• Dave McKay

    @TheGurkha

  • February 26, 2020, 8:00am EDT
Fatmawati Achmad Zaenuri/

SUID, SGID, e Sticky Bits sono potenti permessi speciali che puoi impostare per eseguibili e directory su Linux. Condivideremo i benefici e le potenziali insidie del loro utilizzo.

Sono già in uso

Costruire la sicurezza in un sistema operativo multiutente presenta diversi dilemmi. Prendiamo il concetto (apparentemente) basilare delle password, per esempio. Devono essere memorizzate in modo che ogni volta che qualcuno accede, il sistema può confrontare la password che digita con la copia memorizzata. Ovviamente, dato che le password sono le chiavi del regno, devono essere salvaguardate.

Su Linux, le password memorizzate sono protette in due modi: sono criptate, e solo qualcuno con root privilegi può accedere al file che contiene le password. Questo potrebbe suonare bene, ma presenta un dilemma: se solo le persone con i privilegi di root possono accedere alle password memorizzate, come fanno quelli che non hanno quell’accesso a cambiare le loro password?

Elevare il tuo stato

Di solito, i comandi e i programmi Linux vengono eseguiti con lo stesso set di permessi della persona che lancia il programma. Quando root esegue il comando passwd per cambiare una password, viene eseguito con i permessi di root. Questo significa che il comando passwd può accedere liberamente alle password memorizzate nel file /etc/shadow.

Pubblicità

Quello che sarebbe ideale è uno schema in cui chiunque sul sistema potrebbe lanciare il programma passwd, ma il programma passwd mantiene i privilegi elevati di root. Questo permetterebbe a chiunque di cambiare la propria password.

Lo scenario sopra descritto è esattamente quello che fa il bit Set User ID (SUID). Esegue programmi e comandi con i permessi del proprietario del file, piuttosto che i permessi della persona che lancia il programma.

Stai elevando lo stato del programma

C’è un altro dilemma, però. Si deve evitare che la persona si immischi con la password di qualcun altro. Linux incorpora lo schema SUID che permette di eseguire applicazioni con un insieme di permessi temporaneamente presi in prestito, ma questa è solo metà della storia della sicurezza.

Pubblicità

Il meccanismo di controllo che impedisce a qualcuno di lavorare con la password di un’altra persona è contenuto nel programma passwd, non nel sistema operativo e nello schema SUID.

I programmi che girano con privilegi elevati possono presentare rischi per la sicurezza se non sono creati con una mentalità “security by design”. Questo significa che la sicurezza è la prima cosa da considerare, e poi ci si costruisce sopra. Non scrivete il vostro programma e poi cercate di dargli una mano di sicurezza in seguito.

Il più grande vantaggio del software open source è che potete guardare voi stessi il codice sorgente o fare riferimento a revisioni di pari livello. Nel codice sorgente del programma passwd, ci sono dei controlli, così si può vedere se la persona che esegue il programma è root. Sono permesse diverse capacità se qualcuno è root (o qualcuno che usa sudo).

Questo è il codice che rileva se qualcuno è root.

Questo è un esempio in cui si tiene conto di questo. Poiché root può cambiare qualsiasi password, il programma non deve preoccuparsi dei controlli che di solito esegue per vedere quali password la persona ha il permesso di cambiare. Quindi, per root, salta quei controlli ed esce dalla funzione di controllo.

Pubblicità

Con i comandi e le utilità principali di Linux, potete essere sicuri che hanno la sicurezza incorporata e che il codice è stato rivisto molte volte. Naturalmente, c’è sempre la minaccia di exploit ancora sconosciuti. Tuttavia, le patch o gli aggiornamenti sono veloci ad apparire per contrastare qualsiasi nuova vulnerabilità identificata.

È il software di terze parti, specialmente quello che non è open-source, che dovete stare estremamente attenti ad usare SUID. Non stiamo dicendo di non farlo, ma, se lo fate, volete essere sicuri che non esporrà il vostro sistema al rischio. Non volete elevare i privilegi di un programma che non ha intenzione di autogovernare correttamente se stesso e la persona che lo esegue.

Comandi Linux che usano SUID

Questi sono alcuni dei comandi Linux che usano il bit SUID per dare al comando privilegi elevati quando eseguito da un utente normale:

ls -l /bin/su
ls -l /bin/ping
ls -l /bin/mount
ls -l /bin/umount
ls -l /usr/bin/passwd

