È possibile eseguire uno script bash in una sorta di sandbox?


13

Il nostro prodotto ha bisogno di eseguire uno script bash sconosciuto su un server delicato per raggiungere un certo obiettivo. Questo script bash è fornito dall'utente. Siamo interessati a garantire che siano consentiti solo comandi specifici e che tutti gli altri no. Inoltre, dobbiamo sostituire alcuni comandi con altri.

Quindi, ad esempio, vorremmo eseguire lo script e consentire i seguenti comandi: echo cat awk

Ma non consentire nessun altro comando (non vogliamo fornire un elenco specifico qui).

Inoltre, se lo script contiene il comando cp, vorremmo catturarlo e reindirizzare a un comando diverso (che può essere fatto usando l'alias).

Qualche idea su come sia fatto?

Risposte:


9

Il modo più semplice è utilizzare una jail chroot contenente solo i comandi che si desidera eseguire lo script. Quindi eseguire lo script tramite un wrapper che chiama chrootnella directory e quindi esegue lo script.


17

Non è sicuro al 100% eseguire lo script all'interno di una macchina virtuale, il che presumibilmente impedirebbe allo script di raggiungere il suo obiettivo. Ma ci sono due funzioni che potrebbero aiutarti. Se sei preoccupato che lo script sia stato scritto da una persona maliziosa, queste funzionalità non sono sufficienti; ma se sei solo preoccupato che lo script possa fare cose cattive sul tuo sistema perché è stato scritto da un programmatore incurante o con diversi obiettivi in ​​mente, una di queste due funzionalità offre un ambiente sandbox decente.

  • È possibile eseguire una shell con restrizioni invocando bash come bash -r. Vi rimando al manuale di bash per una descrizione dettagliata; l'idea di base è che lo script non può invocare comandi che non sono presenti $PATH, non possono cambiare $PATH, non possono reindirizzare ao da un file e alcune altre restrizioni. Questo è abbastanza semplice da configurare, ma se lo script sconosciuto è troppo complicato da rivedere, è probabile che utilizzi molte cose proibite in una shell limitata.

  • È possibile impostare un carcere chroot . L'idea è quella di impostare un albero di directory /some/rooted eseguire lo script in un ambiente che ritiene che /some/rootsia l'intero filesystem ( chrootè l'abbreviazione di change root). Una volta impostato l'albero delle directory, eseguire lo script (copiato in /some/root/myscript) come chroot /some/root /bin/bash /myscript. Ad esempio, si imposta una directory /some/root/bincon i comandi che si desidera consentire e il programma chroot vedrebbe questa directory come /bin. Dovrai copiare tutto il necessario per l'esecuzione del programma all'interno del chroot: librerie, file di dati bash, lo script stesso, ecc. Potrebbe essere necessario /procmontare lo script all'interno del chroot; puoi farlo con un comando come mount -t proc proc /proc.

    Se devi rendere disponibile un intero albero di directory per lo script, ad esempio /var/example, hai diverse opzioni. Puoi fare una copia sotto /some/root. Potresti creare collegamenti fisici (se funzionano per la tua applicazione e il chroot si trova nello stesso filesystem). Su Linux, puoi fare mount --bind /var/example /some/root/var/example"innesto" /var/exampleall'interno del chroot. Si noti che un collegamento simbolico non può funzionare poiché la destinazione del collegamento è determinata all'interno del chroot.

    Nota che chroot non fornisce sicurezza assoluta, in particolare contro i processi in esecuzione come root. Ad esempio, un processo di root potrebbe creare un file di dispositivo all'interno del chroot e accedere all'intero disco attraverso di esso. Un processo chroot può ancora effettuare connessioni di rete (puoi proibirlo non includendo alcun programma di rete all'interno del chroot e assicurando che il programma non attendibile non possa creare un file e renderlo eseguibile o sovrascrivere un eseguibile esistente).


Dovrai copiare tutto il necessario , posso creare collegamenti simbolici o reali anziché copiare?
Kyb,

1
@kyb Hard link: sì. Collegamento simbolico: no, un collegamento simbolico può puntare solo a un file che puoi vedere, non ti consente di sfuggire a un chroot. I collegamenti fisici sono difficili da usare per questo e complicati: si rompono se si sostituisce il file, espongono la copia originale nel caso in cui sia scrivibile all'interno del chroot. Se si desidera rendere disponibile un intero albero, copiarlo o eseguire un montaggio bind di sola lettura.
Gilles,

Ho bisogno di rendere disponibili i comandi più comuni come grep, awk, units, ecc Ho bisogno di copiare tutti i file bin e tutte le dipendenze manualmente o c'è qualche trucco utile per dire esplicitamente cosa utils dovrebbe funzionare in chroot?
Kyb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.