RHCSA-serie: Essentiële toegangsbeheer met SELinux in RHEL 7 – Deel 13

Tijdens deze serie hebben we in detail minstens twee toegangscontrole methoden onderzocht: standaard ugo/rwx machtigingen (Beheer Gebruikers en Groepen – Deel 3) en toegangscontrolelijsten (Configureer ACL’s op Bestandssystemen – Deel 7).

RHCSA Exam: SELinux Essentials and Control FileSystem Access

Hoewel nodig als eerstelijns machtigingen en toegangscontrolemechanismen, hebben ze enkele beperkingen die worden aangepakt door Security Enhanced Linux (ook wel SELinux genoemd).

Een van dergelijke beperkingen is dat een gebruiker een bestand of map bloot kan stellen aan een beveiligingslek door een slecht uitgewerkte chmod opdracht en daardoor een onverwachte verspreiding van toegangsrechten kan veroorzaken. Als gevolg hiervan kan elk proces gestart door die gebruiker doen wat het wil met de bestanden in eigendom van de gebruiker, waarbij uiteindelijk kwaadaardige of anderszins gecompromitteerde software root-level toegang tot het hele systeem kan krijgen.

Met deze beperkingen in gedachten, heeft de Amerikaanse National Security Agency (NSA) als eerste SELinux bedacht, een flexibele verplichte toegangscontrole methode, om de mogelijkheid van processen om toegang te krijgen tot of andere bewerkingen uit te voeren op systeemobjecten (zoals bestanden, mappen, netwerkpoorten, enz.) te beperken tot het minst machtigingsmodel, dat later indien nodig kan worden gewijzigd. In weinig woorden krijgt elk element van het systeem alleen de toegang die nodig is om te functioneren.

In RHEL 7, SELinux is opgenomen in de kernel zelf en is standaard ingeschakeld in Enforcing-modus. In dit artikel zullen we kort de basisconcepten uitleggen die verband houden met SELinux en de werking ervan.

SELinux Modi

SELinux kan op drie verschillende manieren werken:

  1. Enforcing: SELinux weigert toegang op basis van SELinux-beleidsregels, een set richtlijnen die de beveiligingsengine controleren.
  2. Permissive: SELinux weigert geen toegang, maar weigeringen worden gelogd voor acties die zouden zijn geweigerd als ze in afdwingende modus zouden worden uitgevoerd.
  3. Disabled (zelfverklarend).

De getenforce-opdracht geeft de huidige modus van SELinux weer, terwijl setenforce (gevolgd door een 1 of een 0) wordt gebruikt om de modus te wijzigen naar Enforcing of Permissive, respectievelijk, alleen tijdens de huidige sessie.

Om persistentie te bereiken bij uitloggen en herstarten, moet u het bestand /etc/selinux/config bewerken en de SELINUX-variabele instellen op enforcing, permissive of disabled:

# getenforce
# setenforce 0
# getenforce
# setenforce 1
# getenforce
# cat /etc/selinux/config
Set SELinux Mode

Meestal zult u setenforce gebruiken om tussen SELinux-modi te schakelen (van afdwingend naar toegeeflijk en terug) als eerste probleemoplossingsstap. Als SELinux momenteel is ingesteld op enforcing terwijl u een bepaald probleem ervaart, en hetzelfde verdwijnt wanneer u het instelt op permissive, kunt u er zeker van zijn dat u naar een SELinux-machtigingsprobleem kijkt.

SELinux-contexten

A SELinux context consists of an access control environment where decisions are made based on SELinux user, role, and type (and optionally a level):

  1. A SELinux user complements a regular Linux user account by mapping it to a SELinux user account, which in turn is used in the SELinux context for processes in that session, in order to explicitly define their allowed roles and levels.
  2. Het concept van rol fungeert als een tussenpersoon tussen domeinen en SELinux-gebruikers, omdat het bepaalt welke procesdomeinen en bestandstypen toegankelijk zijn. Dit zal uw systeem beschermen tegen kwetsbaarheid voor aanvallen op privilege-escalatie.
  3. A type defines an SELinux file type or an SELinux process domain. Under normal circumstances, processes are prevented from accessing files that other processes use, and and from accessing other processes, thus access is only allowed if a specific SELinux policy rule exists that allows it.

Laten we eens kijken hoe dit allemaal werkt aan de hand van de volgende voorbeelden.

VOORBEELD 1: Het standaardpoort wijzigen voor de sshd-daemon

In Beveiliging van SSH – Deel 8 hebben we uitgelegd dat het wijzigen van de standaardpoort waarop sshd luistert, een van de eerste beveiligingsmaatregelen is om uw server te beschermen tegen externe aanvallen. Laten we het bestand /etc/ssh/sshd_config bewerken en de poort instellen op 9999:

