Migliori Pratiche per la Sicurezza dei Filesystem Linux con Permessi Speciali
I permessi dei file Linux costituiscono le fondamenta della sicurezza del sistema, controllando chi può leggere, scrivere ed eseguire i file. Mentre i permessi standard di lettura/scrittura/esecuzione (rwx) sono fondamentali, Linux introduce i bit di permesso speciali—SUID, SGID e Sticky Bit—per gestire il contesto di esecuzione e l'integrità delle risorse condivise. Padroneggiare questi permessi consente agli amministratori di concedere in modo sicuro specifiche capacità elevate, garantendo la funzionalità necessaria e minimizzando al contempo i rischi per la sicurezza.
Questa guida approfondisce l'applicazione pratica e le implicazioni di sicurezza del Set User ID (SUID), Set Group ID (SGID) e dello Sticky Bit. Comprendere quando e come implementare queste funzionalità è cruciale per mantenere l'efficienza operativa senza compromettere la postura di sicurezza complessiva del tuo ambiente Linux.
Riepilogo sulla Comprensione dei Permessi Standard
Prima di esplorare i permessi speciali, è essenziale ricordare la notazione a triplette standard (rwx per proprietario, gruppo e altri). Questi permessi sono rappresentati numericamente utilizzando valori ottali (ad esempio, 755 o 644).
r(Lettura) = 4w(Scrittura) = 2x(Esecuzione) = 1
I permessi speciali modificano questo comportamento di base e sono rappresentati da una quarta cifra ottale iniziale (4, 2 o 1).
I Permessi Speciali: SUID, SGID e Sticky Bit
I permessi speciali aggiungono funzionalità oltre il controllo degli accessi standard. Sono solitamente indicati nell'output dell'elenco lungo (ls -l) con una s o t che sostituisce il flag x standard.
| Permesso | Valore Ottale | Effetto |
|---|---|---|
| SUID (Set User ID) | 4 | Il file viene eseguito con i permessi del proprietario del file (non dell'utente che lo esegue). |
| SGID (Set Group ID) | 2 | Il file viene eseguito con i permessi del gruppo del file, oppure i nuovi file ereditano l'ID di gruppo della directory padre. |
| Sticky Bit | 1 | Impedisce agli utenti di eliminare o rinominare file di proprietà di altri utenti in una directory condivisa, anche se hanno il permesso di scrittura sulla directory. |
1. Set User ID (SUID)
Il bit SUID è potente e potenzialmente pericoloso se usato impropriamente. Quando impostato su un file eseguibile, qualsiasi utente che esegue quel file esegue il processo con i permessi del proprietario.
Caso d'uso pratico: Utility che richiedono privilegi di root per eseguire un'attività specifica, ma non dovrebbero concedere un accesso root generale all'utente.
Esempio: SUID su /usr/bin/passwd
Il comando /usr/bin/passwd richiede tipicamente l'accesso root per modificare il file sicuro /etc/shadow. Ha il bit SUID impostato, consentendo a un utente standard di ottenere temporaneamente i privilegi del proprietario (root) solo per la durata dell'esecuzione di passwd per cambiare la propria password.
Visualizzazione SUID: Nota la s nello slot di esecuzione del proprietario:
ls -l /usr/bin/passwd
# Esempio di output: -rwsr-xr-x 1 root root ... /usr/bin/passwd
Impostazione SUID: Usa il valore ottale 4 combinato con i permessi standard (ad esempio, 755 diventa 4755):
# Supponendo che 'my_script' sia di proprietà di 'appuser'
chmod 4755 /percorso/del/mio_script
Avviso di Sicurezza per SUID: Non impostare mai il bit SUID su shell generiche (come
/bin/bash) o script che interpretano input esterni, poiché ciò concede un accesso root illimitato a chiunque esegua il file.
2. Set Group ID (SGID)
Il bit SGID ha due funzioni principali a seconda che sia applicato a un file o a una directory.
A. SGID su File Eseguibili
Quando impostato su un file eseguibile, il processo viene eseguito con i permessi associati al gruppo proprietario del file, non al gruppo primario dell'utente.
B. SGID su Directory (Cruciale per Ambienti Condivisi)
Quando impostato su una directory, qualsiasi nuovo file o sottodirectory creata al suo interno eredita automaticamente il gruppo proprietario della directory padre, anziché il gruppo primario dell'utente che ha creato il nuovo file.
Caso d'uso pratico: Cartelle di progetto condivise in cui tutti i collaboratori devono avere un accesso di gruppo unificato per la collaborazione.
Impostazione SGID su una Directory: Usa il valore ottale 2 combinato con i permessi standard (ad esempio, 775 diventa 2775):
# Imposta la proprietà di gruppo su 'developers' e abilita SGID
chgrp developers /srv/shared_project
chmod 2775 /srv/shared_project
3. Lo Sticky Bit
Lo Sticky Bit (o Attributo di Salvataggio del Testo) è quasi esclusivamente utilizzato su directory condivise per controllare l'eliminazione dei file.
Quando lo Sticky Bit è impostato su una directory, solo il proprietario di un file all'interno di quella directory, o l'utente root, può eliminare o rinominare quel file, anche se la directory stessa consente l'accesso in scrittura agli 'altri' (o+w).
Caso d'uso pratico: Directory condivise pubbliche come /tmp o cartelle di upload dipartimentali in cui gli utenti dovrebbero poter gestire solo i file che hanno creato.
Esempio: La Directory /tmp
La directory /tmp ha spesso permessi come 1777. L'1 indica che lo Sticky Bit è attivo.
ls -ld /tmp
# Esempio di output: drwxrwxrwt 15 root root 4096 Mar 10 11:30 /tmp
La t alla fine conferma che lo sticky bit è impostato. Senza di esso, qualsiasi utente potrebbe eliminare i file creati da altri utenti in /tmp.
Impostazione dello Sticky Bit: Usa il valore ottale 1 combinato con i permessi standard (ad esempio, 777 diventa 1777):
chmod 1777 /var/public_uploads
Gestione Completa: Combinazione di Permessi Speciali
I permessi speciali vengono spesso combinati. La quarta cifra iniziale è la somma dei bit speciali desiderati (4+2+1 = 7).
| Permessi Desiderati | Valore Ottale |
|---|---|
Standard rwxr-xr-x (755) |
755 |
SUID + rwxr-xr-x |
4755 |
SGID + rwxr-xr-x |
2755 |
Sticky Bit + rwxrwxrwx |
1777 |
SUID + SGID + Sticky Bit + rwx (Raramente necessario) |
7777 |
Esempio di Combinazione di SGID e Sticky Bit per Cartelle Condivise:
Per creare una directory di collaborazione sicura e condivisa in cui tutti gli utenti fanno parte del gruppo 'team', i nuovi file ereditano il gruppo 'team' e gli utenti non possono eliminare i file degli altri:
- Imposta la proprietà di gruppo:
chgrp team /data/projectX - Applica SGID (2) + Standard
rwx(7) + Sticky Bit (1) $\rightarrow 2+1 = 3$ per i bit speciali.- Usando la somma esplicita: SGID (2) + Sticky Bit (1) = 3. Permessi standard
775. - Comando completo:
chmod 3775 /data/projectX
- Usando la somma esplicita: SGID (2) + Sticky Bit (1) = 3. Permessi standard
Quando si visualizza questo: drwxrwxrw t (o drwxrwsrw t se il bit di gruppo è stato utilizzato anche per l'esecuzione).
Migliori Pratiche per la Sicurezza dei Permessi Speciali
A causa dei privilegi elevati che SUID e SGID concedono, devono essere gestiti con estrema cautela.
- Limita l'Ambito di SUID: Imposta SUID solo su eseguibili binari compilati che sono necessari per le operazioni standard (come
passwd,ping). Non applicare mai SUID a script interpretati (Shell, Python, Perl) a meno che non siano racchiusi in un eseguibile wrapper sicuro che convalida l'input. - Audit Regolari: Scansiona periodicamente il filesystem alla ricerca di file SUID/SGID insoliti utilizzando il comando
find:
bash # Trova tutti i file con SUID impostato find / -perm /4000 2>/dev/null # Trova tutti i file con SGID impostato find / -perm /2000 2>/dev/null - Usa SGID per la Coerenza del Gruppo: Preferisci SGID alla gestione manuale della proprietà di gruppo dei file nelle strutture dati condivise; automatizza l'ereditarietà del gruppo.
- Sticky Bit per Aree Pubbliche Scrivibili: Lo Sticky Bit è essenziale per qualsiasi directory destinata all'uso generale da parte degli utenti in cui l'eliminazione da parte di non proprietari deve essere limitata (ad esempio,
/tmp,/var/tmp).
Impiegando SUID con cautela per i compiti elevati richiesti, SGID per una gestione coerente del gruppo e lo Sticky Bit per l'integrità delle directory condivise, gli amministratori possono costruire un ambiente filesystem Linux altamente funzionale ma robustamente protetto.