Tutorial SELinux issue oplossen onder Red Hat & CentOS Linux


file icons flat linux svg wikimedia commons from freepnglogos.com

Beveiliging van servers is natuurlijk sinds het begin van het internet een hot-item. Onder Linux is er een systeem genaamd SELinux dat toegangsbeheer regelt op diepgaand niveau. SELinux vergelijkbaar met een 'firewall', maar in plaats van dat het poorten in de gaten houdt, controleert het of processen alleen system-calls en bestanden benadert waartoe deze toegang zouden moeten kunnen krijgen.

De Linux distributies die dit het best hebben uitgewerkt komen van Red Hat af, Red Hat Enterprise, CentOS en Fedora. Als je serieus bekend wilt raken met SELinux is het een goed idee bijvoorbeeld Fedora Workstation te installeren. Gegarandeerd dat je tegen SELinux-issues aanloopt. Vandaar ook deze blog!

In dit voorbeeld zal een SELinux-module worden gemaakt voor het toestaan van versturen van e-mail vanuit Php via /usr/sbin/sendmail middels Postfix. Standaard is hier een 'sebool' voor, 'httpd_can_sendmail', maar omdat Postfix was geinstalleerd ter vervanging van de standaard sendmail, kwamen er SELinux-issues naarboven.

De eerste stap bij het oplossen van SELinux-issues is altijd eerst om SELinux tijdelijk in permissive-mode te zetten, om te kijken of het echt een SELinux probleem is. In permissive-mode wordt alles gelogt, maar worden SELinux-rules niet gehandhaafd. Dit is mogelijk met het commando:

        # setenfoce 0

De status van SELinux is op te vragen via:

        # sestatus

 

Als dit het probleem oplost, zal je ongetwijfeld met een SELinux-issue te maken hebben. Vaak is het verstandig te Google'n om te kijken of anderen hetzelfde probleem hebben, er zijn namelijk veel policy's voor standaard geinstalleerde services die aan/uit kunnen worden gezet. Een overzicht hiervan is te vinden met het commando:

        # getsebool -a

Een policy is aan/uit te zetten via: (-P staat voor persistent, zodat de waarde blijft opgeslagen na reboot)

        # setsebool -P <bool-naam> on

Tip: controleer na het aanzetten van een bool of SELinux weer in 'enforced' mode staat!

 

Mocht dit het probleem niet oplossen is het mogelijk een custom module te maken. De aanpak hiervan is om SELinux in 'permissive' mode te zetten, alle SELinux-events worden gelogd in /var/log/audit/audit.log. De log-regels kunnen middels 'audit2allow' worden omgezet in een SELinux-policy/module. Een concreet voorbeeld hoe ik m'n Php-mail issue oploste:

1. zet SELinux in permissive mode: # setenforce 0
2. tail -f /var/log/audit/audit.log
3. voer het programma uit dat eerst niet werkte

De volgende regels werden naar de audit-log weggeschreven,

type=AVC msg=audit(1585834638.715:340): avc: denied { execute } for pid=7058 comm="sendmail" name="smtpd" dev="dm-1" ino=660339 scontext=system_u:system_r:system_mail_t:s0 tcontext=system_u:object_r:postfix_smtpd_exec_t:s0 tclass=file permissive=1
type=AVC msg=audit(1585834638.715:341): avc: denied { read open } for pid=7058 comm="sendmail" path="/usr/libexec/postfix/smtpd" dev="dm-1" ino=660339 scontext=system_u:system_r:system_mail_t:s0 tcontext=system_u:object_r:postfix_smtpd_exec_t:s0 tclass=file permissive=1
type=AVC msg=audit(1585834638.715:342): avc: denied { execute_no_trans } for pid=7058 comm="sendmail" path="/usr/libexec/postfix/smtpd" dev="dm-1" ino=660339 scontext=system_u:system_r:system_mail_t:s0 tcontext=system_u:object_r:postfix_smtpd_exec_t:s0 tclass=file permissive=1
type=AVC msg=audit(1585834638.716:343): avc: denied { map } for pid=7058 comm="smtpd" path="/usr/libexec/postfix/smtpd" dev="dm-1" ino=660339 scontext=system_u:system_r:system_mail_t:s0 tcontext=system_u:object_r:postfix_smtpd_exec_t:s0 tclass=file permissive=1
type=AVC msg=audit(1585834638.740:344): avc: denied { setrlimit } for pid=7059 comm="postdrop" scontext=system_u:system_r:postfix_postdrop_t:s0 tcontext=system_u:system_r:postfix_postdrop_t:s0 tclass=process permissive=1

Doordat SELinux in 'permissive' mode staat, wordt het programma wel in z'n geheel uitgevoerd. Vandaar ook meerdere 'denied'-entries.

Deze log-data kan vervolgens in een txt-bestand worden gezet om met audit2allow een module te maken:

        # cat php-postfix-mail.txt | audit2allow -M php-postfix-mail

De module kan vervolgens geinstalleerd worden met het commando: (het uitvoeren van dit command kost wat tijd)

        # semodule -i php-postfix-mail.php

Hierna kan SELinux weer in enforce-mode worden gezet!


Mocht je serieus thuis willen raken in SELinux is het verstandig om hier een boek over te lezen en er de tijd voor te nemen. Een systeembeheerder van een beursgenoteerd bedrijf - flitshandelaar uit Amsterdam - had mij vertelt dat zij een cursus van enkele dagen moesten volgen om SELinux te onder de knie te krijgen. Het enige dat ze bij bleef was hoe het te disablen, omdat ze het te ingewikkeld vonden! 

 

- Bent u opzoek naar een Php of Java programmeur voor uw website of applicatie? (freelance / detachering)
- Losse tickets, opdrachten, of gehele projecten in de planning?
- Systeembeheer van Linux of Windows Server ?

Dan kom ik graag met u in contact! Meer informatie over mij vindt u hier.
Sitemap | Op alle producten & diensten zijn de algemene voorwaarden van toepassing