Bloquear comando particular en Linux para usuarios específicos

27

¿Cómo bloquear el comando, digamos mkdirpara un usuario específico?

Lo que acabo de crear creó la función de solo lectura y la almacené en el perfil de los usuarios ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

Prueba:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

Entonces mi pregunta es ¿Cuál debería ser la forma de lograr esto? ¿Hay alguna herramienta para esto?

Actualización 1 # Pero si el usuario es inteligente, podría copiar el binario mkdir y cambiarle el nombre y usarlo. Entonces, ¿cómo lograr esto?

Rahul Patil
fuente
77
Su ejemplo fallará porque el usuario podría compilar el suyo mkdiry renombrarlo, o incluso simplemente copiar y renombrar el binario existente. Además, hay un shell incorporado para anular alias y funciones.
strugee
hmm eso es correcto, ¿hay alguna forma?
Rahul Patil
el usuario tampoco necesita compilar, puede copiarlo fácilmente y cp /bin/mkdir mkdir2luego usarlo :(
Rahul Patil
Crear un directorio es una tarea tan común / fundamental que hay varias formas de hacerlo, y sería casi imposible bloquearlos a todos (excepto al no permitir que el usuario cree archivos; es decir, proteger todos los directorios contra él). Por ejemplo, cp -r /usr/local/lib gggcreará un directorio llamado ggg(que contiene una copia del contenido de /usr/local/lib, si lo hay, que el usuario puede eliminar). Puede usar find / -type d -emptypara encontrar un directorio vacío para copiar.
G-Man dice 'reinstalar a Monica' el

Respuestas:

21

No sé cómo hacerlo con bash, pero sé de otro shell que restringe el entorno del usuario: lshell (shell limitado) .

Una descripción rápida de la configuración

Lshell se configura a través de un archivo INI. Por defecto, contiene una lista blanca de comandos permitidos, pero se puede configurar fácilmente para prohibir al usuario usar un comando específico.

Esta configuración (configuración predeterminada /etc/lshell.conf) prohíbe al usuario foousar mkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

Para configurar una cuenta de usuario para usar lshell de manera predeterminada, debe:

 chsh -s /usr/bin/lshell foo

Lshell puede hacer más, como:

  • 3 niveles de granularidad: usuario, grupo, todo.
  • 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 sobre SSH.

Y más.

Actualización 1 # Resultado de prueba agregado:

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
rahmu
fuente
3
con allowed = 'all' - ['mkdir'], ¿no puedes simplemente ejecutar bashy no tener restricciones otra vez?
Dawud
3
Solo ser pedante, lo siento, pero todavía hay muchas maneras de eludir las restricciones impuestas por esa lista, por ejemplo dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Creo que el problema es la falta de una política predeterminada restrictiva, es decir, en este escenario, usted OTORGA permisos por defecto, luego NEGA los permisos basados ​​en una lista, cuando debería ser al revés: DENY por defecto, luego GRANT según la política .
dawud
1
@dawud: estoy de acuerdo en que mantener una lista blanca de comandos permitidos es un mejor enfoque que tener una lista negra y espero que el usuario no la eluda superando al administrador.
rahmu
2
@Marco, verifique el ejemplo proporcionado en mi respuesta. Proporciono una lista blanca de comandos permitidos, y en ese escenario, el usuario no puede simplemente cpun binario a su RUTA ( rootdirectorio propio, rxpara el usuario), y rbashevita que se ejecute ./executables. ¿Responde tu pregunta?
dawud
2
@dawud Lo hace, de hecho. Perdí el directorio bin de solo lectura.
Marco
15

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 wheelgrupo, el único autorizado para usar su(impuesto a través de PAM).
  • Al usuario se le proporciona una seguridad adecuada rbashcon una RUTA de solo lectura que apunta a un privado ~/bin, este ~/bin/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*
    
  • al usuario se le da una, de sólo lectura entorno restringido (pensar en cosas por el estilo LESSSECURE, TMOUT, HISTFILElas variables).

  • el usuario se asigna al usuario de SELinux staff_uy se le otorgan derechos para ejecutar comandos como otro usuario según sea necesario a través de sudo.
  • del usuario /home, /tmpy posiblemente /var/tmpestán poliinstantiados 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.inithace que todos los archivos esqueléticos sean de solo lectura para el usuario y de su propiedad root.

De esta forma, puede elegir si $USERpuede ejecutarlo mkdiren su propio nombre (a través de un enlace en el ~/bindirectorio privado , provisto a través de /etc/skel, como se explicó anteriormente), en nombre de otro usuario (a través de sudo) o ninguno.

Dawud
fuente
4

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 algunos otros Unices.

Strugee
fuente
2
En la mayoría de los sistemas de archivos, también puede usar ACL extendidas para un control más detallado: la cantidad de grupos necesarios crecería exponencialmente con la cantidad de usuarios (debido a posibles combinaciones), sin mencionar los problemas de nombres.
Peter
2
agregue un punto más, también elimine el permiso de lectura de otros usuarios 710, para que el usuario no pueda copiar y cambiar el nombre de ese binario, ¿no?
Rahul Patil
1
@RahulPatil sí, y por supuesto, también debes restringir el uso de un compilador.
Peter
1

Lo mejor que he probado es usar Profile.d de la manera mejor y más segura

Paso # 1 (Crear un archivo de alias)

[root@newrbe ~]# vim /etc/customalias.sh

Añadir líneas debajo:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

Guardar y salir

Paso # 2 (Crear cargador de perfil)

/etc/profile.d/ esta ubicación contiene archivos para completar bash

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

Agregue las líneas debajo de los archivos, estas líneas bloquearán los comandos mencionados para los usuarios a continuación

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

guardar y Salir

Ahora salga y vuelva a iniciar sesión

Saludos, -Mansur

Mansur Ali
fuente
/etc/profile.d/no es para bashcompletar , es donde colocar las personalizaciones de sesión de inicio de sesión para los usuarios que usan shells de inicio de sesión tipo POSIX, por lo que generalmente no es donde bashirían las personalizaciones de alias (que preferirían entrar /etc/bash.bashrc) y debería tener una sintaxis de shell POSIX (por lo general, en su .lugar , de sourcey en =lugar de ==).
Stéphane Chazelas
-1

instale sudoers e intente configurar allí qué usuarios y qué comando.

mark.praktisero
fuente
44
Bienvenido a SX. Por favor agregue detalles a su respuesta; el OP, o cualquier otra persona que lea esta pregunta en el futuro, puede no estar al tanto sudo.
Joseph R.
Esta respuesta es simplemente errónea
kiltek