Molte distribuzioni moderne di Linux dispongono di un paio di shell differenti preinstallate. Queste shell Linux contengono dei tool che possono aiutare a svolgere praticamente qualsiasi compito, come muovere o cancellare file, accedere a macchine remote, eseguire script e gestire utenti. Il lato negativo di tutto questo potere è la capacità di danneggiare il sistema che ne deriva. Con lshell possiamo restringere l’accesso degli utenti a un determinato set di comandi, disabilitando completamente alcuni comandi, implementando restrizioni a tempo e molto altro! Ha senso utilizzare lshell per limitare l’uso di certi comandi agli utenti meno esperti. A chi non è mai capitato di lanciare un comando per sbaglio e cancellare dei file di sistema, l’intero disco e la propria home?
Questo tipo di inconvenienti può succedere, e spesso succede, ma con lshell possiamo configurare con semplicità il sistema in modo che i nuovi utenti non possano eseguire comandi come dd o fdisk, che possono potenzialmente rompere il sistema se non utilizzati correttamente. Il tool non è disponibile come software nei repository, ma fortunatamente l’installazione è molto semplice. Dovete avere python e git installati nella macchina.
Aprite un terminale e andate nella cartella dove volete scaricare il progetto:
$ cd ~/Scaricati/progetti $ git clone https://github.com/ghantoos/lshell.git $ cd lshell $ sudo python setup.py install –no-compile –install- scripts=/usr/bin/
L’ultimo comando del blocco qui sopra serve a installare lshell utilizzando lo script setup.py. Ora possiamo verificare che lshell sia disponibile nella lista delle shell installate nella nostra distribuzione lanciando
cat etc/shells: $ echo $SHELL /bin/bash $ cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash /usr/bin/lshell
Il comando echo $SHELL serve a determinare la shell di default attuale. Potete impostare lshell come shell di default di un utente con il comando sudo chsh -s /usr/bin/lshell nomeutente. In alternativa potete impostare lshell come default quando create un utente con il comando sudo adduser –shell /usr/bin/lshell nomeutente. Configurare lshell Con lshell, potete creare delle regole personalizzate e configurazioni per i diversi utenti. La configurazione di default di lshell si trova nel file /etc/lshell.conf e si applica a tutti gli utenti. Il file di configurazione può essere suddiviso in quattro sezioni: 1 [global] – le impostazioni che si applicano globalmente, come i log, vanno qui; 2 [default] – qui vanno i valori che si applicano a tutti gli utenti e gruppi; 3 [nomeutente] – le impostazioni del singolo utente, che si applicano esclusivamente a lui; 4 [grp:nomegruppo] – impostazioni che si applicano a un gruppo e a tutti gli utenti al suo interno. L’ordine di priorità di questo file è Utente D Gruppo D Default. Questo significa che lshell per prima cosa verifica se c’è una sezione dedicata allo specifico utente e applica tutte le impostazioni al suo interno, poi controlla il gruppo e infine la sezione Default. In caso di conflitti, le impostazioni sul nomeutente hanno la priorità per quell’utente, poi vengono le impostazioni per il gruppo e infine la configurazione di default. Il file di configurazione di un lshell appena installato non contiene sezioni [nomeutente] o [grp:nomegruppo]: devono essere aggiunte manualmente. Possiamo decidere la quantità di log che vogliamo ottenere da lshell impostando il valore di loglevel. Accetta un valore compreso tra 0 e 4, dove 0 significa non salvare alcun log, mentre 4 logga qualsiasi comando inserito dagli utenti. Di default, il tool utilizza syslog per i nomi dei file, ma supporta anche nomi di file personalizzati. Per esempio, se volete file di log per utente, modificate la riga logfile : syslog del file /etc/lshell.conf in logfilename : %u-%d- %m-%y. Questo crea un unico file di log per ogni utente e aggiunge la data con i valori separati da trattini. Volendo potete aggiungere %h al nome del file o qualsiasi altra combinazione.
Ovviamente potete anche cambiare l’ordine dei parametri per chiamare i file utente-anno-mese-giorno. L’opzione allowed viene utilizzata per offrire una lista separata da virgola di tutti i comandi utilizzabili dall’utente. Potete impostarlo a all se vi fidate dell’utente e volete che possa utilizzare tutti i comandi. In modo simile potete limitare l’accesso a determinati percorsi all’utente, per esempio /etc, usando l’opzione path. Potete anche definire quante volte un utente può usare il terminale con timer: [light] allowed : ‘all’ – [‘su’,‘dd’,‘cp’,‘mv’,‘rm’] path : [‘/var’,‘/usr/local’] forbidden : [‘;’,‘&’,‘|’,‘<’,‘>’] [utentelshell] allowed : +[‘pwd’,‘ping’,‘cp’,‘mv’] path : -[‘/etc’] In questo blocco, abbiamo creato delle personalizzazioni per due utenti, light e utentelshell. Per il primo, abbiamo definito il path, che contiene le cartelle alle quali può accedere. Con l’opzione allowed gli abbiamo dato accesso a tutti i comandi, tranne quelli che vengono dopo il segno -. Abbiamo anche impostato alcuni simboli che l’utente non può usare. In modo simile abbiamo vietato l’accesso alla cartella /etc all’utente utentelshell, ma questo utente può ancora accedere a tutte le cartelle previste dalla sezione [Default]. Inoltre, in aggiunta ai comandi descritti nella sezione [Default], l’utente utentelshell può anche utilizzare i comandi che seguono il +. Potete scrivere help nel prompt di lshell per ottenere una lista dei comandi utilizzabili. Un’altra funzionalità utile è la capacità di definire quali comandi può utilizzare un utente quando si collega via SSH. Per questo, basta usare l’opzione overssh:
allowed path overssh : +[‘pwd’,‘ping’,‘cp’,‘mv’] : [‘/usr/local’,’/var/www/html’,‘~/’] : +[‘rdiff.backup’,‘rsync’]-[‘ls’,‘scp’]
Come prima, il segno + con l’opzione overssh serve a indicare i comandi aggiuntivi che l’utente nomeutente può utilizzare via SSH, ovviamente in aggiunta a quelli descritti nella sezione [Default]. Il segno – d’altra parte serve a limitare l’utilizzo da parte dell’utente dei comandi ls, e scp, quando si connette via SSH. Potete utilizzare anche le opzioni strict e warning_counter per convincere gli utenti a non utilizzare comandi vietati o tentare di accedere a posti proibiti. Impostate warning_counter a un valore di vostra scelta, a seconda del numero di avvisi che volete dare agli utenti, prima di forzare il loro logout da lshell. Per attivare warning_counter basta impostare a 1 il valore di strict, in questo modo quando l’utente tenterà di lanciare un comando proibito verrà avvisato e il contatore di warning_ counter diminuirà di 1. Quando il contatore finisce, l’utente viene automaticamente espulso da lshell. Per una lista di tutte le opzioni supportate potete utilizzare la man page del progetto. Potete anche leggere i commenti del file /etc/ lshell.conf che descrivono la maggior parte delle opzioni, anche se disabilitate di default. Tutti abbiamo sentito la frase “da grandi poteri vengono grandi responsabilità”. Una variante meno conosciuta ma ugualmente vera dice “da grandi poteri, derivano grandi abilità di incasinare le cose”. Se siete preoccupati che i vostri utenti possano danneggiare il vostro sistema Linux, per mancanza di esperienza o maliziosamente, lshell è l’alternativa perfetta alla miriade di shell di default delle varie distribuzioni.
Aggirare una shell limitata:
Se avete rbash installato, aprite un terminale e lanciate cat /etc/shells e cercate la riga /bin/rbash nell’output. Potete lanciare rbash con il comando bash -r nel terminale. Per impostare rbash come shell di default per un utente, invece della normale bash, usate sudo chsh -s nomeutente, e poi scrivete /bin/rbash. Quando si utilizza la bash ristretta, non si può eseguire cd, impostare le variabili $PATH o $SHELL, dirottare gli output con gli operatori >, >|, <>, >&, &> e >>. Lo svantaggio nell’utilizzare rbash per limitare gli utenti è nella facilità con cui gli stessi possono scappare. Per esempio, dato che /bin/ è nel $PATH gli utenti possono semplicemente scrivere bash nel terminale e avviare una sessione bash non limitata. Si può anche utilizzare vi e lanciare una cosa come questa
light@gonzo: $ vi :set shell=/bin/bash :shell
In questo modo un utente può ritornare alla bash completa di tutte le sue funzionalità invece di rbash. Rbash impone soltanto le restrizioni più basilari ed è molto facile da aggirare. La tecnica di vi funziona anche con lshell, ma soltanto se avete vi nella lista dei comandi abilitati. Questo è il motivo per cui è meglio lavorare con una lista limitata di comandi permessi, piuttosto che permettere tutto ed evitare l’accesso ad alcuni.