Port 9999

Sla de wijzigingen op en herstart sshd:

# systemctl restart sshd
# systemctl status sshd
Restart SSH Service

Zoals je kunt zien, is sshd niet gestart. Maar wat is er gebeurd?

A quick inspection of /var/log/audit/audit.log indicates that sshd has been denied permissions to start on port 9999 (SELinux log messages include the word “AVC” so that they might be easily identified from other messages) because that is a reserved port for the JBoss Management service:

# cat /var/log/audit/audit.log | grep AVC | tail -1
Inspect SSH Logs

Op dit punt zou je SELinux kunnen uitschakelen (maar doe dat niet!) zoals eerder uitgelegd en opnieuw proberen sshd te starten, en het zou moeten werken. De semanage utility kan ons echter vertellen wat we moeten veranderen om sshd te kunnen starten op welke poort we ook kiezen zonder problemen.

Voer uit,

# semanage port -l | grep ssh

om een lijst te krijgen van de poorten waarop SELinux sshd toestaat om op te luisteren.

Semanage Tool

Laten we dus de poort in /etc/ssh/sshd_config veranderen naar Poort 9998, voeg de poort toe aan de ssh_port_t-context, en herstart vervolgens de service:

# semanage port -a -t ssh_port_t -p tcp 9998
# systemctl restart sshd
# systemctl is-active sshd
Semanage Add Port

Zoals je kunt zien, is de service deze keer succesvol gestart. Dit voorbeeld illustreert het feit dat SELinux de TCP-poortnummer controleert naar zijn eigen poorttype interne definities.

VOORBEELD 2: Toestaan dat httpd toegang heeft tot sendmail

Dit is een voorbeeld van SELinux dat een proces beheert dat toegang heeft tot een ander proces. Als je mod_security en mod_evasive samen met Apache op je RHEL 7 server implementeert, moet je httpd toegang geven tot sendmail om een e-mailmelding te sturen in het geval van een (D)DoS-aanval. In het volgende commando, laat de -P vlag weg als je niet wilt dat de wijziging persistent blijft na herstarten.

# semanage boolean -1 | grep httpd_can_sendmail
# setsebool -P httpd_can_sendmail 1
# semanage boolean -1 | grep httpd_can_sendmail
Allow Apache to Send Mails

Zoals je kunt zien in het bovenstaande voorbeeld, zijn SELinux-booleans instellingen (of gewoon booleans) ware / valse regels die zijn ingebed in SELinux-beleid. Je kunt alle booleans weergeven met semanage boolean -l, en het eventueel doorsturen naar grep om de uitvoer te filteren.

VOORBEELD 3: Het serveren van een statische site vanuit een andere map dan de standaardmap

Stel dat je een statische website serveert vanuit een andere map dan de standaardmap (/var/www/html), zeg /websites (dit kan het geval zijn als je bijvoorbeeld je webbestanden opslaat op een gedeeld netwerkstation en het moet koppelen aan /websites).

a). Create an index.html file inside /websites with the following contents:

<html>
<h2>SELinux test</h2>
</html>

Als je dit doet,

# ls -lZ /websites/index.html

Je zult zien dat het bestand index.html is gelabeld met het type default_t SELinux, waar Apache geen toegang toe heeft:

Check SELinux File Permission

b). Change the DocumentRoot directive in /etc/httpd/conf/httpd.conf to /websites and don’t forget to update the corresponding Directory block. Then, restart Apache.

c). Browse to http://<web server IP address>, and you should get a 503 Forbidden HTTP response.

d). Next, change the label of /websites, recursively, to the httpd_sys_content_t type in order to grant Apache read-only access to that directory and its contents:

# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"

e). Finally, apply the SELinux policy created in d):

# restorecon -R -v /websites

Herstart nu Apache en ga opnieuw naar http://<webserver IP-adres> en je zult zien dat het html-bestand correct wordt weergegeven:

Verify Apache Page

Samenvatting

In dit artikel hebben we de basisprincipes van SELinux doorgenomen. Merk op dat vanwege de omvang van het onderwerp een gedetailleerde uitleg niet mogelijk is in één artikel, maar we geloven dat de principes die in deze gids worden uiteengezet, je zullen helpen om verder te gaan naar meer geavanceerde onderwerpen als je dat wilt.

Als ik mag, laat me dan twee essentiële bronnen aanbevelen om mee te beginnen: de NSA SELinux-pagina en de RHEL 7 SELinux Gebruikers- en Beheerdershandleiding.

Aarzel niet om ons te laten weten als je vragen of opmerkingen hebt.

Source:
https://www.tecmint.com/selinux-essentials-and-control-filesystem-access/