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:
- Ejecución de comandos de shell
- Carga de archivos a través de sftp
- Reenvío de puertos
- El cliente reenvía un puerto (no) usado al servidor
- El servidor reenvía su puerto al cliente
- El servidor reenvía un puerto de otro host al cliente (proxy-ish)
- Reenvío X11 (reenvío de pantalla)
- Reenvío de agente de autenticación
- Reenvío de un dispositivo de túnel
Desde la sección Autenticación de la página del manual de sshd (8) :
Si el cliente se autentica con éxito, se ingresa un diálogo para preparar la sesión. En este momento, el cliente puede solicitar cosas como
asignar un pseudo-tty, reenviar conexiones X11, reenviar conexiones TCP o reenviar la conexión del agente de autenticación a través del canal seguro.
Después de esto, el cliente solicita un shell o la ejecución de un comando . Los lados luego ingresan al modo de sesión. En este modo, cualquier lado puede enviar datos en cualquier momento, y dichos datos se envían a / desde el shell o comando en el lado del servidor, y el terminal de usuario en el lado del cliente.
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ón
no-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 sistema
AllowAgentForwarding
- 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
:
Especifica los destinos a los que se permite el reenvío de puertos TCP. La especificación de reenvío debe ser una de las siguientes formas:
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
Se pueden especificar varios reenvíos separándolos con espacios en blanco. Se puede usar un argumento de 'cualquiera' para eliminar todas las restricciones y permitir cualquier solicitud de reenvío. Por defecto, todas las solicitudes de reenvío de puertos están permitidas.
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.
Match User limited-user
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
#GatewayPorts no
AllowAgentForwarding no
PermitOpen localhost:62222
ForceCommand echo 'This account can only be used for [reason]'
Ahora agregue un usuario:
sudo useradd -m limited-user
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 de ssh-
(con un espacio entre las opciones y ssh-
):
command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"
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).
# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222
Conclusión
Lista de verificación: el usuario SSH no debería poder:
- ejecutar comandos de shell - hecho
- acceder a archivos o subir archivos al servidor - hecho
- usar el servidor como proxy (por ejemplo, webproxy) - hecho
- acceder a servicios locales que de otro modo no serían accesibles públicamente debido a un firewall; en parte , el cliente no puede acceder a otros puertos que no sean 62222, pero puede escuchar y conectarse al puerto 62222 en el servidor
- matar el servidor: listo
(tenga en cuenta que estas comprobaciones se limitan al servidor SSH. Si tiene otro servicio vulnerable en la máquina, podría permitir que un posible atacante ejecute comandos, mate el servidor, etc.)