Permessi dei file in Linux

Ciao a tutti. Ci stiamo immergendo attivamente nel lavoro e già a gennaio stiamo preparando molti importanti lanci. Tra gli altri, è stato annunciato l'apertura di una nuova edizione del corso che tutti amano. «Amministratore Linux». In vista del lancio, condividiamo tradizionalmente la traduzione di materiali utili.

Permessi dei file in Linux

Le autorizzazioni dei file offrono un'alternativa sicura ai file eseguibili SUID, ma possono sembrare un po' complicate a prima vista.


Tutti noi sappiamo che i file binari SUID i termini "primary/secondary". sono una cattiva soluzione dal punto di vista della sicurezza.Per fortuna, se la tua applicazione richiede alcune privilegiate limitate, c'è un modo più efficiente, noto come autorizzazioni dei file..

Ti farò risparmiare tempo se desideri evitare di leggere attentamente l'articolo sopra: essenzialmente, le autorizzazioni dei file consentono ai processi che vengono eseguiti con i diritti dell'utente root e, quindi, hanno il diritto di fare qualsiasi cosa, di mantenere determinate capacità limitate, delimitate da questo elenco, quando rilasciano privilegi e vengono eseguiti come utente non privilegiato. Ciò significa che se un attaccante riesce a compromettere un processo attraverso un attacco di buffer overflow o un altro exploit, non sarà in grado di utilizzare altro se non le determinate minime autorizzazioni necessarie al processo.

Le autorizzazioni sono ottime per servizi che di solito vengono sempre eseguiti con i diritti dell'utente root, ma che dire degli strumenti da riga di comando? Fortunatamente, questo è altrettanto supportato a condizione che tu abbia gli strumenti appropriati installati. Se stai usando Ubuntu, ti servirà ad esempio il pacchetto libcap2-bin. Avrai anche bisogno di eseguire un kernel non obsoleto (a partire dalla versione 2.6.24).

). Queste funzionalità consentono di collegare autorizzazioni ai file eseguibili in modo simile alla configurazione del bit SUID, ma solo per un insieme specifico di autorizzazioni. L'utilità setcap viene utilizzata per aggiungere e rimuovere autorizzazioni da un file.

Il primo passo è scegliere le autorizzazioni di cui hai bisogno. Per questo articolo, presumo che ci sia uno strumento di diagnosi di rete denominato tracewalk, che dovrebbe essere in grado di utilizzare socket raw.Di solito, per questo è necessario che l'applicazione venga eseguita con i diritti dell'utente root, ma durante la revisione un elenco si scopre che è solo necessaria l'autorizzazione CAP_NET_RAW..

Assumendo che tu sia nella directory in cui si trova il file binario tracewalk, puoi aggiungere questa autorizzazione nel seguente modo:

sudo setcap cap_net_raw=eip tracewalk

Per ora ignora il suffisso =eip per l'autorizzazione, ne parlerò fra un paio di secondi. Nota che il nome dell'autorizzazione è in minuscolo. Ora puoi controllare se hai configurato correttamente le autorizzazioni con:

setcap -v cap_new_raw=eip tracewalk

Oppure puoi elencare tutte le autorizzazioni impostate per il file eseguibile:

getcap tracewalk

Per riferimento, puoi anche rimuovere tutte le autorizzazioni dal file eseguibile con:

setcap -r tracewalk

A questo punto dovresti essere in grado di eseguire il file eseguibile come utente non privilegiato, e dovrebbe essere in grado di lavorare con socket raw, ma senza alcun altro privilegio di cui dispone l'utente root.

