Bezpieczeństwo Linuksa i BSD
od podstaw
Karol Przystalski
alidej at flatpla.net
Mirosław Szot
mss at kozieglowy.one.pl
http://czlug.icis.pcz.pl/
Źródła problemów
●
luki w oprogramowaniu
●
lekkomyślność użytkowników i/lub
administratorów
●
błędy w konfiguracji
Polityka bezpieczeństwa
●
aktualizacje oprogramowania
●
regularne backupy
●
analiza logów
●
audyt automatyczny i ręczny
●
bez kompromisów
●
“odrobina paranoi nigdy nie boli”
Skąd intruz czerpie informacje
●
skanowanie portów (powolne i rozproszone)
●
fingerprinting
●
bugtraq
●
social engineering
●
google ;)
bugtraq i security advisories
●
http://securityfocus.com/
●
http://www.cert.org/advisories/
●
http://ccteam.org/index.php?name=bugtraq
●
http://www.freebsd.org/security/
●
http://www.freshports.org/
●
http://slackware.com/security/
●
http://www.debian.org/security/
Użytkownicy i grupy
$ id janek
uid=1001(janek) gid=1000(users) grupy=5(tty),7(lp),10(wheel),20(games),
23(audio),24(video),31(console),1000(users)
janek:x:1001:1000:Jan Kowalski:/home/users/janek:/bin/ksh
wheel::10:root,janek
# ls l /dev/sound/mixer
crwrw 1 root audio 14, 0 20050315 08:15 mixer
Fragment pliku /etc/group:
Fragment pliku /etc/passwd:
Przykład wykorzystania grup do przydziału uprawnień:
Przydatne polecenia:
usermod(8), vipw(8), vigr(8), pwck(1) Linux
pw(8), vipw(8), chpass(8) FreeBSD
Administrator root
Dlaczego nie powinno się pracować jako użytkownik root:
# rm rf / smieci/*
drobne przeoczenie
auth required pam_wheel.so group=wheel
Ograniczanie su(1) z użyciem PAM(8), fragment /etc/pam.d/su:
Sposób na podział zadań administratora:
sudo(8), visudo(8), sudoers(5)
PermitRootLogin no
w openssh
Uprawnienia plików i katalogów
crw-rw---- 1 root audio 14, 0 20050315 08:15 /dev/sound/mixer 0660
rw
s
r-xr-x
1 root root 27332 20041023 13:28 /usr/bin/passwd
4
755
drwxrwxrw
t
8 root root 351 20050315 12:37 /tmp
1
777
7 7 7
r = 4
w = 2
x = 1
właściciel (user) grupa (group)
inni (other)
rwx rwx rwx
7
suid = 4000
sgid = 2000
sticky = 1000
Przydatne polecenia:
chown(1), chgrp(1), chmod(1) Linux
chown(8), chgrp(1), chmod(1) FreeBSD
Programy suid/sgid
●
Program suid uruchomiony działa z uprawnieniami właściciela pliku
wykonywanego.
●
Luka w programie suidroot może być wykorzystana do uzyskania
uprawnień administratora.
# find / perm +6000 type f
# ls l /bin/mount
rwsrxrx 1 root root 72520 20050108 15:54 /bin/mount
# chmod s /bin/mount
Tak możemy znaleźć wszystkie programy suid/sgid:
A tak po zastanowieniu możemy zrezygnować z suid:
umask
0666 & ~022 = 0644 = rwrr
$ umask
022
$
touch plik1; ls l plik1
-rw-r--r--
1 janek users 0 20050315 12:41 plik1
$ umask
000
$ touch plik2; ls l plik2
-rw-rw-rw-
1 janek users 0 20050315 12:41 plik2
$ umask
077
$ touch plik3; ls l plik3
-rw-------
1 janek users 0 20050315 12:42 plik3
domyślne uprawnienia
wybierane przez open(2)
dla nowych plików
umask wybrany przez użytkownika
uprawnienia nowego pliku
Atrybuty plików
●
schg, uchg
●
sappnd, uappnd
●
sunlnk, uunlnk
●
i – immutable
●
a – append only
# chattr +i /boot/vmlinuz
# chattr i /boot/vmlinuz
FreeBSD
Linux (ext2/ext3)
# chflags schg /boot/kernel/* /boot/kernel
# touch /boot/kernel/kernel
touch: /boot/kernel/kernel: Operation not permitted
# ls lo /boot/kernel/kernel
rxrxrx 1 root wheel schg 3,6M 10 Gru 17:10 /boot/kernel/kernel*
# chflags noschg /boot/kernel/* /boot/kernel
chattr(1), lsattr(1), lcap(8)
Poziomy bezpieczeństwa FreeBSD
●
1 – insecure – domyślnie po instalacji
●
0 – zmieniany na 1 po wejściu w tryb wielu użytkowników
●
1 – zakaz ładowania/usuwania modułów, zakaz zmian znaczników plików,
zakaz bezpośredniego zapisu do pamięci (/dev/mem) i zamontowanych
dysków.
●
2 – zakaz bezpośredniego zapisu do niezamontowanych dysków, zakaz
zmiany czasu więcej niż o 1 sekundę
●
3 – tryb sieciowy – zakaz zmian reguł filtrów IPFW i IPFilter
Przykład wykorzystania
# sysctl a | grep securelevel
kern.securelevel: 1
# chflags noschg /boot/kernel/kernel
chflags: /boot/kernel/kernel: Operation not permitted
# sysctl kern.securelevel=1
kern.securelevel: 1
sysctl: kern.securelevel: Operation not permitted
Wady:
●
nie wolno pominąć żadnego z plików uruchamianych przy starcie!!
●
zarządzanie jest uciążliwe
●
na poziomie 3 nie można przerwać aktywnego ataku przez dodanie
reguły do firewalla
Access Control Lists
# /sbin/tunefs -a enable /home
/dev/ad0s1g /home ufs rw,nosuid,nodev,acls 1 2
●
Zapewniają bardziej szczegółową kontrolę uprawnień plikowych
●
Nie ograniczają konta root!
●
Samba z obsługą ACL pozwala na ich edycję z poziomu systemu
Windows
Uaktywnienie ACL w systemie FreeBSD (tryb singleuser):
Uaktywnienie przez edycję /etc/fstab:
Wykorzystanie ACL
/home# chmod
og-rwx
janek/
/home# setfacl m
u:www:x
janek/
/home# ls ldo janek/
d
rwx--x---
+
2 janek users 1,5K 15 Mar 19:00 janek/
/home# getfacl janek
#file:janek
#owner: 1001
#group: 1000
user::rwx
user:www:--x
group::
mask::x
other::
/home# id rysio
uid=1009(rysio) gid=1000(users) groups=1000(users)
/home# sudo u rysio ls l janek/public_html/index.html
ls: janek/public_html/index.html:
Permission denied
/home# sudo u www ls l janek/public_html/index.html
rwrr 1 janek users 2012 11 Mar 13:12 janek/public_html/index.html
Chcemy lepiej zabezpieczyć katalogi użytkowników posiadających strony
Demony samodzielne
●
w Slackware (/etc/rc.d/*) kontrolowane przez
atrybut +x
●
/etc/rc[06].d z System V kontrolowane przez
chkconfig (redhat, pld), updaterc.d (debian)
●
/etc/rc.conf.* w BSD
Przykład użycia
# chkconfig list httpd
httpd 0:nie 1:nie 2:nie 3:tak 4:tak 5:tak 6:nie
# chkconfig del httpd
# chkconfig list httpd
httpd 0:nie 1:nie 2:nie 3:nie 4:nie 5:nie 6:nie
Należy wyłączyć niepotrzebne usług lub je odinstalować
chkconfig(8)
Narzędzia debiana: updaterc.d(8), invokerc.d(8), rcconf
Zapracowany root i nobody
●
należy ograniczyć liczbe demonów działających
na prawach root i nobody
●
usługi powinne mieć przydzielonych
użytkowników o minimalnych przywilejach
●
do poszukiwań można wykorzystać lastcomm(1)
i sa(8) z BSD System Accounting
superserwer inetd
●
pozwala na łatwą, zcentraliziowaną kontrolę
drobnych usług
●
sam inetd nie jest niebezpieczny
pop3 stream tcp nowait root /usr/sbin/spop3d spop3d f /etc/spop3d.conf
nazwa usługi z pliku /etc/services
stream, dgram, raw...
przy dgram np. wait.40
może być user.group
pełna ścieżka do demona
argv[]
TCP Wrappers
●
pośredniczy w komunikacji między inetd a
serwerem
●
może byc wykorzystany w samodzielnych
demonach za pomocą biblioteki libwrap
●
pozwala na szczegółową kontrolę dostępu za
pomocą prostych reguł
tcpd lub libwrap
comsat dgram udp wait root /usr/sbin/tcpd in.comsat
# ldd /usr/sbin/inetd | grep wrap
libwrap.so.3 => /usr/lib/libwrap.so.3 (0x2808d000)
comsat dgram udp wait tty:tty /usr/libexec/comsat comsat
W Linuksie musimy jawnie użyć pośrednika tcpd:
We FreeBSD inetd został połączony z bilioteka libwrap:
Przykładowa konfiguracja demona w FreeBSD:
Uwaga: zależnie od dystrybucji z tą biblioteką może być połączony
demon sshd.
Konfiguracja w Linuksie
ALL : localhost 127.0.0.1 [::1]
vsftpd: ALL EXCEPT 192.168.1.15
sshd : ALL
fingerd : 192.168.1.
auth : ALL
vsftpd : ALL : (/usr/sbin/safe_finger l @%h | /usr/bin/mail s %d%h root) &
ALL : ALL
hosts.allow
hosts.deny
hosts_access(5)
Konfiguracja w FreeBSD
ALL : PARANOID : RFC931 20 : deny
ALL : localhost 127.0.0.1 [::1] : allow
vsftpd: ALL : allow
sshd : ALL : allow
comsat : 127.0.0.1 : allow
fingerd : 192.168.1. : allow
auth : ALL : allow
fingerd : ALL \
: spawn (echo Finger. | \
/usr/bin/mail s "tcpd\: %u@%h[%a] fingered me!" root) & \
: deny
ALL : ALL : severity auth.info \
: twist /bin/echo "You are not welcome to use %d from %h."
FreeBSD używa tylko jednego pliku hosts.allow
hosts_access(5)
jak testować?
# tcpdmatch auth@1.2.3.4 rysio@jegodomena.pl
client: hostname jegodomena.pl
client: address 2.3.4.5
client: username rysio
server: hostname serwer.mojadomena.pl
server: address 1.2.3.4
server: process auth
matched: /etc/hosts.allow line 5
option: allow
access: granted
tcpdcheck(8) sprawdza poprawność plików konfiguracyjnych
a tcpdmatch(8) pozwala przetestować reguły
xinetd ulepszony inetd
●
kontrola dostępu bez użycia tcpwrappers
●
kontrola logowania
●
reguły przekazywania
●
kontrola dostępu na podstawie czasu,
obciążenia, itp.
●
i dużo więcej
konfiguracja xinetd.conf
service ftp
{
socket_type = stream
protocol = tcp
flags = NOLIBWRAP
disable = no
port = 21
user = root
server = /usr/sbin/vsftpd
wait = no
nice = 10
only_from = 192.168.1. 127.0.0.1
no_access = 192.168.1.15
access_times = 7:0019:00
log_type = SYSLOG local3 notice
instances = 15
log_on_success = USERID DURATION TRAFFIC
bind = 192.168.1.1
load = 2.5
}
Niepotrzebne usługi
●
sendmail
●
nfs, rpc: portmap, statd, idmapd
●
telnetd
●
rzadko używane usługi z inetd.conf: tftpd, time,
finger, talkd, chargen, echo, itp.
●
rużytki (rsh, rcp...)
Zabezpieczanie X Window System
Jeżeli nie korzystamy z sieciowych funkcji Xów możemy wyłączyć
nasłuch tcp:
alias x='startx -nolisten tcp &'
# cat /usr/lib/X11/xdm/Xservers
:0 local /usr/X11R6/bin/X vt9 -nolisten tcp
Można też przekazać parametry do używanego X Display Managera:
Pomocne narzędzia
netstat – informacje związane z siecia
# netstat tnelp
Active Internet connections (only servers)
Proto RecvQ SendQ Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN 1001 14999 6768/psi
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 0 2348 1403/xinetd
...
t – tcp, u – udp, w raw
# netstat unix p
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State INode PID/Program name Path
unix 2 [ ] DGRAM 1696 808/udevd @udevd
unix 3 [ ] STREAM CONNECTED 16545 6748/Xwrapper /tmp/.X11unix/X0
unix 3 [ ] STREAM CONNECTED 16544 7141/rxvt
...
fuser(1), netstat(8)
# fuser uvn tcp 8010
UŻYTKOWNIK PID DOSTĘP POLECENIE
8010/tcp janek 6768 f.... psi
Narzędzia w FreeBSD
FreeBSD dysponuje sporą liczbą narzędzi posiadających bardzo dużo
ciekawych opcji:
●
netstat – potężne narzędzie ;)
●
sockstat – informacje otwartych gniazdkach
●
fstat – informacje o otwartych plikach
# sockstat 4l p 6080
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
dhcpd dhcpd 28450 5 udp4 192.168.1.1:67 *:*
www httpd 21151 3 tcp46 *:80 *:*
www httpd 21140 3 tcp46 *:80 *:*
root httpd 20579 3 tcp46 *:80 *:*
Inne
●
lsof(8) – lista otwartych plików
●
sa(8) i lastcomm(1) – rozliczanie systemowe
●
nessus
●
nmap
Monitoring i audyt
●
kontrola integralności plików (integrit, tripwire,
aide)
●
John the ripper – lepiej znajdźmy złe hasła
zanim znajdzie je intruz
●
analiza logów – swatch, logcheck lub własne
rozwiązania w Perlu
●
snort, prelude – Intrusion Detection System
Bind DNS
●
ograniczyć rekurencyjne zapytania do autoryzowanych
hostów (np. tylko z LAN)
●
zezwolić na transfery stref tylko z serwerów podrzędnych
●
zadbać o konfiguracje serwerów podrzędnych
●
zabezpieczyć dynamiczne aktualizacje
●
zabezpieczyć klasę CHAOS za pomocą widoków
●
TSIG i DNSSEC
# dig @ns1.twojadomena.pl txt chaos version.BIND
# dig @ns1.twojadomena.pl txt chaos authors.BIND
Apache httpd
●
wyłączyć wszystkie zbędne i nieużywane moduły
●
ukryć wersje za pomoca ServerTokens i ServerSignature
●
ograniczyć automatyczne indeksowanie do śledzonych
przez nas katalogów
●
ograniczyć lub wyłączyć konfigurację na poziomie
plików .htaccess
●
zabezpieczyć się przed źle skonfigurowanymi klientami
SSL za pomocą SSLRequireSSL
Gdy musimy zezwolić
●
SymlinksIfOwnerMatch zamiast FollowSymLinks
●
IncludesNOEXEC zamiast Includes
●
Ostrożnie z AllowOverride
●
Zabezpieczyć CGI i SSI za pomocą suEXEC
●
Pliki z hasłami tylko poza katalogami serwowanymi
PHP
●
php_admin_flag i php_admin_value
●
engine = On tylko dla potrzebujących
●
safe_mode = On
●
expose_php = Off
●
display_errors = Off i log_errors = On
●
register_globals = Off
●
file_uploads = Off
●
allow_url_fopen = Off
●
disable_functions = system,exec,passthru,popen,phpinfo,ini_set
Ściany ogniowe w warstwie sieci
w Linuxie
●
netfilter/iptables
w *BSD
●
ipfw
●
ipfilter
http://coombs.anu.edu.au/~avalon/
●
pf – ulepszony ipfilter dla OpenBSD
także dla Linux
Serwery proxy
●
Squid
●
Privoxy
●
DNRD
●
Jftpgw
●
mod_proxy (moduł apache)
http://www.squidcache.org/
http://www.privoxy.org/
http://dnrd.nevalabs.org/
http://www.mcknight.de/jftpgw
Iptables – Zasada działania
FORWARD
OUTPUT
INPUT
Proces lokalny
Wychodzący
[Decyzja rutingu]
Ruch
przychodzący
Stateful inspection
●
Śledzi i zapamiętuje sesje
●
Zapobiega spoofingowi
●
Defragmentuje pakiety
●
Może działać również z UDP i ICMP
Ściana ogniowa dla stacji roboczej
insmod ip_conntrack
insmod ip_conntrack_ftp
iptables N access
iptables A access m state state ESTABLISHED,RELATED j ACCEPT
iptables A access m state state NEW i ! eth0 j ACCEPT
iptables P INPUT DROP
iptables P FORWARD DROP
iptables A INPUT j access
iptables A FORWARD j access
http://lukasz.bromirski.net/docs/translations/linux24pf.html
Do czego nie służy firewall?
Firewall nie służy jako zabezpieczenie z
zewnątrz.
Funkcją firewalla jest przede wszystkim
filtracja pakietów.
Przed czym nie chroni nas firewall?
●
Sniffing
●
Ataki typu DoS
●
Ataki typu Man in the middle
●
hijacking
●
Dziury (exploity)
Wykrywanie skanowania
●
scanlogd
●
Portsentry
●
Scandetector
●
icmpinfo
http://www.psionic.com/tools/
ftp://coast.cs.purdue.edu/pub/COAST/tools/
ftp://hplyot.obspm.fr/net/
Metody skanowania
●
Ping scanning
●
TCP connect() scan
●
TCP SYN scan
●
TCP FIN scan
●
FTP bounce attack
●
UDP scan
●
ACK scan
●
IP.ID scan
Wady i zalety Portsentry
Zalety:
●
Wykrywa skanowanie
●
Zapobiega dalszemu skanowaniu
Wady:
●
Nie zapobiega atakom
Wykryj dziury zanim ktoś zrobi to
za Ciebie ;)
Skanery:
●
SAINT (Security Administrator's Integrated Network Tool )
●
ISS (Internet Security Scanner)
●
Nessus
●
Nmap (the Network Scanner)
http://www.wwdsi.com/saint
http://iss.net/
http://www.nessus.org/
http://www.insecure.org/nmap
Security by obscurity ;)
●
Ignorowanie pingów
●
Ignorowanie skanowania portów
●
Close SourceSoftware
●
Hasła :)
Wady
●
reverseengineering
●
rezygnacja z funkcjonalności
Fingerprinting – jak to działa?
Metody:
●
Passive fingerprinting
●
Active fingerprinting
Pola według których identyfikujemy system:
●
Window
●
TTL (Time To Live)
●
DF (Don't fragmentation bit)
●
TOS (Type Of Service)
Fingerprinting ochrona
●
The Kernel OS faker
●
Portsentry
http://www.hit2000.org/kosf/
http://www.psionic.com/abacus/portsentry
p0f – Teraz Polska
Wykrywanie maskarady:
# p0f M i eth0
lub dodając kilka opcji można też tak:
# p0f Mlp i eth0
A tak uruchamiamy p0f jako demona:
# p0f i eth0 o /var/log/p0f.log qdMF \
“not dst port ( 135 or 137 or 139 or 445 )”
Public Key Infrastructure
●
Urzędy certyfikujące (Certification Authority)
●
Urzędy rejestracyjne (Registration Authority)
●
Subskrybenci certyfikatów
●
Oprogramowanie
Zasada działania dwóch kluczy.
1. Osoba A generuje swój klucz publiczny i wysyła go do osoby B.
2. Osoba B wysyła zaszyfrowaną wiadomość M oraz zaszyfrowaną
wartość C do osoby A.
3. Osoba A mając wartość C odszyfrowywuje wiadomość
wykorzystując klucz prywatny.
Co zawiera certyfikat?
●
Podpisany klucz publiczny
●
Nazwa (nazwa firm, osoby, komputera)
●
Termin ważności
●
URL
http://openssl.org/
Zasada działania
Secure Sockets Layer
●
Ustanawianie parametrów sesji
–
Klient wysyła żądanie do serwera
–
Serwer wysyła proponowane parametry
–
Klient odsyła odpowiedź
●
Ustanawianie klucza sesyjnego
–
Serwer wysyła swój certyfikat
–
Klient weryfikuje autentyczność certyfikatu
–
Klient wydobywa klucz publiczny serwera
–
Klient generuje losową wartość i tworzy z niej pojedyńczą, dużą
liczbę
Zasada działania SSL cd.
–
Klient szyfruje losową liczbę kluczem publicznym serwera
–
Klient wysyła wysyła zaszyfrowaną liczbę
–
Serwer używając swojego klucza prywatnego (RSA)
odszyfrowuje liczbę wygenerowaną przez klienta
–
Zaszyfrowana losowa liczba jest używana do niezależnego
generowania tajnych kluczy sesji (RC4)
–
Serwer uwierzytelnia się wobec klienta, udowiadniając, że
wygenerował identyczny tajny klucz
Zasada działania SSL cd.
●
Szyfrowana sesja
–
Komunikacja klientserwer przy użyciu tajnego
klucza RC4
Pułapki SSL
●
Wirusy, trojany, spyware (w Linuksie :D)
●
Ataki typu Man in the Middle
Osoba A
Osoba B
Osoba C (?)
Pretty Good Privacy na przykładzie
GNU Privacy Guard
Otwarty zamiennik PGP rozwijany przez Free
Software Foundation i wspierany przez rząd
niemiecki.
Używany algorytm szyfrowania to obecnie
przede wszystkim AES.
http://www.gnupg.org/
GPG w praktyce
Generujemy swoją parę kluczy.
Wybieramy typ klucza.
Wybieramy długość klucza.
Wybieramy kiedy klucz ma
wygasnąć.
Podajemy identyfikator klucza.
Podajemy hasło do klucza
prywatnego.
gpg –genkey
(1) DSA and ElGamel (default)
What keysize do you want? (1024)
Key is valid for ? (0)
Is this correct?
Pozostałe bezpieczne protkoły
●
SSL (Secure Sockets Layer)
●
TLS (Transport Layer Security)
●
SASL (Simple Authentication and Security
Layer)
●
SSH (Secure Socket Shell)
Szyfrowane systemy plików
●
Ncryptfs
●
Avfs
●
Cryptoloop
●
vnd (OpenBSD)
●
EFS
●
StegFS
http://www.filesystems.org/
co dalej?
●
chroot, jail, usermode Linux
●
stackguard, openwall, grsecurity, libsafe
●
NSA SELinux, TrustedBSD MAC Framework
●
rexec i CerbNG