Când o aplicație proprie este blocată de SELinux, soluția corectă nu este setenforce 0. Această comandă trece întregul sistem în modul permissive și elimină aplicarea regulilor pentru toate procesele. Abordarea sigură este să creezi un domeniu separat pentru aplicație, să etichetezi persistent fișierele sale și să permiți numai operațiunile necesare.
Exemplul următor folosește un serviciu numit inventory-api, instalat în /usr/local/bin/inventory-api, cu date în /var/lib/inventory-api.
Verifică starea și comportamentul aplicației
Începe cu:
getenforce
sestatus
systemctl status inventory-api
ps -efZ | grep inventory-api
Dacă procesul apare în domeniul unconfined_service_t, aplicația rulează, dar nu este izolată printr-o politică proprie.
Instalează uneltele necesare pe Fedora, Rocky Linux, AlmaLinux sau RHEL:
sudo dnf install \
selinux-policy-devel \
policycoreutils-devel \
setools-console \
audit
SELinux interceptează operațiunile relevante pentru securitate și le permite numai când politica încărcată autorizează interacțiunea dintre domeniul procesului și tipul resursei accesate.
Generează structura inițială a politicii
Creează un director de lucru ca utilizator normal:
mkdir -p ~/selinux/inventory-api
cd ~/selinux/inventory-api
Generează politica pentru daemon:
sepolicy generate --init \
/usr/local/bin/inventory-api
Instrumentul creează, în mod normal:
inventory_api.te
inventory_api.if
inventory_api.fc
inventory_api_selinux.spec
inventory_api.sh
Fișierul .te definește domeniul și regulile, .fc stabilește contextele fișierelor, iar scriptul generat compilează, instalează și aplică etichetele inițiale. Red Hat recomandă sepolicy generate --init pentru aplicațiile pornite ca servicii.
Construiește și încarcă modulul:
sudo ./inventory_api.sh
sudo systemctl restart inventory-api
Confirmă domeniul:
ps -efZ | grep inventory-api
Procesul ar trebui să ruleze într-un context precum:
system_u:system_r:inventory_api_t:s0
Definește contexte persistente pentru date
Nu folosi chcon ca soluție permanentă. Eticheta poate fi pierdută la relabeling. Creează o regulă persistentă:
sudo semanage fcontext -a \
-t inventory_api_var_lib_t \
'/var/lib/inventory-api(/.*)?'
Aplică eticheta:
sudo restorecon -RFv /var/lib/inventory-api
ls -ldZ /var/lib/inventory-api
semanage fcontext înregistrează asocierea dintre cale și tipul SELinux, iar restorecon aplică acel context pe filesystem. Expresiile trebuie să fie cât mai precise, deoarece personalizările locale au prioritate ridicată.
Testează numai domeniul aplicației în permissive
În loc să dezactivezi protecția global:
sudo semanage permissive -a inventory_api_t
sudo systemctl restart inventory-api
Restul sistemului rămâne în enforcing, dar acțiunile nepermise ale aplicației sunt înregistrate fără a fi blocate. Aceasta este metoda recomandată pentru ajustarea unui domeniu nou.
Testează toate funcțiile reale: pornire, citirea configurației, scrierea datelor, logurile, conexiunea la baza de date și endpoint-urile aplicației.
Vezi AVC-urile recente:
sudo ausearch \
-m AVC,USER_AVC \
-ts recent
Pentru evenimentele procesului:
sudo ausearch \
-c inventory-api \
-ts recent
SELinux înregistrează refuzurile AVC în jurnalul audit și, în funcție de configurație, în journal.
Nu accepta automat tot ce propune audit2allow
Obține o explicație:
sudo ausearch -c inventory-api --raw |
audit2why
Caută interfețe SELinux existente:
sudo ausearch -c inventory-api --raw |
audit2allow -R
audit2allow -R poate sugera macro-uri precum accesul la loguri sau conexiuni de rețea. Verifică însă fiecare propunere cu:
macro-expander \
"numele_interfetei(inventory_api_t)"
Red Hat avertizează că regulile generate automat pot fi prea largi sau chiar greșite. Interfețele existente sunt preferabile regulilor brute allow, dar trebuie inspectat exact ce permisiuni acordă.
După modificarea fișierului .te, reconstruiește:
make -f \
/usr/share/selinux/devel/Makefile \
inventory_api.pp
sudo semodule -i inventory_api.pp
sudo restorecon -RFv \
/usr/local/bin/inventory-api \
/var/lib/inventory-api
Activează enforcing și verifică rezultatul
Elimină excepția temporară:
sudo semanage permissive \
-d inventory_api_t
sudo systemctl restart inventory-api
Verifică:
ps -efZ | grep inventory-api
sudo ausearch -m AVC -ts recent
semodule -lfull | grep inventory
Dacă aplicația funcționează și nu apar AVC-uri legitime, politica poate fi mutată în staging și apoi în producție. Pentru rollback:
sudo semodule -r inventory_api
O politică SELinux bună nu permite tot ce aplicația a încercat în timpul unui singur test. Ea descrie strict ce trebuie să facă aplicația, pe ce fișiere, porturi și servicii, reducând impactul unui bug sau al unei eventuale compromiteri.
Surse folosite
Red Hat Enterprise Linux — Writing a custom SELinux policy.
Red Hat Customer Portal — Quick start to write a custom SELinux policy.
Red Hat Enterprise Linux — configurarea aplicațiilor, contextelor și modulelor SELinux.
Linux manual pages — semanage fcontext și restorecon.

















































