Bezpieczna konfiguracja serwera linuksowego (na przykładzie hostingu na Ubuntu/Debianie) Tomasz Nowak tomasz.nowak@adres.pl AKAICamp #6: Security Poznań, 2015-01-21
Aktualizacja pakietów z błędami bezpieczeństwa Ubuntu: Welcome to Ubuntu 14.04.1 LTS Documentation: https://help.ubuntu.com/ 15 packages can be updated. 0 updates are security updates. apt-get update && apt-get upgrade /etc/sources.list deb http://security.debian.org/ testing/updates main contrib non-free /var/spool/cron/crontabs/root: apt-get update -qq Nakładka byobu pokazuje ostrzeżenia o oczekujących aktualizacjach 2015-01-21 AKAICamp #6: Security 2
Konta lokalne Usuwać konta tymczasowe Hasła generować, np. pwgen 12 -y Skonfigurować moduł spr. siły haseł: libpam-passwdqc Silne skróty kryptograficzne mechanizmu shadow (wtedy wyciek backupu /etc nie da dostępu) /etc/pam.d/common-password password [...] pam_unix.so obscure sha512 rounds=20000 /etc/shadow root:$6$rounds=20000$xi34htvy$mjg..:15643:0:99999:7::: Poblokować dostępy do usług lokalnych (np. stworzyć pliki /etc/cron.allow, /etc/at.allow) Ustawić minimalne uprawnienia dla wszelkich plików i katalogów Poprawić UMASK (np. z 022 na 077): pam_umask lub ~/.bashrc Używać mechanizmu sudo (zamiast konta root ) 2015-01-21 AKAICamp #6: Security 3
Rzut oka na listę usług sieciowych # netstat -tulnp (TCP, UDP, listening, numeric, PIDs) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 633/sshd tcp6 0 0 :::22 :::* LISTEN 633/sshd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1352/apache2 tcp6 0 0 :::80 :::* LISTEN 1352/apache2 tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 1332/dnsmasq tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 21463/cupsd tcp 0 0 10.8.0.22:11224 0.0.0.0:* LISTEN 7252/java tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1459/postgres udp 0 0 0.0.0.0:38753 0.0.0.0:* 1216/avahi-daemon: udp 0 0 0.0.0.0:56511 0.0.0.0:* 28055/dhclient udp 0 0 0.0.0.0:44861 0.0.0.0:* 16841/openvpn Wyłączyć usługi niepotrzebne na serwerze, usługi konfigurujące serwer z zewnątrz Uwaga na usługi na interfejsach: 0.0.0.0 / :: IPv6?... Wyłączyć lub pamiętać o ip6tables 2015-01-21 AKAICamp #6: Security 4
# ps faxu Rzut oka na listę procesów postgres 1459 sty08 0:05 /usr/lib/postgresql/8.4/bin/postgres -D /var/lib/postgresql/8.4/main -c config_file=/etc/postgresql/8.4/main/postgresql.conf dnsmasq 1332 sty08 0:06 /usr/sbin/dnsmasq --keep-in-foreground --enable-dbus -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -r /var/run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49a root 1195 sty08 0:01 /usr/sbin/cron -f daemon 1196 sty08 0:00 /usr/sbin/atd -f redis 1245 sty08 11:04 /usr/bin/redis-server 127.0.0.1:6379 root 24764 19:57 0:00 /usr/sbin/apache2 -k start www-data 24768 19:57 0:00 \_ /usr/sbin/apache2 -k start www-data 24769 19:57 0:00 \_ /usr/sbin/apache2 -k start root 1189 sty08 0:00 /usr/lib/bluetooth/bluetoothd root 1326 sty08 0:01 /usr/sbin/cups-browsed root 1327 sty08 0:13 /usr/sbin/rsyslogd -n Zgodność z przeznaczeniem serwera: niepotrzebne procesy wyłączamy Ważne: cmdline i ścieżki do plików konfiguracyjnych Kształt drzewa procesów zależności 2015-01-21 AKAICamp #6: Security 5
Konfiguracja SSH /etc/default/ssh (plik wczytywany z /etc/init.d/ssh zmienna SSHD_OPTS) /etc/ssh/sshd_config (ścieżka wkompilowana) AddressFamily inet # tzn. tylko IPv4 ListenAddress 10.0.5.1 # sieć wewn. Port 45279 PermitRootLogin no # albo without-passwo StrictModes yes # spr.upr. ~/.ssh/authorized_keys PermitEmptyPasswords no 2015-01-21 AKAICamp #6: Security 6
PostgreSQL: Role Based Access Control Poziomy obiektów w PostgreSQL: Instance Database Schema Table/View/... Role dostępne są na poziomie instance i opisują uprawnienia ( privileges ) do obiektów na niższych poziomach; mają przypisane hasło Przykłady uprawnień: CONNECT, CREATE, SELECT, INSERT, UPDATE, DELETE Role mają też przypisane ustawienia (dostępna pamięć itp.) SELECT * FROM pg_settings where context='user'; Role jako grupy: GRANT group_role TO role1,... ; 2015-01-21 AKAICamp #6: Security 7
PostgreSQL RBAC: zalecenia Oddzielna rola z CONNECT dla każdej aplikac Jako właściciele obiektów (bazy, tabele,...): role nie pracujące (SELECT/INSERT/...) na danych w tych obiektach Nie przypisywać bezpośrednio uprawnień do obiektów rolom używanym do logowania. Role odpowiadające wzorcom zapytań ( access roles ) zastosować na zasadzie grupy 2015-01-21 AKAICamp #6: Security 8
PostgreSQL: Host Based Access Control Wpisy w pliku /etc/postgresql/8.4/main/pg_hba.conf: # local DATABASE USER METHOD [OPTIONS] # host DATABASE USER CIDR-ADDRESS METHOD [OPTIONS] # hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTIONS] # hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTIONS] local all postgres ident host all all 127.0.0.1/32 md5 Zalecenia usunąć wpisy z METHOD=trust używać wpisów hostssl oddzielne wpisy dla każdego serwera aplikacji (ew. podsieci) tylko dla wybranych ról, tylko dla wybranych baz dostęp przez sieć: METHOD=md5 (nie password ) na końcu pliku wpisać all all 0.0.0.0/0 REJECT 2015-01-21 AKAICamp #6: Security 9
Konfiguracja Apache HTTP Server Wyłączyć nieużywane moduły: a2dismod Zainstalować i włączyć moduł mod-security /etc/apache2/apache2.conf Wyłączyć listowanie katalogów <Directory /var/www/html> Options -Indexes </Directory> Ukryć wersję z nagłówka i błędów: ServerSignature Off ServerTokens Prod Dodatkowe ustawienia: Options -FollowSymLinks -Includes -ExecCGI 2015-01-21 AKAICamp #6: Security 10
Konfiguracja PHP Uwaga na pliki z kodem źródłowym, które użytkownik mógłby pobrać, np. header.inc AddHandler application/x-httpd-php.inc (apache:.htaccess) umieścić powyżej katalogu web root Próby ukrycia technologii expose_php = Off # w /etc/php5/apache2/php.ini zmienić PHPSESSID: session.name (php.ini) lub session_name(...) mod-rewrite: obciąć rozszerzenie skryptów php.ini: Uzupełnić disable_functions : shell_exec, system, exec, link,... display_errors = Off allow_url_fopen = Off allow_url_include = Off file_uploads = Off session.cookie_httponly = 1 2015-01-21 AKAICamp #6: Security 11
SSL /etc/apache2/mods-available/ssl.conf SSLProtocol all -SSLv3 #TLSv1, TLSv1.1, TLSv1 SSLCipherSuite HIGH:!aNULL:!MD5:!RC4 PostgreSQL: konfiguracja systemowa `openssl version -d` ( /usr/lib/ssl/ ) 2015-01-21 AKAICamp #6: Security 12
Centralny serwer logów Zwykle używany jest rsyslog: /etc/rsyslog.{conf,d/*} Reguła na serwerach wysyłających: *.* @192.168.1.1:514 Reguła na serwerze odbierającym: $ModLoad imudp $UDPServerRun 514 $template FILENAME,"/var/log/%fromhost-ip%/syslog.log" *.*?FILENAME 2015-01-21 AKAICamp #6: Security 13
Zapora sieciowa iptables Reguły blokowania połączeń przychodzących, polityka DROP nie wpuszczać połączeń SSH z innych kontynentó Reguły blokowania połączeń wychodzących, polityka DROP, ale wypuścić ruch do: serwerów z aktualizacjami serwera NTP serwera zbierającego logi Jeśli są interfejsy IPv6, to również ip6tables! 2015-01-21 AKAICamp #6: Security 14
fail2ban Monitoruje logi usług oraz systemu i blokuje atakujące adresy IP (używając iptables) W komplecie z filtrami logów dla wielu standardowych usług i akcjami do wykonania 2015-01-21 AKAICamp #6: Security 15
Przydatne narzędzia nmap -p- 192.168.0.x Qualys SSL Test https://www.ssllabs.com/ssltest/ WordPress: http://wpscan.org SMTP: http://mxtoolbox.com 2015-01-21 AKAICamp #6: Security 16