Opción de comando SSH Authorized_keys: varios comandos

17

El autorizado_keys tiene una opción command = "..." que restringe una clave a un solo comando. ¿Hay alguna manera de restringir una clave a múltiples comandos? Por ejemplo, teniendo una expresión regular allí, o editando algún otro archivo de configuración?

dkaeae
fuente

Respuestas:

9

No. No es un comando "permitido", sino un comando "forzado" (como opción ForceCommand ).

La única posibilidad es usar diferentes teclas para diferentes comandos o leer parámetros stdin.

Jakuje
fuente
27

Solo puede tener un comando por tecla, porque el comando es "forzado".

Pero puedes usar un script de envoltura. El comando llamado obtiene la línea de comando original como variable de entorno$SSH_ORIGINAL_COMMAND , que puede evaluar.

Por ejemplo, pon esto en ~/.ssh/allowed-commands.sh:

#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

case "$SSH_ORIGINAL_COMMAND" in
    "systemctl restart cups")
        systemctl restart cups
        ;;
    "shutdown -r now")
        shutdown -r now
        ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

Luego referencialo ~/.ssh/authorized_keyscon

command="/home/user/.ssh/allowed-commands.sh",…
hfs
fuente
1
Útil. Puede valer la pena aclarar que es sshd mismo que agrega SSH_ORIGINAL_COMMAND(per man sshd) para que esté disponible en scripts. También para dar un ejemplo de scripts automatizados que permiten SSH_ORIGINAL_COMMANDejecutar ciertos patrones de . Ver también unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight el
7

En el gran SSH, The Secure Shell: The Definitive Guide book de O'Reilly, en el capítulo ocho, hay un buen ejemplo dado usando un script como el siguiente:

#!/bin/sh

/bin/echo "Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit"

/bin/echo "Your choice:"

read ans

while [ "$ans" != "q" ]
do
   case "$ans" in
      1)
         /bin/date
         ;;
      2)
         /usr/bin/who
         ;;
      3)
         /usr/bin/top
         ;;
      q)
         /bin/echo "Goodbye"
         exit 0
         ;;
      *)
         /bin/echo "Invalid choice '$ans': please try again"
         ;;
   esac
   /bin/echo "Your choice:"
   read ans
done
exit 0

Usando esto en su .authorized_keysarchivo como:

command="/path/to/your/script.sh" <ssh-key>

... te da esto cuando haces ssh:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:
gf_
fuente
Pero ese script básicamente se rompe scp, sftpy todas las demás cosas que podrían resultarle útiles algún día.
Jakuje
3
@Jakuje ¿No es esto válido para la commandopción en general?
gf_
1

Otros enfoques usan, por ejemplo, un shell restringido para el usuario dado o usan un contenedor que restringe los comandos a todos los archivos / scripts que se encuentran en un directorio específico, lo que permite aumentar la lista de comandos sin cambiar el contenedor.

Otro artículo describe un script genérico, que también permite argumentos de línea de comando para los comandos permitidos, pero permite bloquearlos con reglas expresadas como expresiones regulares.

Este ejemplo se expresaría de la siguiente manera:

command="only systemctl shutdown"

Y .onlyrulesse crearían archivos con este contenido:

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

La ventaja de este enfoque 'único' es que no hay necesidad de escribir scripts individuales para cada usuario y situación.

Georg Lehner
fuente
El problema con cambiar el shell es que se aplicará a todos los inicios de sesión, incluso aquellos con una clave que no está destinada a ser restringida. Además, si solo inicia sesión en el shell y no tiene acceso de administrador, no puede simplemente cambiar el shell configurado a lo que desee. Pero aún puede editar su archivo autorizado_claves.
Kasperd
Se puede utilizar una "cáscara restringida" comoForcedCommand
Georg Lehner
Se me ocurre, para la situación en la que la cuenta que se usa es una cuenta de usuario normal, y las acciones requeridas son privilegiadas, ¿se puede confiar en sudo para hacer la verificación y establecer la opción de comando autorizado_keys en "sudo $ SSH_ORIGINAL_COMMAND"?
Steve Dee