Nota i nomi dei file sono evidenziati in rosso, il che indica che il bit SUID è impostato.

Pubblicità

I permessi su un file o una directory sono solitamente rappresentati da tre gruppi di tre caratteri: rwx. Questi stanno per leggere, scrivere ed eseguire. Se le lettere sono presenti, quel permesso è stato concesso. Se è presente un trattino (-) invece di una lettera, però, quel permesso non è stato dato.

Ci sono tre gruppi di questi permessi (da sinistra a destra): quelli per il proprietario del file, per i membri del gruppo del file, e per gli altri. Quando il bit SUID è impostato su un file, una “s” rappresenta il permesso di esecuzione del proprietario.

Se il bit SUID è impostato su un file che non ha capacità eseguibili, una “S” maiuscola lo denota.

Vediamo un esempio. L’utente regolare dave digita il comando passwd:

passwd

Pubblicità

Il comando passwd chiede a dave la sua nuova password. Possiamo usare il comando ps per vedere i dettagli dei processi in esecuzione.

Utilizzeremo ps con grep in un’altra finestra del terminale e cercheremo il processo passwd. Useremo anche le opzioni -e (ogni processo) e -f (formato completo) con ps.

Scriviamo il seguente comando:

ps -e -f | grep passwd

Sono riportate due righe, la seconda delle quali è il processo grep che cerca comandi con la stringa “passwd”. È la prima linea che ci interessa, però, perché è quella del processo passwd lanciato da dave.

Possiamo vedere che il processo passwd funziona come se root lo avesse lanciato.

Impostazione del bit SUID

È facile cambiare il bit SUID con chmod. Il modo simbolico u+s imposta il bit SUID e il modo simbolico u-s cancella il bit SUID.

Pubblicità

Per illustrare alcuni dei concetti del bit SUID, abbiamo creato un piccolo programma chiamato htg. È nella directory principale dell’utente dave, e non ha il bit SUID impostato. Quando viene eseguito, mostra gli ID utente reali ed effettivi (UID).

L’UID reale appartiene alla persona che ha lanciato il programma. L’ID effettivo è l’account con cui il programma si comporta come se fosse stato lanciato.

Scriviamo quanto segue:

ls -lh htg
./htg

Quando eseguiamo la copia locale del programma, vediamo che l’ID reale e quello effettivo sono entrambi impostati su dave. Quindi, si sta comportando proprio come dovrebbe fare un programma normale.

Pubblicità

Copiamolo nella directory /usr/local/bin in modo che altri possano usarlo.

Scriviamo quanto segue, usando chmod per impostare il bit SUID, e poi controlliamo che sia stato impostato:

sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg

Quindi, il programma viene copiato, e il bit SUID è impostato. Lo eseguiremo di nuovo, ma questa volta eseguiremo la copia nella cartella /usr/local/bin:

htg

Anche se dave ha lanciato il programma, l’ID effettivo è impostato sull’utente root. Quindi, se mary lancia il programma, succede la stessa cosa, come mostrato sotto:

htg

Pubblicità

L’ID reale è mary, e l’ID effettivo è root. Il programma viene eseguito con i permessi dell’utente root.

RELATO: Come usare il comando chmod su Linux

Il bit SGID

Il bit Set Group ID (SGID) è molto simile al bit SUID. Quando il bit SGID è impostato su un file eseguibile, il gruppo effettivo è impostato sul gruppo del file. Il processo viene eseguito con i permessi dei membri del gruppo del file, piuttosto che i permessi della persona che lo ha lanciato.

Abbiamo modificato il nostro programma htg in modo che mostri anche il gruppo effettivo. Cambieremo il gruppo del programma htg per essere il gruppo predefinito dell’utente mary, mary. Useremo anche i modi simbolici u-s e g+s con chown per rimuovere il bit SUID e impostare il SGID.

Per fare ciò, digitiamo quanto segue:

sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg

Potete vedere il bit SGID denotato dalla “s” nei permessi del gruppo. Inoltre, notate che il gruppo è impostato su mary e il nome del file è ora evidenziato in giallo.

Pubblicità

Prima di eseguire il programma, stabiliamo a quali gruppi dave e mary appartengono. Useremo il comando id con l’opzione -G (gruppi), per stampare tutti gli ID dei gruppi. Poi, eseguiremo il programma htg come dave.

Scriviamo i seguenti comandi:

id -G dave
id -G mary
htg

L’ID del gruppo predefinito per mary è 1001, e il gruppo effettivo del programma htg è 1001. Quindi, anche se è stato lanciato da dave, è in esecuzione con i permessi dei membri del gruppo mary. È come se dave si fosse unito al gruppo mary.

Applichiamo il bit SGID a una directory. Per prima cosa, creeremo una directory chiamata “work”, e poi cambieremo il suo gruppo in “geek”. Imposteremo quindi il bit SGID sulla directory.

Quando usiamo ls per controllare le impostazioni della directory, useremo anche l’opzione -d (directory) così vedremo i dettagli della directory, non il suo contenuto.

Scriviamo i seguenti comandi:

sudo mkdir work
sudo chown dave:geek work
sudo chmod g+s work
ls -lh -d work

Pubblicità

Il bit SGID e il gruppo “geek” sono impostati. Questi influenzeranno qualsiasi elemento creato all’interno della directory work.

Scriviamo quanto segue per entrare nella directory work, creare una directory chiamata “demo” e controllare le sue proprietà:

cd work
mkdir demo
ls -lh -d demo

Il bit SGID e il gruppo “geek” sono automaticamente applicati alla directory “demo”.

Scriviamo quanto segue per creare un file con il comando touch e controllare le sue proprietà:

touch useful.sh
ls -lh useful.sh

Pubblicità

Il gruppo del nuovo file è automaticamente impostato su “geek.”

RELATO: Come usare il comando chown su Linux

Il bit adesivo

Il bit adesivo prende il nome dal suo scopo storico. Quando è impostato su un eseguibile, segnala al sistema operativo che le porzioni di testo dell’eseguibile dovrebbero essere tenute in swap, rendendo il loro riutilizzo più veloce. Su Linux, il bit appiccicoso ha effetto solo su una directory – impostarlo su un file non avrebbe senso.

Quando si imposta il bit appiccicoso su una directory, le persone possono cancellare solo i file che gli appartengono all’interno di quella directory. Non possono cancellare i file che appartengono a qualcun altro, non importa quale combinazione di permessi sia impostata sui file.

Questo vi permette di creare una directory che tutti, e i processi che lanciano, possono usare come archivio condiviso di file. I file sono protetti perché, di nuovo, nessuno può cancellare i file di qualcun altro.

Pubblicità

Creiamo una directory chiamata “shared”. Useremo il modo simbolico o+t con chmod per impostare il bit adesivo su quella directory. Guarderemo poi i permessi su quella directory, così come sulle directory /tmp e /var/tmp.

Scriviamo i seguenti comandi:

mkdir shared
sudo chmod o+t shared
ls -lh -d shared
ls -lh -d /tmp
ls -lh -d /var/tmp

Se il bit adesivo è impostato, il bit eseguibile dell'”altro” set di permessi dei file è impostato su “t”. Anche il nome del file è evidenziato in blu.

Le cartelle /tmp e /var/tmp sono due esempi di directory che hanno tutti i permessi di file impostati per il proprietario, il gruppo e altri (ecco perché sono evidenziati in verde). Sono usate come posizioni condivise per i file temporanei.

Pubblicità

Con questi permessi, chiunque dovrebbe, teoricamente, essere in grado di fare qualsiasi cosa. Tuttavia, il bit adesivo li sovrascrive, e nessuno può cancellare un file che non gli appartiene.

Ricordi

Quella che segue è una rapida lista di controllo di ciò che abbiamo coperto sopra per riferimento futuro:

  • SUID funziona solo sui file.
  • È possibile applicare SGID a directory e file.
  • Puoi applicare il bit adesivo solo alle directory.
  • Se gli indicatori “s“, “g“, o “t” appaiono in maiuscolo, il bit eseguibile (x) non è stato impostato.
Dave McKay
Dave McKay ha usato i computer per la prima volta quando il nastro di carta perforato era in voga, e da allora programma. Dopo oltre 30 anni nell’industria IT, ora è un giornalista tecnologico a tempo pieno. Durante la sua carriera, ha lavorato come programmatore freelance, come manager di un team internazionale di sviluppo software, come project manager di servizi IT e, più recentemente, come Data Protection Officer. Dave è un evangelista di Linux e un sostenitore dell’open source.Read Full Bio ”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.