1. Preambule
Security-Enhanced Linux (SELinux) is een Linux-kernelmodule en een beveiligingssubsysteem van Linux.
SELinux werd voornamelijk ontwikkeld door de NSA. Linux-kernels 2.6 en hoger integreren al SELinux-modules.
SELinux is erg complex en bevat veel conceptuele dingen die moeilijk te leren zijn. Veel Linux-systeembeheerders hebben SELinux uitgeschakeld omdat ze het lastig vinden.
Als je SELinux beheerst en het correct gebruikt, denk ik dat het hele systeem in feite het punt kan bereiken dat het "onvernietigbaar" is (onthoud altijd dat er geen absolute beveiliging is).
Het beheersen van de basisconcepten van SELinux en eenvoudige configuratiemethoden is een verplichte cursus voor elke Linux-systeembeheerder.
Dit artikel is gebaseerd op CentOS 7.4.1708.
Dit artikel is puur een persoonlijke leerervaring, uitwisseling en uitwisseling, fouten zijn onvermijdelijk, alleen ter referentie! Als je een fout vindt, wijs die dan alsjeblieft aan, heel erg bedankt!
2. De rol van SELinux en het machtigingsbeheermechanisme
2.1 De rol van SELinux
De belangrijkste functie van SELinux is het minimaliseren van de middelen die door serviceprocessen in het systeem toegankelijk zijn (het principe van het minste privilege).
Stel je voor dat als een netwerkdienst die als root draait een 0day-kwetsbaarheid heeft, hackers deze kwetsbaarheid kunnen misbruiken om te doen wat ze willen op je server als root. Is het niet eng?
SELinux is hier om dit probleem op te lossen.
2.2 DAC
In een besturingssysteem dat geen SELinux gebruikt, bepaalt of een resource toegankelijk is of een resource de rechten van de corresponderende gebruiker heeft (lezen, schrijven, uitvoeren).
Zolang het proces dat deze bron benadert voldoet aan bovenstaande voorwaarden, kan het worden benaderd.
Het meest fatale probleem is dat rootgebruikers niet onderworpen zijn aan enige regelgeving, en alle bronnen op het systeem zonder beperkingen toegankelijk zijn.
Het belangrijkste onderdeel van dit machtigingsbeheermechanisme is de gebruiker, ook wel autonome toegangscontrole (DAC) genoemd.
2.3 MAC
In een besturingssysteem dat SELinux gebruikt, zijn de factoren die bepalen of een bron toegankelijk is niet alleen de bovenstaande factoren, maar ook of elk type proces toegang heeft tot een bepaald type bron.
Op deze manier is het, zelfs als een proces als root draait, noodzakelijk om het type proces en de soorten bronnen die toegankelijk zijn te bepalen voordat wordt beslist of toegang tot een bron wordt toegestaan. De actieve ruimte van het proces kan ook tot een minimum worden samengedrukt.
Zelfs een serviceproces dat als root draait, heeft meestal alleen toegang tot de resources die het nodig heeft. Zelfs als een programma kwetsbaar is, is de omvang van de impact beperkt tot de middelen waar het toegang toe heeft. De beveiliging is sterk verhoogd.
Het belangrijkste onderdeel van dit machtigingsbeheermechanisme is het proces, ook wel verplichte toegangscontrole (MAC) genoemd.
MAC is onderverdeeld in twee manieren: de ene heet Category Security (MCS) modus, en de andere heet Multi-Level Security (MLS) modus.
De volgende acties zijn in MCS-modus.
2.4 Vergelijking van DAC en MAC
Hier is een afbeelding om te illustreren.
Zoals je kunt zien, kan in DAC-modus zolang de bijbehorende map de rechten van de betreffende gebruiker heeft, worden benaderd. In MAC-modus is het ook beperkt door het bereik van mappen waar processen toegang toe hebben.
3. Basisconcepten van SELinux
3.1 Onderwerp
Het kan volledig gelijkgesteld worden aan een proces.
Opmerking: Voor het gemakkelijke begrip wordt het proces, tenzij anders vermeld, beschouwd als het hoofdgedeelte hieronder.
3.2 Doel
Bronnen die door de directeur worden geraadpleegd. Het kunnen bestanden, mappen, poorten, apparaten, enzovoort zijn.
Opmerking: Voor het gemak van begrip worden, tenzij anders vermeld, de volgende documenten of mappen als objecten beschouwd.
3.3 Beleid & Regels
Er zijn meestal veel bestanden en processen in het systeem, en om tijd en overhead te besparen, reguleren we meestal slechts selectief bepaalde processen.
En welke processen gereguleerd moeten worden en hoe ze te beheersen, wordt bepaald door beleid.
Er zijn meerdere regels in een polis. Sommige regels kunnen naar behoefte worden ingeschakeld of uitgeschakeld (hierna aangeduid als Booleaanse regels).
De regels zijn modulair en uitbreidbaar. Bij het installeren van een nieuwe applicatie kan de applicatie regels toevoegen door nieuwe modules toe te voegen. Gebruikers kunnen regels ook handmatig toevoegen of wegtrekken.
In het CentOS 7-systeem zijn er drie sets beleid, namelijk:
1. gericht: Beheerst de meeste netwerkserviceprocessen. Dit is het beleid dat het systeem standaard gebruikt (alle onderstaande worden gebruikt).
2. Minimum: Op basis van de doelgerichte processen worden alleen geselecteerde netwerkserviceprocessen gereguleerd. Over het algemeen niet.
3. MLS: Meerlaagse beveiligingsbeveiliging. Reguleer alle processen. Dit is het strengste beleid, en de configuratie is erg moeilijk. Over het algemeen wordt het niet gebruikt tenzij er extreem hoge beveiligingseisen zijn.
Beleidsregels kunnen worden ingesteld in /etc/selinux/config.
3.4 Beveiligingscontext
De beveiligingscontext staat centraal in SELinux.
Beveiligingscontext Ik verdeel het in "procesbeveiligingscontext" en "documentbeveiligingscontext".
Een Procesbeveiligingscontext komt doorgaans overeen met meerdere Document Security Contexts.
Alleen wanneer de beveiligingscontext van beide overeenkomt, kan een proces toegang krijgen tot het bestand. Hun correspondentie wordt bepaald door de regels in het beleid.
De bestandsbeveiligingscontext wordt bepaald door waar het bestand is aangemaakt en het proces dat het heeft aangemaakt. En het systeem heeft een set standaardwaarden, en gebruikers kunnen ook de standaardwaarden instellen.
Het is belangrijk om te weten dat het simpelweg verplaatsen van bestanden de beveiligingscontext van je bestanden niet verandert.
De structuur en betekenis van de beveiligingscontext
De beveiligingscontext heeft vier velden, gescheiden door dubbele punten. Vorm zoals: system_u:object_r:admin_home_t:s0.
3.5 SELinux Werkmodus
SELinux heeft drie werkingsmodi, namelijk:
1. handhavend: Afgedwongen modus. Overtredingen van de SELinux-regels worden geblokkeerd en in de logboeken gelogd.
2. Permissief: Tolerantiemodus. SELinux-regelovertredingen worden alleen in de logs geregistreerd. Meestal voor debugging.
3. uitgeschakeld: Schakel SELinux uit.
De werkmodus van SELinux kan worden ingesteld in /etc/selinux/config.
Als je wilt overstappen van uitgeschakeld naar handhavend of permissief, moet je het systeem opnieuw opstarten. En andersom.
Enforce- en Permissive-modi kunnen snel worden gewisseld met het Setenforce 1|0-commando.
Het is belangrijk op te merken dat als het systeem al een tijdje draait met SELinux uitgeschakeld, de eerste herstart na het aanzetten van SELinux langzamer kan verlopen. Omdat het systeem een veilige context moet creëren voor de bestanden op de schijf (ik zei dat ik ongeveer 10 minuten opnieuw was opgestart en dacht dat het dood was...... )。
SELinux-logs moeten worden gelogd met behulp van auditd.service, schakel het alsjeblieft niet uit.
3.6 SELinux Workflow
Hier is een citaat uit een foto, zonder veel uitleg.
Opmerking: De bovenstaande beveiligingstekst verwijst naar de beveiligingscontext.
4. Basisoperaties van SELinux
4.1 Raadpleeg de beveiligingscontext van een bestand of map
Basisgebruik van commando's
ls -Z
Voorbeelden van gebruik
Zoek de beveiligingscontext van /etc/hosts op.
ls -Z /etc/hosts
Uitvoeringsresultaten
-rw-r-r--. wortelwortel system_u:object_r:net_conf_t:s0 /etc/hosts
4.2 Raadpleeg de beveiligingscontext van het proces
Basisgebruik van commando's
ps auxZ | grep -v grep | grep
Voorbeelden van gebruik
Raadpleeg de beveiligingscontext van Nginx-gerelateerde processen.
ps auxZ | grep -v grep | grep nginx
Uitvoeringsresultaten
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: worker process
4.3 Handmatig de beveiligingscontext van een bestand of map wijzigen
Basisgebruik van commando's
CHCON [...]
Optiefunctie -u Wijzig het gebruikersveld van de beveiligingscontext -r Wijzig het rolveld van de beveiligingscontext -t Wijzig het typeveld van de beveiligingscontext -l Wijzig het niveauveld van de beveiligingscontext --referentie Wijzig de beveiligingscontext consistent met het opgegeven bestand of map -R Recursieve bewerking -h Wijzig de beveiligingscontext van de soft link (wijzig het bijbehorende bestand van de soft link zonder deze optie)
Voorbeelden van gebruik
Pas de beveiligingscontext van de test aan naar aaa_u:bbb_r:ccc_t:s0.
CHCON -U aaa_u -R bbb_r -T ccc_t test
4.4 Zet de beveiligingscontext van een bestand of map terug naar de standaardwaarde
Basisgebruik van commando's
RestoreCon [opties] [...]
Optiefunctie - V Printprocedure - R Recursieve Operatie
Voorbeelden van gebruik
Nadat je wat webbestanden aan de map van je Nginx-server hebt toegevoegd, stel je de juiste beveiligingscontext in voor deze nieuwe bestanden.
restorecon -R /usr/share/nginx/html/
4.5 Zoek Booleaanse regels en hun status in het systeem op
Basisgebruik van commando's
getsebool -a
Omdat het commando ofwel alle regels of slechts één regel bevraagt, zoekt het meestal eerst alle regels en filtert het daarna met grep.
Voorbeelden van gebruik
Zoek booleaanse regels op die gerelateerd zijn aan httpd.
getsebool -a | grep httpd
Uitvoeringsresultaten
httpd_anon_write --> weg
httpd_builtin_scripting --> op
httpd_can_check_spam --> weg
httpd_can_connect_ftp --> weg
#以下省略
4.6 Wisselen van een Booleaanse regel
Basisgebruik van commando's
setsebool [optie]
Optiefunctie -P herstart is nog steeds van kracht
Voorbeelden van gebruik
Zet httpd_anon_write regels aan.
setsebool -P httpd_anon_write op
4.7 Voeg een standaard beveiligingscontext toe voor een map
Basisgebruik van commando's
semanage fcontext -a -t "(/.*)?"
Opmerking: De standaard beveiligingscontext van een map of bestand kan worden bekeken door het semanage fcontext -l commando te gebruiken in combinatie met grep-filtering.
Voorbeelden van gebruik
Nadat je een nieuwe sitemap /usr/share/nginx/html2 aan Nginx hebt toegevoegd, moet je dezelfde standaard beveiligingscontext instellen als voor de originele map.
Semanage Fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"
4.8 Poorten toevoegen die door bepaalde soorten processen zijn toegestaan
Basisgebruik van commando's
semanage port -a -t -p
Opmerking: De poortnummers die zijn toegestaan voor verschillende servicetypen kunnen worden bekeken met het commando semanage port -l met grep-filtering.
Voorbeelden van gebruik
Voor Nginx moet je poort 10080 gebruiken voor HTTP-diensten.
Semanage Port -a -t http_port_t -p TCP 10080
5. SELinux-foutanalyse en -oplossing
5.1 Begrijpen van SELinux-logs
Wanneer SELinux is ingeschakeld, wordt normaal gedrag van veel services als een overtreding beschouwd (zowel in de titel als in de onderstaande fouten).
Op dit moment moeten we SELinux-overtredinglogs gebruiken om ze te analyseren en op te lossen.
SELinux-overtredingslogs worden opgeslagen in /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=(geen) 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: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'
...
Het bestand bevat veel inhoud, en het is gemengd met veel systeemauditlogs die niets te maken hebben met SELinux-fouten. We gebruiken de sealert-tool om te helpen met de analyse (als de prompt het commando niet kan vinden, installeer dan het setroubleshoot-pakket).
5.2 Fouten analyseren met sealert
Basisgebruik van commando's
sealert -a /var/log/audit/audit.log
Na het uitvoeren van het commando moet het systeem wat tijd nemen om de overtredingen in de logboeken te analyseren en een analyserapport te leveren. |