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
wheel
gruppo, l'unico autorizzato ad usaresu
(applicato tramite PAM). -
All'utente viene assegnato un
rbash
correttamente protetto con un PATH di sola lettura che punta a un~/bin
privato , 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
,HISTFILE
variabili). - l'utente è associato all'utente SELinux
staff_u
e dato i diritti per eseguire i comandi come altro utente come richiesto tramitesudo
. -
il
/home
dell'utente ,/tmp
e possibilmente/var/tmp
sono 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 root
Inoltre,
/etc/security/namespace.init
rende 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.