Solo per i visitatori del nostro blog: ricevi 3 mesi aggiuntivi gratuiti + 10% di sconto sul piano triennale YSBLOG10
Afferra l'affare

Come ottimizzare SELinux su un server Linux per una maggiore sicurezza

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 auditd

Se 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_t

Base 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 on

Altri 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 persistence

Porte 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 5433

Non 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.pp

Esaminare 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
reboot

Contenitori: 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 necessary

Per 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 on

L'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 httpd

Directory dati MariaDB spostata

systemctl stop mariadb
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
restorecon -Rv /data/mysql
systemctl start mariadb

Considerazioni 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 -l

Se 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, sefcontexte selinux per applicare valori booleani, contesti di file e modalità.
  • SCAP/Compliance: applica profili da scap-security-guide per controllare lo stato di SELinux e i valori booleani richiesti.
  • CI/CD: convalidare le etichette durante le distribuzioni ed eseguire restorecon negli 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: present

Lista di controllo per la risoluzione dei problemi

  • Modalità di conferma: getenforce dovrebbe 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 con semodule.
  • Per i file di runtime, aggiungere tmpfiles.d o ExecStartPre=restorecon.
  • Per i contenitori, utilizzare :Z/:z sui volumi ed evitare --privileged.

Errori comuni da evitare

  • Disabilitare SELinux a livello globale per "risolvere" i problemi dell'app.
  • utilizzando chcon senza semanage fcontext (le etichette scompaiono quando si rietichetta).
  • Consentire regole ampie tramite audit2allow invece di correggere le etichette.
  • Ignorando i valori booleani che risolvono già il problema.
  • Montaggio di volumi di contenitori senza adeguate :Z/:z etichette.

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.

Condividere tramite:

Prahlad Prajapati

Prahlad è uno specialista indiano di web hosting e di crescita organica incentrato sulla SEO. Attivo nel settore digitale dal 2019, aiuta le persone a far crescere i propri siti web attraverso strategie pulite e sostenibili. Appassionato di apprendimento e adattamento rapido, crede che i piccoli dettagli creino grandi successi. Scopri i suoi approfondimenti su web hosting e SEO per migliorare la tua presenza online.

Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

Scorrere fino a Top