În timpul acestei serii am explorat în detaliu cel puțin două metode de control al accesului: standard ugo/rwx permisiuni (Gestionați utilizatorii și grupurile - Partea 3) și liste de control al accesului (Configurați ACL-urile pe sistemele de fișiere - Partea 7).
Deși sunt necesare ca permisiuni de prim nivel și mecanisme de control al accesului, acestea au unele limitări care sunt abordate de Linux îmbunătățit de securitate (aka SELinux pe scurt).
Una dintre astfel de limitări este aceea că un utilizator poate expune un fișier sau un director la o încălcare a securității printr-o metodă slab elaborată chmod comandă și astfel provoacă o propagare neașteptată a drepturilor de acces. Prin urmare, orice proces început de acel utilizator poate face ceea ce dorește cu fișierele deținute de utilizator, unde în cele din urmă un software rău intenționat sau altfel compromis poate obține acces la nivel de rădăcină pentru întreg sistem.
Având în vedere aceste limitări,
Agenția Națională de Securitate a Statelor Unite (NSA) prima dată concepută SELinux, o metodă flexibilă de control obligatoriu a accesului, pentru a restricționa capacitatea proceselor de a accesa sau de a efectua alte operațiuni obiecte de sistem (cum ar fi fișiere, directoare, porturi de rețea etc.) la cel mai mic model de permisiune, care poate fi modificat ulterior ca Necesar. În câteva cuvinte, fiecărui element al sistemului i se oferă doar accesul necesar funcționării.În RHEL 7, SELinux este încorporat în nucleul în sine și este activat în Aplicarea mod implicit. În acest articol vom explica pe scurt conceptele de bază asociate SELinux și funcționarea acestuia.
SELinux poate funcționa în trei moduri diferite:
getenforce
comanda afișează modul curent al SELinux, în timp ce setenforce
(urmat de un 1 sau a 0) este folosit pentru a schimba modul în Aplicarea sau Permisiv, respectiv, numai în timpul sesiunii curente.
Pentru a obține persistența între deconectări și reporniri, va trebui să editați fișierul /etc/selinux/config
fișier și setați variabila SELINUX la oricare punerea în aplicare, permisiv, sau dezactivat:
# getenforce. # setenforce 0. # getenforce. # setenforce 1. # getenforce. # cat / etc / selinux / config.
De obicei, veți folosi setenforce pentru a comuta între modurile SELinux (aplicarea la permisiv și înapoi) ca prim pas de depanare. Dacă SELinux este setat în prezent la punerea în aplicare în timp ce întâmpinați o anumită problemă, și același lucru dispare atunci când o setați la permisiv, puteți avea încredere că vă uitați la o problemă cu permisiunile SELinux.
Un context SELinux constă într-un mediu de control al accesului în care deciziile sunt luate pe baza utilizatorului, rolului și tipului SELinux (și opțional un nivel):
Să vedem cum funcționează toate acestea prin următoarele exemple.
În Securizarea SSH - Partea 8 am explicat că schimbarea portului implicit unde sshd listens on este una dintre primele măsuri de securitate pentru a vă proteja serverul împotriva atacurilor externe. Să edităm /etc/ssh/sshd_config
fișier și setați portul la 9999:
Portul 9999.
Salvați modificările și reporniți sshd:
# systemctl reporniți sshd. # systemctl status sshd.
După cum puteți vedea, sshd nu a reușit să pornească. Dar ce sa intamplat?
O inspecție rapidă a /var/log/audit/audit.log
indică faptul că lui sshd i s-au refuzat permisiunile de pornire pe port 9999 (Mesajele jurnal SELinux includ cuvântul „AVC”, Astfel încât acestea să poată fi identificate cu ușurință din alte mesaje) deoarece acesta este un port rezervat pentru Managementul JBoss serviciu:
# cat /var/log/audit/audit.log | grep AVC | coada -1.
În acest moment ați putea dezactiva SELinux (dar nu!) așa cum am explicat mai devreme și încercați să începeți sshd din nou și ar trebui să funcționeze. Însă semanage utilitarul ne poate spune ce trebuie să schimbăm pentru a putea începe sshd în orice port alegem fără probleme.
Alerga,
# semanage port -l | grep ssh.
pentru a obține o listă a porturilor pe care SELinux permite ascultarea lui sshd.
Deci, să schimbăm portul /etc/ssh/sshd_config
spre Port 9998, adăugați portul la context ssh_port_t, apoi reporniți serviciul:
# semanage port -a -t ssh_port_t -p tcp 9998. # systemctl reporniți sshd. # systemctl is-active sshd.
După cum puteți vedea, serviciul a fost pornit cu succes de data aceasta. Acest exemplu ilustrează faptul că SELinux controlează numărul portului TCP la definițiile interne ale tipului său de port.
Acesta este un exemplu de gestionare a unui proces SELinux care accesează un alt proces. Dacă ar fi să implementezi mod_security și mod_evasive împreună cu Apache în RHEL 7 server, trebuie să permiteți httpd a accesa sendmail pentru a trimite o notificare prin e-mail în urma unui (D) DoS atac. În următoarea comandă, omiteți fișierul -P semnalizați dacă nu doriți ca modificarea să fie persistentă la reporniri.
# semanage boolean -1 | grep httpd_can_sendmail. # setsebool -P httpd_can_sendmail 1. # semanage boolean -1 | grep httpd_can_sendmail.
După cum puteți spune din exemplul de mai sus, SELinux boolean setările (sau doar booleenii) sunt reguli adevărate / false încorporate în politicile SELinux. Puteți enumera toți booleenii cu semanage boolean -l
și, alternativ, introduceți-l în grep pentru a filtra ieșirea.
Să presupunem că serviți un site web static folosind un director diferit de cel implicit (/var/www/html
), Spune /websites (acest lucru ar putea fi cazul dacă vă stocați fișierele web într-o unitate de rețea partajată, de exemplu, și trebuie să le montați la /websites).
A). Creaza un index.html fișier în interior /websites cu următorul conținut:
Testul SELinux
Dacă faci,
# ls -lZ /websites/index.html.
veți vedea că index.html fișierul a fost etichetat cu implicit_t SELinux tip, la care Apache nu poate accesa:
b). Schimba DocumentRoot directivă în /etc/httpd/conf/httpd.conf
la /websites și nu uitați să actualizați blocul Director corespunzător. Apoi, reporniți Apache.
c). Navigați la http: //
și ar trebui să obțineți un răspuns HTTP interzis 503.
d). Apoi, schimbați eticheta /websites, recursiv, la httpd_sys_content_t tastați pentru a acorda Apache acces numai în citire la acel director și conținutul acestuia:
# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"
e). În cele din urmă, aplicați politica SELinux creată în d):
# restorecon -R -v / site-uri web.
Acum reporniți Apache și navigați la http: //
din nou și veți vedea fișierul html afișat corect:
În acest articol am trecut prin elementele de bază ale SELinux. Rețineți că, din cauza vastității subiectului, o explicație detaliată completă nu este posibilă într-un singur articol, dar noi credeți că principiile prezentate în acest ghid vă vor ajuta să treceți la subiecte mai avansate dacă doriți să faceți asa de.
Dacă îmi permiteți, permiteți-mi să recomand două resurse esențiale pentru a începe cu: Pagina NSA SELinux si RHEL 7 SELinux pentru utilizator și administrator ghid.
Nu ezitați să ne anunțați dacă aveți întrebări sau comentarii.