Personal tools

Securitatea sistemului de operare (Slackware)

From linux360

Jump to: navigation, search

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.

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

http://www.linuxsecurity.com

http://www.dshield.org

http://www.securitywizardry.com/radar.htm

http://www.incidents.org

http://www.linux-sec.net

http://www.insecure.org