ændrük sugirió una conexión inversa para obtener una conexión SSH fácil con otra persona (para ayuda remota). Para que eso funcione, se necesita un usuario adicional para aceptar la conexión. Este usuario debe poder reenviar su puerto a través del servidor (el servidor actúa como proxy).
¿Cómo creo un usuario restringido que no puede hacer nada más que lo descrito anteriormente?
El nuevo usuario no debe poder:
- ejecutar comandos de shell
- acceder a archivos o subir archivos al servidor
- usar el servidor como proxy (por ejemplo, webproxy)
- acceder a servicios locales que de otro modo no serían accesibles públicamente debido a un firewall
- matar al servidor
Resumido, ¿cómo creo un usuario SSH restringido que solo puede conectarse al servidor SSH sin privilegios, para poder conectarme a través de esa conexión con su computadora?
ssh
security
port-forwarding
Lekensteyn
fuente
fuente
Respuestas:
TL; DR: vaya al final de la respuesta, "Aplicación de las restricciones"
Agregar un usuario restringido consta de dos partes: 1. Crear el usuario 2. Configurar el demonio SSH (sshd)
Configurando sshd
El mejor lugar para conocer las posibilidades de SSH es leer las páginas del manual relacionadas:
¿Dónde puede el cliente SSH realizar acciones?
Antes de poder restringir algo, debe conocer las características de SSH. Escupir a través de las páginas del manual produce:
Desde la sección Autenticación de la página del manual de sshd (8) :
Opciones para restringir las funciones SSH
Los archivos y sus opciones que alteran el comportamiento son:
~/.ssh/authorized_keys
- contiene claves que pueden conectarse, a las que se pueden dar opciones:command="command"
- Se ignora el comando proporcionado por el usuario (si lo hay). Tenga en cuenta que el cliente puede especificar el reenvío TCP y / o X11 a menos que estén explícitamente prohibidos . Tenga en cuenta que esta opción se aplica a la ejecución de shell, comando o subsistema.no-agent-forwarding
- Prohíbe el reenvío del agente de autenticación cuando esta clave se usa para la autenticación.no-port-forwarding
- Prohíbe el reenvío de TCP cuando esta clave se usa para la autenticaciónno-X11-forwarding
- "Prohibe el reenvío de X11 cuando esta clave se utiliza para la autenticación".permitopen="host:port"
- Limite el reenvío de puerto local 'ssh -L' de modo que solo pueda conectarse al host y puerto especificados.~/.ssh/environment
- Este archivo se lee en el entorno al iniciar sesión (si existe). El procesamiento del entorno está deshabilitado de forma predeterminada y se controla mediante la opción PermitUserEnvironment~/.ssh/rc
- Contiene rutinas de inicialización que se ejecutarán antes de que el directorio de inicio del usuario sea accesible./etc/ssh/sshd_config
- el archivo de configuración de todo el sistemaAllowAgentForwarding
- Especifica si se permite el reenvío ssh-agent (1).AllowTcpForwarding
ForceCommand
- "Fuerza la ejecución del comando especificado por ForceCommand, ignorando cualquier comando proporcionado por el cliente y ~ / .ssh / rc si está presente. El comando se invoca utilizando el shell de inicio de sesión del usuario con la opción -c".GatewayPorts
- "Especifica si los hosts remotos pueden conectarse a los puertos reenviados para el cliente. De forma predeterminada, sshd (8) enlaza los reenvíos de puertos remotos a la dirección de bucle invertido. Esto evita que otros hosts remotos se conecten a los puertos reenviados. GatewayPorts se puede usar para especificar ese sshd debería permitir que los reenvíos de puertos remotos se unan a direcciones que no son de bucle invertido, permitiendo así que otros hosts se conecten ".PermitOpen
:PermitTunnel
- Especifica si se permite el reenvío de dispositivos tun (4). El valor predeterminado es 'no'X11Forwarding
- Especifica si se permite el reenvío X11. El valor predeterminado es 'no'Aplicando las restricciones
La modificación del archivo de configuración de todo el sistema
/etc/ssh/sshd_config
permite que la configuración se aplique incluso si se aplica la autenticación basada en contraseña o si las restricciones~/.ssh/authorized_keys
se eliminan accidentalmente. Si ha modificado los valores predeterminados globales, debe descomentar las opciones en consecuencia.Ahora agregue un usuario:
La opción
ForceCommand
se puede omitir si el shell está configurado en un no-shell como/bin/false
(o/bin/true
) ya/bin/false -c [command]
que no hará nada.Ahora el cliente solo puede conectarse al puerto 62222 en la dirección de bucle invertido del servidor a través de SSH (no escuchará en la dirección IP pública)
La desactivación
AllowTcpForwarding
también prohibiría el uso de-R
, por lo tanto, anularía el uso de una cuenta tan restringida para reenviar un solo puerto.PermitOpen localhost:62222
asume que el puerto 62222 en el servidor nunca está en uso porque el cliente puede conectarse felizmente y escucharlo también.Si se permite el reenvío TCP en la configuración de todo el sistema y la autenticación deshabilitada basada en contraseña, también puede usar la configuración por clave. Edite
~/.ssh/authorized_keys
y agregue las siguientes opciones antes dessh-
(con un espacio entre las opciones yssh-
):Verificar
Para asegurarse de que funciona como se esperaba, es necesario ejecutar algunos casos de prueba. En los comandos a continuación,
host
debe reemplazarse por el inicio de sesión real si no está configurado~/.ssh/config
. Detrás del comando, se muestra un comando que debe ejecutarse en el cliente o el servidor (como se especifica).Conclusión
Lista de verificación: el usuario SSH no debería poder:
fuente
useradd
debe estar desbloqueada. Eso se puede hacer reemplazando la contraseña/etc/shadow
por un asterico (*
) o estableciendo una contraseña usandosudo passwd limited-user
.sftp-server
comando. ConForceCommand
este comando ya no se ejecutará.from=
opción enauthorized_keys
. Le permite limitar el uso de la clave a fuentes con una dirección IP o nombre de host en particular. Ejemplo,from="1.1.1.1"
ofrom="10.0.0.?,*.example.com"
. Consulte la sección "FORMATO DE ARCHIVO DE LLAVES AUTORIZADAS" en la página de manual ( linux.die.net/man/8/sshd ) para ver todas las opciones de claves autorizadas.Host * ControlMaster auto
en su~/.ssh/config
archivo al conectarsessh -N
. Si lo necesita, usessh -N -o ControlMaster=no
Estoy seguro de que hay muchas soluciones para esto, y muchas más robustas que la que propongo. Sin embargo, esto puede ser suficiente para sus necesidades. Para hacerlo, supongo que el usuario puede realizar la autenticación basada en la clave ssh (la masilla o cualquier unix ssh deberían admitir esto).
Agregue un usuario como lo haría normalmente ('adduser' o cualquier otra herramienta)
Cree los usuarios .ssh dir y .ssh / Authorized_keys
Ahora, la única forma en que el usuario puede ingresar a su sistema es mediante el acceso a la clave ssh adecuada, y ssh ejecutará "/ bin / bash -c 'read a'" para ellos, sin importar lo que intenten ejecutar. 'leer a' simplemente leerá hasta una nueva línea, y luego el shell saldrá, por lo que el usuario solo tiene que presionar 'enter' para cerrar la conexión.
Hay muchas otras cosas que podrías hacer en 'command ='. Consulte
man authorized_keys
y busque 'comando' para obtener más información.Si no le gusta el hecho de que presionar enter mata la conexión, puede usar algo como lo siguiente para la entrada 'command =':
Esto solo crea un fifo temporal en el directorio de inicio de los usuarios y luego trata de leerlo. No se escribirá nada en ese archivo, por lo que esto se bloqueará indefinidamente. Además, si desea terminar esa conexión a la fuerza, puede hacer algo como:
Esto debería usar muy pocos recursos y nada debería salir mal en ese script que no terminaría en la terminación del shell.
No vi a mano cómo podría permitir que el usuario remita hacia adelante (
ssh -R
) pero limite (ssh -L
). Quizás podría usarse 'permitopen'. Buscar en Google no fue muy útil. Parecería que algo como 'reenvío sin puerto, permitremoteopen = 10001' sería útil para permitirssh -R 6901:localhost:6901
.Esta es una solucion. Definitivamente se puede mejorar, y cualquier apertura de puertos remotos debe ser examinada. Si mi objetivo era permitir que mi abuela se conectara a mi LAN para poder usar vnc para ver su pantalla, y el acceso a esas teclas se limitara a ella, personalmente me sentiría razonablemente seguro. Si esto fuera para una empresa, sería necesaria una investigación más exhaustiva. Una cosa a tener en cuenta es
ssh -N
que no solicita un shell en absoluto, por lo que el código 'command =' no se ejecuta.Otros mecanismos, posiblemente más seguros, pueden incluir la creación de un shell personalizado para el usuario e incluso bloquearlo con apparmour.
fuente
ssh
para la-N
opción. Debe haber una forma más limpia de lograr esto.ssh -N
no ejecuta un comando en absoluto, no hay problema quecommand="something"
cierre la sesión.chsh ssh_forwarder -s /bin/false
es todo lo que se necesita.