Quindi, cosa significa questo strano suffisso =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — effettive, ereditabili e disponibili (effective, inheritable e permitted):

  • Effettive (Effective) autorizzazioni sono quelle che definiscono cosa può effettivamente fare il processo. Ad esempio, non può gestire socket raw se CAP_NET_RAW. non è nel set efficace.
  • Disponibili (Permitted) autorizzazioni sono quelle che è consentito avere al processo, se le richiede con la chiamata appropriata. Non consentono al processo di fare effettivamente nulla, a meno che non sia stato specificamente scritto per richiedere l'autorizzazione specificata. Questo consente di scrivere processi per aggiungere autorizzazioni particolarmente importanti al set efficace solo per il periodo in cui sono effettivamente necessarie.
  • Ereditabili (Inheritable) autorizzazioni sono quelle che possono essere ereditate nel set disponibile dal processo figlio creato. Durante l'operazione fork() o clone() il processo figlio riceve sempre una copia delle autorizzazioni del processo padre, poiché in quel momento sta ancora eseguendo lo stesso file eseguibile. Il set ereditabile viene utilizzato quando exec() (o simile) viene chiamato per sostituire il file eseguibile con un altro. A questo punto, il set disponibile del processo è mascherato dal set ereditabile per ottenere il set disponibile che sarà utilizzato per il nuovo processo.

Pertanto, l'utilità setcap ci consente di aggiungere i permessi di questi tre set in modo indipendente per questo file eseguibile. Si noti che il valore dei gruppi è interpretato in modo leggermente diverso per i diritti di accesso ai file:

  • Linee di alimentazione doppie disponibili 2×220 V i permessi dei file sono quelli sempre accessibili per il file eseguibile, anche se il processo genitore che lo ha chiamato non ne aveva. Una volta venivano chiamati "permessi forzati".
  • Ereditari i permessi dei file definiscono una maschera aggiuntiva, che può essere usata anche per rimuovere permessi dal set del processo chiamante. Si applicano in aggiunta al set ereditario del processo chiamante, quindi il permesso è ereditato solo se esiste in entrambi i set.
  • Effettivi i permessi dei file rappresentano in realtà solo un bit, e se è impostato, significa che l'intero set disponibile è copiato nel set effettivo del nuovo processo. Questo può essere utilizzato per aggiungere permessi a processi che non sono stati specificamente scritti per richiederli. Poiché è un singolo bit, se lo imposti per un qualsiasi permesso, deve essere impostato per tutti i permessi. Puoi pensarlo come a un bit legacy, perché è utilizzato per consentire l'uso dei permessi per applicazioni che non li supportano.

Impostando i permessi tramite setcap tre lettere e, i e p riguardano effettivo, ereditario e accessibile set rispettivamente. Quindi, la specifica precedente:

sudo setcap cap_net_raw=eip tracewalk

… indica che un permesso CAP_NET_RAW. deve essere aggiunto ai set disponibili e ereditari e che deve essere impostato anche il bit effettivo. Questo sostituirà eventuali permessi precedentemente impostati nel file. Per impostare immediatamente più permessi, usa un elenco separato da virgole:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Guida ai permessi discute tutto ciò più in dettaglio, ma spero che questo post abbia un po' demistificato ciò che accade. Rimane solo da menzionare alcune avvertenze e trucchi.

Per prima cosa, le capacità dei file non funzionano con i symlink: devi applicarle al file binario stesso (cioè all'obiettivo del symlink).

In secondo luogo, non funzionano con script interpretati. Ad esempio, se hai uno script Python a cui vuoi assegnare un permesso, devi assegnarlo all'interprete Python stesso. Ovviamente, questo è un potenziale problema di sicurezza, perché allora tutti gli script eseguiti con questo interprete avranno il permesso specificato, anche se è comunque significativamente meglio che fare SUID. Il workaround più comune sembra essere quello di scrivere un file eseguibile separato in C o in un linguaggio simile, che può eseguire le operazioni necessarie e richiamarlo dallo script. Questo è simile all'approccio utilizzato da Wireshark, che utilizza un file binario. /usr/bin/dumpcap per eseguire operazioni privilegiate:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

In terzo luogo, i permessi dei file vengono disabilitati se si utilizza una variabile di ambiente LD_LIBRARY_PATH per ovvi motivi di sicurezza(1). Lo stesso vale per LD_PRELOAD, per quanto ne so.

1. Poiché un aggressore può ovviamente sostituire una delle librerie standard e utilizzare LD_LIBRARY_PATH, per forzare la propria libreria a essere chiamata preferibilmente rispetto a quella di sistema, e quindi eseguire il proprio codice arbitrario con gli stessi privilegi dell'applicazione chiamante.

E con questo è tutto. Per dettagli sul programma del corso, sarà possibile informarsi durante il webinar che si terrà il 24 gennaio.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster