Agregar un usuario que solo puede ejecutar scripts de forma remota

14

Me gustaría crear un usuario que solo pueda hacer una cosa: a través de ssh, especifique un script (y argumentos de línea de comandos para el script) que resida en una carpeta en particular (para los fines de esta pregunta, llamémoslo /local/remote_only_scripts/foo) y haga que ese script se ejecute y devuelve 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 no debe ser llamado por el usuario.
  • Inicie sesión de forma remota en la cuenta. Nuevamente, el inicio de sesión (¿es eso lo que llama ssh?) No es un script en la carpeta correspondiente.
  • Lista los contenidos del directorio. Está dentro /bin/ls. No es un script en el directorio apropiado.
  • Edite un archivo en ese directorio. emacs, vi, gedit la mayoría de los otros editores no son scripts en ese directorio.
  • Ver el contenido de un archivo en ese directorio.
  • Ejecute un archivo en ese directorio que no tiene permiso para ejecutar.

Tenga en cuenta que estos son ejemplos de que hay muchas otras acciones que no deseo que el usuario pueda hacer. Al considerar una acción, pregunte "¿está haciendo esto 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: Permítanme aclarar lo que quiero decir 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 de alguna manera similar) llámelo hg_guest. hg_guest no puede iniciar sesión localmente ni hacer ninguna de las cosas en la lista anterior. Todo lo que hg_guest puede hacer es ejecutar scripts "remotamente". Dije que debería poder hacerlo a través de ssh, pero pensarlo ahora, tal vez permitirle usar ssh puede permitirle iniciar sesión localmente, por lo que puede ser necesario algún otro mecanismo.

HandyGandy
fuente

Respuestas:

12

Hay una opción de comando en el archivo Authorized_keys. Estas opciones parecen hacer exactamente lo que quieres.

Tenga en cuenta que no es un chroot o un shell restringido. Está permitiendo ejecutar solo esos comandos a través de ssh. Con su ejemplo, sería:

ssh somehost /local/remote_only_scripts/foo

Para este archivo autorizado_claves:

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

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

  • simplemente configure su shell en / bin / false (tal vez necesite / bin / true ya que ssh necesita un inicio de sesión válido)
  • bloquear su contraseña, ver passwd -l

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

Coren
fuente
No creo que necesite especificar ese comando en ssh en el lado del cliente, es un comando 'forzado' para que siempre se ejecute;) El usuario en el sitio remoto todavía necesita un shell válido definido en / etc / passwd.
jirib
1
Además command=, las opciones no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyson necesarias para restringir realmente la cuenta.
jofel
Okay. Me desperté en medio de la noche y decidí verificar las respuestas. Como estoy somnoliento no asimilaré toda la respuesta, sino preguntar algo que me deje confundido. ¿Cómo evita esto que hg_quest inicie sesión desde un tty?
HandyGandy
@HandyGandy Esta es la parte más simple. He agregado 2 formas de hacerlo, pero creo que hay más
Coren
0

Pruebe esto como el 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 desee tener esto en el authorized_keysarchivo explícitamente como en la respuesta de Coren; pero reemplaza el '... / foo; con el programa aquí Eso evitará que los comandos de SSH como sftp, scp, y ssh hostname command.

Arcege
fuente
Si solo desea que el usuario pueda ejecutar los comandos desde su directorio (y no hay demasiados), puede quitar el "programa" de la lectura anterior y usar una instrucción select para ofrecer un menú de texto de opciones de esos programas y luego lee los argumentos. También probaría esto para asegurarme de lo que sucede si escribes un montón de Ctrl-C en varios puntos del script. Es posible que desee un comando de trampa allí también.
Joe
0

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 conectan 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

2bc
fuente