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.