Pregunta

Me gustaría para permitir a un usuario para configurar un túnel SSH a una máquina en particular en un puerto en particular (por ejemplo, 5000), pero quiero restringir el uso de este usuario tanto como sea posible.(Autenticación será con público/privado par de claves).

Yo sé que tengo que editar el correspondiente ~/.ssh/authorized_keys, pero no estoy seguro exactamente qué contenido a poner ahí (aparte de la clave pública).

¿Fue útil?

Solución

En Ubuntu 11.10, descubrí que podía bloque de comandos ssh, enviado con y sin-T, y el bloque scp copia, mientras que permite el reenvío de puerto para ir a través de.

Concretamente tengo una redis-servidor en el "somehost" obligado a localhost:6379 que deseo compartir de forma segura a través de túneles ssh a otros hosts que tiene un fichero de claves y ssh con:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

Esto hará que la redis-servidor "localhost" puerto 6379 en "somehost" para que aparezcan de forma local en el host de ejecutar el comando ssh, reasigna a "localhost" puerto 16379.

En el mando a distancia "somehost" Aquí es lo que he usado para authorized_keys:

cat .ssh/authorized_keys   (portions redacted)

no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost

La no-pty viajes hasta la mayoría de ssh intentos que se desea abrir un terminal.

El permitopen explica qué puertos están permitidos para ser enviado, en este caso el puerto 6379 la redis-puerto del servidor me quería presentar.

El comando="/bin/echo " no enviar comandos-" repite "do-not-send-comandos" si alguien o algo consigue enviar comandos al host a través de ssh -T o de otro tipo.

A partir de un reciente Ubuntu man sshd, authorized_keys / comando se describe de la siguiente manera:

comando="command" Especifica que el comando es ejecutado cada vez que esta clave se utiliza para la autenticación.El comando suministrados por el usuario (si es que existe) ignorado.

Intenta usar scp seguro de copia de archivos también fallará con un eco de "do-not-send-comandos" he encontrado sftp también falla con esta configuración.

Creo que el shell restringido de la sugerencia, de hecho en algunas de las respuestas anteriores, es también una buena idea.También, estoy de acuerdo que todo lo que aquí se detallan podría ser determinado a partir de la lectura de "el hombre sshd" y buscar en ella para "authorized_keys"

Otros consejos

Es probable que desee para configurar el shell del usuario para el shell restringido.Anular la variable PATH del usuario ~/.bashrc o ~/.bash_profile, y no ser capaz de ejecutar los comandos.Más adelante, si usted decide que usted desea permitir que el usuario(s) para ejecutar un conjunto limitado de comandos, como less o tail por ejemplo, entonces usted puede copiar el permitido de comandos a un directorio independiente (como /home/restricted-commands) y actualizar la RUTA de acceso para que apunte a ese directorio.

Además de authorized_keys la opción de no-X11 forwarding, que en realidad es exactamente la que usted está pidiendo:permitopen="host:puerto".Mediante esta opción, el usuario sólo puede configurar un túnel para el host y el puerto especificados.

Para los detalles de la AUTHORIZED_KEYS formato de archivo consulte hombre sshd.

Mi solución es proporcionar al usuario que sólo puede ser constructivo, sin un shell interactivo, para establecer que la shell en /etc/passwd a /usr/bin/tunnel_shell.

Sólo tienes que crear el archivo ejecutable /usr/bin/tunnel_shell con un bucle infinito.

#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0

Explicado aquí: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Soy capaz de configurar el archivo authorized_keys con la clave pública para el registro de en.Lo que no estoy seguro es de que la información adicional que necesito restringir lo que cuenta es permitido hacer.Por ejemplo, sé que puedo poner los comandos tales como:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

Usted quiere una línea en el archivo authorized_keys que se parece a esto.

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 

Si quieres hacer permitir el acceso sólo para un comando específico-como svn -- también puede especificar que el comando en la autorización archivo de claves:

command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]

De http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks

Aquí tienes un bonito post que he encontrado útil:http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

La idea es:(con el nuevo nombre de usuario restringido como "sshtunnel")

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

Tenga en cuenta que utilizamos rbash (restringido bash) para restringir lo que el usuario puede hacer:el usuario no puede cd (change directory) y no pueden establecer las variables de entorno.

Luego editamos el PATH del usuario env variable en /home/sshtunnel/.profile para nada - un truco que hará que bash no se encuentra en alguno de los comandos a ejecutar:

PATH=""

Finalmente nosotros no permitir que el usuario modifique los archivos de configuración de los permisos siguientes:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

Hice un programa en C que tiene este aspecto:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
    if (signo == SIGHUP)
        exit(0);
}

int main()
{
    signal(SIGINT, &sig_handler);
    signal(SIGTSTP, &sig_handler);

    printf("OK\n");
    while(1)
        sleep(1);
    exit(0);
}

Me puse el restringido shell del usuario a este programa.

No creo que el usuario restringido puede ejecutar cualquier cosa, incluso si lo hacen ssh server command, debido a que los comandos se ejecutan utilizando el shell, y este shell no ejecutar nada.

Ver este post sobre la autenticación de claves públicas.

Las dos cosas principales que usted necesita para recordar son:

  1. Asegúrese de que usted chmod 700 ~/.ssh
  2. Añada la clave pública bloque autorizados-teclas

Se generará una clave en la que los usuarios de la máquina a través de cualquier cliente ssh que están utilizando.pUTTY, por ejemplo, tiene una utilidad para hacer precisamente esto.Va a generar una clave privada y pública.

El contenido de el archivo de clave pública generada será colocado en el archivo authorized_keys.

Lo siguiente que necesita para asegurarse de que el cliente ssh está configurado para utilizar la clave privada que genera la clave pública.Es bastante sencillo, pero ligeramente diferentes dependiendo del cliente que se utiliza.

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