Warstwa łącza danych

advertisement
Zarządzanie i integracja
aplikacji Java EE
Przemysław Nowak
Literatura
Bezpieczeństwo w Unixie i Internecie, Simson Garfinkel, Gene Spafford, O’Reilly &
Associates, Inc. Wydawnictwo RM, 1997
Nie tylko wirusy - hacking, cracking, bezpieczeństwo Internetu, Andrzej Dudek,
Wydawnictwo Helion
Polityka bezpieczeństwa i ochrony informacji. Tadeusz Kifner , Wydawnictwo Helion
http://hacking.pl/
http://www.loc.gov/global/internet/security.html
http://www.tisc2001.com
pl.comp.security
comp.os.linux.security
comp.os.ms-windows.nt.admin.security
comp.os.netware.security
comp.security.unix
i wiele innych ...
Unix (Linux)
konfiguracja, administracja systemu
System Unix
MULTICS - 1960, AT&T, GE, MIT, projekt
DARPA
1969 - Unix (PDP 7)
1970 - PDP 11
1973 - język C
1978 - Unix BSD
1979 - Unix AT&T SVR3
1988 - Unix SVR4, Unix OSF/1
System Unix - rodzina
Unix Siódmego Wydania
BSD
System V3
OSF/1
System V4
FreeBSD
SCO Unix
BSD/OS
Solaris
SunOS
AIX
Linux
Linux - inicjowanie systemu
reset, BIOS
ładowanie programu rozruchowego
ładowanie jądra (LILO, LoadLin)
inicjalizacja obszarów roboczych jądra, sprzętu,
systemu plików, terminali, montowanie
dysków (dmesg)
init (inittab)
rc.d (styl BSD i System V)
/etc/inittab
/etc/inittab
Plik definiuje czynności które proces init powinien wykonywać gdy system
przechodzi na poszczególne poziomy pracy.
identyfikator : poziomy_startu : akcja : proces
si::sysinit:/etc/rc.d/rc.sysinit
pf::powerfail:/sbin/genpowerfail start
c1:1235:respawn:/sbin/agetty 38400 tty1 linux
/etc/rc.d/rc.sysinit
Skrypt uruchamiany przy starcie systemu. Powinien zawierać podstawową
inicjalizację systemu, taką jak przyłączanie lokalnych i systemowych
partycji, włączanie ograniczeń dla użytkowników, ustawienie zegara
systemowego czy załadowanie modułów systemu.
Skrypty
startowe
(SystemV)
/etc/rc.d/init.d/
Katalog zawierający skrypty uruchamiające i zatrzymujące poszczególne serwisy
i demony podczas przejść pomiędzy różnymi poziomami startu.
/etc/rc.d/rcX.d/
Katalogi zawierające dowiązania do tych skryptów z katalogu /etc/rc.d/init.d/,
które mają zostać uruchomione bądź zatrzymane przy przejściu na konkretny
poziom startu systemu. X oznacza numer poziomu startu.
/etc/rc.d/rc
Skrypt wykonywany przy zmianie poziomu startu systemu. Uruchamia wszystkie
skrypty z odpowiedniego katalogu /etc/rc.d/rcX.d, podając im parametr w
zależności od pierwszej litery w nazwie dowiązania: S oznacza, że skrypt ma
uruchomić dany serwis lub demona, zaś K znaczy, że serwis ten należy
zamknąć.
/etc/rc.d/rc.local
Skrypt wykonywany jako ostatni przy starcie systemu. Może uruchamiać różne
dodatkowe procesy.
/etc/profile
Plik zawiera ustawienia zmiennych środowiskowych przy starcie systemu.
Skrypty
Bourne’a
nigdy SUID, jeżeli tak jednak być musi należy napisać C wrapper
wywołujący (exec) skrypt
jedna z pierwszych instrukcji: IFS=
następna w kolejności: PATH=........
(bo inaczej te zmienne są dziedziczone)
csh
nie używać! problemy z wieloma rzeczami...
(http://www.ooblick.com/text/CshProgrammingConsideredHarmful.ht
ml)
Linux - podstawowe elementy
jądro, funkcje systemowe, moduły jądra
procesy i wątki, sygnały, identyfikatory procesów, inne atrybuty
zarządzanie pamięcią
system plików, prawa dostępu, rodzaje plików
urządzenia fizyczne
sieć, konfiguracja, usługi
użytkownicy, grupy, kontrola dostępu, uprawnienia, użytkownik root,
System plików UNIXa
Blok
startowy
0
Blok
specjalny
1
Bloki struktur
i-node
2...
Bloki danych
• dysk (partycja) jest podzielony na bloki
• system plików posługuje się pojęciem i-node
 i-node (i-węzeł) odpowiada plikowi, katalogowi lub innym
