Non so come farlo con bash, ma conosco un'altra shell che limita l'ambiente utente:lshell (shell limitata).
Una rapida panoramica della configurazione
Lshell è configurato tramite un file INI. Per impostazione predefinita, contiene una lista bianca di comandi consentiti, ma può essere facilmente configurata per impedire all'utente di utilizzare un comando specifico.
Questa configurazione (default conf /etc/lshell.conf ) vieta l'utente foo dall'utilizzo di mkdir :
[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']
Per configurare un account utente in modo che utilizzi lshell per impostazione predefinita, devi:
chsh -s /usr/bin/lshell foo
Lshell può fare di più, come:
- 3 livelli di granularità:utente, gruppo, tutto.
- Può limitare l'accesso a determinati percorsi nel sistema.
- Può limitare l'uso di determinati caratteri (come
|). - Può limitare l'uso di determinati comandi solo tramite SSH.
E altro ancora.
Aggiornamento 1# Aggiunto il risultato del test :
rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir
Il modo in cui di solito implemento questo tipo di restrizioni richiede il rispetto di diverse condizioni, altrimenti la restrizione può essere facilmente aggirata:
- L'utente non appartiene al
wheelgruppo, l'unico autorizzato ad usaresu(applicato tramite PAM). -
All'utente viene assegnato un
rbashcorrettamente protetto con un PATH di sola lettura che punta a un~/binprivato , questo~/bin/directory contiene collegamenti a semplici utilità:$ ll ~/bin total 0 lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear* lrwxrwxrwx. 1 root dawud 7 Sep 17 08:58 df -> /bin/df* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep* lrwxrwxrwx. 1 root dawud 8 Sep 17 08:58 env -> /bin/env* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep* lrwxrwxrwx. 1 root dawud 9 Sep 17 08:58 grep -> /bin/grep* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo* lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail* lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc* -
all'utente viene fornito un ambiente limitato e di sola lettura (si pensi a cose come
LESSSECURE,TMOUT,HISTFILEvariabili). - l'utente è associato all'utente SELinux
staff_ue dato i diritti per eseguire i comandi come altro utente come richiesto tramitesudo. -
il
/homedell'utente ,/tmpe possibilmente/var/tmpsono poliistanziati tramite/etc/security/namespace.conf:/tmp /tmp/.inst/tmp.inst-$USER- tmpdir:create root /var/tmp /tmp/.inst/var-tmp.inst-$USER- tmpdir:create root $HOME $HOME/$USER.inst/ tmpdir:create rootInoltre,
/etc/security/namespace.initrende tutti i file scheletrici di sola lettura per l'utente e di proprietà diroot.
In questo modo puoi scegliere se $USER può eseguire mkdir per proprio conto (tramite un link nel privato ~/bin directory, fornita tramite /etc/skel , come spiegato sopra), per conto di un altro utente (tramite sudo ) o nessuno.
Aggiungi un gruppo fittizio, aggiungi l'utente a quel gruppo, chown root:somegroup /bin/mkdir , chmod g-x /bin/mkdir . Si noti che ciò si basa sull'impossibilità per l'utente di modificare i propri gruppi. IIRC questo è vero in GNU/Linux ma non in qualche altro Unix.