Politica targeted din SELinux este cu adevărat mare, sistemul de operare consumând timp și resurse pentru a căuta informații de fiecare dată când trebuie să ia o decizie. De aceea, este folosit un cache care stochează cele mai recente decizii allow/deny ale politicii folosite. Acest cache se numește Active Vector Cache (AVC). Din acest motiv, mesajele SELinux de interzicere a accesului mai sunt cunoscute și ca "refuzuri AVC - AVC denials" - mesaje care provin dintr-un log AVC și sunt evenimente AVC. În articolul de față vom discuta despre cum putem remedia erorile SELinux și modalitatea lor de gestionare, folosindu-ne de AVC și sistemul de loguri SELinux.
De fiecare dată când avem probleme într-un sistem Linux ne uităm în fișierele log, să vedem ce s-a întâmplat și, eventual, cum putem remedia neregulile. Responsabil de scrierea logurilor pentru SELinux este serviciul auditd.
Pentru a ne asigura că acest serviciu funcționează:
# systemctl status auditd
● auditd.service - Security Auditing Service
Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-09-15 12:50:01 EEST; 6 days ago
Docs: man:auditd(8)
https://github.com/linux-audit/audit-documentation
Main PID: 645 (auditd)
CGroup: /system.slice/auditd.service
├─645 /sbin/auditd
├─647 /sbin/audispd
└─649 /usr/sbin/sedispatch
Serviciul auditd va scrie toate mesajele de interzicere a accesului în fișierul /var/log/audit/audit.log. Acest fișier stochează mult mai multe înregistrări, nu doar intrări legate de SELinux. De reținut că, dacă serviciul auditd nu funcționează, este folosit fișierul /var/log/messages. Pentru a vedea doar intrările legate de SELinux vom filtra după AVC, deoarece toate intrările din log referitoare la AVC vor conține șirul de caractere "AVC":
# cat /var/log/audit/audit.log | grep AVC
type=AVC msg=audit(1537604802.502:388): avc: denied { noatsecure } for pid=19772 comm="firewalld" scontext=system_u:system_r:firewalld_t:s0 tcontext=system_u:system_r:iptables_t:s0 tclass=process permissive=0
type=AVC msg=audit(1537604802.661:396): avc: denied { noatsecure } for pid=19773 comm="firewalld" scontext=system_u:system_r:firewalld_t:s0 tcontext=system_u:system_r:iptables_t:s0 tclass=process permissive=0
type=USER_AVC msg=audit(1533364001.416:217): pid=616 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: denied { send_msg } for msgtype=method_call interface=org.freedesktop.systemd1.Manager member=LookupDynamicUserByName dest=org.freedesktop.systemd1 spid=722 tpid=1 scontext=system_u:system_r:sssd_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=dbus permissive=0 exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'
Sau folosind comanda ausearch
căutând un anumit proces/eveniment:
# ausearch -m avc -c firewalld ---- time->Sat Sep 22 11:26:42 2018 type=AVC msg=audit(1537604802.502:388): avc: denied { noatsecure } for pid=19772 comm="firewalld" scontext=system_u:system_r:firewalld_t:s0 tcontext=system_u:system_r:iptables_t:s0 tclass=process permissive=0 ---- time->Sat Sep 22 11:26:42 2018 type=AVC msg=audit(1537604802.661:396): avc: denied { noatsecure } for pid=19773 comm="firewalld" scontext=system_u:system_r:firewalld_t:s0 tcontext=system_u:system_r:iptables_t:s0 tclass=process permissive=0
Acest log poate fi analizat și cu ajutorul utilitarului sealert
, instrument care afișează părțile relevante ale acestui log într-un format mult mai ușor de interpretat:
# sealert -a /var/log/audit/audit.log
100% done
found 0 alerts in /var/log/audit/audit.log
Sau, în cazul în care sunt alerte:
# sealert -a /var/log/audit/audit.log 100% done found 42 alerts in /var/log/audit/audit.log -------------------------------------------------------------------------------- SELinux is preventing firewalld from using the noatsecure access on a process. ***** Plugin catchall (100. confidence) suggests ************************** If you believe that firewalld should be allowed noatsecure access on processes labeled insmod_t by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # ausearch -c 'firewalld' --raw | audit2allow -M my-firewalld # semodule -X 300 -i my-firewalld.pp Additional Information: Source Context system_u:system_r:firewalld_t:s0 Target Context system_u:system_r:insmod_t:s0 Target Objects Unknown [ process ] Source firewalld Source Path firewalld Port <Unknown> Host <Unknown> Source RPM Packages Target RPM Packages Policy RPM selinux-policy-3.14.1-42.fc28.noarch Selinux Enabled True Policy Type targeted Enforcing Mode Enforcing Host Name bobsesland Platform Linux bobsesland 4.17.14-202.fc28.x86_64 #1 SMP Wed Aug 15 12:29:25 UTC 2018 x86_64 x86_64 Alert Count 56 First Seen 2018-09-22 11:26:42 EEST Last Seen 2018-09-22 11:27:31 EEST Local ID 9cf5ee6a-0491-4b81-905d-de51164a2a55 Raw Audit Messages type=AVC msg=audit(1537604851.972:345): avc: denied { noatsecure } for pid=950 comm="firewalld" scontext=system_u:system_r:firewalld_t:s0 tcontext=system_u:system_r:insmod_t:s0 tclass=process permissive=0 Hash: firewalld,firewalld_t,insmod_t,process,noatsecure --------------------------------------------------------------------------------
În exemplul de mai sus am selectat o eroare SELinux legată de firewalld; după cum observăm, ni se indică și modalitatea de a remedia defectul (partea marcată cu galben):
În exemplul de mai jos este un caz de alertă apache/httpd:
# sealert -a /var/log/audit/audit.log
SELinux is preventing /usr/sbin/httpd from read access on the file fisiertest.html. For complete SELinux messages. run sealert -l d72b5c45-af2d-4a29-95cd-8a7289594b85
Din fericire, avem mai multe informații despre ceea ce este în neregulă - ni se spune să rulăm o anumită comandă:
sealert -l d72b5c45-af2d-4a29-95cd-8a7289594b85
Așadar, o rulăm:
# sealert -l d8dfacad-00f5-4796-a00d-c02bbfdc3a41
SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/fisiertest.html.
***** Plugin restorecon (99.5 confidence) suggests ************************
If you want to fix the label.
/var/www/html/fisiertest.html default label should be httpd_sys_content_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/html/testfile.html
***** Plugin catchall (1.49 confidence) suggests **************************
If you believe that httpd should be allowed getattr access on the fisiertest.html file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
Additional Information:
Source Context system_u:system_r:httpd_t:s0
Target Context unconfined_u:object_r:admin_home_t:s0
Target Objects /var/www/html/fisiertest.html [ file ]
Source httpd
Source Path /usr/sbin/httpd
Observăm, de asemenea, că ni se oferă o mulțime de informații utile, chiar și comenzile care trebuie rulate pentru a rezolva problema.
În cazul în care folosim și interfața grafică, un instrument deosebit de util și care ne ajută să determinăm tot ceea ce am spus mai sus este SELinux Troubleshooter GUI:
[…] a acestei erori: verificăm conținutul fișierului /var/log/audit/audit.log (cum am învățat în articolul precedent) și aplicăm recomandările de acolo sau, în loc să mutăm fișierul din /root, îl vom copia […]