1. Preambul
Linux cu securitate îmbunătățită (SELinux) este un modul de kernel Linux și un subsistem de securitate al Linux.
SELinux a fost dezvoltat în principal de NSA. Kernel-urile Linux 2.6 și mai mari integrează deja module SELinux.
SELinux este foarte complex și are multe aspecte conceptuale greu de învățat. Mulți administratori de sistem Linux au dezactivat SELinux pentru că îl consideră problematic.
Dacă poți stăpâni SELinux și să-l folosești corect, cred că întregul sistem poate ajunge practic la punctul de a fi "indestructibil" (amintește-ți mereu că nu există o securitate absolută).
Stăpânirea conceptelor de bază ale SELinux, precum și a metodelor simple de configurare, este un curs obligatoriu pentru orice administrator de sistem Linux.
Acest articol se bazează pe CentOS 7.4.1708.
Acest articol este pur și simplu o experiență personală de împărtășire și schimb de experiențe de învățare, greșelile sunt inevitabile, doar pentru referință! Dacă găsiți o greșeală, vă rog să o menționați, vă mulțumesc foarte mult!
2. Rolul SELinux și mecanismul de gestionare a permisiunilor
2.1 Rolul lui SELinux
Funcția principală a SELinux este de a minimiza resursele care pot fi accesate de procesele de serviciu din sistem (principiul privilegiului minim).
Imaginează-ți că dacă un serviciu de rețea care rulează ca root are o vulnerabilitate 0day, hackerii pot exploata această vulnerabilitate pentru a face orice doresc pe serverul tău ca root. Nu-i așa că e înfricoșător?
SELinux este aici să rezolve această problemă.
2.2 DAC
Într-un sistem de operare care nu folosește SELinux, factorul care determină dacă o resursă poate fi accesată este dacă o resursă are permisiunile utilizatorului corespunzător (citire, scriere, execuție).
Atâta timp cât procesul de accesare a acestei resurse îndeplinește condițiile de mai sus, poate fi accesat.
Cea mai fatală problemă este că utilizatorii root nu sunt supuși niciunei reglementări, iar orice resurse din sistem pot fi accesate fără restricții.
Corpul principal al acestui mecanism de gestionare a permisiunilor este utilizatorul, cunoscut și sub denumirea de control autonom al accesului (DAC).
2.3 MAC
Într-un sistem de operare care folosește SELinux, factorii care determină dacă o resursă poate fi accesată nu sunt doar cei de mai sus, ci și dacă fiecare tip de proces are acces la un anumit tip de resursă.
Astfel, chiar dacă un proces rulează ca root, este necesar să se determine tipul de proces și tipurile de resurse care pot fi accesate înainte de a decide dacă se permite accesul la o resursă. Spațiul activ al procesului poate fi, de asemenea, comprimat la minimum.
Chiar și un proces de serviciu care rulează ca root are, în general, acces doar la resursele de care are nevoie. Chiar dacă un program este vulnerabil, amploarea impactului este limitată la resursele la care are acces. Securitatea este mult sporită.
Corpul principal al acestui mecanism de gestionare a permisiunilor este procesul, cunoscut și sub denumirea de control obligatoriu al accesului (MAC).
MAC este subdivizat în două moduri: unul se numește modul Category Security (MCS), iar celălalt se numește modul Multi-Level Security (MLS).
Următoarele acțiuni sunt în modul MCS.
2.4 Comparație între DAC și MAC
Iată o imagine pentru ilustrație.
După cum vezi, în modul DAC, atâta timp cât directorul corespunzător are permisiunile utilizatorului corespunzător, acesta poate fi accesat. În modul MAC, este limitat și de gama de directoare la care procesele au acces.
3. Concepte de bază ale SELinux
3.1 Subiect
Poate fi complet echivalat cu un proces.
Notă: Pentru ușurința înțelegerii, cu excepția cazului în care se specifică altfel, procesul este considerat corpul principal de mai jos.
3.2 Obiectiv
Resurse accesate de director. Pot fi fișiere, directoare, porturi, dispozitive etc.
Notă: Pentru ușurința înțelegerii, cu excepția cazului în care se specifică altfel, următoarele documente sau directoare sunt considerate obiecte.
3.3 Politică și Regulă
De obicei, există un număr mare de fișiere și procese în sistem, iar pentru a economisi timp și eforturi, de obicei reglementăm selectiv doar anumite procese.
Și care procese trebuie reglementate și cum să le controleze sunt determinate de politici.
Există mai multe reguli într-o poliță. Unele reguli pot fi activate sau dezactivate după nevoie (denumite în continuare reguli booleene).
Regulile sunt modulare și extensibile. La instalarea unei aplicații noi, aplicația poate adăuga reguli prin adăugarea de module noi. Utilizatorii pot, de asemenea, să adauge sau să scadă manual reguli.
În sistemul CentOS 7, există trei seturi de politici, și anume:
1. țintit: Controlează majoritatea proceselor de servicii de rețea. Aceasta este politica folosită implicit de sistem (toate cele de mai jos sunt folosite).
2. Minim: Pe baza țintei, sunt reglementate doar anumite procese de servicii de rețea. În general, nu.
3. MLS: Protecție de securitate pe mai multe niveluri. Reglementează toate procesele. Aceasta este cea mai strictă politică, iar configurarea este foarte dificilă. În general, nu este folosit decât dacă există cerințe extrem de ridicate de securitate.
Politicile pot fi setate în /etc/selinux/config.
3.4 Context de securitate
Contextul securității este în centrul SELinux.
Contextul de securitate îl împart în "context de securitate a proceselor" și "context de securitate a documentelor".
Un Context de Securitate a Proceselor corespunde de obicei mai multor Contexte de Securitate a Documentelor.
Doar atunci când contextul de securitate al celor două corespunde poate un proces accesa fișierul. Corespondența lor este determinată de regulile din poliță.
Contextul de securitate al fișierului este determinat de locul unde a fost creat fișierul și de procesul care l-a creat. Iar sistemul are un set de valori implicite, iar utilizatorii pot seta și valorile implicite.
Este important de menționat că simpla mutare a fișierelor nu schimbă contextul de securitate al fișierelor tale.
Structura și semnificația contextului de securitate
Contextul de securitate are patru câmpuri, separate prin două puncte. Formă precum: system_u:object_r:admin_home_t:s0.
3.5 Modul de Funcționare SELinux
SELinux are trei moduri de funcționare, și anume:
1. aplicarea: Modul impus. Încălcările regulilor SELinux vor fi blocate și înregistrate în jurnale.
2. Permisiv: Modul toleranță. Încălcările regulilor SELinux sunt înregistrate doar în jurnale. De obicei pentru depanare.
3. dezactivat: Dezactivează SELinux.
Modul de lucru SELinux poate fi setat în /etc/selinux/config.
Dacă vrei să treci de la "cu dizabilități" la "aplicat" sau permisiv, va trebui să repornești sistemul. Și invers.
Modurile de impunere și permisivă pot fi schimbate rapid cu comanda Setenforce 1|0.
Este important de menționat că, dacă sistemul a rulat cu SELinux oprit o perioadă, prima repornire după pornirea SELinux poate fi mai lentă. Pentru că sistemul trebuie să creeze un context sigur pentru fișierele de pe disc (am spus că am repornit cam 10 minute și am crezut că e mort...... )。
Jurnalele SELinux trebuie înregistrate cu ajutorul auditd.service, vă rugăm să nu le dezactivați.
3.6 Fluxul de lucru SELinux
Iată un citat dintr-o fotografie, fără prea multe explicații.
Notă: Textul de securitate de mai sus se referă la contextul de securitate.
4. Operațiuni de bază SELinux
4.1 Interogarea contextului de securitate al unui fișier sau director
Utilizare de bază prin comandă
ls -Z
Exemple de utilizare
Interoghează contextul de securitate al /etc/hosts.
ls -Z /etc/hosts
Rezultatele execuției
-r-r--r--. rădăcina rădăcină system_u:object_r:net_conf_t:s0 /etc/hosts
4.2 Interogare contextul de securitate al procesului
Utilizare de bază prin comandă
ps auxZ | grep -v grep | grep
Exemple de utilizare
Interogați contextul de securitate al proceselor legate de Nginx.
ps auxZ | grep -v grep | Grep Nginx
Rezultatele execuției
system_u:system_r:httpd_t:s0 root 7997 0.0 0.0 122784 2156 ? Ss 14:31 0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:httpd_t:s0 nginx 7998 0.0 0.0 125332 7560 ? S 14:31 0:00 nginx: procesul lucrătorului
4.3 Modificarea manuală a contextului de securitate al unui fișier sau director
Utilizare de bază prin comandă
chcon [...]
Funcția opțiune -u Modifică câmpul utilizator al contextului de securitate -r Modifică câmpul de rol al contextului de securitate -t Modifică câmpul tip al contextului de securitate -l Modifică câmpul de nivel al contextului de securitate --reference Modifică contextul de securitate consistent cu fișierul sau directorul specificat -R Operație recursivă -h Modifică contextul de securitate al legăturii soft (modifică fișierul corespunzător al legăturii soft fără această opțiune)
Exemple de utilizare
Modifică contextul de securitate al testului la aaa_u:bbb_r:ccc_t:s0.
CHCON -U aaa_u -R bbb_r -T ccc_t Test
4.4 Revenirea contextului de securitate al unui fișier sau director la valoarea sa implicită
Utilizare de bază prin comandă
RestoreCon [opțiuni] [...]
Funcție de opțiune - Procedura operațiunii de imprimare V - Operație recursivă R
Exemple de utilizare
După ce adaugi câteva fișiere web în directorul serverului tău Nginx, setează contextul de securitate corect pentru aceste fișiere noi.
restorecon -R /usr/share/nginx/html/
4.5 Interoghează regulile booleene și starea lor în sistem
Utilizare de bază prin comandă
getsebool -a
Deoarece comanda interogează fie toate regulile, fie doar una, de obicei interoghează toate regulile mai întâi și apoi filtrează cu grep.
Exemple de utilizare
Interoghează regulile booleene legate de httpd.
getsebool -a | grep httpd
Rezultatele execuției
httpd_anon_write -->
httpd_builtin_scripting --> mai departe
httpd_can_check_spam -->
httpd_can_connect_ftp -->
#以下省略
4.6 Comutarea unei reguli booleene
Utilizare de bază prin comandă
setsebool [opțiune]
Funcția de opțiune -P restart încă are efect
Exemple de utilizare
Activează regulile httpd_anon_write.
setsebool - P httpd_anon_write on
4.7 Adaugă un context de securitate implicit pentru un director
Utilizare de bază prin comandă
semanage fcontext -a -t "(/.*)?"
Notă: Contextul de securitate implicit al unui director sau fișier poate fi vizualizat folosind comanda semanage fcontext -l împreună cu filtrarea grep.
Exemple de utilizare
După ce adaugi un nou director al site-ului /usr/share/nginx/html2 în Nginx, trebuie să setezi același context de securitate implicit ca și directorul original.
semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"
4.8 Adaugă porturi permise de anumite tipuri de procese
Utilizare de bază prin comandă
portul semanage -a -t -p
Notă: Numerele de port permise pentru diverse tipuri de servicii pot fi vizualizate folosind comanda semanage port -l cu filtrare grep.
Exemple de utilizare
Pentru Nginx, trebuie să folosești portul 10080 pentru serviciile HTTP.
portul SEMANAGE -A -T http_port_t -P TCP 10080
5. Analiza și rezolvarea erorilor SELinux
5.1 Înțelegerea jurnalelor SELinux
Când SELinux este activat, un comportament normal al multor servicii este considerat o încălcare (atât în titlu, cât și în erorile de mai jos).
În acest moment, trebuie să folosim jurnalele de încălcări SELinux pentru a le analiza și rezolva.
Jurnalele de încălcări SELinux sunt salvate în /var/log/audit/audit.log.
/var/log/audit/audit.log 的内容大概是这样的。
type=LOGIN msg=audit(1507898701.391:515): pid=8523 uid=0 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=25 res=1
Type=USER_START MSG=Audit(1507898701.421:516): PID=8523 UID=0 AuID=0 SES=25 Subj=system_u:system_r:crond_t:S0-S0:C0.C1023 MSG='op=PAM:session_open grantors=pam_loginuid,pam_ keyinit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=succes'
...
Fișierul conține mult conținut și este amestecat cu multe jurnale de audit de sistem care nu au nicio legătură cu erorile SELinux. Vom folosi utilitarul sealert pentru a ajuta la analiză (dacă promptul nu găsește comanda, instalează pachetul setroubleshoot).
5.2 Analizează erorile cu sealert
Utilizare de bază prin comandă
sealert -a /var/log/audit/audit.log
După executarea comenzii, sistemul trebuie să ia timp să analizeze încălcările din jurnale și să furnizeze un raport de analiză. |