¿Cómo restringir a los usuarios de SSH a un conjunto predefinido de comandos después de iniciar sesión?

StackOverflow https://stackoverflow.com/questions/402615

  •  03-07-2019
  •  | 
  •  

Pregunta

Esta es una idea para una seguridad.Nuestros empleados tendrán acceso a algunos comandos en un servidor Linux, pero no a todos.Deberán p.e.tener la posibilidad de acceder a un archivo de registro (less logfile) o iniciar diferentes comandos (shutdown.sh / run.sh).

Información de contexto:

Todos los empleados acceden al servidor con el mismo nombre de usuario:Nuestro producto se ejecuta con permisos de usuario "normales", no se necesita "instalación".Simplemente descomprímalo en su directorio de usuario y ejecútelo.Gestionamos varios servidores donde está "instalada" nuestra aplicación.En cada máquina hay un usuario. johndoe.Nuestros empleados a veces necesitan acceso a la aplicación en la línea de comando para acceder y verificar los archivos de registro o para reiniciar la aplicación manualmente.Sólo algunas personas tendrán acceso completo a la línea de comando.

Estamos utilizando autenticación ppk en el servidor.

Sería fantástico si el empleado1 solo pudiera acceder al archivo de registro y el empleado2 también pudiera hacer X, etc.

Solución:Como solución usaré el command opción como se indica en el aceptado respuesta.Crearé mi propio script de shell que será el único archivo que se podrá ejecutar para alguno empleados.El script ofrecerá varios comandos que se pueden ejecutar, pero ningún otro.Usaré los siguientes parámetros en authorized_keys de lo indicado aquí:

command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host

Esto es suficiente seguridad para nosotros.¡Gracias comunidad!

¿Fue útil?

Solución

También puede restringir las teclas a los comandos permitidos (en el archivo autorizado_claves).

I.e. el usuario no iniciaría sesión a través de ssh y luego tendría un conjunto restringido de comandos, sino que solo se le permitiría ejecutar esos comandos a través de ssh (por ejemplo, " ssh somehost bin / showlogfile ")

Otros consejos

ssh sigue el rsh tradición utilizando el programa shell del usuario desde el archivo de contraseña para ejecutar comandos.

Esto significa que podemos resolver esto sin involucrar ssh configuración de cualquier manera.

Si no desea que el usuario pueda tener acceso al shell, simplemente reemplace el shell de ese usuario con un script.si miras dentro /etc/passwd Verá que hay un campo que asigna un intérprete de comandos de shell a cada usuario.El script se utiliza como shell para el inicio de sesión interactivo. ssh user@host así como para comandos ssh user@host command arg ....

Aquí hay un ejemplo.Creé un usuario foo cuyo caparazón es un script.El script imprime el mensaje. my arguments are: seguido de sus argumentos (cada uno en una línea separada y entre corchetes angulares) y termina.En el registro por si acaso no hay argumentos.Esto es lo que sucede:

webserver:~# ssh foo@localhost
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

Si el usuario intenta ejecutar un comando, se verá así:

webserver:~# ssh foo@localhost cat /etc/passwd
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>

Nuestro "caparazón" recibe un -c invocación de estilo, con el comando completo como un argumento, de la misma manera que /bin/sh lo recibiría.

Como puede ver, lo que podemos hacer ahora es desarrollar más el script para que reconozca el caso cuando se ha invocado con un -c argumento y luego analiza la cadena (por ejemplo, mediante coincidencia de patrones).Aquellas cadenas que están permitidas se pueden pasar al shell real invocando recursivamente /bin/bash -c <string>.El caso de rechazo puede imprimir un mensaje de error y terminar (incluido el caso cuando -c Está perdido).

Tienes que tener cuidado al escribir esto.Recomiendo escribir sólo coincidencias positivas que permitan sólo cosas muy específicas y no permitan todo lo demás.

Nota: si usted es root, aún puedes iniciar sesión en esta cuenta anulando el shell en el su comando, como este su -s /bin/bash foo.(Sustituya el shell de su elección). Los no root no pueden hacer esto.

