Personal tools

Difference between revisions of "Securitatea sistemului de operare (Slackware)"

From linux360

Jump to: navigation, search
Line 12: Line 12:
 
==Stabilirea parolelor conturilor==
 
==Stabilirea parolelor conturilor==
 
Pentru stabilirea corectă a parolelor conturilor (root sau utilizator) trebuie să aveţi în vedere următoarele:
 
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ă litere mari şi mici, combinate cu caractere alfa-numerice;
+
*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 nu trebuie să conţină numele proprii, date calendaristice sau expresii "din dicţionar", de genul: "user", "mylove", "badboy", etc.;
 
*Parola trebuie schimbată periodic:
 
*Parola trebuie schimbată periodic:
Line 25: Line 25:
 
*rularea unei aplicaţii cu drepturi de root, cu ajutorul <tt>sudo</tt>. 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.
 
*rularea unei aplicaţii cu drepturi de root, cu ajutorul <tt>sudo</tt>. 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 bun:
+
Exemplu de configurare corectă:
 
  %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
 
  %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
 
  %users  ALL=/opt/kde/bin/konqueror,/opt/kde/bin/k3b
 
  %users  ALL=/opt/kde/bin/konqueror,/opt/kde/bin/k3b
Exemplu rău:
+
Exemplu de configurare greşită:
 
  root ALL=(ALL) ALL
 
  root ALL=(ALL) ALL
 
  gabriel ALL=(ALL) ALL
 
  gabriel ALL=(ALL) ALL
Line 40: Line 40:
 
<code>nmap localhost</code>
 
<code>nmap localhost</code>
 
Iată un exemplu, pe o staţie de lucru virtuală:
 
Iată un exemplu, pe o staţie de lucru virtuală:
  Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2006-12-01 20:41 EET
+
  Starting Nmap 4.11 ... at 2006-12-01 20:41 EET
 
  Interesting ports on localhost (127.0.0.1):
 
  Interesting ports on localhost (127.0.0.1):
 
  Not shown: 1668 closed ports
 
  Not shown: 1668 closed ports
Line 60: Line 60:
  
 
Scopul nostru este:
 
Scopul nostru este:
  Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2006-12-01 22:58 EET
+
  Starting Nmap 4.11 ... at 2006-12-01 22:58 EET
 
  All 1680 scanned ports on localhost (127.0.0.1) are closed
 
  All 1680 scanned ports on localhost (127.0.0.1) are closed
 
   
 
   
Line 89: Line 89:
 
Deci, 854 este folosit de rpc.statd, o implementare NSM (Network Status Monitor) pentru protocolul rpc.
 
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);
+
*Î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):
 
*Închideţi serverele (daemon-ii): sshd, bind, cups, dnsmasq, nfsd, rpc, sendmail prin comanda (exemplu pentru sendmail):
 
<code>/etc/rc.d/rc.sendmail stop</code>
 
<code>/etc/rc.d/rc.sendmail stop</code>

Revision as of 10:56, 2 December 2006

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ă.

Î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

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.

Programe specializate

Programe incluse în distribuţie

  • nmap

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.

  • netstat
  • iptraf
  • tcpdump

Programe "out of box"

  • chkrootkit
  • rkhunter
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)
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)

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.