Securitatea sistemului de operare (Slackware)
From linux360
Acest articol tratează aspectele elementare legate de securitatea unei staţii de lucru, pe care a fost instalată distribuţia Slackwarwe Linux 11.0. Regulile de bază explicate aici pot fi aplicabile şi în cazul altor distribuţii Linux, cu specificarea că s-ar putea să existe diferenţe în denumirea sau calea către unele fişiere de configurare menţionate în articol.
Atenţionare!
Acest articol conţine referiri la aplicaţii care, rulate "împotriva" unui alt calculator, sunt sau pot fi interpretate ca fiind:
- scanare a unei reţele de calculatoare, în vederea descoperirii structurii şi serviciilor oferite de serverele acesteia;
- scanare de porturi, în vederea descoperirii de porturi deschise sau filtrate de un firewall, a serviciilor rulate şi a eventualelor breşe de securitate / vulnerabilităţi;
- încercare de obţinere ilegală de drepturi de acces, prin compromiterea conturilor.
Nimic din acest articol nu poate şi nu trebuie interpretat ca o încurajare pentru astfel de acţiuni.
Contents
Stabilirea parolelor conturilor
Pentru stabilirea corectă a parolelor conturilor (root sau utilizator) trebuie să aveţi în vedere următoarele:
- Parola trebuie să aibă o lungime de cel puţin 6 caractere şi trebuie să conţină caractere alfa-numerice, combinate cu caractere speciale (exemplu: #dC$z4A);
- Parola nu trebuie să conţină numele proprii, date calendaristice sau expresii "din dicţionar", de genul: "user", "mylove", "badboy", etc.;
- Parola trebuie schimbată periodic:
- prin stabilirea unei "Expiry date" în momentul creării contului prin comanda adduser
- prin comanda passwd sau passwd <nume_utilizator>
- Parola trebuie memorată, nu scrisă pe birou, pe tastatură, pe suportul de cafea, pe o bucăţică de hârtie lipită de monitor, etc.;
- Parola nu trebuie comunicată nimănui, mai ales prin telefon, e-mail sau alte mijloace de comunicaţii, indiferent dacă sunt sau nu securizate.
Parolele sunt memorate în fişierele /etc/passwd şi /etc/shadow. Există multe mituri legate de aceste fişiere şi parola de root. Adevărul este că, în marea majoritate a cazurilor, conturile au fost compromise datorită nerespectării regulilor elementare enumerate mai sus.
Folosirea contului root
Contul root trebuie folosit numai pentru operaţii de administrare a sistemului. Dacă doriţi să rulaţi temporar o aplicaţie cu drepturi de root, există 2 variante pentru a evita logarea directă ca root:
- logarea temporară cu drepturi de root, prin comanda su, urmată de introducerea parolei de root, apoi de comanda exit;
- rularea unei aplicaţii cu drepturi de root, cu ajutorul sudo. Configurarea acestuia este destul de complicată şi există tendinţa de a permite tuturor aplicaţiilor să ruleze cu drepturi de root, ceea ce nu este indicat. Pentru configurarea sudo, editaţi fişierul /etc/sudoers.
Exemplu de configurare corectă:
%users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom %users ALL=/opt/kde/bin/konqueror,/opt/kde/bin/k3b
Exemplu de configurare greşită:
root ALL=(ALL) ALL gabriel ALL=(ALL) ALL
Actualizarea pachetelor
Menţinerea "up to date" a unui sistem Slackware este una dintre cele mai dificile sarcini. Nu mă refer la upgrade-urile obişnuite de pachete din versiunea curentă (care sunt opţionale), ci la cele cu menţiunea (* Security fix *) din versiunea stabilă. Actualizarea pachetelor cu versiuni noi, în care sunt remediate probleme de securitate, este o condiţie esenţială a securităţii unui sistem Linux.
În afară de aplicaţiile cuprinse în distribuţie (installpkg, removepkg, upgradepkg, pkgtool, slackpkg - din directorul /extra de pe DVD), există aplicaţii care fac această sarcină mai uşoară: swaret, gslapt, slapt-get şi KPackage.
Închiderea serviciilor
Având în vedere că orice serviciu (server, daemon) deschide un port (filtrat sau nu de un firewall), serviciile care nu sunt necesare trebuie închise.
Pentru a vedea ce servicii rulează pe calculatorul dumneavoastră rulaţi comanda:
nmap localhost
Iată un exemplu, pe o staţie de lucru virtuală:
Starting Nmap 4.11 ... at 2006-12-01 20:41 EET Interesting ports on localhost (127.0.0.1): Not shown: 1668 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 37/tcp open time 53/tcp open domain 80/tcp open http 111/tcp open rpcbind 113/tcp open auth 587/tcp open submission 631/tcp open ipp 854/tcp open unknown 953/tcp open rndc 6000/tcp open X11 Nmap finished: 1 IP address (1 host up) scanned in 1.196 seconds
Scopul nostru este:
Starting Nmap 4.11 ... at 2006-12-01 22:58 EET All 1680 scanned ports on localhost (127.0.0.1) are closed Nmap finished: 1 IP address (1 host up) scanned in 0.187 seconds
Acesta este calculatorul meu personal şi are: conexiune la Internet, intefaţă grafică, reţea virtuală în care sunt 3 calculatoare virtuale şi oricare dintre acestea pot accesa Internetul, cu toate că nu am nici un port deschis.
Pentru a închide toate porturile din exemplul de mai sus, urmaţi următorii paşi:
- Pentru a vedea ce serviciu a deschis portul 854, rulaţi comanda:
netstat -teanlp
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN 0 1556 1526/inetd tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 0 1996 1588/sendmail: acce tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 0 1358 1510/rpc.portmap tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 0 3796 1949/X tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 2035 1627/httpd tcp 0 0 0.0.0.0:113 0.0.0.0:* LISTEN 0 1559 1526/inetd tcp 0 0 192.168.102.131:53 0.0.0.0:* LISTEN 0 1587 1534/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 0 1585 1534/named tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 1570 1530/sshd tcp 0 0 0.0.0.0:854 0.0.0.0:* LISTEN 0 1552 1520/rpc.statd tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN 0 1959 1560/cupsd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 0 1995 1588/sendmail: acce tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 0 1589 1534/named
Deci, 854 este folosit de rpc.statd, o implementare NSM (Network Status Monitor) pentru protocolul rpc.
- Închideţi toate porturile deschise prin fişierul de configurare a serverului inetd, /etc/inetd.conf (comentaţi liniile care iniţializează serviciile: time/udp, time/tcp, comsat şi auth);
- Închideţi serverele (daemon-ii): sshd, bind, cups, dnsmasq, nfsd, rpc, sendmail prin comanda (exemplu pentru sendmail):
/etc/rc.d/rc.sendmail stop
chmod 0644 /etc/rc.d/rc.sendmail
- Restartaţi serverul inetd:
/etc/rc.d/rc.inetd stop
/etc/rc.d/rc.inetd start
- Pentru închiderea portului 6000/tcp (port pe care ascultă serverul X) editaţi linia 27 din fişierul /usr/X11R6/bin/startx şi restartaţi serverul X:
Original:
serverargs=""
Modificat:
serverargs="-nolisten tcp"
În acest moment toate porturile sunt închise. Dacă doriţi rularea unui anumit server, acesta trebuie actualizat cu ultimul update, configurat corect, securizat (prin editarea unui fişier de configurare - de exemplu: /etc/ftpusers pentru serverul ftp, /etc/ssh/sshd_config pentru serverul sshd) şi filtrat prin firewall.
Cel mai simplu firewall
Imediat după instalarea sistemului de operare, politica implicită este "ACCEPT", adică sunt permise fără nici o restricţie toate conexiunile INPUT, OUTPUT şi FORWARD.
iptables --list
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
- Pasul 1 - schimarea politicilor INPUT, OUTPUT şi FORWARD în "DROP"
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables --list
Chain INPUT (policy DROP) target prot opt source destination Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination
- Pasul 2 - Stabilirea regulilor pentru OUTPUT
iptables -A OUTPUT -j ACCEPT
- Pasul 3 - Stabilirea regulilor pentru INPUT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Am nevoie de portul 22 deschis pe calculatorul virtual pentru a verifica ce scriu în acest articol:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- Pasul 4 - Crearea unei reguli suplimentare pentru logarea pachetelor respinse de firewall
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix "Alarma:"
iptables -A LOG_DROP -j DROP
- Pasul 5 - Stabilirea pachetelor care vor fi logate
iptables -A INPUT -j LOG_DROP
Iată rezultatul:
iptables --list
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh LOG_DROP all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere Chain LOG_DROP (1 references) target prot opt source destination LOG all -- anywhere anywhere LOG level warning prefix `Alarma: ' DROP all -- anywhere anywhere
Pachetele respinse vor fi logate în /var/log/syslog.
- Pasul 6 - Rularea acestor reguli la bootarea calculatorului:
Adăugaţi toate comenzile de mai sus în fişierul /etc/rc.d/rc.local:
iptables --flush iptables -X iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -N LOG_DROP iptables -A LOG_DROP -j LOG --log-prefix "Alarma: " iptables -A LOG_DROP -j DROP iptables -A INPUT -j LOG_DROP
Dacă aveţi nevoie de cereri/răspunsuri DNS, atunci adăugaţi:
iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -j ACCEPT
Bineînţeles că soluţia cu rc.local nu e elegantă deloc, dar e funcţională. Elegant este crearea unui script rc.firewall, cu opţiuni de start|stop|restart, alocarea de variabile pentru interfeţe (externă şi internă), porturi sigure, etc. Pentru un începător este mult prea mult.
Limitarea accesului
- Configurarea fişierului /etc/hosts.allow
Adăugaţi următoarea linie:
ALL: ALL: DENY
- Configurarea fişierului /etc/hosts.deny
Adăugaţi următoarea linie:
ALL: ALL
- Cine este logat pe calculator
Pentru a vedea cine este logat la un moment dat pe calculator, rulaţi comanda who sau w.
13:09:27 up 11 min, 5 users, load average: 0.01, 0.15, 0.12 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - 13:02 6:31 0.22s 0.02s /bin/sh /usr/X11R6/bin/startx gabriel pts/2 - 13:04 4:53 0.06s 0.03s -bash root pts/3 192.168.102.1 13:05 4:04 0.02s 0.02s -bash gabriel pts/4 192.168.102.1 13:06 2:50 0.02s 0.02s -bash root pts/5 192.168.102.128 13:08 30.00s 0.03s 0.03s -bash
În acelaşi timp, output-ul de mai sus este un exemplu de configurare şi utilizare greşită a unui sistem Linux:
- utilizatorul s-a logat ca root în consolă (tty1), din care a lansat serverul grafic;
- este permisă logarea ca root prin conexiune ssh.
Pentru a închide conexiunile ssh din exemplul de mai sus, rulaţi netstat -teanpl
tcp 0 0 192.168.102.131:22 192.168.102.1:36597 ESTABLISHED0 3218 1288/3 tcp 0 0 192.168.102.131:22 192.168.102.128:2760 ESTABLISHED0 4038 1321/5 tcp 0 0 192.168.102.131:22 192.168.102.1:42057 ESTABLISHED0 3619 1305/sshd: gabriel
şi cu comanda kill închideţi procesele 3218, 4038, 3619:
Connection to 192.168.102.131 closed by remote host. Connection to 192.168.102.131 closed.
Pentru a nu mai permite logarea ca root de la distanţă prin ssh, editaţi linia 37 din fişierul de configurare /etc/ssh/sshd_config şi restartaţi serverul sshd:
Linia originală:
#PermitRootLogin yes
Linia modificată:
PermitRootLogin no
Programe specializate
Programe incluse în distribuţie
- nmap (Network Mapper) este o aplicaţie pentru scanarea unei reţele de calculatoare în vederea verificării securităţii acelei reţele. În general oferă informaţii despre: calculatoarele care sunt on-line, ce servicii oferă acestea (inclusiv versiunea acestor servicii), ce sistem de operare folosesc, dacă sunt sau nu protejate de un firewall şi altele.
O scanare nmap trimite către calculatorul ţintă peste 3000 de pachete. Personal, nu cunosc nici un administrator de reţea care să suporte asta. În schimb, această comandă este utilă pentru scanarea propriului computer şi descoperirea porturilor deschise, aşa cum am arătat în exemplele de mai sus. Pentru a rula nmap cu toate opţiuniunile activate trebuie să vă logaţi ca root (su) şi să tastaţi:
nmap -sS -sR -sV -O -PI -PT localhost
- netstat este o aplicaţie care afişează caracteristicile detaliate ale conexiunilor stabilite sau posibil a fi stabilite de un anumit calculator prin interfaţa sa de reţea. Modalitatea de utilizare şi exemple de comenzi au fost prezentate în secţiunile anterioare.
- iptraf este o aplicaţie de monitorizare a traficului pe interfeţele de reţea de pe un calculator, în plus poate genera statistici generale sau detaliate despre traficul pe o anumită interfaţă de reţea sau pe toate interfeţele de reţea. Poate salva informaţiile captate în /var/log/iptraf/ip_traffic-1.log.
- tcpdump afişează informaţii despre pachetele care trec printr-o interfaţă de reţea şi îndeplinesc o anumită condiţie stabilită de utilizator. Informaţiile pot fi salvate ca fişier text, pentru o analiză ulterioară.
Programe "out of box"
- Ethereal (Wireshark) este o aplicaţie complexă de captură, analiză şi comparaţie a traficului pe o interfaţă de reţea.
- chkrootkit şi rkhunter sunt aplicaţii specializate în detectarea vulnerabilităţilor unui calculator (rootkit-uri, fişiere înlocuite, sume de control modificate, etc). Iată un fragment din output-ul unei comenzi rkhunter --checkall:
System checks * Allround tests Checking hostname... Found. Hostname is MyLinuxBox Checking for passwordless user accounts... OK Checking for differences in user accounts... Found differences Info: ---------------------- < gabriel:x:1000:100:Gabriel:/home/gabriel:/bin/bash > gabriel:x:1000:100:Gabriel,,,:/home/gabriel:/bin/bash * Check: SSH Searching for sshd_config... Found /etc/ssh/sshd_config Checking for allowed root login... Watch out Root login possible. Possible risk!
- TARA (Tiger Analytical Research Assistant) este un auditor de securitate locală. Mai jos este un exemplu din fişierul-raport:
Security scripts *** 3.0.2 ARC, 2002.0513.2100 *** Sat Dec 2 02:05:53 EET 2006 02:05> Beginning security report for MyLinuxBox (i686 Linux 2.6.17.13). # Performing check of passwd files... # Performing check of group files... # Performing check of user accounts... # Checking accounts from /etc/passwd. --WARN-- [acc001w] Login ID mysql is disabled, but still has a valid shell. # Checking accounts from /etc/passwd... # Performing check of /etc/default/login, /securetty, and /etc/ttytab... # Performing check of PATH components... # Only checking user 'root' --WARN-- [path002w] /usr/bin/nn in root's PATH from default is not owned by root (owned by news). # Performing check of system file permissions... --WARN-- [perm001w] /etc/fstab should not have group read. --WARN-- [perm001w] /etc/fstab should not have world read.
- snort + mysql + ACID (BASE) este o combinaţie de aplicaţii pentru:
- detectarea intruziunilor;
- salvarea informaţiilor într-o bază de date;
- analiza, compararea, sortarea informaţiilor cu ajutorul unei interfeţe web.
Ce facem când e prea târziu?
De regulă este prea târziu atunci când:
- comanda nestat arată conexiuni "Established", cu user 0 (root) pentru servicii/programe pe care nu le-aţi iniţiat dumneavoastră;
- comanda top arată suprasolicitarea procesorului sau memoriei de către aplicaţiile de reţea;
- blocări frecvente ale calculatorului la aplicaţii care înainte nu aveau probleme de rulare;
- pierderi de date, imposibilitatea accesării unor partiţii, reducerea fără un motiv evident a spaţiului liber de pe partiţii;
- comanda nmap arată alte porturi deschise, în special (dar nu obligatoriu) porturi mai mari de 1024;
- fişierul /var/log/secure nu mai există, a fost modificat sau în el apar înregistrări valide la ore când nimeni nu putea fi logat la calculator;
- nu mai există fişierul /var/log/wtmp;
- la rulare, rkhunter/chkrootkit descoperă sume MD5 incorecte, fişiere modificate, rootkit-uri, log-uri suspecte, etc.
Dacă securitatea sistemului dumneavoastră a fost compromisă nu mai puteţi face aproape nimic. Înlocuirea fişierelor modificate cu altele originale (de pe CD-urile/DVD-ul distribuţiei) este doar o soluţie temporară, pentru că nu vă rezolvă problema de securitate şi nu vă garantează că peste un timp nu se va repeta. În funcţie de nivelul de cunoştinţe pe care îl aveţi şi de importanţa informaţiilor care sunt pe acel calculator, puteţi alege să nu deconectaţi imediat calculatorul de la Internet/reţeaua locală, pentru că, esenţial în astfel de cazuri este analiza detaliată a sistemului, cu ajutorul fişierelor rămase în /var/log (în acel calculator sau în altele din reţea) sau cu un program specializat (de exemplu, The Sleuth Kit + Autopsy), pentru a stabili cauza compromiterii sistemului:
- un alt calculator din reţeaua locală a fost compromis;
- un cont de utilizator a fost compromis;
- aţi comis o greşeală de configurare a unui serviciu;
- aţi comis o greşeală de configurare în stabilirea regulilor de acces prin firewall;
- aţi avut o aplicaţie cu o vulnerabilitate majoră care a fost exploatată,
eventual, încercaţi să stabiliţi o listă de adrese IP suspecte, de unde ar fi putut fi generat atacul.
Link-uri utile
http://tldp.org/HOWTO/Security-HOWTO