Aquí hay un script de ejemplo:restringir al usuario a utilizar únicamente ssh para git acceso a los repositorios bajo /git.

#!/bin/sh

if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
  printf "interactive login not permitted\n"
  exit 1
fi

set -- $2

if [ $# != 2 ] ; then
  printf "wrong number of arguments\n"
  exit 1
fi

case "$1" in
  ( git-upload-pack | git-receive-pack )
    ;; # continue execution
  ( * )
    printf "command not allowed\n"
    exit 1
    ;;
esac

# Canonicalize the path name: we don't want escape out of
# git via ../ path components.

gitpath=$(readlink -f "$2")  # GNU Coreutils specific

case "$gitpath" in
  ( /git/* )
     ;; # continue execution
  ( * )
    printf "access denied outside of /git\n"
    exit 1
    ;;
esac

if ! [ -e "$gitpath" ] ; then
   printf "that git repo doesn't exist\n"
   exit 1
fi

"$1" "$gitpath"

Por supuesto, confiamos en que estos programas Git git-upload-pack y git-receive-pack No tenga agujeros ni trampillas de escape que den acceso a los usuarios al sistema.

Esto es inherente a este tipo de esquema de restricción.El usuario está autenticado para ejecutar código en un determinado dominio de seguridad, y estamos imponiendo una restricción para limitar ese dominio a un subdominio.Por ejemplo, si permite que un usuario ejecute el vim comando en un archivo específico para editarlo, el usuario puede simplemente obtener un shell con :!sh[Enter].

Lo que está buscando se llama Shell restringido . Bash proporciona un modo en el que los usuarios solo pueden ejecutar comandos presentes en sus directorios de inicio (y no pueden moverse a otros directorios), lo que podría ser lo suficientemente bueno para usted.

He encontrado este hilo para ser muy ilustrativo, aunque un poco anticuado.

Debe adquirir `rssh ', el shell restringido

Puede seguir las guías de restricción mencionadas anteriormente, todas se explican por sí mismas y son fáciles de seguir. Comprenda los términos 'chroot jail', y cómo implementar de manera efectiva las configuraciones sshd / terminal, y así sucesivamente.

Dado que la mayoría de sus usuarios acceden a sus terminales a través de sshd, probablemente también debería buscar en sshd_conifg, el archivo de configuración del demonio SSH, para aplicar ciertas restricciones a través de SSH. Ten cuidado, sin embargo. Comprenda correctamente lo que intenta implementar, ya que las ramificaciones de configuraciones incorrectas son probablemente bastante graves.

¿Por qué no escribes tu propio shell de inicio de sesión?Sería bastante sencillo usar Bash para esto, pero puedes usar cualquier idioma.

Ejemplo en Bash

Utilice su editor favorito para crear el archivo. /root/rbash.sh (Esto puede ser cualquier nombre o ruta, pero debe ser chown root:root y chmod 700):

#!/bin/bash

commands=("man" "pwd" "ls" "whoami")
timestamp(){ date +'%Y-%m-%s %H:%M:%S'; }
log(){ echo -e "$(timestamp)\t$1\t$(whoami)\t$2" > /var/log/rbash.log; }
trycmd()
{
    # Provide an option to exit the shell
    if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]]
    then
        exit

    # You can do exact string matching for some alias:
    elif [[ "$ln" == "help" ]]
    then
        echo "Type exit or q to quit."
        echo "Commands you can use:"
        echo "  help"
        echo "  echo"
        echo "${commands[@]}" | tr ' ' '\n' | awk '{print "  " $0}'

    # You can use custom regular expression matching:
    elif [[ "$ln" =~ ^echo\ .*$ ]]
    then
        ln="${ln:5}"
        echo "$ln" # Beware, these double quotes are important to prevent malicious injection

        # For example, optionally you can log this command
        log COMMAND "echo $ln"

    # Or you could even check an array of commands:
    else
        ok=false
        for cmd in "${commands[@]}"
        do
            if [[ "$cmd" == "$ln" ]]
            then
                ok=true
            fi
        done
        if $ok
        then
            $ln
        else
            log DENIED "$cmd"
        fi
    fi
}

# Optionally show a friendly welcome-message with instructions since it is a custom shell
echo "$(timestamp) Welcome, $(whoami). Type 'help' for information."

# Optionally log the login
log LOGIN "$@"

# Optionally log the logout
trap "trap=\"\";log LOGOUT;exit" EXIT

# Optionally check for '-c custom_command' arguments passed directly to shell
# Then you can also use ssh user@host custom_command, which will execute /root/rbash.sh
if [[ "$1" == "-c" ]]
then
    shift
    trycmd "$@"
else
    while echo -n "> " && read ln
    do
        trycmd "$ln"
    done
fi

Todo lo que tienes que hacer es configurar este ejecutable como tu shell de inicio de sesión.Por ejemplo, edite su /etc/passwd archivo y reemplace su shell de inicio de sesión actual de ese usuario /bin/bash con /root/rbash.sh.

Este es sólo un ejemplo simple, pero puedes hacerlo tan avanzado como quieras, la idea está ahí.Tenga cuidado de no bloquearse cambiando el shell de inicio de sesión de su propio y único usuario.Y siempre pruebe símbolos y comandos extraños para ver si realmente es seguro.

Puedes probarlo con: su -s /root/rbash.sh.

Tener cuidado, asegúrese de hacer coincidir todo el comando y tenga cuidado con los comodines.Es mejor excluir los símbolos Bash como ;, &, &&, ||, $, y comillas invertidas para estar seguro.

Dependiendo de la libertad que le des al usuario, no habrá nada más seguro que esto.Descubrí que a menudo solo necesitaba crear un usuario que tenga acceso a solo unos pocos comandos relevantes y, en ese caso, esta es realmente la mejor solución.Sin embargo, si desea dar más libertad, una cárcel y permisos podrían ser más apropiados.Los errores se cometen fácilmente y sólo se notan cuando ya es demasiado tarde.

Es posible que desee ver la configuración de una cárcel .

Otra forma de ver esto es mediante el uso de ACL POSIX, debe ser compatible con su sistema de archivos, sin embargo, puede tener un ajuste preciso de todos los comandos en Linux de la misma manera que tiene el mismo control en Windows (solo sin la mejor interfaz de usuario). enlace

Otra cosa a tener en cuenta es PolicyKit .

Tendrás que buscar en Google para que todo funcione, ya que definitivamente no es una fortaleza de Linux en este momento.

[Divulgación: escribí sshdo que se describe a continuación]

Si desea que el inicio de sesión sea interactivo, la configuración correcta es probablemente la respuesta correcta. Pero si hay un conjunto real de comandos que desea permitir (y nada más) y está bien que estos comandos se ejecuten individualmente a través de ssh (por ejemplo, ssh user @ host cmd arg blah blah), entonces un control genérico de lista blanca de comandos para ssh puede ser lo que necesitas. Esto es útil cuando los comandos están escritos de alguna manera en el extremo del cliente y no requieren que el usuario escriba realmente el comando ssh.

Hay un programa llamado sshdo para hacer esto. Controla qué comandos pueden ejecutarse a través de conexiones ssh entrantes. Está disponible para descargar en:

http://raf.org/sshdo/ (lea las páginas del manual aquí) https://github.com/raforg/sshdo/

Tiene un modo de entrenamiento para permitir todos los comandos que se intentan, y una opción --learn para producir la configuración necesaria para permitir los comandos aprendidos permanentemente. Luego, se puede desactivar el modo de entrenamiento y no se ejecutará ningún otro comando.

También tiene una opción --unlearn para dejar de permitir comandos que ya no se usan para mantener el mínimo privilegio estricto a medida que los requisitos cambian con el tiempo.

Es muy exigente con lo que permite. No permitirá un comando con ningún argumento. Solo se pueden permitir comandos de shell completos.

Pero admite patrones simples para representar comandos similares que varían solo en los dígitos que aparecen en la línea de comando (por ejemplo, números de secuencia o marcas de fecha / hora).

Es como un firewall o control de lista blanca para comandos ssh.

Y admite diferentes comandos permitidos para diferentes usuarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top