Per ottimizzare SELinux su un server Linux, mantenetelo in modalità di applicazione e rimuovete gli attriti correggendo le etichette, abilitando i booleani corretti e creando moduli di policy minimi e verificati. Utilizzate strumenti come semanage, restorecon, setsebool, ausearch, sealert e audit2allow consentono di ottimizzare l'accesso in modo preciso, ridurre i falsi dinieghi e mantenere una sicurezza elevata con un impatto trascurabile sulle prestazioni.
Ottimizzare SELinux su server Linux significa ottimizzare policy, etichette e valori booleani in modo che le applicazioni funzionino senza problemi, mentre SELinux continua a imporre un rigoroso controllo degli accessi obbligatorio. In questa guida, imparerai i metodi pratici e passo dopo passo che utilizziamo in produzione. ambienti di hosting per rendere SELinux sicuro, silenzioso e veloce, senza ricorrere alla modalità permissiva o disabilitata.
Cos'è SELinux (e perché dovresti ottimizzarlo)
SELinux (Security-Enhanced Linux) applica un controllo di accesso obbligatorio tramite l'applicazione di tipi, ruoli e livelli. Ogni processo e file ha un'etichetta (contesto) come httpd_t or httpd_sys_content_tLe policy stabiliscono cosa può comunicare con cosa. L'ottimizzazione non consiste nel disattivare SELinux; consiste nell'allineare etichette, valori booleani e policy al carico di lavoro, in modo che i dinieghi si interrompano e la sicurezza rimanga intatta.
Controllo rapido dello stato di salute: SELinux aiuta o ostacola?
Innanzitutto, convalidare modalità, dinieghi e policy. Questo mostra dove intervenire senza compromettere le protezioni.
# Check mode and policy
getenforce
sestatus
# See recent AVC denials (RHEL/CentOS/Fedora)
ausearch -m avc -ts recent | aureport -a
journalctl -t setroubleshoot -S -2h
# Install helpful tools (RHEL/Fedora)
dnf install -y setroubleshoot setroubleshoot-server policycoreutils-python-utils
# On Debian-based (AppArmor is default, but SELinux is available)
apt install selinux-basics selinux-policy-default auditdSe un servizio specifico fallisce, esegui un test mirato invece di disabilitare SELinux a livello globale:
# Temporarily put only the service into permissive domain (safer than global)
semanage permissive -a httpd_t # Example for Apache
# Later revert
semanage permissive -d httpd_tBase di riferimento delle migliori pratiche per la produzione
- Esegui in modalità di applicazione con la policy predefinita "mirata".
- Mantenere aggiornati i pacchetti di policy (correzioni di sicurezza e regole migliorate).
- Installare setroubleshoot e auditd per una diagnostica leggibile.
- Correggi le etichette prima di scrivere una nuova policy; la policy va scritta per ultima, non per prima.
- Quando disponibili, utilizzare valori booleani anziché regole personalizzate.
Sintonizzazione con i valori booleani SELinux (prima la sicurezza)
I valori booleani attivano/disattivano modelli di accesso comuni (ad esempio, lasciando server web effettuare chiamate di rete). Sono sicuri, documentati e persistono con -P.
# List booleans and current values
getsebool -a | grep httpd
# Allow Apache/NGINX to connect out (APIs, upstreams)
setsebool -P httpd_can_network_connect on
# Allow web apps to talk to databases
setsebool -P httpd_can_network_connect_db on
# Common virtualization and storage booleans
setsebool -P virt_use_nfs on
setsebool -P virt_use_samba on
# DNS server writes master zones
setsebool -P named_write_master_zones onAltri booleani usati frequentemente includono samba_export_all_rw, ftp_home_dir, ssh_sysadm_logine mysql_connect_anyPrima di creare regole personalizzate, verificare sempre se un valore booleano risolve già il rifiuto.
Etichettatura corretta di file, directory e porte
La maggior parte dei dinieghi "misteriosi" sono dovuti a mancate corrispondenze di etichette. Assicurati che file e porte abbiano i tipi previsti per i loro servizi.
Contesti di file persistenti
# Example: custom web root for Apache/NGINX
semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"
restorecon -Rv /srv/www
# Writable app uploads
semanage fcontext -a -t httpd_sys_rw_content_t "/srv/www/uploads(/.*)?"
restorecon -Rv /srv/www/uploads
# Avoid chcon for long-term; use semanage + restorecon for persistencePorte di servizio personalizzate
# Allow web server on port 8080
semanage port -a -t http_port_t -p tcp 8080
# PostgreSQL on 5433
semanage port -a -t postgresql_port_t -p tcp 5433Non lasciare mai i servizi vincolati alle porte etichettate unreserved_port_t; assegnare il tipo corretto in modo che la policy sappia quale dominio può connettersi.
Gestire i dinieghi AVC in modo efficiente (audit2allow nel modo giusto)
I dinieghi AVC ti dicono cosa ha bloccato SELinux. Leggili, correggi etichette o valori booleani e solo allora crea regole minime, se necessario.
# Human-readable reports
sealert -a /var/log/audit/audit.log | less
# Find denials for a service
ausearch -m avc -c httpd | aureport -a
# Generate a minimal policy module from recent denials
ausearch -m avc -ts recent | audit2allow -M myapp_selinux
semodule -i myapp_selinux.ppEsaminare attentamente le regole generate. Consentimenti eccessivamente ampi (ad esempio, consentendo httpd_t leggere var_t ovunque) indeboliscono la tua sicurezza. Preferisci rietichettare i file per httpd_sys_content_t o abilitare un valore booleano anziché creare un valore generale consentito.
Systemd, file temporanei e rietichettatura automatica
Alcuni file vengono creati in fase di esecuzione. Utilizzare le regole systemd e tmpfiles per preservare le etichette corrette.
# Ensure a directory is re-labeled before service starts
ExecStartPre=/sbin/restorecon -R /var/lib/myapp
# /etc/tmpfiles.d/myapp.conf example (Z recurses, z does not)
# Type Path Mode UID GID Age Argument
d /var/run/myapp 0755 myapp myapp -
Z /var/run/myapp - - - -Se le etichette sono ampiamente errate (file system spostato, nuova policy), attiva una nuova etichettatura completa:
touch /.autorelabel
rebootContenitori: Docker/Podman/Kubernetes con SELinux
I contenitori utilizzano etichette MCS per isolare i carichi di lavoro. Etichette di volume corrette e installate policy SELinux del contenitore prevenire dinieghi rumorosi.
# Install container policies (RHEL/Fedora)
dnf install -y container-selinux
# Label shared host paths for containers
# :Z gives a private label (exclusive), :z is shared (multiple containers)
podman run -v /data/app:/var/www/html:Z -d nginx
docker run -v /data/shared:/shared:z -d busybox
# Avoid --privileged or label=disable unless absolutely necessaryPer Kubernetes (CRI-O/Podman), mantenere SELinux abilitato sugli host. Utilizzare volumi persistenti con contesti corretti (container_file_t o assegnato automaticamente tramite :Z/:z) per evitare problemi di autorizzazione.
Esempi pratici di messa a punto
Apache/NGINX che gestisce un Docroot personalizzato con caricamenti
# Content and uploads
semanage fcontext -a -t httpd_sys_content_t "/srv/www/public(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t "/srv/www/public/uploads(/.*)?"
restorecon -Rv /srv/www/public
# Outbound API and DB connections
setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect_db onL'app Django comunica con PostgreSQL su una porta non predefinita
# Allow PostgreSQL on 5433
semanage port -a -t postgresql_port_t -p tcp 5433
# If served by gunicorn under httpd_t (via mod_proxy)
setsebool -P httpd_can_network_connect on
# Log any remaining denials and adjust labels/policy minimally
ausearch -m avc -ts recent -c httpdDirectory dati MariaDB spostata
systemctl stop mariadb
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
restorecon -Rv /data/mysql
systemctl start mariadbConsiderazioni sulle prestazioni: sovraccarico di SELinux nella pratica
Le moderne soluzioni SELinux aggiungono un overhead trascurabile (in genere inferiore all'1% nei carichi di lavoro web/database). I rallentamenti più significativi sono solitamente dovuti a etichette errate che causano nuovi tentativi o blocchi di I/O. Misura il prima e il dopo con test di carico realistici:
# Basic throughput check with and without specific policy changes
wrk -t8 -c256 -d60s http://app/
perf stat -d -d -d -p $(pidof httpd) -- sleep 30
# Count denials during the test
ausearch -m avc -ts recent | wc -lSe i conteggi AVC diminuiscono dopo l'etichettatura e i valori booleani, il "problema di prestazioni" era dovuto a un attrito delle policy, non al sovraccarico di SELinux.
Indurimento e automazione (Ansible, SCAP)
Codificare l'ottimizzazione di SELinux per mantenere gli ambienti coerenti tra server e ricostruzioni.
- Ansible: usa moduli come
seboolean,sefcontexteselinuxper applicare valori booleani, contesti di file e modalità. - SCAP/Compliance: applica profili da
scap-security-guideper controllare lo stato di SELinux e i valori booleani richiesti. - CI/CD: convalidare le etichette durante le distribuzioni ed eseguire
restoreconnegli hook in cui le app creano percorsi in fase di esecuzione.
# Example Ansible tasks
- name: Ensure SELinux enforcing
ansible.posix.selinux:
policy: targeted
state: enforcing
- name: Allow httpd outbound
ansible.posix.seboolean:
name: httpd_can_network_connect
state: true
persistent: true
- name: Label uploads
community.general.sefcontext:
target: "/srv/www/public/uploads(/.*)?"
setype: httpd_sys_rw_content_t
state: presentLista di controllo per la risoluzione dei problemi
- Modalità di conferma:
getenforcedovrebbe essere Enforcing. - Riproduci una volta, quindi controlla i rifiuti:
ausearch -m avc -ts recent. - Correggi prima le etichette:
semanage fcontext+restorecon. - Controlla i valori booleani:
getsebool -a | grep <service>. - Se il problema persiste, generare un modulo minimo con
audit2allow, rivedere e installare consemodule. - Per i file di runtime, aggiungere tmpfiles.d o
ExecStartPre=restorecon. - Per i contenitori, utilizzare
:Z/:zsui volumi ed evitare--privileged.
Errori comuni da evitare
- Disabilitare SELinux a livello globale per "risolvere" i problemi dell'app.
- utilizzando
chconsenzasemanage fcontext(le etichette scompaiono quando si rietichetta). - Consentire regole ampie tramite
audit2allowinvece di correggere le etichette. - Ignorando i valori booleani che risolvono già il problema.
- Montaggio di volumi di contenitori senza adeguate
:Z/:zetichette.
Quando chiedere aiuto
Se esegui carichi di lavoro critici per le entrate o non disponi di competenze SELinux interne, un manageL'approccio d consente di risparmiare tempo e rischi. A YouStable, La nostra manageI server d vengono forniti con SELinux in modalità di applicazione, ottimizzati per gli stack più comuni (LAMP/LEMP, Node.js, container). Risolviamo i problemi AVC, scriviamo moduli di policy minimi e integriamo le modifiche nella tua automazione in modo che sopravvivano agli aggiornamenti.
FAQ: Ottimizzare SELinux su Linux
SELinux rallenta il mio server?
Nei kernel e nelle policy moderne, l'overhead di SELinux è in genere inferiore all'1% per i carichi di lavoro web e database. La lentezza percepita deriva solitamente da etichette errate e ripetuti dinieghi. Correggi etichette e valori booleani, quindi esegui nuovamente il benchmark. Usa ausearch -m avc per confermare che i dinieghi diminuiscono durante i test di carico.
Dovrei usare Enforcing, Permissive o Disabled?
Utilizzare Enforcing in produzione. Permissive è indicato per una risoluzione dei problemi breve e mirata (o per rendere permissivo un dominio specifico). Evitare Disabled: rimuove un potente livello di sicurezza e rende difficoltosa la riattivazione futura a causa di file non etichettati e policy non testate.
Come faccio a lasciare Apache/NGINX si connette a un database remoto?
Abilitare i valori booleani appropriati e assicurarsi che l'etichettatura delle porte sia corretta. Ad esempio: setsebool -P httpd_can_network_connect on e setsebool -P httpd_can_network_connect_db onSe il DB è in ascolto su una porta non predefinita, impostarne il tipo con semanage port.
Ho impostato 777 permessi, ma continuo a ricevere il messaggio "Permesso negato". Perché?
I permessi UNIX possono consentire l'accesso mentre SELinux lo nega ancora a causa di etichette errate. Controlla il contesto con ls -ZRisolvilo usando semanage fcontext e restorecon quindi il percorso ha il tipo SELinux corretto per il dominio del servizio.
Come faccio a ripristinare tutte le etichette SELinux ai valori predefiniti?
Crea
/.autorelabel e riavviare. Il sistema verrà rietichettato in base alla politica corrente. Per percorsi specifici, utilizzare restorecon -Rv <path>. Assicurarsi che esistano le regole giuste con semanage fcontext in modo che le etichette rimangano invariate dopo la rietichettatura.