Skip to main content

Cyber AI România

Miercuri, 16 septembrie 2026

Cum construiești o politică SELinux pentru o aplicație proprie fără să dezactivezi protecția sistemului

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.

Facebook
X
WhatsApp

Te-ar putea interesa si: