Tengo un servidor en una red interna (iniciar sesión allí a través de VPN) desde donde inicio sesión en el servidor a través de SSH con autenticación de clave pública/privada OpenSSH. Desde el punto de vista de la seguridad, quiero vincular las direcciones MAC de mis tres clientes usados iptables
en el servidor para que solo estos clientes puedan iniciar sesión con él.
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP
Sin embargo, ¿se recomienda hacerlo de esta manera? ¿Qué otros (mejores) métodos puedo utilizar para vincular el inicio de sesión SSH a los clientes utilizados?
(Si alguien quiere solicitar 2FA, lamentablemente la 2FA no es posible como posible solución).
Gracias.
Respuesta1
Supongo que desea evitar que su servidor SSH acepte conexiones de hosts que no son de confianza aunque proporcionen credenciales de usuario válidas. ¿Es correcto?
Una posible solución para vincular la autenticación de clave pública de los usuarios a los hosts de clientes seleccionados es mediante la autenticación basada en host. Configurando la autenticación basada en host y definiendo AuthenticationMethods
el parámetro en /etc/ssh/sshd_config
:
AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
O:
AuthenticationMethods hostbased,publickey
Eso le indicará al demonio SSH que solicite a los clientes que autentiquen los hosts desde los que se conectan antes de verificar las claves o contraseñas de los usuarios. La primera alternativa permite la autenticación basada en contraseña, mientras que la segunda la restringe únicamente a claves públicas. Dado que la autenticación basada en host se basa en pares de claves, el servidor SSH podrá autenticar clientes con direcciones IP dinámicas.
Aquí sigue las instrucciones completas. La documentación sobre cómo SSH realiza la autenticación basada en host está escrita enssh(1)
página de manual. Tenga en cuenta cómo SSH identifica a los usuarios y verifique si es aplicable a su caso.
La autenticación basada en host funciona de la siguiente manera: si la máquina desde la que el usuario inicia sesión aparece en la máquina remota
/etc/hosts.equiv
o/etc/ssh/shosts.equiv
en ella, ylos nombres de usuario son los mismos en ambos lados, o si los archivos~/.rhosts
existen~/.shosts
en el directorio de inicio del usuario en la máquina remota ycontener una línea que contiene el nombre de la máquina cliente y el nombre del usuario en esa máquina, se considera que el usuario puede iniciar sesión. Además, el servidor debe poder verificar la clave de host del cliente para que se permita el inicio de sesión. Este método de autenticación cierra los agujeros de seguridad debidos a la suplantación de IP, la suplantación de DNS y la suplantación de enrutamiento. [Nota para el administrador:/etc/hosts.equiv
,~/.rhosts
y el protocolo rlogin/rsh en general son intrínsecamente inseguros y deben desactivarse si se desea seguridad.]
Para habilitar la autenticación basada en host en OpenSSH:
- Establezca los siguientes valores de parámetros en
/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes
# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
- Para realizar la autenticación basada en host, puede confiar en la información del nombre de host proporcionada por los clientes configurando
HostbasedUsesNameFromPacketOnly yes
en/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly yes
- O, alternativamente, puede configurar el demonio SSH para identificar nombres de host mediante la resolución de las direcciones IP de los clientes utilizando información almacenada en
/etc/hosts
archivos o registros PTR en el servidor DNS de la red:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly no
UseDNS yes
- Enumere los nombres de host de los clientes autorizados en
/etc/ssh/shosts.equiv
el archivo. Créelo manualmente si no existe. La sintaxis del archivo es casi la misma que la documentada enhombre host.equiv(5), sin embargoEl demonio SSH no acepta nombres de host vacíos.
# /etc/ssh/shosts.equiv
ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
- Enumere las claves públicas de los hosts autorizados en
/etc/ssh/ssh_known_hosts
el archivo. Una manera conveniente de hacerlo es a través dessh-keyscan
:
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts
Después de configurar el servidor OpenSSH para aceptar solicitudes de autenticación basada en host, los clientes también deben configurarse para solicitar autenticación basada en host:
- Establezca los siguientes valores de parámetros en
/etc/ssh/ssh_config
:
# /etc/ssh/ssh_config
Host *
HostbasedAuthentication yes
EnableSSHKeySign yes
- Asegúrese de que los bits SUID/SGID en
ssh-keysign
El ejecutable concede permiso de lectura a los archivos de clave privada del host:
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
16517300 616 -r-xr-sr-x 1 root ssh_keys 630344 Feb 4 16:01 /usr/libexec/openssh/ssh-keysign
[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys 480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys 387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key