obiektom (pliki specjalne, gniazdka, kolejki FIFO)
Budowa i-node
Prawa dostępu
Właściciel
Rozmiar
Czasy
...
...
Bezpośrednie
wskazania bloków
danych
Blok danych
Blok danych
Blok danych
Blok danych
Blok danych
Blok danych
Blok pośredni
Blok danych
Dwustopniowe
wskazanie pośrednie
Blok danych
Trójstopniowe
wskazanie pośrednie
Blok danych
Użytkownicy i ich działania
identyfikatory
hasła
grupy
superużytkownik (root)
system plików i uprawnienia użytkowników
programy SUID i GUID
polecenie chown
Użytkownicy - plik /etc/passwd
/etc/passwd
Plik zawierający dane o użytkownikach systemu i ich hasłach.
Informacja jest podana następująco:
identyfikator : zaszyfrowane_hasło : numer_użytkownika :
numer_grupy : katalog_domowy : interpretator_poleceń
Hasła są podane w postaci zaszyfrowanej.
tomek:&1$2fg5zZ#$1$mTx/.Y5:505:501:/home/tomek/:/bin/bash
Ze względu na bezpieczeństwo zaszyfrowane hasła mogą być
umieszczane w pliku /etc/shadow, z prawami do czytania tylko dla
administratora systemu, wówczas w pliku /etc/passwd w ich miejsce
umieszcza się '*'.
Linux - logowanie użytkowników
init
inittab
fork, exec
getty
podanie nazwy
użytkownika
podanie hasła
(jeżeli potrzebne)
getty
.....
getty
exec
login
passwd
chdir, setgid, setuid, exec shell
sh
/etc/bashrc
Plik zawiera ustawienia niektórych zmiennych
środowiskowych oraz synonimów wspólnych dla
wszystkich użytkowników.
Ochrona kont użytkowników
konta bez haseł
tomek::101:100:Tomasz Bezhasla:/home/tomek:/bin/bash
konta grupowe
martwe konta
usermod ...
konta domyślne
news:x:9:13:news:/usr/lib/news:
konta uruchamiające jedno polecenie
date::99:100:date:/tmp:/sbin/date
konta z ograniczonymi interpreterami (bash -r)
tomek::101:100:Tomasz Ograniczony:/home/tomek:/bin/bash -r
konta z ograniczonym systemem plików
tomek::101:100:Tomasz Ograniczony:/home/tomek:*
ograniczenia pory logowania
Grupy użytkowników
/etc/group
Plik zawiera informacje o grupach użytkowników w systemie. Każda
linia jest formatu:
identyfikator_grupy : zaszyfrowane_hasło : numer_grupy :
lista_użytkowników
users::501:tomek,jurek,ania
Złe hasła
imiona i nazwiska osób (rodziny, szefów, znajomych, dzieci),
zwierząt
imiona postaci bajkowych (np. frodo, gandalf itp.)
nazwa systemu operacyjnego i komputera
numery telefonów, numery rejestracyjne samochodów
daty urodzenia
inne informacje dające się łatwo zdobyć (np. adresy)
nazw użytkowników w żadnej postaci (np. pisanych wielkimi literami
lub podwójnie)
słów ze słowników (także z innych języków)
nazw własnych (miejsc, państw, krain geograficznych)
wyrazów składających się z powtórzonej jednej litery (np. aaaaaaaa),
prostych wzorów (np. qwerty)
każdego z powyższych napisanych wspak
Dobre hasła
wielkie i małe litery jednocześnie
cyfry i/lub znaki interpunkcyjne pomieszane z
literami
zawierają pewne znaki kontrolne lub spacje
są łatwe do zapamiętania
są przynajmniej siedmioznakowe
dają się szybko wpisać
Specjalne metody identyfikacji
Hasła jednorazowe (np. OPIE - One time Password
In Everything)
Tokeny (np. SecurID firmy Secure Dynamics,
NetSecure firmy Digital Pathways)
systemy wykorzystujące cechy biofizyczne
użytkowników
Ochrona konta root
bezpieczne terminale
/etc/securetty
grupa wheel
/etc/suauth
root:user1,usr2:OWNPASS
root:ALL EXCEPT GROUP WHEEL:DENY
usr1:user10:NOPAS
Uprawnienia użytkownika root
zmiana wartości nice dowolnego procesu
wysyłanie dowolnych sygnałów do dowolnych procesów
zmiana ograniczeń systemowych (max. czas CPU, max.rozmiary
plików itp..)
włączanie i wyłączanie rozliczania
zmiana identyfikatora na dowolnego użytkownika (polecenie su)
wylogowywanie użytkowników oraz przeładowywanie systemu
zalogowanie się pomimo istnienia pliku /etc/nologin
ustawianie czasu
dostęp do wszystkich urządzeń
odczyt i zmiana dowolnego obszaru pamięci
tworzenie plików urządzeń w dowolnych miejscach systemu plików
(mknod)
Uprawnienia użytkownika root (cd)
uruchamianie usług sieciowych na „zaufanych” portach
rekonfiguracja sieci
włączanie trybu „promiscous” interfejsu sieciowego odczyt, zmiana,
usuwanie plików i programów
uruchamianie dowolnego programu
montowanie i odmontowywanie systemu plików
dodawanie, usuwanie, zmiana kont użytkowników
regulowanie ograniczeń miejsca na dysku i ustawianie systemu
rozliczania
używanie polecenia chroot
zapisywanie plików pomimo 100% zapełnienia dysku
Uprawnienia użytkownika root
(czego root nie może)
dokonywać zmian w systemie plików zamontowanym „read only” - ale
może pisać do „surowego” urządzenia lub zamontować dysk
„read/write”
odmontować system plików zawierający otwarte pliki lub w którym jakiś
proces ma swój bieżący katalog
odszyfrować zawartość pliku /etc/passwd - ale może zmodyfikować
program login, tak aby hasła użytkowników były logowane, może też
poleceniem passwd zmienić hasło konta
Konfigurowanie systemu Linux
Konfiguracja
typowe urządzenia i linki do nich (mouse, modem, cdrom, zip)
punkty montowania dysków (szczególnie wymiennych)
drukarka
interfejs sieciowy
konfiguracja
autoryzacja
ftp, telnet, ssh i inne usługi
poczta (mime)
nfs, samba, ncp (klient, server)
ppp
httpd
X server
linuxconf i inne
Typowe urządzenia i linki do nich
(mouse, modem, cdrom, zip)
/dev/mouse -> /dev/psaux (dla gpm)
/dev/modem -> /dev/ttyS0 (dla minicom)
/dev/cdrom -> /dev/hdc
/dev/sda4 -> /dev/zip
np: ln -s /dev/ttyS0 /dev/modem
Punkty montowania dysków
/etc/fstab, /etc/mtab
Np.:
/dev/fd0
/mnt/floppy auto
/dev/cdrom
/mnt/cdrom
iso9660 ro,user,noauto
/dev/zip
/mnt/zip
vfat
user,noauto,exec 0 1
/dev/hda1
/mnt/win
vfat
user,noauto
server:/export /mnt/server nfs
user,noauto
0 1
0 1
0 1
defaults
mount /mnt/cdrom
mount -t iso9660 -o ro,user,noauto /dev/cdrom /mnt/cdrom
Drukarki
z portem równoległym (/dev/lp0), szeregowym
(/dev/ttyS0), USB (/dev/usb/lp0), drukarki
sieciowe
tzw. drukarki GDI (Windows) na ogół nie są
obsługiwane!
Postscript lub ghostscript
LPD - Line Printer Deamon
lpd - spooling system (lpd, lpr, lpq, lpc, lprm)
baza danych - /etc/printcap
# LOCAL djet500
lp|dj|deskjet:sd=/var/spool/lpd/dj:mx#0:lp=/dev/lp0:sh:
CUPS Common UNIX Printing System
obsługuje IPP (Internet Printing Protocol)
administracja, konfiguracja, status itp. przez WWW lub
przez lpadmin
obsługa szyfrowania (TLS i SSL)
obsługa rozliczania (zadania/strony)
sterowanie dostępem dla użytkowników
obsługa PPD (PostScript Printer Description)
API oraz biblioteki
konfiguracja klienta - /etc/cups/client.conf
Interfejs sieciowy
ifconfig lo 127.0.0.1
route add -host 127.0.0.1 lo
ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
route add -net 192.168.1.0 netmask 255.255.255.0 eth0
route add default gw 192.168.1.1 eth0
/etc/services, /etc/protocols
/etc/inetd.conf
ftp stream tcp
v
nowait root
/usr/sbin/wu.ftpd -l -i -a -
telnet stream tcp
nowait root
/usr/sbin/tcpd
Interfejs sieciowy cd..
/etc/host.equiv, ~/.rhosts
Demon tcpd:
logowanie i sterowanie dostępem (/etc/host.allow,
/etc/host.deny)
# <service list>: <host list> [: command]
/etc/hosts, /etc/networks, /etc/nsswitch.conf, /etc/resolv.conf
masquarading, firewall - będzie jeszcze o tym mowa....
ipchains, iptables
ipchains -A forward -s 192.168.1.0/24 -j MASQ
Interfejs sieciowy - filtr pakietów
Warstwa aplikacji
Programy
klientów i serwerów
Warstwa transportowa
TCP, UDP
Warstwa sieci
IP, ICMP
Warstwa łącza danych
adresy MAC
Sprzęt
Zapora sieciowa
Źrodłowe i docelowe porty TCP/UDP
Znaczniki stanu połączeń TCP
Źródłowe i docelowe adresy IP
Komunikaty ICMP
ipchains (kernel 2.2.x)
Suma
kontrolna
Poprawność
DENY
Łańcuch
wejściowy
Demaskarada
DENY
DENY /
REJECT
Łańcuch
przekazujący
Decyzja
o rutingu
DENY /
REJECT
Proces lokalny
Łańcuch
wyjściowy
DENY /
REJECT
iptables (kernel 2.4.x)
Suma
kontrolna
Poprawność
DROP
DROP
Decyzja
o rutingu
Łańcuch
wejściowy
DROP /
REJECT
Łańcuch
przekazujący
DROP /
REJECT
Proces lokalny
Decyzja
o rutingu
Łańcuch
wyjściowy
DROP /
REJECT
Interfejs sieciowy cd..
Serwer ftp: - /etc/ftpusers
wu.ftpd, proftpd...
anonymous ftp -> wydzielony system plików i chroot
e-mail:
serwer - sendmail, qmail klient - mail, pine
fetchmail
nfs:
/etc/fstab, /etc/exports
/home 192.168.0.0/255.255.255.0 (rw, no_root_squash)
Interfejs sieciowy cd..
DNS:
bind
/etc/named.conf
bind uruchamiany na poziomie uprzywilejowania
nadzorcy, zwykłego użytkownika, w pułapce chroot
traffic shaper
tc
Interfejs sieciowy cd..
samba:
/etc/smb.conf
dial-in server:
mgetty
ppp:
/usr/sbin/pppd, /etc/ppp/*, /etc/inittab
http:
/usr/lib/apache/*
Program routed
uruchamiany przy starcie systemu (ze skryptów
rc.d)
sprawdza, które interfejsy sieciowe są
skonfigurowane i czynne (muszą być co najmniej
2)
wysyła i odbiera w pętli komunikaty oraz modyfikuje
tablice rutowania w jądrze
/etc/gateways - dodatkowy plik konfiguracyjny
<net | host> nazwa1 gateway nazwa2 metric wartość <passive | active | external>
Program gated
obsługuje protokoły wewnętrzne RIP, OSPF, Hello,
ISIS
obsługuje protokoły zewnętrzne EGP, BGP
mogą być uruchomione jednocześnie różne
protokoły
ścieżki wyznaczone przez protokół wewnętrzny
mogą być publikowane przez protokół
zewnętrzny
polecenia konfiguracyjne w jednym pliku za
pomocą spójnej składni
Program gated - konfiguracja (1)
zawartość pliku /etc/gated.conf
emulacja routed
rip yes ;
- emulacja routed „pasywnego”
rip yes {
nobroadcast ;
};
Program gated - konfiguracja (2)
Protokół RIP i OSPF
interfaces {
interface le0 passive ;
};
autonomoussystem 283 ;
snmp yes ;
rip yes {
broadcast ;
defaultmetric 5 ;
interface le version 2 multicast
;
ospf yes {
traceoptions lsabuild protocol;
monauthkey "XXXXXXXX" ;
backbone {
authtype simple ;
interface al. {
priority 2 ;
};
interface le {
authkey "YYYYYYYY" ;
};
};
};
static {
default gateway 132.236.200.200 preference
140 retain ;
};
Program gated - konfiguracja (3)
export proto ospfase type 1 {
proto bgp as 2021 {
ospf yes {
ALL
area 0.0.0.2 {
metric
authtype
none;1; };
Szkielet OSPF networks
proto {direct
{ mask 255.0.0.0; };
119.0.0.0
Ruter ID: 19.1.1.18
(Area 0.0.0.0) interface
119.2.128.18
bgp
yes
{
ALL
costpreference
1metric
{
AS: 1019
1; 50;
};
BGP IGP
retransmitinterval 5; transitdelay 1;
group1;type
};priority
hellointerval 10;
19.1.1.19
External
peeras
routerdeadinterval
40; 2021
};
{ 119.4.128.18
export
proto bgp as 2021 {
interface
119.2.128
cost
1 {peer
119.2.128.18
21.5.1.21
;
proto
direct
{
retransmitinterval
5; all
transitdelay
1; };
interfaces
passive;
};ALL{ options
priority 1; hellointerval 10;
OSPF Area: 0.0.0.2
autonomoussystem
group
type
metric
1; }; 1019;
Ruter A
routerdeadinterval 40; };
IGP
peeras 1019
ospfase
{
119.4.128
routerid
19.1.1.18;
}; proto
119.4.128.18
{ALL
{
ripbackbone
no;
authtype
none;
peer
19.1.1.19
;
metric
1; };
hello
no;
interface
};}; 19.1.1.19
21.1.1.21
1{
egp cost
no;
};
retransmitinterval 5; transitdelay 1;
priority 1; hellointerval 60;
routerdeadinterval 180; };
BGP External: do AS 2021
};
};
X Server
programy do konfiguracji:
XF86Setup, XConfigurator, xf86config
/etc/inittab
id:4:initdefault:
x1:4:wait:/etc/rc.d/rc.4
~/.xinitrc, ~/.xsession
~/.Xdefaults
Demony systemowe
cron
bind
syslogd, klogd
inetd i inne
Konfiguracja cron’a - crontab
/etc/crontab
minuty godzina dzień_miesiąca miesiąc
dzień_tygodnia program_do_wykonania
znak '*' oznacza wykonanie o każdej dozwolonej wartości
dla danego pola, można podawać listy wartości i
zakresy
Sciany ogniowe (firewall) (1)
atak sieciowy
Sciany ogniowe (firewall) (2)
www
nieuzasadnione korzystanie z zasobów sieciowych
Sciany ogniowe (firewall) (3)
ściana ogniowa pozwala na
filtrowanie pakietów
Filtracja pakietów (1)
filtracja na podstawie typu protokołu (np.
blokowanie komunikatów ICMP)
filtracja poziomu warstwy sieciowej (IP)
przekazanie pakiety na podstawie adresów IP nadawcy
i/lub odbiorcy
filtracja poziomu warstwy transportowej (na
podstawie numerów portów - rodzajów usług)
filtracja na poziomie warstwy aplikacji (serwery
proxy)
NAT (masquarading) - ukrywanie struktury sieci
Filtracja pakietów (2)
filtracja statyczna
reguły „sztywno” ustalone, duża szybkość działania,
mała elastyczność
filtracja dynamiczna
zasady zmieniane w czasie funkcjonowania systemu
(odblokowywanie połączeń „na żądanie”), analiza
ruchu i blokowanie wykrytych ataków
NAT
B
A
C
NAT
nie istnieje fizyczne połączenie komputerów A i B oraz A i C, przesyłane
pakiety są modyfikowane w komputerze realizującym NAT - zmiana
adresów IP
z punktu widzenia komputera A komunikuje się on wyłącznie z komputerem
realizującym NAT, nie ma on żadnych informacji o strukturze sieci
lokalnej
w sieci lokalnej można używać adresów prywatnych
10.x.x.x, 192.168.x.x, ...
NAT
NAT - konfiguracja
Zastosowanie NAT
Korzyści:
Wady:
redukcja zapotrzebowania
na adresy publiczne
złożone dostosowanie
niektórych protokołów (np.
FTP)
łatwość organizacji sieci
używając adresów
prywatnych
przezroczystość (dla
niektórych aplikacji)
bezpieczeństwo
brak skalowania
wprowadzenie dodatkowych
węzłów sieci (multihomed
networks)
brak fizycznego połączenia
end-to-end
dla zapewnienia
bezpieczeństwa potrzebny
IPsec
Firewall - architektura DMZ
Serwer
ftp, http, news, DNS
DMZ
Strefa zdemilitaryzowana
Zapory sieciowe (firewall)
- pożądane cechy
Wybór odpowiednich filtrów (pakietów, połączeń,
usług itp.)
Odporność na ataki
Wydajność
Monitorowanie sieci
Dodatki (VPN, legalizacja i autoryzacja)
Uwaga: zapory nie chronią przed atakami z wewnątrz sieci!
Firewall sieciowy
Warstwa aplikacji
Programy serwera i klienta
Zapora sieciowa
Warstwa transportowa
TCP, UDP
Warstwa sieci
IP, ICMP. IGMP
Warstwa łącza danych
MAC
Sprzęt
źródłowe i docelowe porty TCP/UDP
znaczniki stanu połączeń TCP
źródłowe i docelowe adresy IP
protokoły ICMP, IGMP....
źródłowe i docelowe adresy sprzętowe
Netfilter
Poprawność
CRC
DROP
Pre-Routing
DROP
Forward
Post-Routing
DROP /
REJECT
Input
DROP /
REJECT
Output
Lokalny proces
DROP /
REJECT
Netfilter - Przyklad (1)
Netfilter - Przyklad (2)
DMZ:
Packet Filter box:
Mail server

PING any network
 SMTP to external

TRACEROUTE any network
 Accept SMTP from internal and
external

Access DNS
 Accept POP-3 from internal

Allow WWW, ftp, traceroute, ssh to
external

Allow SMTP to Mail server

Allow POP-3 to Mail server

Allow DNS to Name server

Allow rsync to Web server

Allow WWW to Web server

Allow ping to packet filter box
Name server
 Send DNS to external
 Accept DNS from internal,
external and packet filter box
Web server
 Accept HTTP from internal and
external
 Rsync access from internal
Internal:
Netfilter - Przyklad (3)
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
iptables -A INPUT -i ! lo -j DROP iptables -A OUTPUT -i ! lo -j DROP
iptables -A FORWARD -j DROP
ifconfig eth0 192.84.219.0 netmask 255.255.255.0
ifconfig eth1 192.168.1.0 netmask 255.255.255.0
pppd
route add default ppp0
iptables -N internal-dmz
iptables -N external-dmz
iptables -N internal-external
iptables -N dmz-internal
iptables -N dmz-external
iptables -N external-internal
iptables -N icmp-accept
iptables -N NEVER
iptables -N LOGDROP
Netfilter - Przyklad (4)
iptables -A NEVER -j LOG --log-level alert --log-prefix "filter ERROR: ”
iptables -A NEVER -j DROP iptables -A LOGDROP -m limit -j LOG --log-prefix
"filter: ”
iptables -A LOGDROP -j DROP iptables -A FORWARD -i eth1 -o eth0 -j internal-dmz
iptables -A FORWARD -i eth1 -o ppp0 -j internal-external
iptables -A FORWARD -i eth0 -o ppp0 -j dmz-external
iptables -A FORWARD -i eth0 -o eth1 -j dmz-internal
iptables -A FORWARD -i ppp0 -o eth0 -j external-dmz
iptables -A FORWARD -i ppp0 -o eth1 -j external-internal
iptables -A FORWARD -j NEVER
iptables -A icmp-accept -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A icmp-accept -p icmp --icmp-type source-quench -j ACCEPT
iptables -A icmp-accept -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A icmp-accept -p icmp --icmp-type parameter-problem -j ACCEPT
Netfilter - Przyklad (5)
iptables -A internal-dmz -p tcp -d $MAILSERVER --dport smtp -j ACCEPT
iptables -A internal-dmz -p tcp -d $MAILSERVER --dport pop-3 -j ACCEPT
iptables -A internal-dmz -p udp -d $NAMESERVER --dport domain -j ACCEPT
iptables -A internal-dmz -p tcp -d $NAMESERVER --dport domain -j ACCEPT
iptables -A internal-dmz -p tcp -d $WEBSERVER --dport www -j ACCEPT
iptables -A internal-dmz -p tcp -d $WEBSERVER --dport rsync -j ACCEPT
iptables -A internal-dmz -p icmp -j icmp-accept
iptables -A internal-dmz -j LOGDROP
ptables -A external-dmz -p tcp -d $MAILSERVER --dport smtp -j ACCEPT
iptables -A external-dmz -p udp -d $NAMESERVER --dport domain -j ACCEPT
iptables -A external-dmz -p tcp -d $NAMESERVER --dport domain -j ACCEPT
iptables -A external-dmz -p tcp -d $WEBSERVER --dport www -j ACCEPT
iptables -A external-dmz -p icmp -j icmp-accept
iptables -A external-dmz -j DROP
Netfilter - Przyklad (6)
iptables -A internal-external -p tcp --dport www -j ACCEPT
iptables -A internal-external -p tcp --dport ssh -j ACCEPT
iptables -A internal-external -p udp --dport 33434:33500 -j ACCEPT
iptables -A internal-external -p tcp --dport ftp -j ACCEPT
iptables -A internal-external -p tcp --dport 1024:65535 -j ACCEPT
iptables -A internal-external -p icmp --icmp-type ping -j ACCEPT
iptables -A internal-external -j LOG iptables -A internal-external -j REJECT
iptables -A dmz-internal -p tcp ! --syn -s $MAILSERVER smtp -j ACCEPT
iptables -A dmz-internal -p udp -s $NAMESERVER domain -j ACCEPT
iptables -A dmz-internal -p tcp ! --syn -s $NAMESERVER domain -j ACCEPT
iptables -A dmz-internal -p tcp ! --syn -s $WEBSERVER www -j ACCEPT
iptables -A dmz-internal -p tcp ! --syn -s $WEBSERVER rsync -j ACCEPT
iptables -A dmz-internal -p icmp -j icmp-accept
iptables -A dmz-internal -j NEVER
Netfilter - Przyklad (7)
iptables -A dmz-external -p tcp -s $MAILSERVER smtp -j ACCEPT
iptables -A dmz-external -p udp -s $NAMESERVER domain -j ACCEPT
iptables -A dmz-external -p tcp -s $NAMESERVER domain -j ACCEPT
iptables -A dmz-external -p tcp ! --syn -s $WEBSERVER www -j ACCEPT
iptables -A dmz-external -p icmp -j icmp-accept iptables -A dmz-external -j NEVER
iptables -A external-internal -p tcp ! --syn --sport www -j ACCEPT
iptables -A external-internal -p tcp ! --syn --sport ssh -j ACCEPT
iptables -A external-internal -p tcp ! --syn --sport ftp -j ACCEPT
iptables -A external-internal -p tcp ! --syn --sport 1024:65535 -j ACCEPT
iptables -A external-internal -p icmp --icmp-type pong -j ACCEPT
iptables -A external-internal -j DROP
iptables -N external-if
iptables -N dmz-if
iptables -N internal-if
Netfilter - Przyklad (8)
iptables -A INPUT -i ppp0 -j external-if
iptables -A INPUT -i eth0 -j dmz-if
iptables -A INPUT -i eth1 -j internal-if
iptables -A external-if -p icmp --icmp-type pong -j ACCEPT
iptables -A external-if -j icmp-accept
iptables -A external-if -j DROP
iptables -A dmz-if -p tcp ! --syn -s $NAMESERVER 53 -j ACCEPT
iptables -A dmz-if -p udp -s $NAMESERVER 53 -j ACCEPT
iptables -A dmz-if -p icmp --icmp-type pong -j ACCEPT
iptables -A dmz-if -j icmp-accept iptables -A dmz-if -j NEVER
iptables -A internal-if -p icmp --icmp-type ping -j ACCEPT
iptables -A internal-if -p icmp --icmp-type pong -j ACCEPT
iptables -A internal-if -j icmp-accept iptables -A internal-if -j LOGDROP
iptables -D 1 input; iptables -D 1 forward; iptables -D 1 output
APACHE + JAVA + TOMCAT
Instalacja serwera Apache 2
Aktualizacja oprogramowania
apt-get update
apt-get –u upgrade
Instalacja serwera www
apt-get install apache2
apt-get install libapache2-mod-jk
Apache 2
Pliki konfiguracyjne serwera www znajdują
się w katalogu /etc/apache2.
Strony dostępne na serwerze można
znaleźć w podkatalogu
/etc/apache2/sites-available.
W przypadku definiowania pojedynczego
Virtual hosta można tego dokonać
bezpośrednio w pliku
/etc/apache2/apache2.conf
Instalacja Javy
Pakiet do pobrania:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
W celu dokonania instalacji należy:
mv jdk-6u24-linux-i586.bin /usr/local
chmod +x jdk-6u24-linux-i586.bin
./jdk-6u24-linux-i586.bin
rm jdk-6u24-linux-i586.bin
Konfiguracja
W pliku /etc/profile dodać
export JAVA_HOME=/usr/local/java
Zmodyfikować zmienna PATH do postaci:
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/
bin:/usr/local/java/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/java/
bin"
fi
Instalacja serwera Apache Tomcat
Aplikacja dostępna pod adresem
http://tomcat.apache.org/download-70.cgi
Po pobraniu należy wykonać:
mv apache-tomcat-7.0.12.tar.gz /usr/local/; cd /usr/local/
tar zxvf apache-tomcat-7.0.12.tar.gz
ls -s apache-tomcat-7.0.12 tomcat
Z poziomu konsoli:
cd /usr/local/tomcat/bin/
chmod 755 shutdown.sh startup.sh
workers.properties
# This file provides minimal jk configuration properties needed to
# connect to Tomcat.
#
# We define a worker named ‘default’
#workers.tomcat_home=/usr/locale/tomcat/
workers.java_home=/usr/local/java/
ps=/
worker.list=default
worker.default.port=8009
worker.default.host=localhost
worker.default.type=ajp13
worker.default.lbfactor=1
Apache -> Tomcat
W pliku apache2.conf
# mod_jk config
# workers.properties
JkWorkersFile /etc/apache2/workers.properties# Where to put jk logs
JkLogFile /var/log/apache2/jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y] “
#JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat –ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat “%w %V %T”
Virtual Host
/etc/apache2/sites-available:
<VirtualHost *:80>
ServerName test.dmcs.pl
ServerAdmin [email protected]
JkMount /* default
JkMount /*.jsp default
DirectoryIndex index.jsp index.html
# Globally deny access to the WEB-INF directory
<LocationMatch ‘.*WEB-INF.*’>
AllowOverride None
deny from all
</LocationMatch>
</VirtualHost>
Apache restart
/etc/init.d/apache2 stop
/usr/local/tomcat-5.5.25/bin/startup.sh
/etc/init.d/apache2 start
APACHE ANT
ANT
• Producent: Apache Software Foundation
• System operacyjny: GNU/Linux, Windows,
Mac OS, BeOS
• Pierwsze wydanie: 19 lipca 2000
• Aktualna wersja stabilna: 1.8.2
Czym jest ANT ?
• Narzędzie, służące do zautomatyzowania procesu
budowy oprogramowania. Podobne do programu
Make
• Napisany w Javie do wykorzystania z programami
napisanymi w tym języku.
• Co najważniejsze, jest to open-source na licencji
Apache Software Fundation.
Ant a Make ?
• W pliku Makefile czynności określone jako
komendy powłoki – zależne od platformy
• Ant rozwiązuje ten problem
• Użycie XML‘a i pliku build.xml
Schemat build.xml
<project name="project_name" basedir="." default="default"
<property name="src" value="./src" />
<target name="default">
<task1 param1="value" />
<task2>
<type param="value" />
</task2>
</target>
</project>
Przykładowy build.xml
<?xml version="1.0"?>
<project name="Hello" default="compile">
<target name="clean" description="remove intermediate files">
<delete dir="classes"/>
</target>
<target name="compile"
description="compile the Java source code to class files">
<mkdir dir="classes"/>
<javac srcdir="." destdir="classes"/>
</target>
<target name="jar" depends="compile"
description="create a Jar file for the application">
<jar destfile="hello.jar">
<fileset dir="classes" includes="**/*.class"/>
<manifest>
<attribute name="Main-Class" value="HelloProgram"/>
</manifest>
</jar>
</target>
</project>
ANT
• wymagania - JDK 1.2 lub nowsza
• download - http://ant.apache.org
• najnowsza wersja - Ant 1.8.2 (27-December2010 )
Do czego można użyć ANT’a?
• Ant możne pobierać kod źródłowy systemu kontroli
wersji
CVS, Subversion, Synergy, Perforce, ClearCase i wiele innych
• Ant można skompilować kod źródłowy
• Ant pozwala na przeprowadzanie testów
jednostkowych
JUnit3, JUnit4, TestNG lub dowolną aplikację testową
• Ant może pakować skompilowany kod i zasoby
jars, wars, ears, tars, zips
• Ant może obsłużyć zależności pomiędzy target’ami
Ant – przykładowa instalacja
rozpakować apache-ant-1.8.2-bin.tar.gz do
/usr/local/ant
export ANT_HOME=/usr/local/ant
exportJAVA_HOME=/usr/local/java
export PATH=$PATH:$ANT_HOME/bin
Ant terminologia (1)
project:
<project> jest element najwyższego poziomu w skrypt Ant
<project> ma trzy atrybuty opcjonalne:
name nazwa projektu
default domyślnego celu używać, gdy nie jest zdefiniowany cel
basedir katalog bazowy, z którego wykonywane są ścieżki
Ant terminologia (2)
target:
• Każdy projekt definiuje zero lub więcej target’ów
• target jest zbiorem zadań, które mają być zrealizowane
• Podczas uruchamiania Ant’a, można wybrać target(s),
które będą wykonane
• Gdy żaden target nie jest wywołany, zostanie wykonany
domyślnym
• target mogą być wykonywane warunkowo
• mogą być zdefiniowane zależności między target’ami
przykład
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="A"/>
<target name="D" depends="B,C"/>
Ant terminologia (3)
tasks
• task jest to fragment kodu, który może być wykonany
• task może mieć wiele atrybutów
• Ant zawiera ponad 80 podstawowych zadań i 60
opcjonalnych
• Istnieje ponad 100 zadań firm trzecich napisanych dla
Ant
• rozszerzenia Ant (zadania) mogą być z łatwością
napisane innych unikalnych problem
Ant terminologia (4)
Properties
properties ma nazwę i wartość (case-sensitive)
properties mogą być stosowane w wartości atrybutów
zadania Odbywa się to poprzez umieszczenie nazwy
pomiędzy "$ {" i "}" w wartości atrybutu
Np., jeśli jest właściwość "builddir„ o wartości „build", może być
wykorzystana w atrybucie: ${builddir}/classes . Jest to rozwijane w
czasie wykonywania do postaci: build/classes
Własności wbudowane
Ant umożliwia dostęp do wszystkich właściwości systemu,
jak gdyby zostały zdefiniowane przy użyciu
<PROPERTY> zadania. Na przykład, $ {os.name}
rozszerza się do nazwy systemu operacyjnego.
Ant ma kilka wbudowanych właściwości:
basedir - bezwzględną ścieżkę do projektu bazowego
katalogu (zgodnie z atrybutem basedir z <project>)
ant.file - ścieżkę bezwzględną buildfile
ant.version - wersja Ant
ant.project.name - nazwa projektu, który jest aktualnie
wykonywany, ale jest w atrybut name <project>
ant.java.version
Ant dostępne środowiska
• WSAD / RAD / Eclipse
Ant zbudowany jest na tych IDE
Wszystkie posiadają wyspecjalizowane "Ant View"
• z linii poleceń
Automatyzacja środowiska (CruiseControl)
Wymaga JDK
Wiersz poleceń Ant
ant [ options ] [ target-names ]
uruchamia target określony nazwa i te od których zależy
można podać wiele nazw oddzielonych spacjami
-D opcja określa właściwość, która może być
wykorzystana przez cele i zadania.
np. -Dproperty-name=property-value
ant -help
wymienia inne opcje wiersza polecenia
Podstawowe zadania
<copy>
<mkdir>
<concat>
<move>
<delete>
<replace>
<filter>
<sync>
<fixcrlf>
<tempfile>
<get>
<touch>
Zadania kompilacji
<javac> Kompiluje określony plik źródłowy
<apt> Uruchomienie narzędzia procesor
adnotacji (apt), a następnie opcjonalnie
kompiluje kod
<rmic> Uruchamia rmic kompilator
Zadania archwizacji
<zip> , <unzip> tworzy plik zip.
<jar> , <unjar> buduje plik jar
<war> , <unwar> rozszerzenie pliku Jar na, archiwum www
Zadania testowe
<junit> Działa z badań w ramach testów JUnit.
<junitreport> Łączy poszczególne pliki XML
generowane przez zadania Junit i generuje
arkusz raportu.
Zadania własności
<dirname> Ustawia własności do wartości
ostatniego elementu ścieżki.
<loadfile> Ładuje plik do własności.
<propertyfile> Tworzy lub modyfikuje pliki
własności.
<uptodate> Ustawia właściwość, jeżeli dany
plik jest nowszy niż docelowy zestaw
plików źródłowych.
Inne zadania
<echo> tekst Echoes do System.out lub do
pliku.
<javadoc> Generuje kod dokumentacji za
pomocą narzędzia javadoc.
<sql> Wykonuje szereg instrukcji SQL
poprzez JDBC do bazy danych.
Usuwanie, tworzenie i kopiowanie
Najważniejsze elementy pliku build.xml
• <deltree dir="${build}"/>
• <mkdir dir="${build}/${src}" />
• <copy todir="${build}/${src}">
<fileset dir="${src}">
<include name="*.xml"/>
<exclude name="index.xml"/>
</fileset>
</copy>
Komendy systemowe
Ant umożliwia wykonywanie komend
systemowych.
<exec failonerror="true" executable="/bin/mimic_cmd">
<arg value='"startDaemon()"' />
</exec>
Apache MAVEN
Maven
• Producent: Apache Software Foundation
• Pierwsze wydanie: 25th June 2007
• Aktualna wersja stabilna: 3.0.3
Literatura
• Maven: The Definitive Guide
http://www.sonatype.com/books/mavenbook/reference/public-book.html
• Developing with Eclipse and Maven
http://www.sonatype.com/m2eclipse/documentatio
n/download-book?file=books/m2eclipse-book.pdf
• Opisy wtyczek
http://maven.apache.org
Czym jest Apache Maven
Narzędzie automatyzującym budowę
programowania na platformę Java.
Funkcjonalności realizowane poprzez wtyczki
automatycznie pobierane przy ich pierwszym
wykorzystaniu.
Plik określający sposób budowy aplikacji nosi
nazwę POM-u (ang. Project Object Model).f
Cele Mavena
Budowanie oprogramowania ma zakończyć się
osiągnięciem wybranego przez budującego celu.
Dostępnych celów jest wiele. Pula celów nie jest
bezpośrednio określona przez twórcę POM-a, lecz
przez
wtyczki
rozszerzające
funkcjonalność
Mavena. Poszczególne cele mogą wymagać
wcześniejszej realizacji innych celów, np. cel
package (zbudowanie paczki dystrybucyjnej)
wymaga uprzedniej realizacji compile (kompilacja
kodów źródłowych) oraz test (uruchomienie testów
automatycznych).
Cykle życia (1)
Mianem głównego cyklu życia projektu określa się
uszeregowanych kolejno osiem najważniejszych z
punktu widzenia budowy aplikacji celów. Powodzenie
każdego kolejnego celu uzależnione jest od pomyślnej
realizacji celów znajdujących się wcześniej w cyklu:
validate - sprawdzenie, czy projekt jest poprawny i czy
wszystkie niezbędne informacje zostały określone
compile - kod źródłowy jest kompilowany
test - przeprowadzane są testy jednostkowe
Cykle życia (2)
package - budowana jest paczka dystrybucyjna
integration-test - zbudowany projekt umieszczany
jest w środowisku testowym, gdzie przeprowadzane
są testy integracyjne
verify - sprawdzenie, czy paczka jest poprawna
install - paczka umieszczana jest w repozytorium
lokalnym - może być używana przez inne projekty
jako zależność
deploy - paczka umieszczana jest w repozytorium
zdalnym (opublikowana)
Co to POM ?
POM, czyli Project Object Model, to
dokument XML-owy kompleksowo opisujący
projekt.
POM nie tylko precyzuje szczegóły budowy
produktu, ale też może przechowywać
informacje
o
zespole
programistów,
zastosowanych systemach wspomagających
rozwój oprogramowania.
W Mavenie dokument POM nosi nazwę
pom.xml.
Przykład POM (1)
<project>
<modelVersion>4.0.0</modelVersion>
<!-- Podstawowe informacje dla Mavena 
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
Przykład POM (2)
<!-- Ustawienia budowania -->
<build>...</build>
<!-- Ustawienia generowania strony HTML z
dokumentacją i raportami -->
<reporting>...</reporting>
Przykład POM (3)
<!-- Ogólne informacje o projekcie -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
Przykład POM (4)
<!-- Ustawienia środowiska tworzenia projektu -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
Powiązania pomiędzy plikami POM
Agregacja - Mechanizm mający na celu rozbicie dużego
projektu na podprojekty (moduły), by ułatwić
zarządzanie źródłami. POM głównego projektu
agreguje POM-y modułów, te zaś mogą agregować
POM-y swoich podmodułów itd.
Dziedziczenie - Każdy POM ma rodzica, którym jest inny
dokument POM. Eliminuje to potrzebę jawnego
określania wszystkich elementów w POM-ie każdego
modułu
Zależność
Tworzenie POM
Programista może napisać POM-a samodzielnie
od podstaw, prościej jednak użyć Mavena, który
potrafi wygenerować prostego POM-a
samodzielnie:
mvn archetype:create
-DarchetypeGroupId=org.apache.maven.archetypes
-DgroupId=com.mycompany.app -DartifactId=my-app
Wtyczki
Większość funkcjonalności Mavena dostępna jest za
pośrednictwem wtyczek. Każda z wtyczek posiada
wyspecyfikowane cele które może realizować.
Dany cel może być wywołany używając poniższej
składni:
mvn [nazwa-wtyczki]:[nazwa-celu]
Przykładowo kompilacji kodu można dokonać
wywołując
mvn compile:compile.
Generowanie raportów
Jedną z funkcjonalności Mavena jest
zautomatyzowana generacja strony internetowej
projektu.
Strona, oprócz ogólnych informacji ustalanych na
podstawie POM-a, zawiera również zbiór raportów
dokumentujących projekt.
W skład raportów wchodzą najczęściej Javadoc,
kody źródłowe itd.
Maven a Ant
Apache Ant jest innym narzędziem na platformę Java
automatyzującym proces budowy oprogramowania.
Pracując z Antem, programista tworzy skrypt (Buildfile)
określający krok po kroku sposób budowy programu.
W Mavenie natomiast określa raczej co ma zostać
zbudowane i w jaki sposób, niż kiedy i w jakiej kolejności.
Kolejność wykonywania poszczególnych faz jest ustalana
przez Mavena.
Maven wydaje się być mniej elastyczny niż Ant, nie jest to
jednak prawdą, gdyż ostatecznie można nakazać Mavenowi
wywołanie Anta. Na korzyść Mavena przemawia fakt, że
stworzenie i utrzymanie pliku POM wymaga zwykle
znacznie mniej pracy, niż Antowego Buildfile'a.
INSTALACJA MAVENA
Konfiguracja środowiska
• Pobierz Maven2 ze strony
http://maven.apache.org
• Zainstaluj Maven2 w maven_home
• Dodaj ścieżkę maven_home/bin do PATH
(uwaga Linux/Windows)
• Ustal lokalizację JDK w zmiennej środowiskowej
JAVA_HOME
Maven z Netbeans
• Zainstaluj plugin Maven w NetBeans (Tools →
Plugins)
• Sprawdź czy w Tools → Options →
Miscellaneous znajduje się zakładka Maven
• Na zakładce Maven podać lokalizację
maven_home (o ile NetBeans sam nie wykrył
Maven-a po PATH)
Maven z Eclipse
• Pobierz plik archiwum z Eclipse. Dla przykładowej
instalacji jako baza posłużyła wersja Eclipse 3.5 JavaEE
(Galileo)
• Zainstaluj Mylyn dla Eclipse 3.5:
http://download.eclipse.org/tools/mylyn/update/e3.5
• Zainstaluj AspectJ dla Eclipse 3.5
http://download.eclipse.org/tools/ajdt/35/update
• Zainstaluj Subclipse 1.6
http://subclipse.tigris.org/update_1.6.x
• Zainstaluj GEF dla Eclipse 3.5
http://download.eclipse.org/tools/gef/updates/releases/
• Zainstaluj m2eclipse
http://m2eclipse.sonatype.org/update/
Maven z Eclipse
• W konfiguracji Eclipse jako masznę JAVA podać tę z
pakietu JDK (eclipse.ini), np.:
-vm e:\Programs\Java\jdk1.6.0_14\bin\javaw.exe
• Dodać ścieżkę w Window → Preferences → Maven →
Installations do katalogu w którym zainstalowano maven2
• Uwaga! Warto wyłączyć automatyczne budowanie
projektu w Eclipse
TWORZENIE PROJEKTU
Informacje wstępne
• Projekty można tworzyć z poziomu:
– Środowiska programistycznego
– Linii poleceń i samego maven-a
• Projekty tworzy się na podstawie tzw. archetypów
np.:
– Dla aplikacji bazującej na spring
– Dla modułu EJB
– Dla aplikacji WEB itd.
• Środowisko programistyczne tak naprawdę
wykorzystuje te archetypy i mavena do
utworzenia określonego typu projektu
Projekt nadrzędny (POM)
•Utworzyć nowy projekt Maven
•File → New → Project (Alt+Shift+N)
•Wybrać Maven Project
•Wybrać archetyp (można przeszukiwać listę)
•groupId: org.codehouse.mojo.archetypes
•artifactId: pom-root
Docelowa struktura projektów
SuperPOM
Jest to podstawowa konfiguracja dostarczana
przez konkretną dystrybucję maven
Kolejne wydanie maven może używać nowszych
wtyczek (o wyższych numerach wersji) niż to z
którego aktualnie korzystasz.
Jeżeli coś działało w wersji, której do tej pory
używałeś, to nie znaczy że będzie działało w
wersji nowszej. Wniosek: zawsze podawaj
numery wersji wtyczek w pom.xml
Projekt nadrzędny (POM)
• Do podania są następujące wartości:
•
•
•
•
lokalizacja projektu na dysku
grupId
artifactId (nazwa projektu w IDE)
wersja
• Plik pom.xml powinien mieć następującą postać:
<modelVersion>4.0.0</modelVersion>
<groupId>project.samples</groupId>
<artifactId>NazwaProjektu</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>NazwaProjektu Multi Project</name>
<url>http://maven.apache.org</url>
Projekt typu JEE 5 Enterprise (EAR)
•Projekt typu EAR składa (ang. assembly) dostępne moduły
(artefakty) w archiwum EAR
•File → New Project (Ctrl+Shift+N)
•Wybrać Maven Project i Next
•Rozwinąć listę: Archetypes from Remote Maven
Repositories (można wpisywać nazwę archetypu – Quick
Search)
•Wybrać z listy: JEE 5 EAR Archetype i Next
•Podać: nazwę projektu, lokalizację, grupę, wersję i
zatwierdzić Finish
Projektu typu UTILITY (JAR)
• File → New Project (Ctrl+Shift+N)
• Wybrać Maven Project i Next
• Wybrać Maven Quickstart Archetype i Next
• Podać: nazwę projektu, lokalizację, grupę, wersję
i zatwierdzić Finish
• Zmienić wersję Java na wymaganą, np.:1.5
(Project →Properties → Sources)
Projekt JEE 5 EJB (JAR)
• File → New Project (Ctrl+Shift+N)
• Wybrać Maven Project i Next
• Rozwinąć listę Archetypes from Remote Maven
Repositories
• Wybrać z listy JEE 5 ejb jar archetype (można
wpisywać nazwę archetypu – Quick Search) i
Next
• Podać nazwę projektu, lokalizację, grupę, wersję i
• zatwierdzić Finish
Projekt JEE 5 Web (WAR)
• File → New Project (Ctrl+Shift+N)
• Wybrać Maven Project i Next
• Rozwinąć listę Archetypes from Remote Maven
Repositories
• Wybrać z listy JEE 5 web application archetype (można
wpisywać nazwę archetypu – Quick Search) i Next
• Podać nazwę projektu, lokalizację, grupę i wersję,
zatwierdzić Finish
• Z Project → Properties → Frameworks dodać framework
web którego będziemy używać w projekcie
Konfiguracja projektu EAR
Dodaj jako zależności moduł ejb i moduł web
<dependency>
<groupId>pl.test.was</groupId>
<artifactId>WebModule</artifactId>
<version>1.0-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>pl.test.was</groupId>
<artifactId>EjbModule</artifactId>
<version>1.0-SNAPSHOT</version>
<type>ejb</type>
</dependency>
Konfiguracja maven-ear-plugin
• Dodaj do pliku pom wtyczkę maven-ear-plugin
• W konfiguracji wtyczki należy dopisać:
<modules>
<webModule>
<groupId>pl.test.was</groupId>
<artifactId>WebModule</artifactId>
</webModule>
<ejbModule>
<groupId>pl.test.was</groupId>
<artifactId>EjbModule</artifactId>
</ejbModule>
</modules>
• Powyższe moduły zostaną załączone do archiwum EAR w formie
spakowanej (jar i war)
• EAR może zawierać 0..1 moduł WEB (war), 0..N modułów EJB (jar)
i 0..N innych bibliotek JAR
Budowa aplikacji EJB3/3.1
• W przypadku gdy chcemy aby moduły EJB i WEB nie były
umieszczane razem w formie jednej aplikacji EAR, to
pojawia się problem związany z zależnościami.
• Aplikacja WEB musi zawierać część kodu aplikacji EJB, a
dokładniej specyfikację interfejsów komponentów EJB z
których będzie korzystać.
• Projekt Maven dla EJB musi więc, oprócz zbudowania
aplikacji EJB, wygenerować także archiwum jar
zawierające te interfejsy.
Konfiguracja maven-ejb-plugin
• Ustawić wartość generateClient na true
• Wskazać w <clientIncludes> co ma zostać umieszczone w
kliencie
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<generateClient>true</generateClient>
<clientIncludes>
<!--Dołącz do klienta tylko "zdalne interfejsy"-->
<clientInclude>
pl/test/sos/ejb/endpoint/*Remote.class
</clientInclude>
</clientIncludes>
<ejbVersion>3.0</ejbVersion>
</configuration>
</plugin>
Konfiguracja projektu WEB
• W projekcie aplikacji WEB należy dodać zależność
względem wcześniej wygenerowanego klienta aplikacji
EJB – wartość <type> ustawiona na ejb-client
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>EjbModule</artifactId>
<version>${EjbModule.ver}</version>
<type>ejb-client</type>
</dependency>
• Maven wie, że nie należy dołączać archiwum jar z
aplikacją EJB tylko archiwum jar klienta tej aplikacji.
• Zwróć uwagę na możliwość zastosowania:
• parametru EjbModule.ver, który zostały zdefiniowany w pliku
• konfiguracyjnym nadrzędnego projektu maven (pom) parametru
standardowego project.groupId
PARAMETRY
Parametry standardowe
Odwołanie do parametru ma postać
${nazwa_parametru}
Standardowo dostępne wartości:
• project.* - wartości z Maven POM
• settings.* - ustawienia z settings.xml
• env.* - zmienne środowiskowe
• java.lang.System
Parametry standardowe: project
• Najczęściej wykorzystywane wartości project.*
– artifactId
– groupId
– version
– build.*
• directory
• sourceDirectory
Parametry standardowe: settings
Generalnie bardzo rzadko wykorzystuje się w
ustawieniach projektu wartości z settings.xml
Najczęściej wykorzystywane wartości z settings.*
• localRepository
• offline
Za to bardzo wygodnie jest tam wpisać dane
uwierzytelniające w sekcji <servers> dla
wykorzystywanych serwerów podanych w sekcji
<distributionManagement> pliku pom.xml
Parametry standardowe: env
• Najczęściej wykorzystywane wartości env.*
• path
• home
• java_home
• Jeżeli to tylko możliwe, powinno się używać wartości
• dostępnych poprzez java.lang.System
Parametry standardowe: java.lang.System
• Wartości bardzo często wykorzystywane
• Najbardziej popularne to:
• java.version
• java.home
• user.home
• user.dir
• line.separator
• file.separator
• os.*
Parametry użytkownika
• Można definiować własne parametry
• Wykorzystywane podczas konfiguracji projektu i przy
filtrowaniu
• Przykład definicji:
<properties>
<EJBModule.ver>1.0-SNAPSHOT</EJBModule.ver>
<WEBModule.ver>1.0-SNAPSHOT</WEBModule.ver>
</properties>
• Przykład użycia:
<dependency>
<groupId>pl.szsk.was</groupId>
<artifactId>WebModule</artifactId>
<version>${WEBModule.ver}</version>
<type>war</type>
</dependency>
Filtrowanie
• Proces podstawiania wartości parametrów w plikach
• W pliku musi znajdować się odwołanie do parametru w
postaci
${nazwa_parametru}
• Pozwala na zmianę treści plików konfiguracyjnych czy też
samych plików źródłowych aplikacji np:
• Konfiguracja połączenia do bazy danych
• Adres WebService w adnotacji
• Proces filtrowania musi zostać jawnie uaktywniony.
SUPERPOM ma domyślne ustawienia jak poniżej:
<resources>
<resource>src/main/resources</resource>
<filtering>true</filtering>
</resources>
Filtrowanie: przykład filtrowania źródeł
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
<!-- domyślnie zasoby są kopiowane do target/classes -->
<targetPath>../filtered-sources</targetPath>
</resource>
<resource>
<!—trzeba podać też katalog z normalnymi plikami zasobów,
inaczej ich nie skopiuje-->
<directory>src/main/resources</directory>
</resource>
</resources>
GENEROWANIE STRONY
PROJEKTU
Generowanie strony projektowej (Site)
• Sekcja <reporting >: konfiguracja raportów generowanych na
potrzeby projektu
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.1.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.6</version>
<configuration>
<aggregate>true</aggregate>
</configuration>
</plugin>
</plugins>
</reporting>
Generowanie strony projektowej (Site)
• W przypadku projektu wielomodułowego, strona będzie
generowana z osobna dla każdego projektu.
• Raporty można zintegrować ustawiając wartość aggregate
na true. Agregacja następuje dopiero po wykonaniu celu
site:deploy
• Dla celu site:deploy należy skonfigurować
distributionManagement, tzn miejsce w którym zostanie
umieszczona strona projektu. Może być to także okalizacja
na serwerze plików czy też www (transport np.: scp).
<distributionManagement>
<site>
<id>Test</id>
<url>file://d://javaProg//docs</url>
</site>
<distributionManagement>
Konfiguracja serwerów: przykład
• Plik pom.xml
<distributionManagement>
<site>
<id>Test</id>
<name>Test Site</name>
<url>scp://nazwa_serwera/sciezka_do_np_public_html/</url>
</site>
</distributionManagement>
• Plik settings.xml
<servers>
<server>
<id>Test</id>
<username>uzytkownik</username>
<password>haslo</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
</servers>
Informacje o projekcie: przykład
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.1.2</version>
<reportSets>
<reportSet>
<reports>
<report>index</report>
<report>project-team</report>
<report>dependencies</report>
<report>dependency-convergence</report>
<report>dependency-management</report>
<report>plugin-management</report>
<report>plugins</report>
<report>summary</report>
<report>scm</report>
</reports>
</reportSet>
</reportSets>
</plugin>
•
Listę członków zespołu projektowego bądź też organizacji należy umieścić w
sekcji <developers>.
• Można też stworzyć dodatkową listę w sekcji <contributors> dla osób bądź
jednostek przekazujących coś na rzecz projektu.
• Jeżeli generowane są raporty z scm (np. changelog) to id powinno być
zgodne z loginem w tym systemie.
<developers>
<developer>
<id>test</id>
<name>test user</name>
<email>[email protected]</email>
<organization>Technical University of Lodz</organization>
<organizationUrl>http://www.p.lodz.pl</organizationUrl>
<timezone>CET</timezone>
<roles>
<role>kierownik projektu</role>
<role>pracownik</role>
</roles>
</developer>
</developers>
Informacje o projekcie: summary
• Dane podstawowe o projekcie
<name>Test</name>
<description>Opis projektu</description>
<url>http://strona_domowa_projektu</url>
• Warto wpisać dane jednostki organizacyjnej. Informacja ta jest
umieszczana dodatkowo w wielu raportach np.: javadoc
<organization>
<name>Technical University of Lodz</name>
<url>http://www.p.lodz.pl</url>
</organization>
Informacje o projekcie: scm
• Wyświetlane są podstawowe informacje o systemie scm
użytym w projekcie, oraz jak z niego korzystać. Wymaga
podania stosownych url w sekcji scm:
<scm>
<connection>scm:svn:svn://adres_repozytorium</connection>
<url>http://adres_www_repozytorium</url>
</scm>
• Można też w tej sekcji ustalić developerConnection dla
scm. Ten url wykorzystywany jest przy operacjach zapisu
• connection jest tylko dla operacji oczytu
• url jest wykorzystywany w wielu raportach do
podlinkowania plików źródłowych (o ile w ogóle system
scm udostępnia pliki np. po http)
Informacje o projekcie: scm
• Skonfigurowanie sekcji scm pozwala z poziomu
Maven wykonywać operacje w systemie scm np.
commit, update itd.
• Wiele innych wtyczek bazuje na scm
Raporty na stronie projektowej
• W sekcji <reporting> można dodać wiele wtyczek
generujących pożyteczne raporty. We wcześniej
przedstawionym przykładzie znajdował się mavenjavadoc-plugin
• W większości z nich należy zwrócić uwagę na sposób
kodowania źródeł i sposób kodowania generowanego
raportu. Domyślnie przyjmowane jest ISO-8859-1
• Do ustalenia tych wartości warto zdefiniować w pliku
pom parametry np. <source.enc> czy też <source.ver>,
jak w przykładzie na kolejnym slajdzie. Parametry te
powinny być także użyte np. w konfiguracji mavencompiler-plugin
Problemy przy generowaniu strony
• Z uwagi na złożoność generowania strony
projektowej, może pojawić się wyjątek
OutOfMemoryError. Należy wtedy zmienić
ustawienia maszyny wirtualnej dla maven
set MAVEN_OPTS=-Xmx1024m -Xms512m XX:PermSize=256m -XX:MaxPermSize=512m
mvn site
PRACA Z REPOZYTORIUM
Konfiguracja klienta svn po ssh
• Założenia
– Dostęp do repozytorium poprzez svn+ssh
– Uwierzytelnianie z wykorzystaniem klucza prywatnego
• Potrzebne są następujące programy
– klient subversion (np. Collabnet)
– putty (do konfiguracji ssh)
– plink (do utworzenia połączenia ssh)
– puttygen (gdy chcemy generować klucze)
Konfiguracja klienta svn po ssh
• Wygodnie jest do PATH dodać ścieżkę do katalogu z
zainstalowanymi programami putty, puttygen i plink (w tym
przypadku nawet bardzo wskazane) oraz svn
• W profilu użytkownika w Application Data\Subversion
(%APPDATA%\Subversion) znajduje się plik konfiguracyjny
config. Ustawienia można także wprowadzić z poziomu
rejestru – patrz plik README
• Domyślnie svn poszukuje ssh do nawiązania połączenia
svn+ssh. Zmieniamy to na plink.exe w sekcji [tunnels]
[tunnels]
ssh = plink.exe
Konfiguracja połączenia svn po ssh
• Uruchomić putty
• Skonfigurować sesję
– Session:
• hostname: uzytkownik@serwer
• connection type: SSH
• session name: nazwa_sesji
– Connection/SSH
• Wybrać wersję protokołu – najlepiej v2
– Connection/SSH/Auth
• Wskazać lokalizację pliku z kluczem prywatnym
• Zapisać sesję z poziomu Session
Test i konfiguracja maven
• Wykonać dowolne polecenie svn na repozytorium np.:
svn ci svn+ssh://nazwa_sesji/lokalizacja_repo
• Konfiguracja maven:
<scm>
<connection>scm:svn:svn+ssh://nazwa_sesji/lokalizacja_repo</connection>
<developerConnection>scm:svn:svn+ssh://nazwa_sesji/lokalizacja_repo</deve
loperConnection>
<url>http://nazwa_serwera_web_svn/lokalizacja_repo</url>
</scm>
• Wykonać polecenie:
mvn scm:checkin -Dmessage="test"
• Jeżeli wszystko przebiegło pomyślnie oznacza to, że maven został
prawidłowo skonfigurowany do pracy z repozytorium
BUDOWA PLANOWANEGO
WYDANIA APLIKACJI
Konfiguracja wtyczki maven-release-plugin
• Przez „wydanie” rozumiemy utworzenie
planowanej finalnej wersji projektu
• Jeżeli skonfigurowano projekt zgodnie z
wcześniejszymi slajdami to jest on praktycznie
gotów do użycia tej wtyczki
• Wtyczka nie wymaga wtedy dodatkowej
konfiguracji, aczkolwiek można to zrobić.
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.0-beta-9</version>
</plugin>
Cele wtyczki
release:clean – usunięcie informacji (dodatkowych plików)
po wykonaniu release:prepare
release:prepare – przygotowanie wydania w SCM.
release:rollback – wycofanie zmian z ostatniego wydania
release:perform – wykonanie wydania z systemu SCM
release:stage – wykonanie wydania do innego repozytorium
albo katalogu
release:branch – utworzenie rozgałęzienia aktualnego
projektu z aktualizacją numerów wersji
Przygotowanie wydania, cel: prepare
• Sprawdzenie zgodności źródeł z repozytorium (<scm>)
• Zmiana numerów wersji w plikach pom.xml (część
interaktywna, możliwy jest tryb wsadowy)
• Zmiana informacji w <scm> tak aby odpowiadała nowej
lokalizacji wydania w repozytorium, np. w systemie svn
katalog tags
• Wykonanie testów
• Zatwierdzenie zamian w repozytorium (tags)
• Podniesienie numerów wersji z jednoczesnym dodaniem
SNAPSHOT
• Zatwierdzenie zmian w repozytorium dla wersji rozwojowej
np. w systemie svn katalog trunk
Inne przydatne cele projektowe
• Po wykonaniu celu prepare dobrze jest wykonać clean,
celem usunięcia tymczasowych kopii plików pom.xml i
informacji o przygotowanym ostatnim wydaniu
• W przypadku problemów z dokończeniem przygotowania
wydania, gdy wykonane zostały zmiany w repozytorium
można wycofać te zmiany przy pomocy celu rollback
• Można jednak po dokonaniu poprawek w konfiguracji
kontynuować przygotowanie wydania przy pomocy celu
prepare (takie jest domyślne ustawienie dla wtyczki, które
oczywiście można zmienić)
Wydanie projektu, cel: perform
Pobranie ostatniego wydania projektu
Wykonanie celów:
– deploy – umieszczenie artefaktów projektowych w
repozytorium maven
– site-deploy – umieszczenie strony projektowej na
dedykowanym serwerze
HUDSON
„Ręczna” integracja
Automatyczna integracja
Ciągła integracja
CI, Ciągła integracja (ang. Continous Integration)
– zestaw zaleceń i praktyk, które mają skrócić
czas
dostarczenia
oprogramowania
do
użytkowników dzięki usprawnieniu integracji
kodu.
CI - zalety
• Repozytorium kodu
• Automatyzacja build-ów
• Automatyzacja testów
• Commit codziennie, build co noc
• Izolacja środowiska testowego od produkcyjnego
• Szybkie build-y, wyniki dostępne dla każdego
• Automatyzacja instalacji
Systemy CI
Hudson - https://hudson.dev.java.net
Apache Continuum - http://continuum.apache.org
CruiseControl - http://cruisecontrol.sourceforge.net/
LuntBuild - http://luntbuild.javaforge.com/
TeamCity http://www.jetbrains.com/teamcity/index.html
CI - 2008
CI - 2009
Hudson - instalacja i uruchomienie
• Instalacja:
java -jar hudson.war
deploy w kontenerze Tomcat
• Dostęp: http://localhost:8080
HUDSON - zalety
• Prosta instalacja,
• Prosta obsługa,
• Możliwość obsługi dowolnych projektów (Ant,
Maven, Make),
• Powiadomienia przez RSS/email/komunikator,
• Build-y w środowisku rozproszonym,
• Wtyczki wyświetlające raporty, metryki itp.,
• Wykresy w postaci trendów.
Wtyczki
• SCM - integracja z systemami zarządzania kodem (inne niż SVN, CVS),
• Build triggers - wyzwalacze,
• Build tools - integracja z narzędziami do buildów,
• Build wrappers - dodatkowe operacje przed / po buildzie,
• Build notifiers - dodatkowe powiadomienia,
• Slave controllers - dodatkowe opcje zarządzania
• rozproszeniem obliczeń,
• Build reports - raporty, statystyki, wykresy,
• External site integrations - integracja z systemami zewn. Np. JIRA,
• Artifact uploaders - zarządzanie artefaktami,
• Page decorators - ozdobniki.
Tworzenie zadania Hudson‘a (1)
• Mając już gotowy projekt wraz z działającym skryptem budującym
należy utworzyć zadanie Hudsona:
• z głównego panelu sterowania Hudson wybieramy opcję New Job
• określamy nazwę dla tworzonego zadania
• wybieramy free-style jako rodzaj projektu i przechodzimy do
następnego ekranu, gdzie wpiszemy pozostałe szczegóły
• wybieramy system kontroli wersji z którego będzie korzystał Hudson
(w naszym przypadku będzie to Subversion)
• jako warunek wywołania procesu integracji (Build Triggers)
wybieramy cykliczne odpytywanie repozytorium (Poll SCM)
• w harmonogramie wpisujemy łańcuch znaków zgodny z formatem
crond (np. */2 * * * * – odpytywanie co 2 minuty)
Tworzenie zadania Hudson‘a (2)
następnie definiujemy, co właściwie będzie oznaczać dla Hudson‘a
zbudowanie aplikacji – w naszym przypadku chcemy, aby było to
wywołanie przy pomocy Ant‘a domyślnego celu zdefiniowanego w
skrypcie budowania (zaznaczamy Invoke Ant)
przyszedł czas na określenie czynności, które zostaną wykonane po
zakończeniu budowania aplikacji – zgodnie z wcześniejszymi
ustaleniami będzie interesowało nas:
zachowanie artefaktów (validator.jar) z procesu budowania (Archive the artifacts)
opublikowanie wyników testów jednostkowych (Publish JUnit test result report)
opublikowanie wyników pokrycia kodu testami (Record Emma coverage report)
opublikowanie wyników sprawdzenia jakości kodu przy użyciu checkstyle‘a (Report
violations)
wysłanie informacji o integracji, która się nie powiodła (E-mail Notification)
Dodatkowe zdania
uzyskanie zbudowanej wersji aplikacji z
konkretnego build‘a
analiza zmienności w czasie różnych parametrów
opisujących aplikację w celu określenia trendów
(np. procentowe pokrycie testami kodu
źródłowego)
zatwierdzenie zmian w repozytorium, które
spowodują niebudowanie się aplikacji
spowoduje wysłanie maila na wskazany adres
Podsumowanie
Hudson stanowił bardzo ważne ogniwo w procesie
wytwarzania, dla większości standardowych
zastosowań powinien być odpowiedni.
pozostając bardzo intuicyjny oraz łatwy w
konfiguracji dostarcza możliwości na zupełnie
wystarczającym poziomie zaawansowania.
Download