Manual pentru Securitate în Gentoo
Conţinut:
A. Securitatea Sistemului
1. Preocupări Înainte de Instalare
1.a. Securitatea Fizică
Nu contează câte protecţii implementaţi, pentru că acestea pot fi uşor dejucate
de un atacator ce deţine acces fizic la maşina dvs. În ciuda acestora, există
un număr de măsuri de precauţie ce pot fi aplicate pentru a oferi un grad de
securitate împotriva atacatorilor ce deţin acces fizic la maşina dvs. Plasarea
sistemelor dvs. hardware într-un loc încuiat previne ca atacatorul să îl
deconecteze şi să îl sustragă. Încuierea maşinii este, de asemenea, o idee bună
pentru a vă asigura faptul că atacatorul nu va pleca împreună cu discul dvs.
Pentru a preveni un atacator să boot-eze de pe alt disc, şi să vă modifice
permisiunile şi restricţiile de login, încercaţi să setaţi discul ca primul
dispozitiv de boot din BIOS şi să setaţi o parola pentru BIOS. Este, de
asemenea, important să setaţi o parolă de boot pentru LILO sau GRUB, pentru a
preveni un utilizator cu caracter maliţios în a-şi obţine accesul complet în
sistemul dvs. Aceasta este acoperită mai în detaliu în Capitolul 3, la Setarea unei parole pentru
GRUB şi and Setarea unei
parole pentru LILO.
1.b. Planificarea Aplicaţiilor Daemon/Serviciilor
Începeţi prin documentarea serviciilor pe care această maşină ar trebui să le
ruleze. Aceasta vă va ajuta să compuneţi o schemă de partiţionare mai bună
pentru sistemul dvs. şi să vă permită să vă planificaţi măsurile de securitate.
Bineînţeles, acest lucru nu este necesar dacă maşina serveşte unui scop simplu,
cum ar fi un desktop sau un firewall dedicat. În aceste cazuri, nu ar trebui să
rulaţi nici un serviciu, exceptând, poate, sshd.
Această listă poate fi utilizată pentru a ajuta administrarea sistemului. Prin
păstrarea unei liste curente a informaţiilor despre versiuni, vă va fi mult mai
uşor să păstraţi totul la zi dacă o vulnerabilitate este descoperită pentru una
din aplicaţiile dvs. daemon.
1.c. Scheme de Partiţionare
Reguli de partiţionare:
-
Orice structură de directoare în care un utilizator de sistem ar trebui să
poată scrie (spre ex. /home, /tmp) ar trebui să se
afle pe o partiţie separată şi să utilizaţi cotele de disc. Aceasta reduce
riscul ca utilizatorul să vă umple întregul sistem de fişiere. Portage
utilizează /var/tmp pentru a compila fişierele, deci acea
partiţie trebuie să fie mare.
-
Orice structură de directoare pe care plănuiţi să instalaţi aplicaţii ce nu
aparţin distribuţiei ar trebui să se afle pe o partiţie separată. Conform
Standardului Ierarhiei
Fişierelor, acesta este /opt sau /usr/local.
Dacă acestea sunt partiţii separate, nu vor fi şterse în momentul
reinstalării sistemului.
-
Pentru o mai bună securitate, datele statice pot fi stocate pe o partiţie
separată ce este mount-ată doar pentru citire (read-only). Pentru cei cu
adevărat paranoici, încercaţi să utilizaţi medii doar citibile, cum ar fi
mediile CDROM.
1.d. Utilizatorul root
Utilizatorul 'root' este cel mai vital utilizator din sistem şi nu trebuie
folosit în nici un scop decât atunci când este neapărat necesar. Dacă un
atacator obţine acces root, singura modalitate prin care mai puteţi avea
încredere în sistem este reinstalarea.
Reguli de aur pentru 'root'
-
Întotdeauna creaţi un utilizator de sistem pentru întrebuinţarea zilnică şi,
dacă acest utilizator necesită acces la root, adăugaţi utilizatorul în grupul
'wheel'. Aceasta face posibil ca un utilizator obişnuit să efectueze
su pentru root.
-
Niciodată nu rulaţi X sau orice altă aplicaţie ca root. root ar trebui să fie
utilizat doar în cazul în care absolut necesar acest lucru; dacă există o
vulnerabilitate în aplicaţia ce rulează ca utilizator, un atacator obţine
doar acces utilizator. Dar, dacă aplicaţie rulează ca root, atacatorul obţine
acces root.
-
Întotdeauna utilizaţi căi absolute în timp ce sunteţi autentificat ca root
(sau întotdeauna folosiţi su -, ce înlocuieşte variabilele de mediu
ale utilizatorului cu cele pentru root, în timp ce sunteţi sigur că variabila
PATH pentru root conţine doar directoare protejate, cum ar fi
/bin şi /sbin). Este posibil să fie păcălit
utilizatorul root în rularea unei alte aplicaţii decât cea care o doreşte.
Dacă variabila PATH a utilizatorului root este protejată sau acesta
utilizează numai căi absolute, ne putem asigura că această problemă nu se va
întâmpla.
-
Dacă un utilizator doreşte să ruleze doar câteva comenzi ca root, în locul
acţiunilor obişnuite ale utilizatorului root, luaţi în considerare utilizarea
sudo în loc. Trebuie doar să fiţi atenţi cui daţi acces, de asemenea.
-
Niciodată nu părăsiţi terminalul când sunteţi autentificaţi ca root.
Gentoo are o protecţie implicită împotriva utilizatorilor de sistem obişnuiţi
ce încearcă să execute su către root. Setările PAM implicite necesită ca
un utilizator să fie membru al grupului "wheel" pentru a putea efectua
su.
1.e. Politici de Securitate
Există mai multe motive pentru care trebuie să concepeţi o politică de
securitate pentru sistemele şi reţeaua dvs.
-
O politică solidă vă permite să conturaţi securitatea ca un "sistem" decât
doar un set de diferite caracteristici. Spre exemplu, fără o politică, un
administrator poate decide să închidă accesul telnet, pentru că transmite
parole necriptate, dar să lase deschis accesul ftp, ce deţine aceeaşi
slăbiciune. O politică bună de securitate vă permite să identificaţi măsurile
ce merită aplicate şi cele care nu.
-
Pentru a diagnostica problemele, conduce audituri sau depista intruşii, este
posibil să trebuiască să interceptaţi traficul prin reţea, să inspectaţi
istoricul autentificărilor şi comenzilor utilizatorilor şi să analizaţi
directoarele home. Fără ca dvs. să conturaţi aceste acţiuni prin tipărire şi
să îi înştiinţaţi pe utilizatori despre ele, acestea pot fi chiar ilegale şi
vă pot pune pe dvs. în pericol.
-
Conturile de utilizator compromise reprezintă unele din cele mai comune
ameninţări securităţii unui sistem. Fără a explica utilizatorilor importanţa
securităţii şi cum să practice o securitate solidă (spre ex. să nu-şi scrie
parolele pe un bilet Post-It lipit pe biroul acestora), este foarte puţin
probabil că dvs. veţi putea spera în securizarea conturilor de utilizator.
-
O reţea şi structură de sisteme bine documentată vă va ajuta, alături de
examinatorii juridici pentru aplicarea legilor, dacă sunt necesari, în
urmărirea intruziunii şi identificarea punctelor slabe după fapt. Un afiş
despre "probleme" pentru politica de securitate, prin care să afirmaţi că
sistemul dvs. este o reţea privată şi orice acces neautorizat este interzis,
vă vor ajuta să asiguraţi posibilitatea de a acţiona în judecată un intrus,
după ce este prins.
Nevoia unei securităţi solide este, sperăm, acum, mult mai clară.
Politica efectivă, este un document, sau mai multe documente, ce evidenţiază
caracteristicile reţelei şi ale sistemului (cum ar fi serviciile oferite),
utilizarea acceptabilă şi utilizarea interzisă, "practici solide" de
securitate, şi aşa mai departe. Toţi utilizatorii ar trebui înştiinţaţi atât de
politica dvs. de securitate, cât şi de modificările aduse acesteia în vederea
actualizării. Este important să vă acordaţi timp pentru a ajuta utilizatorii
despre politica dvs., precum şi motivul pentru care politica trebuie semnată
sau ce se întâmplă dacă acţionează împotriva politicii (politica trebuie să
precizeze şi acest aspect). Aceasta trebuie repetată o dată pe an, deoarece
politica se poate modifica (dar şi ca o reamintire a politicii utilizatorului).
Notă:
Creaţi politici ce sunt uşor de citit şi foarte precise pentru fiecare subiect.
|
O politică de securitate ar trebui să conţină, cel puţin, următoarele subiecte:
- Utilizare acceptabilă
- Aplicaţii Screen saver
- Manipularea parolei
- Descărcarea şi instalarea aplicaţiilor
- Informaţii ce menţionează că utilizatorii sunt monitorizaţi
- Utilizarea de aplicaţii anti-virus
- Manipularea informaţiei sensibile (în orice formă scrisă, hârtie sau format digital)
- Curăţarea biroului şi încuierea informaţiilor confidenţiale
- Oprirea sistemului PC înainte de a părăsi spaţiul
- Utilizarea encripţiei
- Manipularea cheilor colegilor de încredere
- Manipularea materialului confidenţial în călătorii
- Manipularea echipamentului de calculator în călătorii
- Manipularea sistemului laptop în călătorii şi staţionările la hoteluri
Utilizatori diferiţi pot necesita nivele sau tipuri diferite de acces, deci
politica dvs. poate varia în acest pentru a acoperi toate aceste situaţii.
Politica de securitate poate deveni foarte mare în conţinut, iar informaţiile
vitale pot fi uşor uitate. Politica pentru personalul IT poate conţine
informaţii ce sunt confidenţiale pentru utilizatorul obişnuit, fiind vitală
împărţirea acesteia în mai multe politici mai mici; spre ex. Politica de
Utilizare Acceptabilă, Politica pentru parole, Politica pentru Mesageria
Electronică şi Politica pentru Accesul la Distanţă.
Puteţi găsi exemple de politici de securitate la Proiectul de Politici de
Securitate al SANS. Dacă aveţi o reţea mică şi consideraţi că aceste
politici sunt prea elaborate, ar trebui să consultaţi Site-ul Manualului de
Securitate.
2. Sporirea securităţii
2.a. Indicatori USE
Fişierul make.conf conţine indicatori USE setaţi de utilizator şi
/etc/make.profile/make.defaults conţine indicatorii USE impliciţi
pentru Gentoo Linux. Relativ la scopul acestui ghid, indicatorii USE importanţi
sunt pam (Pluggable Authentication Modules), tcpd (TCP wrappers),
şi ssl (Secure Socket Layer). Toate acestea sunt între indicatorii USE
impliciţi.
2.b. Portejarea cu parolă a aplicaţiei GRUB
GRUB suportă două soluţii de adăugare a protecţiei cu parolă pentru aplicaţia
bootloader. Prima utilizează textul simplu, în timp ce a doua utilizează
encripţia md5+salt.
Cod 2.1: /boot/grub/grub.conf |
timeout 5
password changeme
|
Aceasta va adăuga parola changeme. Dacă nu este introdusă nici o parolă
la boot, GRUB va utiliza setarea de boot implicită.
La adăugarea unei parole md5, trebuie să convertiţi parola dvs. în formatul
crypt, care este acelaşi cu formatul utilizat în /etc/shadow.
Pentru mai multe informaţii consultaţi man crypt. Parola criptată va
arăta în felul următor: $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs.
Vă puteţi cripta parola dvs. direct în shell-ul GRUB:
Cod 2.2: md5crypt în shell-ul grub |
#/sbin/grub
GRUB version 0.92 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB lists
possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub> md5crypt
Password: ********
Encrypted: $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs.
grub> quit
|
Apoi, efectuaţi cut şi paste pentru parolă în
/boot/grub/grub.conf.
Cod 2.3: /boot/grub/grub.conf |
timeout 5
password --md5 $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs.
|
Timpul de aşteptare de 5 secunde devine folositor când sistemul este la
distanţă şi trebuie să repornească fără interacţiune de la tastatură. Puteţi
afla mai multe informaţii despre parolele GRUB, executând info grub.
2.c. Projarea cu parolă a aplicaţiei LILO
LILO suportă, de asemenea, două metode de a manipula parolele: global şi pentru
fiecare imagine, amândouă în text clar.
Parola globală este setată în partea superioară a fişierului de configurare şi
se aplică fiecărei imagini de boot:
Cod 3.1: /etc/lilo.conf |
password=changeme
restricted
delay=3
|
Parola pentru fiecare imagine este setabilă, după cum urmează:
Cod 3.2: /etc/lilo.conf |
image=/boot/bzImage
read-only
password=changeme
restricted
|
Dacă opţiunea restricted este introdusă, va cere parola de fiecare dată.
Pentru a stoca noua informaţie din lilo.conf, trebuie să rulaţi
/sbin/lilo.
2.d. Restricţionarea Utilizării Consolei
Fişierul /etc/securetty permite să specificaţi dispozitivele
(terminal) tty în care utilizatorul root are dreptul să se autentifice.
Vă sugerăm să comentaţi toate liniile, cu excepţia vc/1 dacă utilizaţi
devfs şi toate liniile cu excepţia tty1 dacă utilizaţi udev. Aceasta va
asigura ca utilizatorul root să nu poată să se autentifice decât o singură dată
şi doar pe un terminal.
Notă:
Utilizatorii din grupul "wheel" încă pot să ruleze su - pentru a deveni
root pe alte dispozitive TTY.
|
Cod 4.1: /etc/securetty |
vc/1
tty1
|
3. Jurnalizarea
3.a. Introducere
Jurnalizarea suplimentară ar trebui să fie adăugată pentru a cuprinde
avertismentele sau erorile ce pot să indice un atac în desfăşurare sau o
compromitere reuşită. Deseori, atacatorii scanează sau probează înainte de a
ataca.
Este, de asemenea, vital ca fişierele dvs. de jurnalizare să fie uşor citibile
şi manipulabile. Gentoo Linux vă permite să alegeţi între 3 nivele de
jurnalizare diferite în momentul instalării.
3.b. Jurnalizarea: Syslogd
Syslogd este cel mai utilizat sistem de jurnalizare pentru Linux şi, în
general, pentru Unix. Acesta deţine unele facilităţi pentru rotirea fişierelor
jurnal, dar utilizarea /usr/sbin/logrotate prin intermediul cron
(logrotate este configurat din /etc/logrotate.conf) se dovedeşte
mai utilă, deoarece logrotate are multe caracteristici. Cât de des se
poate efectua rotirea fişierelor de jurnal depinde de încărcarea sistemului.
Mai jos, aveţi un fişier syslog.conf standard, cu unele opţiuni
adăugate. Am decomentat liniile cron şi tty şi am adăugat un
server de jurnalizare la distanţă. Pentru îmbunătăţirea securităţii puteţi
adăuga jurnalizarea în două locuri.
Cod 2.1: /etc/syslog.conf |
# /etc/syslog.conf Fişier de configurare pentru syslogd.
#
# Pentru mai multe informaţii consultaţi pagina
# de manual syslog.conf(5).
# Acest fişier este din Debian, îl vom utiliza şi noi de acum încolo
# Daniel Robbins, 5/15/99
#
# Mai întâi câteva fişiere de jurnal standard. Jurnalizăm după funcţie.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* /var/log/mail.log
user.* -/var/log/user.log
uucp.* -/var/log/uucp.log
local6.debug /var/log/imapd.log
#
# Jurnalizarea pentru sistemul de poştă electronică. Împărţiţi-l pentru a scrie
# mai uşor script-uri de analizare a acestor fişiere.
#
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
# Jurnalizarea pentru sistemul de ştiri INN
#
news.crit /var/log/news/news.crit
news.err /var/log/news/news.err
news.notice -/var/log/news/news.notice
#
# Unele fişiere jurnal pentru cuprinderea tuturor informaţiilor.
#
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
#
# Situaţiile critice şi alertele sunt trimise tuturor utilizatorilor autentificaţi.
#
*.emerg *
*.=alert *
#
# Îmi place să mi se afişeze mesaje în consolă, dar doar într-o consolă
# virtuală pe care, de obicei, o las nefolosită.
#
daemon,mail.*;\
news.=crit;news.=err;news.=notice;\
*.=debug;*.=info;\
*.=notice;*.=warn /dev/tty8
# Setarea unui server de jurnalizare la distanţă
*.* @logserver
# Pipa denumită /dev/xconsole este utilizată pentru utilitarul `xconsole'. Pentru a
# o folosi, trebuie să invocaţi `xconsole' cu opţiunea `-file' option:
#
# $ xconsole -file /dev/xconsole [...]
#
# NOTĂ: ajustaţi lista următoare, sau veţi avea probleme în cazul în care aveţi
# un site destul de încărcat..
#
#daemon.*,mail.*;\
# news.crit;news.err;news.notice;\
# *.=debug;*.=info;\
# *.=notice;*.=warn |/dev/xconsole
local2.* --/var/log/ppp.log
|
Cel mai probabil, atacatorii vor încerca să îşi şteargă urmele prin editarea
sau ştergerea fişierelor de jurnalizare. Le puteţi îngreuna acţiunile prin
jurnalizarea într-unul sau mai multe server-e de jurnalizare pe alte maşini.
Pentru a afla mai multe informaţii despre syslogd, puteţi rula man
syslog.
3.c. Metalog
Metalog de Frank Dennis nu
poate jurnaliza pe un server la distanţă, dar este avantajos în momentul în
care sunt luate în calcul performanţa şi flexibilitatea jurnalizării. Poate
jurnaliza după numele aplicaţiei, urgenţă, funcţie (ca syslogd), şi deţine un
modul de căutare cu expresii regulate cu care puteţi lansa aplicaţii externe
când anumite combinaţii potrivite. Este foarte bun la acţionare în momentul în
care este necesar.
Configurarea standard este, de obicei, de ajuns. Dacă doriţi să fiţi notificat
printr-un mesaj de câte ori cineva greşeşte parola, utilizaţi unul din
următoarele script-uri.
Pentru postfix:
Cod 3.1: /usr/local/sbin/mail_pwd_failures.sh pentru postfix |
#! /bin/sh
echo "$3" | mail -s "Warning (program : $2)" root
|
Pentru netqmail:
Cod 3.2: /usr/local/sbin/mail_pwd_failures.sh pentru netqmail |
#!/bin/sh
echo "To: root
Subject:Failure (Warning: $2)
$3
" | /var/qmail/bin/qmail-inject -f root
|
Amintiţi-vă să faceţi script-ul executabil prin executarea /bin/chmod +x
/usr/local/sbin/mail_pwd_failures.sh
Apoi, decomentaţi linia de sub "Password failures" din
/etc/metalog/metalog.conf ca:
Cod 3.3: /etc/metalog/metalog.conf |
command = "/usr/local/sbin/mail_pwd_failures.sh"
|
3.d. Syslog-ng
Syslog-ng are aproape aceleaşi caracteristici ca syslog şi metalog cu o mică
diferenţă. Poate filtra mesajele pe baza nivelului şi conţinutului (ca
metalog), oferă jurnalizare la distanţă, ca syslog, poate manipula jurnale din
syslogd (chiar şi fluxurile de caractere - eng. streams - din Solaris), să
scrie în terminal, să execute programe, şi să se comporte ca un server de
jurnalizare. În fapt, este cel mai bun dintre cele două sisteme de jurnalizare
combinat cu o configuraţie avansată.
Aveţi mai jos un fişier de configurare clasic, puţin modificat.
Cod 4.1: /etc/syslog-ng/syslog-ng.conf |
options { chain_hostnames(off); sync(0); };
#sursa de unde să citească jurnalele
source src { unix-stream("/dev/log"); internal(); };
source kernsrc { file("/proc/kmsg"); };
#definirea destinaţiilor
destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination cron { file("/var/log/cron.log"); };
destination daemon { file("/var/log/daemon.log"); };
destination kern { file("/var/log/kern.log"); };
destination lpr { file("/var/log/lpr.log"); };
destination user { file("/var/log/user.log"); };
destination mail { file("/var/log/mail.log"); };
destination mailinfo { file("/var/log/mail.info"); };
destination mailwarn { file("/var/log/mail.warn"); };
destination mailerr { file("/var/log/mail.err"); };
destination newscrit { file("/var/log/news/news.crit"); };
destination newserr { file("/var/log/news/news.err"); };
destination newsnotice { file("/var/log/news/news.notice"); };
destination debug { file("/var/log/debug"); };
destination messages { file("/var/log/messages"); };
destination console { usertty("root"); };
destination console_all { file("/dev/tty12"); };
destination xconsole { pipe("/dev/xconsole"); };
#crearea filtrelor
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_user { facility(user); };
filter f_debug { not facility(auth, authpriv, news, mail); };
filter f_messages { level(info..warn)
and not facility(auth, authpriv, mail, news); };
filter f_emergency { level(emerg); };
filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
filter f_failed { match("failed"); };
filter f_denied { match("denied"); };
#conectarea filtrelor şi destinaţiilor
log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(syslog); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_daemon); destination(daemon); };
log { source(kernsrc); filter(f_kern); destination(kern); };
log { source(src); filter(f_lpr); destination(lpr); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_user); destination(user); };
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); };
log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };
log { source(src); filter(f_debug); destination(debug); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };
#jurnalul implicit
log { source(src); destination(console_all); };
|
Syslog-ng este foarte uşor de configurat, dar şi foarte uşor de omis ceva în
fişierul de configurare, deoarece este mare. Autorul încă promite unele
caracteristici în plus, cum ar fi encripţia, autentificarea, compresia şi
controlul MAC (Mandatory Access Control - Controlul Accesului Obligatoriu). Cu
aceste opţiuni, va fi un sistem de jurnalizare în reţea perfect, deoarece un
atacator nu poate spiona jurnalul.
Şi syslog-ng mai are un alt avantaj: nu trebuie rulat ca root!
3.e. Analiza jurnalelor cu Logcheck
Bineînţeles, păstrarea tuturor jurnalelor separat este doar jumătate din toată
munca. O aplicaţie precum Logcheck, poate efectua analize de jurnal regulate
mult mai uşor. Logcheck este un script însoţit de un binar denumit
logtail, ce rulează prin intermediul aplicaţiei dvs. cron şi verifică
jurnalele după unele reguli ce definesc activitatea suspectă. Apoi, acesta
trimite ceea ce afişează prin poştă electronică utilizatorului root.
Logcheck şi logtail fac parte din pachetul app-admin/logsentry.
Logcheck utilizează patru fişiere pentru a filtra intrările importante din
fişiere de cele neimportante. Aceste fişiere sunt
logcheck.hacking, ce conţine mesaje legate de mesaje de atac
cunoscute, logcheck.violations, ce conţine combinaţii indicând
violări ale securităţii, logcheck.violations.ignore, ce conţine
cuvinte cheie ce pot fi găsite prin intermediul fişierului de violări,
permiţând intrărilor normale să fie ignorate şi logcheck.ignore,
care conţine modele ale acelor intrări care trebuie ignorate.
Atenţie:
Nu lăsaţi fişierul logcheck.violations.ignore gol. Logcheck
utilizează grep pentru a analiza jurnalele, unele versiuni ale acestuia
considerând un fişier gol ca fiind orice. Astfel, toate violările vor fi
ignorate.
|
4. Mount-area partiţiilor
4.a. Mount-area partiţiilor
Când mount-aţi o partiţie ext2, ext3 sau reiserfs aveţi
câteva opţiuni pe care le puteţi aplica în fişierul /etc/fstab.
Aceste opţiuni sunt:
-
nosuid - Va ignora bitul SUID şi îl va considera ca pe un fişier
obişnuit
-
noexec - Va preveni execuţia fişierelor de pe această partiţie
-
nodev - Ignoră fişierele dispozitiv
Din păcate, aceste setări pot fi înşelate cu uşurinţă prin execuţia unei căi
indirecte. Oricum, setarea /tmp ca noexec va opri majoritatea
aplicaţiilor exploit să fie executate direct din /tmp.
Cod 1.1: /etc/fstab |
/dev/sda1 /boot ext2 noauto,noatime 1 1
/dev/sda2 none swap sw 0 0
/dev/sda3 / reiserfs notail,noatime 0 0
/dev/sda4 /tmp reiserfs notail,noatime,nodev,nosuid,noexec 0 0
/dev/sda5 /var reiserfs notail,noatime,nodev 0 0
/dev/sda6 /home reiserfs notail,noatime,nodev,nosuid 0 0
/dev/sda7 /usr reiserfs notail,noatime,nodev,ro 0 0
/dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0
proc /proc proc defaults 0 0
|
Atenţie:
Setarea /tmp în modul noexec poate opri execuţia corectă a
unor script-uri.
|
Notă:
Pentru cote de disc, consultaţi secţiunea
despre Cote.
|
Notă:
Personal, nu setez /var ca noexec sau nosuid, chiar
dacă fişierele normale nu sunt executate din acest director de mount. Motivul
este faptul că netqmail este instalat în /var/qmail şi îi trebuie
permisă execuţia şi accesarea unui fişier SUID. În schimb, setez
/usr doar pentru citire (eng. read-only) deoarece nu scriu
niciodată în această locaţie, decât când actualizez Gentoo. Apoi, remount-ez
sistemul de fişiere şi pentru scriere (eng. read-write), îl actualizez şi îl
remount-ez încă o dată.
|
Notă:
Chiar dacă nu utilizaţi netqmail, Gentoo tot mai necesită bitul pentru execuţie
setat pentru /var/tmp doarece pachetele ebuild sunt compilate în
această locaţie. În schimb, o cale alternativă poate fi setată dacă insistaţi
să aveţi /var mount-at în modul noexec.
|
5. Limitări pentru Utilizatori/Grupuri
5.a. /etc/security/limits.conf
Controlarea utilizării resurselor poate fi foarte efectivă în momentul în care
încercaţi să preveniţi un atac local de tip Denial of Service sau să
restricţionaţi numărul maxim de autentificări pentru un grup sau un utilizator
de sistem. În orice caz, setări prea stricte vor modifica comportamentul
sistemului dvs. şi vor rezulta erori de programe, aşadar asiguraţi-vă că
verificaţi fiecare setare, mai întâi.
Cod 1.1: /etc/security/limits.conf |
* soft core 0
* hard core 0
* hard nproc 15
* hard rss 10000
* - maxlogins 2
@dev hard core 100000
@dev soft nproc 20
@dev hard nproc 35
@dev - maxlogins 10
|
Dacă încercaţi să setaţi nproc sau maxlogins la 0, poate că ar
trebui să ştergeţi utilizatorul, în loc. Exemplul de mai sus defineşte setările
grupului dev relativ la procese, fişiere core şi numărul maxim de
autentificări definit de maxlogins. Restul este setat la o valoare
implicită.
Notă:
/etc/security/limits.conf este componentă a pachetului PAM şi se
aplica doar pachetelor ce utilizează PAM.
|
5.b. /etc/limits
/etc/limits este foarte similar cu fişierul de limite
/etc/security/limits.conf. Singura diferenţă este formatul şi
faptul că funcţionează pentru utilizatori sau modele de potrivire a numelor de
utilizatori (nu şi de grupuri). Haideţi să aruncăm o privire la un exemplu de
configurare:
Cod 2.1: /etc/limits |
* L2 C0 U15 R10000
kn L10 C100000 U35
|
Aici definim setările implicite şi o setare specifică pentru utilizatorul kn.
Fişierul limits face parte din pachetul sys-apps/shadow. Nu este necesar să
setaţi nici o limită în acest fişier dacă aţi dezactivat pam în
make.conf sau nu aţi configurat corect PAM.
5.c. Cote
Atenţie:
Asiguraţi-vă că sistemul de fişiere pe care îl aveţi, suportă cote. Pentru a
utiliza cote pe ReiserFS, trebuie să vă modificaţi sursele de kernel cu unele
patch-uri disponibile de la Namesys.
Utilitare pentru utilizatori sunt disponibile la proiectul Linux DiskQuota. În
timp ce cotele funcţionează pe ReiserFS, este posibil să înregistraţi probleme
în timpul utilizării acestora -- aţi fost înştiintaţi!
|
Aplicarea cotelor pe un sistem de fişiere, restricţionează utilizarea discului
pe baza unor utilizatori sau grupuri. Cotele sunt activate în kernel şi
adăugate într-un director de mount în /etc/fstab. Opţiunea este
activată în configurarea kernel-ului la File systems->Quota support.
Aplicaţi următoarele setări, recompilaţi kernel-ul şi reporniţi utilizând noul
kernel.
Începeţi în a instala cotele prin emerge quota. Apoi, modificaţi
fişierul dvs. /etc/fstab şi adăugaţi usrquota şi
grpquota partiţiilor cărora doriţi să le restricţionaţi utilizarea
discului, ca în exemplul de mai jos.
Cod 3.1: /etc/fstab |
/dev/sda1 /boot ext2 noauto,noatime 1 1
/dev/sda2 none swap sw 0 0
/dev/sda3 / reiserfs notail,noatime 0 0
/dev/sda4 /tmp ext3 noatime,nodev,nosuid,noexec,usrquota,grpquota 0 0
/dev/sda5 /var ext3 noatime,nodev,usrquota,grpquota 0 0
/dev/sda6 /home ext3 noatime,nodev,nosuid,usrquota,grpquota 0 0
/dev/sda7 /usr reiserfs notail,noatime,nodev,ro 0 0
/dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0
proc /proc proc defaults 0 0
|
Pe fiecare partiţie pe care aţi activat cotele, creaţi fişierele de cotă
(aquota.user şi aquota.group) şi copiaţi-le în
rădăcina partiţiei.
Cod 3.2: Crearea fişierelor de cotă |
# touch /tmp/aquota.user
# touch /tmp/aquota.group
# chmod 600 /tmp/aquota.user
# chmod 600 /tmp/aquota.group
|
Acest pas trebuie efectuat pe fiecare partiţie pe care sunt activate cotele.
După adăugarea şi configurarea fişierelor de cotă, trebuie să adăugăm script-ul
de quota în nivelul de iniţializare boot.
Cod 3.3: Adăugarea quota în nivelul de iniţializare boot |
# rc-update add quota boot
|
Acum, vom configura sistemul pentru a verifica cotele odată pe săptămână prin
adăugarea următoarei linii în /etc/crontab:
Cod 3.4: Addăugarea verificării de cotă în crontab |
0 3 * * 0 /usr/sbin/quotacheck -avug.
|
După repornirea maşinii, este timpul să setăm cotele pentru utilizatori şi
grupuri. edquota -u kn va porni editorul definit în $EDITOR (implicit
este nano) şi vă va lăsa să editaţi cotele pentru utilizatorul kn. edquota
-g va efectua aceeaşi acţiune pentru grupuri.
Cod 3.5: Setarea cotelor pentru utilizatorul kn |
Quotas for user kn:
/dev/sda4: blocks in use: 2594, limits (soft = 5000, hard = 6500)
inodes in use: 356, limits (soft = 1000, hard = 1500)
|
Pentru mai multe detalii, consultaţi man edquota sau Mini Ghidul pentru Cote.
5.d. /etc/login.defs
Dacă politica dvs. de securitate indică faptul că utilizatorii ar trebui să-şi
schimbe parola o dată pe săptămână, modificaţi valoarea opţiunii
PASS_MAX_DAYS la 14 şi pe cea a PASS_WARN_AGE la 7. Este
recomandat să utilizaţi învechirea parolei deoarece metodele brute force pot
găsi orice parolă, într-un anumit timp. De asemenea, vă încurajăm să setaţi
LOG_OK_LOGINS la yes.
5.e. /etc/login.access
Fişierul login.access face parte, de asemenea, din pachetul
sys-apps/shadow, ce oferă o tabelă de control al accesului pentru
autentificare. Acest tabel este utilizat pentru a controla cine are şi cine nu
are dreptul să se autentifice pe baza numelui de utilizator, grup sau sistem
gazdă. Implicit, tuturor utilizatorilor din sistem li se permite să se
autentifice, deci fişierul nu conţine decât comentarii şi exemple. Fie că vă
securizaţi server-ul sau staţia de lucru, vă recomandăm să setaţi acest fişier
pentru ca nimeni altcineva decât dvs. (administratorul) să aibă acces la
consolă.
Notă:
Aceste setări nu se aplică utilizatorului root.
|
Cod 5.1: /etc/login.access |
-:ALL EXCEPT wheel sync:console
-:wheel:ALL EXCEPT LOCAL .gentoo.org
|
Important:
Aveţi grijă când configuraţi aceste opţiuni, deoarece greşelile vă pot tăia
accesul la maşină dacă nu aveţi acces root.
|
Notă:
Aceste setări nu se aplică pentru SSH, deoarece SSH nu execută /bin/login
implicit. Aceasta poate fi activată prin setarea UseLogin yes în
/etc/ssh/sshd_config.
|
Aceasta va seta accesul pentru autentificare astfel încât utilizatorii membri
ai grupului wheel să se poată autentifica local din domeniul gentoo.org. Poate
puţin paranoic, dar mai bine să fiţi în siguranţă decât să regretaţi.
6. Permisiunile Fişierelor
6.a. Accesibil tuturor pentru citire
Utilizatorii normali nu ar trebui să aibă acces la fişierele de configurare sau
parole. Un atacator poate sustrage parolele din bazele de date sau site-uri web
şi să le utilizeze pentru compromiterea -- sau chiar mai rău, pentru ştergerea
-- datelor. De aceea este important ca permisiunile fişierelor să fie corecte.
Dacă sunteţi sigur că un fişier este utilizat doar de root, atribuiţi-i
acestuia permisiunile 0600 şi utilizatorul corect cu chown.
6.b. Accesibil pentru scriere tuturor/grupului
Cod 2.1: Găsirea fişierelor şi directoarelor accesibile pentru scriere tuturor |
# /usr/bin/find / -type f \( -perm -2 -o -perm -20 \) \
-exec ls -lg {} \; 2>/dev/null >writable.txt
# /usr/bin/find / -type d \( -perm -2 -o -perm -20 \) \
-exec ls -ldg {} \; 2>/dev/null >>writable.txt
|
Aceasta va crea un fişier imens cu permisiunile tuturor fişierelor ce au
permisiuni de scriere setate, fie pentru grup, fie pentru oricine. Verificaţi
aceste permisiuni şi eliminaţi fişierele accesibile pentru scriere tuturor,
prin execuţia /bin/chmod o-w pentru fişierele respective.
6.c. Fişiere SUID/SGID
Fişierele cu bitul SUID sau SGID setat, execută cu privilegiile utilizatorului
sau grupului proprietar şi nu cu cele ale utilizatorului care execută
acel fişier. În mod normal, aceşti biţi sunt utilizaţi pe fişierele ce trebuie
să ruleze ca root pentru a îşi urma paşii de execuţie firesc. Aceste fişiere
pot conduce la compromiteri de root locale (dacă au probleme de securitate).
Aceasta este periculos şi fişierele cu biţii SUID sau SGID setaţi ar trebui să
fie evitate cu orice preţ. Dacă nu utilizaţi aceste fişiere, executaţi chmod
0 pe ele sau dezinstalaţi pachetul care le conţine (verificaţi cărui pachet
aparţin prin utilizarea equery; dacă nu îl aveţi deja instalat, tastaţi
emerge gentoolkit). Altfel, dezactivaţi bitul SUID cu chmod -s.
Cod 3.1: Găsirea fişierelor setuid |
# /usr/bin/find / -type f \( -perm -004000 -o -perm -002000 \) \
-exec ls -lg {} \; 2>/dev/null >suidfiles.txt
|
Aceasta va crea un fişier conţinând lista tuturor fişierelor cu bitul SUID/SGID
activ.
Cod 3.2: Lista cu binarele setuid |
/bin/su
/bin/ping
/bin/mount
/bin/umount
/var/qmail/bin/qmail-queue
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/crontab
/usr/bin/chage
/usr/bin/expiry
/usr/bin/sperl5.6.1
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/procmail
/usr/bin/suidperl
/usr/lib/misc/pt_chown
/usr/sbin/unix_chkpwd
/usr/sbin/traceroute
/usr/sbin/pwdb_chkpwd
|
Implicit, Gentoo Linux nu are multe fişiere SUID (deşi acest lucru depinde de
pachetele instalate), dar aţi putea să vă creaţi o listă ca cea de mai sus.
Majoritatea comenzilor nu ar trebui să fie rulate de utilizatorii normali, ci
doar de root. Dezactivaţi botul SUID pentru ping, mount,
umount, chfn, chsh, newgrp, suidperl,
pt_chown şi traceroute prin execuţia comenzii chmod -s pe
fiecare fişier în parte. Nu dezactivaţi bitul pentru su,
qmail-queue sau unix_chkpwd. Dezactivarea setuid pentru aceste
fişiere vă va opri să mai puteţi rula su şi recepţionarea mesajelor
electronice. Prin dezactivarea bitului (în cazurile în care este sigur) opriţi
posibilitatea ca un utilizator de sistem normal (sau un atacator) să obţină
acces de root prin oricare din aceste fişiere.
Singurele fişiere SUID pe care le am pe sistemul propriu sunt su,
passwd, gpasswd, qmail-queue, unix_chkpwd şi
pwdb_chkpwd. Dar, dacă rulaţi aplicaţia X, este posibil să aveţi mai
multe, deoarece X are nevoie de acces superior ce îl poate obţine prin
intermediul SUID.
6.d. Binare şi hardlink-uri SUID/SGID
Un fişier este considerat şters când nu mai există nici un link ce indică spre
acesta. Acest concept poate fi ciudat, dar luaţi în considerare un fişier ca
/usr/bin/perl care este, de fapt, un link către inod-ul unde este
stocată data. Orice număr de link-uri pot indica către acest fişier şi până
când toate acestea dispar, fişierul încă există.
Dacă utilizatorii dvs. au acces pe o partiţie ce nu este mount-ată cu
nosuid sau noexec (spre ex., dacă /tmp,
/home sau /var/tmp nu sunt partiţii separate) ar
trebui să vă asiguraţi că utilizatorii nu crează hardlink-uri indicând spre
binare SUID sau SGID, astfel încât, după ce Portage se actualizează, ei încă
mai au acces la vechile versiuni.
Atenţie:
Dacă aţi primit un avertisment de la portage despre unele hardlink-uri rămase
şi utilizatorii dvs. pot scrie pe o partiţie ce permite execuţia fişierelor
SUID/SGID, ar trebui să consultaţi această secţiune cu atenţie. Unul din
utilizatorii dvs. poate încerca să înşele procesul dvs. de actualizare prin
păstrarea unei versiuni vechi a programului. Dacă utilizatorii dvs. nu pot crea
fişierele lor proprii SUID, pot doar să execute programe utilizând modulul de
încărcare dinamică (partiţiile mount-ate noexec), atunci nu aveţi de ce
să vă îngrijoraţi.
|
Notă:
Utilizatorii nu au nevoie de acces de citire pentru un fişier pentru a crea un
link la acesta, ci doar de permisiuni de citire pentru directorul ce conţine
acel fişiere.
|
Pentru a verifica numărul de link-uri al unul fişier, puteţi utiliza comanda
stat.
Cod 4.1: Comanda stat |
$ stat /bin/su
File: `/bin/su'
Size: 29350 Blocks: 64 IO Block: 131072 regular file
Device: 900h/2304d Inode: 2057419 Links: 1
Access: (4711/-rws--x--x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2005-02-07 01:59:35.000000000 +0000
Modify: 2004-11-04 01:46:17.000000000 +0000
Change: 2004-11-04 01:46:17.000000000 +0000
|
Pentru a găsi fişierele SUID şi SGID cu mai multe link-uri, puteţi utiliza
find.
Cod 4.2: Găsirea binarelor suid/sgid cu mai multe link-uri |
$ find / -type f \( -perm -004000 -o -perm -002000 \) -links +1 -ls
|
7. PAM
7.a. PAM
PAM este o suită de librării partajate ce oferă o cale alternativă de
autentificare a utilizatorilor în programe. Indicatorul USE pam este
activ implicit. Astfel, setările PAM din Gentoo Linux sunt destul de
acceptabile, dar este întotdeauna loc de îmbunătăţiri. Mai întâi instalaţi
cracklib.
Cod 1.1: Instalarea cracklib |
# emerge cracklib
|
Cod 1.2: /etc/pam.d/passwd |
auth required pam_unix.so shadow nullok
account required pam_unix.so
password required pam_cracklib.so difok=3 retry=3 minlen=8 dcredit=2 ocredit=2
password required pam_unix.so md5 use_authtok
session required pam_unix.so
|
Aceasta va adăuga cracklib, ce va asigura că parolele utilizatorilor sunt de
minim 8 caractere şi conţin minim 2 cifre, 2 alte caractere şi mai mult de 3
caractere diferite faţă de parola anterioară. Aceasta forţează utilizatorul
să-şi aleagă o parolă bună (politica de parole). Consultaţi documentaţia PAM
pentru mai multe opţiuni.
Cod 1.3: /etc/pam.d/sshd |
auth required pam_unix.so nullok
auth required pam_shells.so
auth required pam_nologin.so
auth required pam_env.so
account required pam_unix.so
password required pam_cracklib.so difok=3 retry=3 minlen=8 dcredit=2 ocredit=2 use_authtok
password required pam_unix.so shadow md5
session required pam_unix.so
session required pam_limits.so
|
Fiecare serviciu ce nu configurat cu un fişier PAM în /etc/pam.d
va utiliza regulile din /etc/pam.d/other. Regulile implicite sunt
să interzică prin directiva deny, aşa cum ar trebui să fie. Dar mie îmi
place să am multe jurnale, motiv pentru care am adăugat pam_warn.so.
Ultima directivă de configurare este pam_limits, ce este controlată de
/etc/security/limits.conf. Consultaţi secţiunea despre
/etc/security/limits.conf pentru mai multe asemenea setări.
Cod 1.4: /etc/pam.d/other |
auth required pam_deny.so
auth required pam_warn.so
account required pam_deny.so
account required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so
session required pam_warn.so
|
8. Aplicaţii Wrapper pentru TCP
8.a. Aplicaţii Wrapper pentru TCP
Aceasta este o modalitate de a controla accesul la servicii, în mod normal
manipulat de inetd (pe care Gentoo nu îl are), dar poate fi utilizat şi de
xinetd şi alte servicii.
Notă:
Serviciul ar trebui să execute tcpd între argumentele sale (în xinetd).
Consultaţi capitolul despre xinetd pentru mai multe informaţii.
|
Cod 1.1: /etc/hosts.deny |
ALL:PARANOID
|
Cod 1.2: /etc/hosts.allow |
ALL: LOCAL @wheel
time: LOCAL, .gentoo.org
|
Aşa cum puteţi observa, formatul este foarte similar cu cel din
/etc/login.access. Tcpd suportă un anumit serviciu; nu se
suprapune cu /etc/login.access. Aceste setări se aplică doar
serviciilor ce utilizează aplicaţii wrapper pentru tcp.
Este, de asemenea, posibil, să executaţi comenzi când un serviciu este accesat
(aceasta poate fi utilizată când activaţi interconectarea pentru utilizatorii
dial-in) dar nu este recomandat, deoarece utilizatorii tind să creeze mai multe
probleme decât încearcă să rezolve. Un exemplu poate fi încercarea de a
configura un script să trimită un mesaj de fiecare dată când cineva se
potriveşte unei reguli de blocare, dar un atacator poate lansa un atac DoS prin
potrivirea continuă a regulii de blocare. Aceasta va crea multe operaţii de ip
I/O şi mesaje, deci nu trebuie să faceţi aşa!. Consultaţi man 5
hosts_access pentru mai multe informaţii.
9. Securitatea pentru Kernel
9.a. Înlăturarea funcţionalităţii
Regula de bază pentru configurarea de kernel este să îndepărtaţi orice nu aveţi
nevoie. Aceasta, nu numai că vă va crea un kernel mic, dar va îndepărta şi
toate vulnerabilităţile ce pot să fie prezente în modulele driver şi în alte
funcţionalităţi.
De asemenea, luaţi în considerare dezactivarea suportului de încărcare a
modulelor. Chiar şi aşa, este posibilă introducerea de aplicaţii root kit fără
suportul acestor funcţionalităţi, îngreunează atacatorilor obişnuiţi instalarea
de asemenea aplicaţii prin intermediul modulelor de kernel.
9.b. Sistemul de fişiere proc
Mulţi parametri de kernel pot fi modificaţi prin intermediul sistemului de
fişiere /proc sau utilizând sysctl.
Pentru a modifica dinamic parametrii de kernel în timpul rulării, trebui să
aveţi definit în kernel CONFIG_SYSCTL. Această opţiune este activată
implicit într-un kernel 2.4 standard.
Cod 2.1: Dezactivarea IP forwarding |
# /bin/echo "0" > /proc/sys/net/ipv4/ip_forward
|
Asiguraţi-vă că IP forwarding este dezactivată. Dorim această opţiune doar
pentru sistemele cu mai multe gazde conectabile. Este recomandat să activaţi
sau să dezactivaţi această opţiune înainte de toate celelalte opţiuni, deoarece
acesta activează/dezactivează la rându-i alte opţiuni, de asemenea.
Cod 2.2: Refuzarea pachetelor ping |
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
|
Aceasta va cauza kernel-ului pur şi simplu să ignore toate mesajele ping
(cunoscute şi sub numele de mesaje ICMP de tipul 0). Motivul pentru aceasta
este că un pachet IP ce are înglobat un mesaj ICMP poate conţine alte
informaţii decât credeţi. Administratorii utilizează ping ca utilitate de
diagnosticare şi sunt adeseori nemulţumiţi de faptul că este dezactivat, dar nu
există nici un motiv ca cineva din exterior să poată trimite ping. Oricum,
deoarece uneori poate fi la îndemână pentru cei din interior să poată utiliza
ping, puteţi dezactiva mesajele ICMP de tipul 0 din firewall (permiţând
administratorilor locali să continue utilizarea acestui utilitar).
Cod 2.3: Ignorarea pachetelor ping de difuzare |
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
|
Aceasta dezactivează răspunsul la cererile ICMP de difuzare (eng. broadcast) şi
va preveni atacurile Smurf. Atacul Smurf funcţionează prin trimiterea unui
mesaj ICMP de tip 0 (ping) adresei de difuzare a unei reţele. În mod normal,
atacatorul va utiliza o adresă sursă falsă. Toate calculatoarele din reţea vor
răspunde mesajului ping, astfel inundând cu pachete sistemul gazdă de la adresa
sursă falsă.
Cod 2.4: Dezactivarea pachetelor rutate ale sursei |
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
|
Nu acceptaţi pachete rutate ale sursei. Atacatorii pot utiliza rutarea sursei
pentru a genera trafic, pretinzând că acestea sunt originare din interiorul
reţelei, dar acestea sunt, de fapt rutate înapoi alături de calea de pe care a
venit, în acest fel atacatorii putându-vă compromite reţeaua. Rutarea sursei
este rar utilizată în scopuri legitime, deci este sigur să o dezactivaţi.
Cod 2.5: Dezactivaţi acceptarea redirectării |
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/secure_redirects
|
Nu acceptaţi pachete ICMP redirectate. Redirectările ICMP pot fi utilizate
pentru a vă altera tabelele de rutare, posibil către un final neplăcut.
Cod 2.6: Protecţia împotriva mesajelor de eroare incorecte |
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
|
Activaţi protecţia împotriva răspunsurilor de eroare incorecte.
Cod 2.7: Activaţi filtrarea adresei inverse |
# for i in /proc/sys/net/ipv4/conf/*; do
/bin/echo "1" > $i/rp_filter
done
|
Activaţi filtrarea adresei inverse. Aceasta vă ajută să vă asiguraţi că
pachetele utilizează adrese sursă legitime şi respingerea pachetelor primite
dacă intrarea din tabela de rutare a adresei sursa a acestora nu se potriveşte
interfeţei de reţea pe care vin. Aceasta oferă avantaje de securitate pentru că
previne falsificarea adreselor IP. Trebuie să o activăm pentru fiecare
net/ipv4/conf/*, altfel validarea adreselor sursă nu va fi complet
funcţională.
Atenţie:
În orice caz, activarea filtrelor pentru adresa inversă poate fi o problemă
dacă utilizaţi rutarea asimetrică (pachetele de la dvs. la un sistem gazdă
urmează altă cale decât pachetele ce trimise de la acel sistem gazdă către
dvs.) sau dacă operaţi un sistem gazdă ce nu rutează şi are mai multe adrese IP
pe interfeţe diferite.
|
Cod 2.8: Înregistrarea tuturor pachetelor false, rutate de sursă şi redirectate |
# /bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
|
Înregistrarea în jurnal a pachetelor false, rutate de sursă şi redirectate.
Toate aceste setări vor fi refăcute în momentul în care maşina este repornită.
Vă sugerez să le adăugaţi în /etc/sysctl.conf, ce este interpretat
automat de script-ul de iniţializare /etc/init.d/bootmisc.
Sintaxa pentru /etc/sysctl.conf este destul de simplă. Eliminaţi
/proc/sys/ din căile menţionate anterior şi înlocuiţi
/ cu .:
Cod 2.9: Translatarea pentru sysctl.conf |
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward
net.ipv4.ip_forward = 0
|
9.c. Grsecurity
Patch-ul de la Grsecurity este standard
în sursele de kernel Gentoo, dar este dezactivat implicit. Configuraţi-vă
kernel-ul în mod obişnuit şi apoi configuraţi opţiunile Grsecurity. O
explicaţie amănunţită despre opţiunile Grsecurity (version 1.9) disponibile se
află pe pagina proiectului Gentoo Hardened.
Sursele grsec-sources recente, oferă versiunea 2.* a Grsecurity. Pentru
mai multe informaţii despre acest set îmbunătăţit de patch-uri Grsecurity, vă
rugăm să consultaţi documentaţia disponibilă pe pagina oficială Grsecurity.
9.d. Kerneli
Kerneli este un patch ce adaugă
encripţie kernel-ului existent. Prin aplicarea acestui patch în sursele de
kernel veţi beneficia de noi opţiuni, cum ar fi cifruri criptografice,
algoritmi digest şi filtre criptografice de loop.
Atenţie:
Patch-ul kerneli nu este, momentan, într-o versiune stabilă pentru ultima
versiune de kernel, deci aveţi mare atenţie la utilizarea acestuia.
|
9.e. Alte patch-uri de kernel
Şi, probabil că mai sunt şi multe altele.
10. Securizarea Serviciilor
6.a. Apache
Apache (1.3.26) conţine un fişier de configuraţie chiar decent dar, din nou,
trebuie să îmbunătăţim unele opţiuni, cum ar fi să determinăm apache să asculte
pe o singură adresă şi să prevenim scurgerea de informaţii de la acesta. Mai
jos sunt explicate opţiunile ce ar trebui aplicate fişierului de configurare.
Dacă nu aţi dezactivat ssl în fişierul dvs. /etc/make.conf
înainte de a instala Apache, ar trebui să aveţi acces la un server ce are
activat modul ssl. Trebuie doar să adăugaţi următoarea linie pentru a activa.
Cod 1.1: /etc/conf.d/apache |
HTTPD_OPTS="-D SSL"
|
Cod 1.2: /etc/apache/conf/apache.conf |
#Determinaţi-l să asculte pe adresa dvs. ip
Listen 127.0.0.1
BindAddress 127.0.0.1
#Nu este o idee bună să utilizaţi nobody sau nogroup -
#pentru fiecare serviciu ce nu rulează ca root
#(trebuie doar să adăugaţi utilizatorul apache cu grupul apache)
User apache
Group apache
#Va opri apache să îşi afişeze versiunea
ServerSignature Off
ServerTokens Prod
|
Apache este compilat cu --enable-shared=max şi
--enable-module=all. Implicit, aceasta va activa toate modulele, deci va
trebui să comentaţi toate modulele din secţiunea LoadModule
(LoadModule şi AddModule) pe care nu le utilizaţi. Reporniţi
serviciul prin execuţia /etc/init.d/apache restart.
Documentaţie este disponibilă la http://www.apache.org.
10.b. Bind
Puteţi găsi documentaţie pe pagina Internet Software
Consortium. Manualu de Referinţă pentru Administrarea BIND 9 este, de
asemenea, în doc/arm.
Pachetele ebuild mai noi pentru BIND suportă mediul chroot în afara sistemului.
După ce instalaţi bind, urmaţi aceste instrucţiuni simple:
Cod 2.1: Mediul chroot pentru BIND |
ebuild /var/db/pkg/net-dns/bind-9.2.2-r2/bind-9.2.2-r2.ebuild config\`"
|
10.c. Djbdns
Djbdns este o implementare DNS pe a cărei securitate, autorul este dispus să
parieze pe bani. Este
foarte diferit de modul de funcţionare al Bind 9, dar merită încercat. Mai
multe informaţii pot fi obţinute de la http://www.djbdns.org.
10.d. FTP
În general, utilizarea FTP (File Transfer Protocol - Protocolul de Transfer de
Fişiere) nu este o idee bună. Acesta utilizează date necriptate (spre ex.
parolele sunt transmise în text clar), ascultă pe două porturi (în mod normal,
porturile 20 şi 21) şi atacatorii caută frecvent autentificări anonime pentru
tranzitul warez. Deoarece protocolul FTP conţine câteva probleme de securitate,
ar trebui să utilizaţi în loc sftp sau HTTP. Dacă această soluţie este
posibilă, securizaţi-vă serviciile în orice mod posibil şi pregătiţi-vă.
10.e. Mysql
Dacă doriţi ca doar aplicaţii locale să vă acceseze baza de date mysql,
decomentaţi următoarea linie din /etc/mysql/my.cnf.
Cod 5.1: Dezactivaţi accesul la reţea |
skip-networking
|
Apoi, trebuie să dezactivăm utilizarea comenzii LOAD DATA LOCAL INFILE.
Aceasta, pentru a preveni accesul neautorizat la citirea fişierelor locale.
Aceasta este relevantă când sunt găsite noi vulnerabilităţi de tipul SQL
Injection în aplicaţiile PHP.
Cod 5.2: Dezactivarea LOAD DATA LOCAL INFILE în secţiunea [mysqld] |
set-variable=local-infile=0
|
Apoi, trebuie să ştergem baza de date exemplu (test) şi toate conturile, cu
excepţia contului root local.
Cod 5.3: Ştergerea bazei de date exemplu şi tuturor utilizatorilor nenecesari |
mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not (host="localhost" and user="root");
mysql> flush privileges;
|
Atenţie:
Fiţi atenţi la comenzile anterioare, dacă deja aveţi configurate conturi de
utilizator.
|
Notă:
Dacă aţi modificat parolele din promptul MYSQL, ar trebui întotdeauna să
ştergeţi ~/.mysql_history şi /var/log/mysql/mysql.log
deoarece acestea stochează comenzile SQL executate cu parolele în text clar.
|
10.f. Proftpd
Proftpd a avut câteva probleme de securitate, dar majoritatea se pare că au
fost rezolvate. Chiar şi aşa, este o idee bună să aplicăm unele îmbunătăţiri:
Cod 6.1: /etc/proftpd/proftpd.conf |
ServerName "My ftp daemon"
#Nu afişaţi identificarea server-ului
ServerIdent on "Go away"
#Înlesneşte crearea de utilizatori virtuali
RequireValidShell off
#Utilizaţi fişierele de parolă şi grup (passwd utilizează formatul crypt)
AuthUserFile "/etc/proftpd/passwd"
AuthGroupFile "/etc/proftpd/group"
# Permisiuni
Umask 077
# Timpi de expirare şi limitări
MaxInstances 30
MaxClients 10 "Only 10 connections allowed"
MaxClientsPerHost 1 "You have already logged on once"
MaxClientsPerUser 1 "You have already logged on once"
TimeoutStalled 10
TimeoutNoTransfer 20
TimeoutLogin 20
#Toţi trebuie să efectueze chroot
DefaultRoot ~
#nu rulaţi ca root
User nobody
Group nogroup
#înregistraţi fiecare transfer
TransferLog /var/log/transferlog
#Probleme cu globalizarea
DenyFilter \*.*/
|
Puteţi găsi documentaţie la http://www.proftpd.org.
10.g. Pure-ftpd
Pure-ftpd este o ramură a originalului trollftpd, modificat pentru scopuri de
securitate şi funcţionalitate de Frank Dennis.
Folosiţi utilizatori virtuali (niciodată conturi de sistem) prin activarea
opţiunii AUTH. Setaţi-o cu valoarea -lpuredb:/etc/pureftpd.pdb şi
creaţi utilizatorii prin comanda /usr/bin/pure-pw.
Cod 7.1: /etc/conf.d/pure-ftpd |
AUTH="-lpuredb:/etc/pureftpd.pdb"
## Misc. Others ##
MISC_OTHER="-A -E -X -U 177:077 -d -4 -L100:5 -I 15"
|
Configuraţi setarea dvs. MISC_OTHER pentru a interzice autentificările
anonime (-E), toţi trebuie să utilizeze chroot (-A), preveniţi ca
utilizatorii să poată citi sau scrie în fişierele ce încep cu un . (punct)
(-X), timpul maxim de inactivitate (-I), limitaţi recursia
(-L), şi o mască de utilizator rezonabilă cu umask.
Atenţie:
Nu utilizaţi opţiunile -w sau -W! Dacă doriţi să aveţi un
site warez, încetaţi consultarea acestui ghid!
|
Se poate găsi documentaţie la http://www.pureftpd.org.
10.h. Vsftpd
Vsftpd (prescurtarea de la very secure ftp - ftp foarte securizat) este o
aplicaţie daemon foarte mică ce conţine o configuraţie implicită rezonabilă.
Este simplă şi nu are aşa multe funcţionalităţi ca pureftp şi proftp.
Cod 8.1: /etc/vsftpd |
anonymous_enable=NO
local_enable=YES
#doar pentru citire
write_enable=NO
#activarea înregistrării transferurilor
xferlog_std_format=YES
idle_session_timeout=20
data_connection_timeout=20
nopriv_user=nobody
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chrootlist
ls_recurse_enable=NO
|
Aşa cum puteţi observa, nu există nici o soluţie ca acest serviciu să deţină
permisiuni individuale, dar deţine unele setări pentru accesul anonim pentru
care este chiar bun. Uneori poate fi un lucru bun să avem un server ftp anonim
(pentru partajarea aplicaţiilor open source), iar vsftpd se descurcă chiar
bine.
10.i. Netqmail
Netqmail este adesea considerat ca fiind un server de poştă electronică foarte
bun. Este scris având securitatea (şi paranoia) în minte. Nu permite relay
implicit şi nu a avut nici o breşă de securitate din 1996. Pur şi simplu
instalaţi rulând emerge netqmail şi configuraţi-l!
10.j. Samba
Samba este un protocol pentru partajarea fişierelor cu reţele Microsoft/Novell
şi nu ar trebui utilizat pe internet. Chiar şi aşa, mai are nevoie de
securizare.
Cod 10.1: /etc/samba/smb.conf |
[global]
#Ascultă pe o interfaţă
interfaces = eth0 10.0.0.1/32
#Asiguraţi-vă că utilizaţi parole criptate
encrypt passwords = yes
directory security mask = 0700
#permiteţi traficul de la 10.0.0.*
hosts allow = 10.0.0.
#Activează autentificarea utilizatorilor
#(nu utilizaţi modul share)
security = user
#Interzice conturile privilegiate
invalid users = root @wheel
#Mărimea maximă afişată de smb pentru o resursă partajată (nu este o limită)
max disk size = 102400
#Confirmaţi politica de securitate
min password length = 8
null passwords = no
#Utilizaţi PAM (dacă aţi adăugat suport)
obey pam restrictions = yes
pam password change = yes
|
Asiguraţi-vă că permisiunile sunt setate corect pe fiecare resursă partajată şi
amintiţi-vă să consultaţi documentaţia.
Acum, reporniţi server-ul şi adăugaţi utilizatorii care ar trebui să aibă acces
la acest serviciu. Aceasta poate fi efectuată prin intermediul comenzii
/usr/bin/smbpasswd cu parametrul -a.
10.k. ssh
Singura securizare pe care o necesită OpenSSH este activarea unei autentificări
mai puternice bazată pe encripţia cu chei publice. Prea multe site-uri (cum ar
fi http://www.sourceforge.net, http://www.php.net şi
http://www.apache.org) au suferit intruziuni neautorizate din cauza
pierderii parolei sau parolelor proaste.
Cod 11.1: /etc/ssh/sshd_config |
#Activaţi doar versiunea 2
Protocol 2
#Dezactivaţi autentificarea root. Utilizatorii trebuie să ruleze su pentru root
PermitRootLogin no
#Activaţi autentificarea cu chei publice
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#Dezactivaţi .rhost şi autentificarea cu parolă normală
RhostsAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no
#Permiteţi doar utilizatorilor din grupul wheel sau admin să se autentifice
AllowGroups wheel admin
#În aceste grupuri, permiteţi doar următorilor utilizatori
#Opţiunea @<domainname> este opţională dar înlocuieşte
#vechea directivă AllowHosts
AllowUsers kn@gentoo.org bs@gentoo.org
#Înregistrarea în jurnal
SyslogFacility AUTH
LogLevel INFO
ListenAddress 127.0.0.1
|
De asemenea, verificaţi că nu aveţi UsePAM yes în fişierul dvs. de
configurare deoarece suprascrie mecanismul de autentificare cu chei publice.
Acum, tot ceea ce utilizatorii dvs. trebuie să facă este să-şi creeze o cheie
(pe maşina de pe care doresc să se autentifice) cu următoarea comandă:
Cod 11.2: Creaţi o pereche de chei DSA |
# /usr/bin/ssh-keygen -t dsa
|
Şi tastaţi fraza de autentificare.
Cod 11.3: Ce afişează ssh-keygen |
Generating public/private dsa key pair.
Enter file in which to save the key (/home/kn/.ssh/id_dsa):[Apăsaţi Enter]
Created directory '/home/kn/.ssh'.
Enter passphrase (empty for no passphrase): [Introduceţi fraza]
Enter same passphrase again: [Introduceţi fraza din nou]
Your identification has been saved in /home/kn/.ssh/id_dsa.
Your public key has been saved in /home/kn/.ssh/id_dsa.pub.
The key fingerprint is:
07:24:a9:12:7f:83:7e:af:b8:1f:89:a3:48:29:e2:a4 kn@knielsen
|
Aceasta va adăuga două fişiere în directorul dvs. ~/.ssh/ denumite
id_dsa şi id_dsa.pub. Fişierul denumit
id_dsa reprezintă cheia dvs. privată şi ar trebui ferită de alţi
utilizatori decât dvs. Celălalt fişier id_dsa.pub trebuie
distribuit pe fiecare server pe care aveţi acces. Adăugaţi cheia în directorul
home al utilizatorilor în ~/.ssh/authorized_keys şi utilizatorul
ar trebui să poată să se autentifice.
Cod 11.4: Adăugarea fişierului id_dsa.pub în fişierul authorized_keys |
$ scp id_dsa.pub other-host:/var/tmp/currenthostname.pub
$ ssh other-host
password:
$ cat /var/tmp/currenthostname.pub >> ~/.ssh/authorized_keys
|
Acum, utilizatorii ar trebui să îşi păzească şi cheia lor privată. Stocaţi-o pe
un suport media pe care îl purtaţi mereu cu dvs. sau păstraţi-o pe staţia de
lucru (puneţi acest paragraf în politica pentu parole).
Pentru mai multe informaţii vizitaţi site-ul OpenSSH.
10.l. Utilizarea xinetd
xinetd înlocuieşte inetd (care nu este conţinut în Gentoo), aplicaţia
daemon pentru servicii internet. Suportă controlul accesului pe baza adresei
sistemului apelant şi timpului de acces. De asemenea, oferă capabilităţi
extinse de jurnalizare, incluzând timpul la care a pornit aplicaţia server,
adresa sistemului gazdă apelant, numele utilizatorului de la distanţă, timpul
de rulare şi acţiunile executate.
Ca şi cu celelalte servicii, este important să avem o configuraţie implicită
bună. Dar, deoarece xinetd este rulat ca root şi suportă protocoale ce
este posibil să nu le cunoaşteţi, vă recomandăm să nu îl utilizaţi. Totuşi,
dacă doriţi să-l utilizaţi, iată cum puteţi adăuga unele funcţionalităţi de
securitate în acesta:
Cod 12.1: Instalarea xinetd |
# emerge xinetd tcp-wrappers
|
Şi apoi editaţi fişierul de configurare:
Cod 12.2: /etc/xinetd.conf |
defaults
{
only_from = localhost
instances = 10
log_type = SYSLOG authpriv info
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
# Aceasta va rula pserver (cvs) prin xinetd cu următoarele setări:
# maxim 10 instanţe (10 conexiuni în acelaşi timp)
# limitaţi pserver doar la tcp
# folosiţi utilizatorul cvs pentru a rula acest serviciu
# ascultaţi pe o singură adresă ip
# permiteţi accesul de la 10.0.0.*
# limitaţi timpul în care dezvoltatorii pot utiliza dvs de la 8am la 5pm
# utilizaţi aplicaţii wrapper tcp (controlul accesului se poate face din
# /etc/hosts.allow şi /etc/hosts.deny)
# variabila max_load pentru maşină este setată la 1.0
# Indicatorul disable este setat implicit pe no, dar mi-ar plăcea
# cazul în care ar trebui să fie dezactivat
service cvspserver
{
socket_type = stream
protocol = tcp
instances = 10
protocol = tcp
wait = no
user = cvs
bind = 10.0.0.2
only_from = 10.0.0.0
access_times = 8:00-17:00
server = /usr/sbin/tcpd
server_args = /usr/bin/cvs --allow-root=/mnt/cvsdisk/cvsroot pserver
max_load = 1.0
log_on_failure += RECORD
disable = no
}
|
Pentru mai multe informaţii consultaţi man 5 xinetd.conf.
10.m. X
Implicit, Xorg este configurat ca aplicaţie Xserver. Aceasta poate fi
periculos, deoarece X utilizează conexiuni TCP necriptate şi ascultă pentru
aplicaţiile xclients.
Important:
Dacă nu aveţi nevoie de acest serviciu, dezactivaţi-l!
|
Dar, dacă depindeţi de utilizarea staţiei dvs. de lucru ca Xserver, utilizaţi
comanda /usr/X11R6/bin/xhost cu atenţie. Această comandă permite
clienţilor de pe alte sisteme gazdă să se conecteze şi să utilizeze terminalul.
Aceasta poate fi la îndemână dacă aveţi nevoie de o aplicaţie X de pe altă
maşină şi singura modalitate de rulare este prin intermediul reţelei, dar poate
fi, de asemenea, exploatată de un atacator. Sintaxa acestei comenzi este
/usr/X11R6/bin/xhost +hostname
Atenţie:
Nu utilizaţi niciodată xhost +! Aceasta va permite oricărui client să se
conecteze şi să preia controlul asupra aplicaţiei X. Dacă un atacator vă
poate accesa aplicaţiaX, vă poate înregistra tastele apăsate şi prelua
controlul asupra aplicaţiei dvs. desktop. Dacă trebuie să-l utilizaţi,
amintiţi-vă mereu să adăugaţi un nume de sistem gazdă.
|
O soluţie mult mai securizată este să dezactivaţi această funcţionalitate
definitiv, prin pornirea X cu startx -- -nolisten tcp sau să o
dezactivaţi permanent din configuraţie.
Cod 13.1: /usr/X11R6/bin/startx |
defaultserverargs="-nolisten tcp"
|
Pentru a vă asigura că startx nu va fi suprascris la instalarea
unei noi versiuni de Xorg, trebuie să îi protejaţi locaţia. Adăugaţi următoarea
linie în /etc/make.conf:
Cod 13.2: /etc/make.conf |
CONFIG_PROTECT_MASK="/usr/X11R6/bin/startx"
|
Dacă utilizaţi un manager de login grafic, trebuie să luaţi în considerare altă
abordare.
Pentru gdm (Gnome Display Manager)
Cod 13.3: /etc/X11/gdm/gdm.conf |
[server-Standard]
command=/usr/X11R6/bin/X -nolisten tcp
|
Pentru xdm (X Display Manager) şi kdm (Kde Display Manager)
Cod 13.4: /etc/X11/xdm/Xservers |
:0 local /usr/bin/X11/X -nolisten tcp
|
11. Mediul Chroot şi Aplicaţii Server Virtuale
11.a. Mediul chroot
Rularea în mediul chroot a unui serviciu este o cale de a limita mediul unui
serviciu (sau utilizator) la a accesa doar ce este necesar şi a nu obţine acces
(sau informaţii) ce pot conduce la accesul root. Prin rularea unui serviciu ca
un alt utilizator de sistem decât root (nobody, apache,
named), un atacator poate accesa doar fişierele cu permisiunile acestui
utilizator. Aceasta înseamnă că un atacator nu poate obţine acces root
chiar dacă serviciile au o breşă de securitate.
Unele servicii ca pure-ftpd şi bind au funcţionalităţi pentru
mediul chroot, şi altele servicii nu. Dacă un serviciu îl suportă, utilizaţi-l,
altfel trebuie să găsiţi o soluţie să vă creaţi unul propriu. Să vedem cum
creăm un mediu chroot şi, pentru o mai bună înţelegere a modului de
funcţionare, îl vom testa cu bash (un mod uşor de a învăţa).
Creaţi directorul /chroot cu mkdir /chroot. Apoi, aflaţi
cu ce biblioteci dinamice este compilat bash (dacă este compilat cu
-static, acest pas nu este necesar):
Următoarea comandă va crea o listă de biblioteci utilizate de bash.
Cod 1.1: Afişarea listei de biblioteci utilizate |
# ldd /bin/bash
libncurses.so.5 => /lib/libncurses.so.5 (0x4001b000)
libdl.so.2 => /lib/libdl.so.2 (0x40060000)
libc.so.6 => /lib/libc.so.6 (0x40063000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
|
Acum, creaţi mediul pentru bash.
Cod 1.2: Crearea mediului chroot pentru bash |
# mkdir /chroot/bash
# mkdir /chroot/bash/bin
# mkdir /chroot/bash/lib
|
Apoi, copiaţi fişierele utilizate de bash (/lib) în
directorul lib din chroot şi copiaţi comanda bash în directorul
bin din chroot. Aceasta va crea exact acelaşi mediu, doar cu mai
puţine funcţionalităţi. După copiere, încercaţi-l: chroot /chroot/bash
/bin/bash. Dacă vi se afişează un prompt /, atunci
funcţionează! Altfel, vă va specifica cu precizie ce fişier lipseşte. Unele
biblioteci dinamice depind între ele.
Veţi observa că în interiorul mediului chroot nu funcţionează nimic cu excepţia
echo. Aceasta se datorează faptului că nu avem nici o altă comandă
disponibilă în mediul chroot, în afară de bash, iar echo este o
funcţionalitate integrată.
Aceasta este, practic, soluţia prin care puteţi să vă creaţi un serviciu în
mediul chroot. Singura diferenţă este că serviciile, uneori, se bazează pe
fişiere dispozitiv şi pe fişiere de configurare din /etc. Trebuie
doar să le copiaţi (fişierele dispozitiv pot fi copiate cu cp -a) în
mediul chroot, să editaţi script-ul de iniţializare pentru a utiliza mediul
chroot înainte de execuţie. Poate fi dificil să găsiţi fişierele dispozitiv şi
cele de configurare necesare unui serviciu. Aici devine la îndemână comanda
strace. Porniţi serviciul bash cu /usr/bin/strace şi căutaţi
comenzile open, read, stat şi, poate, conect. Aceasta vă va da un indiciu
despre ce fişiere să copiaţi. Dar, în cele mai multe cazuri, trebuie doar să
copiaţi fişierul passwd (editaţi copia şi ştergeţi toţi utilizatorii ce nu au
legătură cu serviciul), /dev/zero, /dev/log şi
/dev/random.
11.b. User Mode Linux
O altă modalitate de a crea un mediu mai securizat, este prin rularea unei
maşini virtuale. O maşină virtuală, aşa cum sugerează şi numele, este un proces
ce rulează deasupra sistemului de operare real, oferind un suport hardware şi un
sistem de operare ce pare a fi o maşină unică, separată. Beneficiul de
securitate este faptul că, dacă aplicaţia server ce rulează în maşina virtuală
este compromisă, doar server-ul virtual este afectat şi nu instalarea părinte.
Pentru mai multe informaţii despre cum să setaţi User Mode Linux, consultaţi
Ghidul User-Mode Linux.
12. Sisteme Firewall
12.a. Un sistem firewall
Oamenii se gândesc adesea că un sistem firewall oferă secutatea fundamentală,
dar se înşeală. În cele mai multe cazuri, un sistem firewall configurat
incorect oferă mai puţină securitate decât în cazul în care nu ar exista deloc.
Un sistem firewall este tot o aplicaţie şi ar trebui să fie tratată ca orice
altă aplicaţie, pentru că, cel mai probabil, conţine erori.
Deci, gândiţi-vă înainte de a implementa un sistem firewall! Chiar aveţi nevoie
de unul? Dacă dvs. consideraţi că aveţi nevoie, scrieţi o politică de
securitate despre cum funcţionează, ce tip de sistem firewall este şi cine ar
trebui să opereze cu acesta. Dar, mai întâi, consultaţi acest ghid.
Sistemele firewall sunt utilizate pentru două scopuri:
- Pentru a ţine utilizatorii (viermii/atacatorii) în afară
- Pentru a ţine utilizatorii (angajaţii/copiii) în înterior
În fapt, sunt trei tipuri de sisteme firewall:
- Filtrare de pachete
- Retransmitere în circuit
- Sisteme gateway la nivelul aplicaţie
Un sistem firewall trebuie să fie o maşină dedicată ce nu rulează nici un
serviciu (sau sshd, ca fiind singurul) şi securizat în modul recomandat
în acest ghid.
12.b. Filtrarea de pachete
Tot traficul de reţea este transmis sub formă de pachete. Cantităţi însemnate
de trafic sunt împărţite în pachete mici pentru o manipulare mai uşoară şi apoi
reasamblate în momentul sosirii la destinaţie. În antet, fiecare pachet conţine
informaţii despre cum şi unde ar trebui să fie distribuit. Iar această
informaţie este exact ceea ce utilizează un sistem firewall de filtrare de
pachete. Filtrarea este bazată pe:
- Permiterea sau interzicerea pachetelor pe baza adresei IP a sursei/destinaţiei
- Permiterea sau interzicerea pachetelor pe baza portului sursei/destinaţiei
- Permiterea sau interzicerea pachetelor pe baza protocolului
- Permiterea sau interzicerea pachetelor pe baza unor opţiuni specifice unui anume protocol
Cu alte cuvinte, această filtrare este bazată pe toate datele conţinute în
antetul unui pachet şi nu pe baza conţinutului.
Slăbiciuni:
-
Informaţia adresei dintr-un pachet poate fi o adresă IP eronată (sau, cum se
spune, falsă - eng. spoofed - de la trasmiţător)
-
Datele sau cererile dintr-un pachet permis pot conţine date nedorite pe care
un atacator le poate utiliza pentru a exploata erori cunoscute din serviciile
din spatele sistemului firewall
- De obicei, poate afecta tot sistemul
Avantaje:
- Simplu şi uşor de implementat
-
Poate afişa avertismente despre unele posibile atacuri înainte de a se
întâmpla (spre ex. prin detectarea scanărilor de porturi)
- Bun în oprirea atacurilor SYN
Exemple de fitre de pachete gratuite pentru Linux:
Notă:
Este recomandat să utilizaţi iptables. Ipchains este învechit.
|
12.c. Retransmiterea în cicuit
Un gateway la nivelul circuitului este un sistem firewall ce validează
conexiunile înainte de a permite schibul de date. Aceasta înseamnă că pur şi
simplu nu permite sau interzice pachete pe baza antetului pachetului, ci
determină dacă conexiunea între cele două capete este validă, în conformitate
cu reguli configurabile, înainte de a deschide o sesiune şi a permite datelor
să fie interchimbate. Filtrarea este bazată pe:
- Adresa IP a sursei/destinaţiei
- Portul sursei/destinaţiei
- O perioadă de timp
- Protocol
- Utilizator
- Parolă
Tot traficul este validat şi monitorizat, iar traficul nedorit este oprit.
Slăbiciuni:
-
Operează în nivelul de Transport şi poate necesita modificări substanţiale
programelor ce oferă în mod normal funcţii de transport.
12.d. Sisteme gateway la nivelul aplicaţie
Sistemul gateway la nivelul aplicaţie este un proxy pentru aplicaţii,
interschimbând datele cu sistemele la distanţă cu voia clienţilor. Este
protejat de public în mod securizat în spatele unei structuri DMZ
(De-Militarized Zone - Zonă De-Militarizată: partea dintr-o reţea privată care
este vizibilă printr-un sistem firewall) sau unui sistem firewall ce nu permite
nici o conexiune din exterior. Filtrarea se bazează pe:
- Permiterea sau interzicerea pe baza adresei IP a sursei/destinaţiei
- Pe baza conţinului pachetului
- Limitarea accesului la fişiere pe baza tipului fişierului sau extensiei acestuia
Avantaje:
- Poate reţine în memoria cache fişierele, mărind performanţele reţelei
- Înregistrarea detaliată în jurnal a tuturor conexiunilor
- Este foarte scalabil (unele aplicaţii proxy pot "partaja" datele reţinute în memoria cache)
- Nu există acces direct către exterior
- Se poate chiar modifica conţinutul pachetului în timpul procesării
Slăbiciuni:
- Configurarea este complexă
Sistemele gateway la nivelul aplicaţie sunt considerate a fi cele mai sigure
soluţii deoarece nu trebuie să ruleze ca root şi sistemele gazdă din spatele
acestora nu sunt accesibile din internet.
Exemplu de sistem gateway la nivelul aplicaţie, gratuit:
12.e. Iptables
Pentru a putea utiliza iptables, trebuie să îl aveţi activat în kernel. Eu
am adăugat iptables ca module (comanda iptables le va încărca în
funcţie de necesitate) şi mi-am recompilat kernel-ul (dar poate aţi dori
să compilaţi iptables, dacă intenţionaţi să dezactivaţi Loadable
Kernel Modules, aşa cum am amintit anterior). Pentru mai multe informaţii
despre configurarea kernel-ului pentru iptables, vizitaţi Tutorial
Iptables, Capitolul 2: Prepararări. După ce aţi compilat noul kernel
(sau în timp ce compilaţi kernel-ul), trebuie să adăugaţi comanda
iptables. Rulaţi doar emerge iptables, şi ar trebui să
funcţioneze.
Acum, testaţi dacă funcţionează, rulând iptables -L. Dacă ceva
returnează eroare, atunci există o neregulă şi va trebui să verificaţi încă o
dată configuraţia.
Iptables este noul şi mult îmbunătăţitul filtru de pachete din versiunea de
kernel 2.4.x. Este succesorul filtrului de pachete anterior din versiunea de
kernel Linux 2.2.x. Una din îmbunătăţirile majore este faptul că iptables poate
efectua o filtrare dinamică, în funcţie de stare, pentru pachete. În cazul
filtrării de pachete dinamice, este posibilă păstrarea stărilor conexiunii TCP.
O conexiune TCP constă într-o serie de pachete ce conţin informaţii despre
adresa IP a sursei, adresa IP a destinaţiei, portul sursă şi un număr al
secvenţei, pentru ca pachetele să poată fi reasamblate în momentul pierderii
datelor. TCP este un protocol orientat pe conexiune, în contrast cu UDP care nu
depinde de conexiune.
Prin examinarea antetului unui pachet TCP, un filtru de pachete dinamic poate
determina dacă un pachet recepţionat face parte dintr-o conexiune deja
stabilită sau nu şi decide dacă să accepte sau să refuze pachetul.
Cu ajutorul unui filtru de pachete static, care nu determină starea conexiunii,
este posibil să se înşele acest fitru în a accepta pachete ce ar trebui să fie
refuzate, prin manipularea anteturilor TCP ale pachetelor. Aceasta se poate
efectua prin manipularea indicatorului SYN sau a altor indicatori din antetul
TCP pentru a determina un pachet cu caracter maliţios să apară ca fiind parte a
unei conexiuni deja stabilite (deoarece filtrul de pachete însuşi nu poate
determina starea conexiunii). Cu ajutorul filtrării dinamice de pachete, este
posibil refuzul acestor pachete, deoarece nu sunt parte a unei conexiuni deja
stabilite. Aceasta va opri, de asemenea, posibilitatea "scanărilor ascunse", un
tip de scanare a porturilor în care aplicaţia scanner trimite pachete cu
indicatori ce este foarte probabil să nu fie reperaţi şi înregistraţi în jurnal
de sistemul firewall decât pachetele normale SYN.
Iptables oferă mai multe funcţionalităţi precum NAT (Network Address
Translation - Translatarea Adresei de Reţea) şi limitarea ratelor de
transmisie. Limitarea ratelor de transmisie este foarte utilă în momentul
prevenirii unui anumit atac DoS (Denial of Service), precum transmiterea masivă
de pachete SYN.
O conexiune TCP este stabilită de un aşa-numit salut în trei paşi. În momentul
stabilirii unei conexiuni TCP, clientul transmite un pachet părţii server, cu
indicatorul SYN activat. Când partea server recepţionează pachetul SYN, acesta
răspunde înapoi cu un pachet SYN+ACK, clientului. Când pachetul SYN+ACK este
recepţionat de client, acest răspunde cu un al treilea pachet ACK, confirmând
conexiunea.
Un atac de tip SYN flood este efectuat prin trimiterea pachetului SYN, dar
nerăspunzând cu pachetul SYN+ACK. Clientul poate modifica un pachet cu o adresă
IP sursă falsă, pentru că nu are nevoie de răspuns. Sistemul server va adăuga o
intrare într-o coadă a conexiunilor pe-jumătate deschise când recepţionează
pachetul SYN şi va aştepta pachetul final ACK înainte de a şterge intrarea din
coadă. Coada de aşteptare are un număr limitat de intrări, şi dacă toate
intrările sunt ocupate nu mai poate deschide alte conexiuni. Dacă un pachet ACK
nu este recepţionat înainte de un timp de aşteptare, intrarea este ştearsă
automat din coadă. Timpii de aşteptare variază, de obicei, între 30-60 secunde
sau chiar mai mult. Clientul iniţiază atacul prin falsificarea multor pachet
SYN cu adrese IP sursă diferite şi le transmite către o adresă IP ţintă cât mai
repede posibil, astfel determinând umplerea cozii de conexiuni pe-jumătate
deschise şi astfel, prevenind ca alţi clienţi să stabilească o conexiune
legitimă cu server-ul.
Aici intervine limitarea ratei de transmisie la îndemână. Este posibil să
limităm rata de transmisie a pachetelor SYN acceptate prin utilizarea -m
limit --limit 1/s. Aceasta va limita numărul de pachete SYN acceptate la
unul pe secundă, astfel restrictionând transmiterea masivă de pachete SYN
resurselor noastre.
Notă:
Altă opţiune în prevenirea atacurilor SYN sunt cookie-urile SYN, ce permit sistemului
să răspundă cu pachete SYN fără a umple spaţiul cozii de conexiuni.
Cookie-urile SYN pot fi activate în configuraţia kernel-ului Linux, dar sunt la
nivel experimental în acest moment.
|
Acum, câte ceva practic!
Când iptables este încărcat în kernel, el deschide 5 legături unde vă puteţi
plasa regulile. Aceastea sunt denumite INPUT, OUTPUT,
FORWARD, PREROUTING şi POSTROUTING. Fiecare din acestea
este denumit lanţ şi conţine o listă de reguli. Fiecare regulă specifică faptul
că, dacă antetul unui pachet are un conţinut, atunci iată ce se face cu
pachetul. Dacă regula nu se potriveşte pachetului, următoarea regulă din lanţ
este analizată.
Vă puteţi plasa regulile direct în cele 5 lanţuri, sau să creati noi lanţuri şi
să le adăugaţi ca regulă într-un lanţ deja existent. Iptables suportă
următoarele opţiuni.
| Opţiune: |
Descriere: |
| -A |
Adăugare |
| -D |
Ştergere |
| -I |
Introducere |
| -R |
Înlocuire |
| -L |
Afişare |
| -F |
Ştergerea tuturor regulilor din lanţ sau toate lanţurile |
| -Z |
Reporneşte de la zero numărătoarele din lanţ sau din toate lanţurile |
| -C |
Testarea pachetului în lanţ |
| -N |
Crearea unui lanţ nou, definit de utilizator |
| -X |
Ştergerea unui lanţ definit de utilizator |
| -P |
Modificarea politicii lanţului la o ţintă |
| -E |
Modificarea numelui lanţului |
| -p |
Protocol |
| -s |
Adresa/masca sursă |
| -d |
Adresa/masca destinaţie |
| -i |
Numele intrării (numele ethernet) |
| -o |
Numele ieşirii (numele ethernet) |
| -j |
Jump (ţinta pentru regulă) |
| -m |
Potrivire extinsă (este posibilă utilizarea extensiilor) |
| -n |
Afişarea numerică a adreselor şi porturilor |
| -t |
Tabela de manipulat |
| -v |
Modul informativ |
| -x |
Extinderea numerelor (afişarea valorilor exacte) |
| -f |
Potrivirea doar a fragmentului următor sau a celor ce urmează |
| -V |
Versiunea pachetului |
| --line-numbers |
Afişează numărul de linii pe ecran |
Mai întâi, vom încerca să blocăm toate pachetele ICMP destinate maşinii
noastre, doar pentru a ne familiariza cu iptables.
Cod 5.1: Blocarea tuturor pachetelor ICMP |
# iptables -A INPUT -p icmp -j DROP
|
Mai întâi specificăm lanţul în care regula noastră ar trebui să fie adăugată,
apoi protocolul pachetelor ce trebuie înregistrate şi, în final, ţinta. Ţinta
poate fi numele unui lanţ specificat sau una din ţintele noastre speciale
ACCEPT, DROP, REJECT, LOG, QUEUE sau
MASQUERADE. În acest caz, utilizăm DROP, ce va refuza pachetul
fără a-i răspunde clientului.
Notă:
Ţinta LOG este, ceea ce se numeşte, "ne-terminală". Dacă un pachet se
potriveşte unei reguli cu ţinta LOG, în loc să se oprească evaluarea,
pachetul va continua să fie supus următoarelor reguli. Aceasta vă permite să
înregistraţi în jurnal pachetele şi aceasta să fie procesate normal.
|
Acum, încercaţi ping localhost. Nu veţi primi nici un răspuns, deoarece
iptables va refuza toate pachetele ICMP venite. De asemenea, nu veţi putea
transmite ping altor maşini, deoarece pachetul de răspuns ICMP va fi refuzat,
din nou. Acum, ştergeţi lanţul pentru avea fluxul ICMP din nou funcţional.
Cod 5.2: Ştergerea tuturor regulilor |
# iptables -F
|
Acum, să analizăm filtrarea dinamică de pachete din iptables. Dacă am fi dorit
să activăm inspecţia dinamică a pachetelor ce sosesc pe interfaţa eth0, am fi
rulat comanda:
Cod 5.3: Acceptarea pachetelor originare dintr-o conexiune deja stabilită |
# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
|
Aceasta va accepta orice pachet dintr-o conexiune deja stabilită sau în relaţie
cu lanţul INPUT. De asemenea, aţi putea să ştergeţi orice pachet ce nu este în
tabela de stări prin execuţia comenzii iptables -A INPUT -i eth0 -m state
--state INVALID -j DROP chiar înaintea comenzii anterioare. Aceasta
activează filtrarea de pachete dinamică în iptables, prin încărcarea extensiei
"state". Dacă aţi fi dorit ca alţi utilizatori să se conecteze la maşina dvs.,
aţi fi putut utiliza indicatorul --state NEW. Iptables conţine unele
module pentru scopuri diferite. Unele dintre acestea sunt:
| Modul/Potrivire |
Descriere |
Opţiuni extinse |
| mac |
Încarcă extensia pentru adresa mac a pachetelor ce sosesc. |
--mac-source |
| state |
Activează inspecţia dinamică |
--state (stările sunt ESTABLISHED ,RELATED, INVALID, NEW) |
| limit |
Limitarea ratei de transmisie |
--limit, --limit-burst |
| owner |
Încearcă să potrivească unele caracteristici ale creatorului pachetului |
--uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner
sessionid
|
| unclean |
Unele verificări aleatoare în plus pentru pachete |
|
Să încercăm să creăm un lanţ definit de utilizator şi să îl aplicăm unui lanţ
deja existent:
Cod 5.4: Crearea unui lanţ definit de utilizator |
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
# iptables -A INPUT -j mychain
|
Prin aplicarea regulii lanţului de intrare, obţinem politica: toate pachetele
spre exterior sunt permise şi toate pachetele spre interior sunt oprite.
Se poate găsi documentaţie pe pagina de documentaţie
Netfilter/iptables.
Să vedem un exemplu complet. În acest caz, politica sistemului firewall/gateway
afirmă:
- Conexiunile spre sistemul firewall sunt permise doar prin SSH (portul 22)
-
Reţeaua locală ar trebui să aibă acces la HTTP, HTTPS şi SSH (DNS at trebui,
de asemenea, permis)
-
Traficul ICMP poate conţine informaţii nenecesare şi nu ar trebui să fie
acceptat. Bineînţeles, trebuie să permitem o parte din traficul ICMP.
- Scanările de porturi ar trebui detectate şi înregistrate
- Atacurile SYN ar trebui ocolite
- Tot restul traficului ar trebui să fie oprit şi înregistrat
Cod 5.5: /etc/init.d/firewall |
#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#inside
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=217.157.156.144
OINTERFACE=eth1
opts="${opts} showstatus panic save restore showoptions rules"
depend() {
need net
}
rules() {
stop
ebegin "Setting internal rules"
einfo "Setting default rule to drop"
$IPTABLES -P FORWARD DROP
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
#default rule
einfo "Creating states chain"
$IPTABLES -N allowed-connection
$IPTABLES -F allowed-connection
$IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \
"Bad packet from ${IINTERFACE}:"
$IPTABLES -A allowed-connection -j DROP
#ICMP traffic
einfo "Creating icmp chain"
$IPTABLES -N icmp_allowed
$IPTABLES -F icmp_allowed
$IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
time-exceeded -j ACCEPT
$IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
destination-unreachable -j ACCEPT
$IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
$IPTABLES -A icmp_allowed -p icmp -j DROP
#Incoming traffic
einfo "Creating incoming ssh traffic chain"
$IPTABLES -N allow-ssh-traffic-in
$IPTABLES -F allow-ssh-traffic-in
#Flood protection
$IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
ALL RST --dport ssh -j ACCEPT
$IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
ALL FIN --dport ssh -j ACCEPT
$IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
ALL SYN --dport ssh -j ACCEPT
$IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT
#outgoing traffic
einfo "Creating outgoing ssh traffic chain"
$IPTABLES -N allow-ssh-traffic-out
$IPTABLES -F allow-ssh-traffic-out
$IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT
einfo "Creating outgoing dns traffic chain"
$IPTABLES -N allow-dns-traffic-out
$IPTABLES -F allow-dns-traffic-out
$IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \
-j ACCEPT
$IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \
-j ACCEPT
einfo "Creating outgoing http/https traffic chain"
$IPTABLES -N allow-www-traffic-out
$IPTABLES -F allow-www-traffic-out
$IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
$IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT
#Catch portscanners
einfo "Creating portscan detection chain"
$IPTABLES -N check-flags
$IPTABLES -F check-flags
$IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \
--limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \
5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
-m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \
--limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
$IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \
--limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \
--limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
$IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Apply and add invalid states to the chains
einfo "Applying chains to INPUT"
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A INPUT -j icmp_allowed
$IPTABLES -A INPUT -j check-flags
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -j allow-ssh-traffic-in
$IPTABLES -A INPUT -j allowed-connection
einfo "Applying chains to FORWARD"
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -j icmp_allowed
$IPTABLES -A FORWARD -j check-flags
$IPTABLES -A FORWARD -o lo -j ACCEPT
$IPTABLES -A FORWARD -j allow-ssh-traffic-in
$IPTABLES -A FORWARD -j allow-www-traffic-out
$IPTABLES -A FORWARD -j allowed-connection
einfo "Applying chains to OUTPUT"
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -j icmp_allowed
$IPTABLES -A OUTPUT -j check-flags
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A OUTPUT -j allow-ssh-traffic-out
$IPTABLES -A OUTPUT -j allow-dns-traffic-out
$IPTABLES -A OUTPUT -j allow-www-traffic-out
$IPTABLES -A OUTPUT -j allowed-connection
#Allow client to route through via NAT (Network Address Translation)
$IPTABLES -t nat -A POSTROUTING -o $IINTERFACE -j MASQUERADE
eend $?
}
start() {
ebegin "Starting firewall"
if [ -e "${FIREWALL}" ]; then
restore
else
einfo "${FIREWALL} does not exists. Using default rules."
rules
fi
eend $?
}
stop() {
ebegin "Stopping firewall"
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
eend $?
}
showstatus() {
ebegin "Status"
$IPTABLES -L -n -v --line-numbers
einfo "NAT status"
$IPTABLES -L -n -v --line-numbers -t nat
eend $?
}
panic() {
ebegin "Setting panic rules"
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -P FORWARD DROP
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
eend $?
}
save() {
ebegin "Saving Firewall rules"
$IPTABLESSAVE > $FIREWALL
eend $?
}
restore() {
ebegin "Restoring Firewall rules"
$IPTABLESRESTORE < $FIREWALL
eend $?
}
restart() {
svc_stop; svc_start
}
showoptions() {
echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
echo "start) will restore setting if exists else force rules"
echo "stop) delete all rules and set all to accept"
echo "rules) force settings of new rules"
echo "save) will store settings in ${FIREWALL}"
echo "restore) will restore settings from ${FIREWALL}"
echo "showstatus) Shows the status"
}
|
Unele sfaturi la crearea unui sistem firewall:
- Creaţi politica sistemul dvs. firewall înainte de a-l implementa
- Păstraţi-l simplu
-
Să ştiţi cum funcţionează fiecare protocol (citiţi documentele RFC(Request For Comments) relevante)
-
Amintiţi-vă că sistemul firewall este doar o aplicaţie care rulează ca root.
- Testaţi-vă sistemul dvs. firewall
În cazul în care consideraţi că iptables este greu de înţeles sau ia mult timp
pentru a-l înţelege ori ia mult timp pentru a seta un sistem firewall decent,
puteţi utiliza Shorewall. În
principiu acesta utilizează iptables pentru a genera reguli firewall, dar se
concentrează pe reguli şi nu pe anumite protocoale.
12.f. Squid
Squid este o aplicaţie server proxy foarte puternică. Poate filtra traficul pe
baza timpului, expresiilor regulate aplicate căilor/componentelor URI,
adreselor IP ale sursei şi destinaţiei, domeniului, aplicaţiei browser,
autentificării utilizatorului, tipului componentei MIME şi numărului portului
(protocol). Probabil că am uitat unele funcţionalităţi, dar poate fi greu să
acoperim întreaga listă aici.
În următorul exemplu am adăugat un filtru pentru spaţii publicitare, în locul
unui filtru pentru site-urile porno. Motivul pentru aceasta este că Gentoo.org
nu trebuie să fie afişat ca un site porno. Şi nu vreau să-mi pierd
timpul încercând să găsesc unele site-uri bune pentru dvs.
În acest caz, politica mea afirmă:
-
Navigarea (HTTP/HTTPS) este permisă în timpul orelor de lucru (luni-vineri
8-17 şi sâmbătă 8-13), dar dacă angajaţii rămân până târziu, ar trebui să
muncească nu să navigheze
-
Descărcarea fişierelor nu este permisă (.exe, .com, .arj, .zip, .asf, .avi,
.mpg, .mpeg, etc)
-
Nu agreem spaţiile publicitare, deci acestea sunt filtrate şi înlocuite cu o
imagine gif transparentă (aici intervine creativitate dvs.!).
-
Toate celelalte conexiuni spre şi din Internet sunt interzise.
Aceasta se implementează în 4 paşi simpli.
Cod 6.1: /etc/squid/squid.conf |
# Ascultă pe o adresă ip şi un port
http_port 10.0.2.1:3128
# Configuraţia standard
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
# Adăugarea unor liste de control al accesului de bază
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
# Adăugarea celor care pot accesa server-ul proxy
acl localnet src 10.0.0.0/255.255.0.0
# Şi a porturilor
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE
# Adăugarea unei liste de control al accesului pe baza unor expresii
# regulate pentru componentele url
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"
# Adăugarea unor liste de control al accesului pe baza orei şi zilei
acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00
acl CONNECT method CONNECT
# permite accesul managerului de pe localhost
http_access allow manager localhost
http_access deny manager
# Permite cererile de curăţare de la localhost
http_access allow purge localhost
http_access deny purge
# Interzice cererile pentru porturile necunoscute
http_access deny !Safe_ports
# Interzice CONNECT pe alte porturi decât cele SSL
http_access deny CONNECT !SSL_ports
# Regulile mele proprii
# Adăugaţi o pagină pentru a fi afişată
# când un spaţiu publicitar este îndepărtat
deny_info NOTE_ADS_FILTERED url_ads
# Apoi interziceţi-le
http_access deny url_ads
# Interziceţi toate arhivele
http_access deny archives
# Restricţionaţi accesul doar la orele de lucru
http_access allow localnet restricted_weekdays
http_access allow localnet restricted_weekends
# Interziceţi restul
http_access deny all
|
Urmează completarea fişierelor ce nu dorim să fie descărcate de utilizatorii
dvs. Am adăugat fişierele zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg,
au, ra, arj, tar, gz şi z.
Cod 6.2: /etc/squid/files.acl |
\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$
|
Notă:
Vă rugăm să notaţi parantezele [] ce conţin majuscule şi minuscule pentru
fiecare caracter. Aceasta se introduce pentru ca nimeni să nu păcălească
filtrul prin accesarea unui fişier denumit AvI în loc de avi.
|
Urmează adăugarea expresiilor regulate pentru identificarea spaţiilor
publicitare. Probabil, dvs. veţi fi mult mai creativi decât mine:
Cod 6.3: /etc/squid/banner-ads.acl |
/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif
|
Şi ultima parte constă în afişarea următorului fişier în momentul în care un
spaţiu publicitar este îndepărtat. Practic, este o jumătate de fişier html cu o
imagine gif transparentă de dimensiunea 4x4.
Cod 6.4: /etc/squid/errors/NOTE_ADS_FILTERED |
<HTML>
<HEAD>
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://localhost/images/4x4.gif">
<TITLE>ERROR: The requested URL could not be retrieved</TITLE>
</HEAD>
<BODY>
<H1>Add filtered!</H1>
|
Notă:
Nu închideţi tag-urile <HTML> şi <BODY>. Această operaţie va fi
efectuată de squid.
|
După cum puteţi observa, Squid are multe posibilităţi şi este foarte eficient,
atât la filtrare cât şi la nivelul proxy. Puteţi chiar să utilizaţi şi alte
aplicaţii proxy Squid pentru scalarea în reţele foarte mari. Configuraţi
exemplificată aici este potrivită mai degrabă pentru o reţea mică ce conţine
1-20 utilizatori.
Dar, combinarea filtrului de pachete (iptables) şi sistemul gateway de la
nivelul aplicaţie (Squid) este, probabil, cea mai bună soluţie, chiar dacă
Squid se află într-o locaţie sigură şi nimeni nu îl poate accesa din exterior.
Încă trebuie să fim atenţi la atacurile din interior.
Acum, trebuie să configuraţi aplicaţiile browser ale clienţilor pentru
utilizarea aplicaţiei server proxy. Sistemul gateway va preveni utilizatorii să
aibă orice contact cu exteriorul, decât dacă utilizează sistemul proxy.
Notă:
În Mozilla, acesta se setează în Edit->Preferences->Advanced->Proxies.
|
Operaţia mai poate fi făcută transparent, prin utilizarea iptables să transmită
mai departe tot traficul spre exterior spre aplicaţia proxy, Squid. Aceasta se
poate face prin adăugarea unei reguli de transmitere mai departe/prerutare în
sistemul gateway:
Cod 6.5: Activarea retransmiterii portului spre aplicaţia noastră proxy |
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to proxyhost:3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to proxyhost:3128
|
Notă:
Dacă aplicaţia proxy rulează pe un sistem de filtrare de pachete -- deşi nu este
recomandat, dar poate fi necesar în cazul în care nu aveţi maşini suficiente --
utilizaţi ţinta REDIRECT în locul DNAT (REDIRECT
redirectează pachetele la localhost).
|
12.g. Lecţii învăţate
Am învăţat că:
-
Un sistem firewall poate reprezenta un risc. Un sistem firewall configurat
incorect este mai rău decât a nu avea nici unul.
- Cum să setăm un sistem gateway de bază şi un sistem proxy transparent.
-
Cheia unui sistem firewall bun este să cunoaşteţi protocoalele pe care doriţi
să le permiteţi.
-
Traficul IP nu conţine întotdeauna date legitime, de ex. pachetele ICMP care
pot avea un conţinut cu caracter maliţios.
- Cum să prevenim atacurile SYN.
-
Filtrarea traficului HTTP, prin îndepărtarea imaginilor ofensive şi
descărcarea de viruşi.
-
Combinarea filtrării pachetelor şi a sistemelor gateway, oferă un control mai
bun.
Acum, dacă chiar doriţi, mergeţi şi creaţi un sistem firewall ce se
potriveşte nevoilor dvs.
13. Detecţia intruziunii
13.a. AIDE (Advanced Intrusion Detection Environment)
AIDE este un sistem Host-Based Intrusion Detection System (HIDS), o alternativă
gratuită la Tripwire (dacă deja cunoaşteţi Tripwire nu ar trebui să întâmpinaţi
dificultăţi în învăţarea configurării AIDE). Sistemele HIDS sunt utilizate în
detecţia modificărilor în fişierele de configurare generale ale sistemului şi a
binarelor, în general prin crearea unei semnături criptografice unice pentru
fişierele şi stocarea acestora într-o locaţie sigură. În mod regulat (cum ar
fi, zilnic), semnătura stocată ştiută a fi corectă este comparată cu cea
generată din copia curentă a fiecărui fişier, pentru a determina dacă fişierul
a fost modificat. Sistemele HIDS sunt o modalitate bună de a detecta
modificările nepermise sistemului dvs., dar necesită mai multă muncă pentru a
le implementa şi utiliza corect.
Fişierul de configurare este bazat pe expresii regulate, macro-uri şi reguli
pentru fişiere şi directoare. Avem următoarele macro-uri:
| Macro |
Descriere |
Sintaxă |
| ifdef |
Dacă a fost definit |
@@ifdef "nume" |
| ifndef |
Dacă nu a fost definit |
@@ifndef "nume" |
| define |
Defineşte o variabilă |
@@define "nume" "valoare" |
| undef |
Indefineşte o variabilă |
@@undef "nume" |
| ifhost |
Dacă "hostname" |
@@ifhost "hostname" |
| ifnhost |
Dacă nu "hostname" |
@@ifnhost "hostname" |
| endif |
Endif trebuie utilizat după fiecare din macro-urile anterior, cu excepţia
define şi undef
|
@@endif |
Aceste macro-uri devin foarte la îndemână, dacă aveţi mai mult de un sistem
Gentoo şi doriţi să utilizaţi AIDE pe toate. Dar nu toate maşinile rulează
aceleaşi servicii şi nici măcar aceeaşi utilizatori.
Apoi, avem seturi de indicatori de verificare pentru fişiere şi directoare.
Acestea reprezintă combinaţii de permisiuni, proprietăţi ale fişierelor şi
semnături criptografice (spre ex. sume de control).
| Indicator |
Descriere |
| p |
permisiuni |
| i |
inod |
| n |
numărul de link-uri |
| u |
utilizator |
| g |
grup |
| s |
mărime |
| b |
numărul de blocuri |
| m |
mtime (timpul modificării) |
| a |
atime (timpul accesului) |
| c |
ctime (timpul creării) |
| S |
verificarea mărimii de creştere |
| md5 |
suma de control md5 |
| sha1 |
suma de control sha1 |
| rmd160 |
suma de control rmd160 |
| tiger |
suma de control tiger |
| R |
p+i+n+u+g+s+m+c+md5 |
| L |
p+i+n+u+g |
| E |
Grup gol |
| > |
Creşterea fişierul jurnal p+u+g+i+n+S |
Iar, dacă AIDE este compilat cu suport mhash, atunci mai suportă încă unele
funcţionalităţi:
| Indicator |
Descriere |
| haval |
suma de control |
| gost |
suma de control gost |
| crc32 |
suma de control crc32 |
Acum, vă puteţi crea propriile dvs. reguli pe baza indicatorilor explicaţi
anterior prin combinarea lor, ca în următorul exemplu:
Cod 1.1: Crearea unui set de reguli pentru AIDE |
All=R+a+sha1+rmd160
Norm=s+n+b+md5+sha1+rmd160
|
Ultimul lucru pentru crearea fişierului de configurare este să vedem cu să
adăugăm o regulă unui fişier sau director. Pentru a introduce o regulă,
combinaţi numele fişierului sau directorului şi regula. AIDE va adăuga
fişierele recursiv, dacă nu specificaţi o regulă alternativă.
| Indicatori |
Descriere |
| ! |
Nu adaugă acest fişier sau director. |
| = |
Adaugă acest director, dar nu recursiv. |
Deci, haideţi să vedem un exemplu complet:
Cod 1.2: /etc/aide/aide.conf |
@@ifndef TOPDIR
@@define TOPDIR /
@@endif
@@ifndef AIDEDIR
@@define AIDEDIR /etc/aide
@@endif
@@ifhost smbserv
@@define smbactive
@@endif
# Locaţia bazei de date ce trebuie citită.
database=file:@@{AIDEDIR}/aide.db
# Locaţia bazei de date ce trebuie scrisă.
database_out=file:aide.db.new
verbose=20
report_url=stdout
# Definiţia regulilor
All=R+a+sha1+rmd160
Norm=s+n+b+md5+sha1+rmd160
@@{TOPDIR} Norm
!@@{TOPDIR}etc/aide
!@@{TOPDIR}dev
!@@{TOPDIR}proc
!@@{TOPDIR}root
!@@{TOPDIR}tmp
!@@{TOPDIR}var/log
!@@{TOPDIR}var/run
!@@{TOPDIR}usr/portage
@@ifdef smbactive
!@@{TOPDIR}etc/smb/private/secrets.tdb
@@endif
=@@{TOPDIR}home Norm
|
În exemplul de mai sus, specificăm în unele macro-uri, de unde începe
directorul superior şi unde este localizat directorul AIDE. AIDE compară
fişierul /etc/aide/aide.db când verifică integritatea fişierului.
Dar, când actualizează sau crează un fişier nou, acesta stochează informaţia în
/etc/aide/aide.db.new. Acesta pentru ca să nu suprascrie automat
fişierul db vechi. Opţiunea report_URL nu este implementată, încă, dar
intenţia autorului a fost să poată trimite un email sau chiar să execute
script-uri.
Fişierul ebuild pentru pachetul AIDE conţine, acum, un fişier de
configurare funcţional, un script ajutător şi un script pentru crontab.
Script-ul ajutător efectuează un număr de sarcini pentru dvs. şi
oferă o interfaţă ce este mai mult prietenoasă pentru script-uri. Pentru
a observa toate opţiunile disponibile, încercaţi aideinit --help.
Pentru a începe, tot ceea ce trebuie făcut este să executaţi aideinit
-i şi script-ul crontab ar trebui să detecteze baza de date şi să
trimită mesajele corespunzătoare în fiecare zi. Vă recomandăm să
revizuiţi fişierul /etc/aide/aide.conf pentru a vă asigura
că această configuraţie reflectă în mod exact ceea ce este potrivit
pentru maşină.
Notă:
În funcţie de procesorul dvs., viteza de acces la disc şi indicatorii pe care
i-aţi setat pe fişiere, această operaţie poate dura ceva timp.
|
Notă:
Aminitiţi-vă să setaţi un alias pentru a putea verifica mesajele utilizatorului
root. Altfel, nu veţi şti niciodată ce raportează AIDE.
|
Acum, există un risc inerent când stocaţi fişierele db local, deoarece
atacatorul (dacă ştie că AIDE este instalat) mai mult ca sigur va încerca să vă
altereze fişierul db, să îl actualizeze sau să modifice
/usr/bin/aide. Deci, va trebui să creaţi un CD sau un alt suport
media şi să stocaţi o copie a fişierului .db şi binarele AIDE.
Se pot găsi informaţii pe pagina proiectului AIDE.
13.b. Snort
Snort este un Network Intrusion Detection System (NIDS) - Sistem de Detecţie a
Intruziunii în Reţea. Pentru a-l instala şi configura, utilizaţi următoarele
exemple.
Cod 2.1: /etc/conf.d/snort |
PIDFILE=/var/run/snort_eth0.pid
MODE="full"
NETWORK="10.0.0.0/24"
LOGDIR="/var/log/snort"
CONF=/etc/snort/snort.conf
SNORT_OPTS="-D -s -u snort -dev -l $LOGDIR -h $NETWORK -c $CONF"
|
Cod 2.2: /etc/snort/snort.conf |
var HOME_NET 10.0.0.0/24
var EXTERNAL_NET any
var SMTP $HOME_NET
var HTTP_SERVERS $HOME_NET
var SQL_SERVERS $HOME_NET
var DNS_SERVERS [10.0.0.2/32,212.242.40.51/32]
var RULE_PATH ./
preprocessor frag2
preprocessor stream4: detect_scans detect_state_problems detect_scans disable_evasion_alerts
preprocessor stream4_reassemble: ports all
preprocessor http_decode: 80 8080 unicode iis_alt_unicode double_encode iis_flip_slash full_whitespace
preprocessor rpc_decode: 111 32771
preprocessor bo: -nobrute
preprocessor telnet_decode
include classification.config
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/smtp.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/rservices.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/tftp.rules
include $RULE_PATH/web-cgi.rules
include $RULE_PATH/web-coldfusion.rules
include $RULE_PATH/web-iis.rules
include $RULE_PATH/web-frontpage.rules
include $RULE_PATH/web-misc.rules
include $RULE_PATH/web-attacks.rules
include $RULE_PATH/sql.rules
include $RULE_PATH/x11.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/backdoor.rules
include $RULE_PATH/shellcode.rules
include $RULE_PATH/policy.rules
include $RULE_PATH/porn.rules
include $RULE_PATH/info.rules
include $RULE_PATH/icmp-info.rules
include $RULE_PATH/virus.rules
# include $RULE_PATH/experimental.rules
include $RULE_PATH/local.rules
|
Cod 2.3: /etc/snort/classification.config |
config classification: not-suspicious,Not Suspicious Traffic,3
config classification: unknown,Unknown Traffic,3
config classification: bad-unknown,Potentially Bad Traffic, 2
config classification: attempted-recon,Attempted Information Leak,2
config classification: successful-recon-limited,Information Leak,2
config classification: successful-recon-largescale,Large Scale Information Leak,2
config classification: attempted-dos,Attempted Denial of Service,2
config classification: successful-dos,Denial of Service,2
config classification: attempted-user,Attempted User Privilege Gain,1
config classification: unsuccessful-user,Unsuccessful User Privilege Gain,1
config classification: successful-user,Successful User Privilege Gain,1
config classification: attempted-admin,Attempted Administrator Privilege Gain,1
config classification: successful-admin,Successful Administrator Privilege Gain,1
# CLASIFICĂRI NOI
config classification: rpc-portmap-decode,Decode of an RPC Query,2
config classification: shellcode-detect,Executable code was detected,1
config classification: string-detect,A suspicious string was detected,3
config classification: suspicious-filename-detect,A suspicious filename was detected,2
config classification: suspicious-login,An attempted login using a suspicious username was detected,2
config classification: system-call-detect,A system call was detected,2
config classification: tcp-connection,A TCP connection was detected,4
config classification: trojan-activity,A Network Trojan was detected, 1
config classification: unusual-client-port-connection,A client was using an unusual port,2
config classification: network-scan,Detection of a Network Scan,3
config classification: denial-of-service,Detection of a Denial of Service Attack,2
config classification: non-standard-protocol,Detection of a non-standard protocol or event,2
config classification: protocol-command-decode,Generic Protocol Command Decode,3
config classification: web-application-activity,access to a potentially vulnerable web application,2
config classification: web-application-attack,Web Application Attack,1
config classification: misc-activity,Misc activity,3
config classification: misc-attack,Misc Attack,2
config classification: icmp-event,Generic ICMP event,3
config classification: kickass-porn,SCORE! Get the lotion!,1
|
Mai multe informaţii pot fi găsite pe site-ul Snort.
10.c. Detecţia aplicaţiilor malware şi chkrootkit
Sistemele HIDS, ca AIDE au o metodă bună de detecţie a modificărilor efectuate
în sistemul dvs., dar nu strică să mai deţinem o linie de apărare.
chkrootkit este un utilitar ce scanează fişierele de sistem comune
pentru prezenţa codurilor rootkit -- aplicaţii proiectate să ascundă acţiunile
unui intrus şi să îi permită să îşi menţină accesul -- şi vă scanează sistemul
pentru urme cunoscute ale aplicaţiilor de tip keylogger (ce reţin tastele
apăsate) şi a altor aplicaţii "malware" (cu caracter maliţios). În timp
chkrootkit (şi alte alternative, precum rkhunter) sunt utilitare
folositoare, atât pentru mentenanţa sistemului cât şi pentru urmărirea
intruşilor după ce a fost desfăşurat un atac, ele nu vă pot garanta că sistemul
dvs. este sigur.
Cea mai bună soluţie să utilizaţi chkrootkit pentru a detecta o
intruziune, este să-l rulaţi regulat prin intermediul cron. Pentru a
începe, instalaţi app-admin/chkrootkit. chkrootkit poate fi
rulat din linia de comandă prin comanda cu acelaşi nume, sau din cron
printr-o intrare similară cu următoarea:
Cod 3.1: Programarea chkrootkit prin intermediul cron |
0 3 * * * /usr/sbin/chkrootkit
|
14. Menţinerea actualizărilor
14.a. Menţinerea actualizărilor
Odată ce aţi instalat cu succes sistemul dvs. şi aţi asigurat un bun nivel de
securitate, nu aţi terminat. Securitatea este un proces în desfăşurare; vasta
majoritate a intruziunilor sunt rezultatul unor vulnerabilităţi cunoscute în
sistemele nereparate. Menţinerea sistemului dvs. actualizat este singurul şi
cel mai valoros pas pe care puteţi să-l efectuaţi pentru o securitate mai bună.
Dacă aveţi o versiune recentă a pachetului portage instalată, puteţi,
mai întâi, să vă sincronizaţi structura portage cu emerge --sync şi apoi
să executaţi comanda glsa-check --list pentru a verifica dacă sistemul
este la zi la nivel de securitate. glsa-check este parte componentă a
pachetului app-portage/gentoolkit.
Cod 1.1: Examplu de afişare a comenzii glsa-check -l |
# glsa-check -l
WARNING: This tool is completely new and not very tested, so it should not be
used on production systems. It's mainly a test tool for the new GLSA release
and distribution system, it's functionality will later be merged into emerge
and equery.
Please read http://www.gentoo.org/proj/en/portage/glsa-integration.xml
before using this tool AND before reporting a bug.
[A] means this GLSA was already applied,
[U] means the system is not affected and
[N] indicates that the system might be affected.
200406-03 [N] sitecopy: Multiple vulnerabilities in included libneon ( net-misc/sitecopy )
200406-04 [U] Mailman: Member password disclosure vulnerability ( net-mail/mailman )
.......
|
Atenţie:
Utilitarul glsa-check este încă experimental, deci, dacă securitatea
este prioritatea dvs. ce mai mare, ar fi indicat să verificaţi încă o dată
lista cu alte surse.
|
Toate liniile ce încep cu [A] şi [U] pot fi, aproape sigur,
ignorate deoarece sistemul nu este afectat de acel GLSA.
Important:
Notaţi faptul că obişnuita comandă emerge -vpuD world nu alege
toate actualizările de pachete. Va trebui să utilizaţi glsa-check
dacă doriţi să vă asiguraţi că toate actualizările GLSA sunt
rezolvate în sistemul dvs.
|
Cod 1.2: Verificarea tuturor actualizărilor GLSA |
# glsa-check -t all
WARNING: This tool is completely new and not very tested, so it should not be
used on production systems. It's mainly a test tool for the new GLSA release
and distribution system, it's functionality will later be merged into emerge
and equery.
Please read http://www.gentoo.org/proj/en/portage/glsa-integration.xml
before using this tool AND before reporting a bug.
This system is affected by the following GLSA:
200504-06
200510-08
200506-14
200501-35
200508-12
200507-16
# glsa-check -p $(glsa-check -t all)
Checking GLSA 200504-06
The following updates will be performed for this GLSA:
app-arch/sharutils-4.2.1-r11 (4.2.1-r10)
**********************************************************************
Checking GLSA 200510-08
The following updates will be performed for this GLSA:
media-libs/xine-lib-1.1.0-r5 (1.1.0-r4)
# glsa-check -f $(glsa-check -t all)
|
Dacă trebuie să actualizaţi un serviciu care rulează, nu uitaţi să-l
restartaţi.
Păstrarea kernel-ului la zi este
de asemenea recomandată.
Dacă doriţi să primiţi un mesaj de oricâte ori este publicat un anunţ GLSA,
subscrieţi-vă la lista de discuţii gentoo-announce. Intrucţiunile pentru
a vă subscrie la aceasta precum şi la alte liste de discuţii pot fi găsite în
documentul Generalităţi despre Listele de
Discuţii Gentoo Linux.
O altă resursă bună pentru securitate este lista de discuţii Bugtraq.
Conţinutul acestui document este publicat sub licenţa Creative Commons -
Attribution / Share Alike.
|
|