No sé cómo hacerlo con bash, pero conozco otro shell que restringe el entorno del usuario:lshell (shell limitado).
Una descripción general rápida de la configuración
Lshell se configura a través de un archivo INI. De forma predeterminada, contiene una lista blanca de comandos permitidos, pero se puede configurar fácilmente para prohibir que el usuario use un comando específico.
Esta configuración (predeterminada conf /etc/lshell.conf
) prohíbe al usuario foo
de usar mkdir
:
[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']
Para configurar una cuenta de usuario para usar lshell de forma predeterminada, debe:
chsh -s /usr/bin/lshell foo
Lshell puede hacer más, como:
- 3 niveles de granularidad:usuario, grupo, todos.
- Puede restringir el acceso a ciertas rutas en el sistema.
- Puede restringir el uso de ciertos caracteres (como
|
). - Puede restringir el uso de ciertos comandos solo a través de SSH.
Y más.
Actualizar 1# Resultado de la prueba agregada:
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
La forma en que suelo implementar este tipo de restricciones requiere que se cumplan varias condiciones, de lo contrario, la restricción se puede eludir fácilmente:
- El usuario no pertenece al
wheel
grupo, el único autorizado para usarsu
(aplicado a través de PAM). -
El usuario recibe un
rbash
debidamente protegido con una RUTA de solo lectura que apunta a un~/bin
privado , este~/bin/
El directorio contiene enlaces a utilidades simples:$ 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*
-
el usuario recibe un entorno restringido de solo lectura (piense en cosas como
LESSSECURE
,TMOUT
,HISTFILE
variables). - el usuario está asignado al usuario de SELinux
staff_u
y dados derechos para ejecutar comandos como otro usuario según sea necesario a través desudo
. -
el
/home
del usuario ,/tmp
y posiblemente/var/tmp
están poliinstanciados a través de/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
Además,
/etc/security/namespace.init
hace que todos los archivos esqueléticos sean de solo lectura para el usuario y sean propiedad deroot
.
De esta forma puedes elegir si $USER
puede ejecutar mkdir
en su propio nombre (a través de un enlace en el privado ~/bin
directorio, aprovisionado a través de /etc/skel
, como se explicó anteriormente), en nombre de otro usuario (a través de sudo
) o ninguno en absoluto.
Agregue un grupo ficticio, agregue el usuario a ese grupo, chown root:somegroup /bin/mkdir
, chmod g-x /bin/mkdir
. Tenga en cuenta que esto depende de que el usuario no pueda modificar sus grupos. IIRC esto es cierto en GNU/Linux pero no en otros Unices.