Agregar un usuario que solo puede ejecutar scripts de forma remota

Agregar un usuario que solo puede ejecutar scripts de forma remota

Me gustaría crear un usuario que solo pueda hacer una cosa: a través de ssh especificar un script (y los argumentos de la línea de comandos para el script) que reside en una carpeta en particular (para los propósitos de esta pregunta, llamémoslo /local/remote_only_scripts/foo) y ejecutar ese script. y devolver su salida.

Para que quede claro algunos ejemplos de cosas que no quiero que el usuario pueda hacer:

  • Inicie sesión localmente en la cuenta. La aplicación de inicio de sesión es /bin/login. No es un script en la /local/remote_only_scripts/foocarpeta, por lo que el usuario no debe llamarlo.
  • Inicie sesión de forma remota en la cuenta. Nuevamente, iniciar sesión (¿es así como lo llama ssh?) no es un script en la carpeta correspondiente.
  • Enumere el contenido del directorio. Está en /bin/ls. No es un script en el directorio apropiado.
  • Edite un archivo en ese directorio. emacs, vi, gedit, la mayoría de los demás editores no son scripts en ese directorio.
  • Ver el contenido de un archivo en ese directorio.
  • Ejecutar un archivo en ese directorio que no tiene permiso para ejecutar.

Tenga en cuenta que estos sonejemplosHay muchas otras acciones que no quiero que el usuario pueda realizar. Al considerar una acción, pregunte "¿esto se hace mediante un script en /local/remote_only_scripts/foo?" si la respuesta es no, el usuario no debería poder hacerlo. Si la respuesta es sí, entonces el usuario debería poder hacerlo.

PD: Déjame aclarar a qué me refiero con "agregar un usuario". No me refiero a agregar un usuario a algún subsistema ssh. Más bien me refiero a agregar un usuario al sistema informático. Entonces, por ejemplo, tengo un sistema que ejecuta Debian estable, llámelo por su dirección, www.hg.bar.com. Quiero agregar un usuario (a través de kuser, users-admin o useradd o alguna forma similar), llámelo hg_guest. hg_guest no puede iniciar sesión localmente ni hacer ninguna de las cosas de la lista anterior. Todo lo que hg_guest puede hacer es ejecutar scripts "de forma remota". Dije que debería poder hacerlo a través de ssh, pero pensándolo bien ahora, tal vez permitirle usar ssh le permita iniciar sesión localmente, por lo que es posible que se requiera algún otro mecanismo.

Respuesta1

Hay unadominioopción en el archivo autorizado_keys. Estas opciones parecen hacer exactamente lo que quieres.

Tenga en cuenta que no es un chroot ni un shell restringido. Permite ejecutar solo esos comandos a través de ssh. Con tu ejemplo sería:

ssh somehost /local/remote_only_scripts/foo

Para este archivo de claves_autorizadas:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Hay muchas formas si no desea que su usuario pueda iniciar sesión localmente. Tu también puedes :

  • simplemente configure su caparazón en/bin/falso(tal vez necesites/bin/verdaderoya que ssh necesita un inicio de sesión válido)
  • bloquear su contraseña, verpasswd -l

EDITAR: agregó más opciones de restricción y aclaró cómo eliminar el acceso local.

Respuesta2

Pruebe esto como shell de inicio de sesión para el usuario:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Probablemente también querrás tener esto en el authorized_keysarchivo explícitamente como en la respuesta de Coren; pero reemplace '.../foo; con el programa aquí. Eso evitará comandos de SSH como sftp, scpy ssh hostname command.

Respuesta3

En el caso de que solo necesiten acceder a un script, esto funciona muy bien para mí. Agregue el usuario y cambie su shell predeterminado a la ruta del script. Cuando se conecten a través de ssh, ejecutará el script y cerrará su sesión.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest:x:2002:100::/home/hg_guest:/local/remote_only_scripts/foo/script.sh

información relacionada