SSH, que significa Secure Shell, no es muy seguro por defecto, optando por la autenticación de contraseña básica sin otros límites. Si verdaderamente desea bloquear su servidor, deberá realizar más configuraciones.
No permita inicios de sesión con contraseña: use claves SSH
Lo primero que debe hacer es deshacerse de la autenticación de contraseña por completo y cambiar al uso de claves SSH. Las claves SSH son una forma de cifrado de clave pública; dispone de una clave pública que actúa como su nombre de usuario y una clave privada que actúa como su contraseña (excepto que esta contraseña tiene 2048 caracteres). Su clave privada se almacena en su disco, pero está encriptada con una frase de contraseña y ssh-agent. Cuando ingresa a SSH en un servidor, en lugar de pedir su contraseña, el agente ssh se conecta al servidor usando sus claves.
Inclusive si ya está usando claves SSH, querrá asegurarse de que sus inicios de sesión con contraseña estén desactivados, dado que los dos no se excluyen mutuamente.
RELACIONADO: ¿Qué es el reenvío de agentes SSH y cómo se utiliza?
Generar claves SSH
Puede generar una nueva clave SSH usando el ssh-keygen
utilidad, instalada por defecto en la mayoría de los sistemas Unix.
ssh-keygen
Esto le pedirá una frase de contraseña para cifrar el archivo de clave local. No se utiliza para la autenticación con el servidor, pero debe mantenerse en secreto.
ssh-keygen
guardará su clave privada en ~/.ssh/id_rsa
y además guardará su clave pública en ~/.ssh/id_rsa.pub
. La clave privada permanece en su disco duro, pero la clave pública debe cargarse en el servidor para que el servidor pueda verificar su identidad y verificar que usted tiene permiso para ingresar a ese servidor.
El servidor mantiene una lista de usuarios autorizados, regularmente almacenados en ~/.ssh/authorized_keys
. Puede agregar su archivo de clave manualmente a este archivo, o puede utilizar el ssh-copy-id
utilidad:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
Reemplazar user@host
con su propio nombre de usuario y nombre de host del servidor. Se le pedirá que inicie sesión con su contraseña anterior una vez más, después de lo cual no se le debe volver a solicitar y puede deshabilitar el inicio de sesión con contraseña.
Desactivar el inicio de sesión con contraseña SSH
Ahora que puede ingresar al servidor con sus claves, puede desactivar la autenticación de contraseña por completo. Asegúrese de que la autenticación basada en claves esté funcionando o se le bloqueará el acceso a su servidor.
En el servidor, abre /etc/ssh/sshd_config
en su editor de texto favorito y busque la línea que comienza con:
#PasswordAuthentication
Querrá descomentar esto (quitar el hashtag) y cambiar «sí» a «no»:
PasswordAuthentication no
Entonces, reinicia sshd
con:
systemctl restart sshd
Debería verse obligado a volver a conectarse y, si su archivo de claves es incorrecto, no se le pedirá una contraseña.
Si lo desea, además puede forzar la autenticación basada en claves públicas, que bloqueará todos los demás métodos de autenticación. Agregue las siguientes líneas a /etc/ssh/sshd_config
:
AuthenticationMethods publickey PubkeyAuthentication yes
y reiniciar sshd
.
RELACIONADO: ¿Qué es un archivo PEM y cómo se utiliza?
Bloquear a los atacantes con denyhosts
denyhosts
es una utilidad para evitar repetidos intentos fallidos de inicio de sesión a través de SSH, equivalente a cómo su teléfono lo bloquea después de demasiados intentos. No está instalado de forma predeterminada, por lo que tendrá que instalarlo desde el administrador de paquetes de su distribución. Para sistemas basados en Debian como Ubuntu, eso sería:
sudo apt-get install denyhosts -y
Una vez que esté instalado, habilítelo con:
sudo systemctl enable denyhosts
denyhosts
debería ejecutarse automáticamente ahora, pero querrá incluir su dirección IP en el listado blanca en caso de que se bloquee. Siempre puede volver a intentarlo desde una dirección IP distinto, pero esto le ahorrará algunos problemas.
Abrir /etc/hosts.allow
, y en la parte inferior del archivo agregue:
sshd: your-ip-address
reemplazando your-ip-address
con su dirección IP.
Por defecto, denyhosts
se bloqueará después de un intento fallido para los usuarios raíz y cinco intentos fallidos para otros usuarios. Puede cambiar esta conducta editando /etc/denyhosts.conf
.
Si se ha bloqueado accidentalmente, deberá detenerse denyhosts
y elimine su dirección IP de algunos lugares:
/etc/hosts.deny
/var/lib/denyhosts/hosts
/var/lib/denyhosts/hosts-restricted
/var/lib/denyhosts/hosts-root
/var/lib/denyhosts/hosts-valid
/var/lib/denyhosts/users-hosts
Reiniciar denyhosts
y debería poder conectarse de nuevo.
Lista blanca de acceso SSH
Aún cuando forzar claves SSH con denyhosts
probablemente sea suficiente seguridad, puede incluir direcciones IP específicas en el listado blanca. La mayoría de los proveedores de servidores proporcionarán herramientas para hacer esto desde una interfaz web. Si esa es una alternativa, querrá incluirla en el listado blanca desde allí en lugar de desde el servidor SSH, dado que siempre podrá cambiar la IP de la lista blanca en caso de que se bloquee.
Si no es una alternativa, deberá configurar manualmente /etc/hosts.deny
para bloquear todo el tráfico de hosts no autorizados.
Una nota importante: Si incluyes tu casa en el listado blanca, es factible que tu ISP no te dé una dirección IP estática y tu dirección IP puede cambiar en cualquier momento. Querrá asegurarse de que eso no suceda antes de incluir en el listado negra todas las demás direcciones IP, o agregar varias direcciones como respaldo, o simplemente omitir este paso por completo.
Abrir /etc/hosts.allow
y asegúrese de que su dirección IP esté en el archivo:
sshd: your-ip-address
Si es así, puede continuar y rechazar todas las demás conexiones:
echo 'sshd: ALL' >> /etc/hosts.deny
Reiniciar sshd
y debería ver sus cambios.
Alternativamente, configure un proxy frente a su servidor SSH
Si no desea exponer su servidor SSH a Internet, pero necesita ingresar a él desde varias direcciones IP, puede configurar un proxy frente a él para manejar la conexión. Este podría ser otro servidor en la nube o inclusive una caja que se ejecuta en su casa.
El servidor SSH debe configurarse para aceptar solo conexiones del servidor proxy, y el servidor proxy debe aceptar conexiones desde cualquier lugar. Puede configurar el servidor proxy como desee, pero inclusive un simple conexión netcat trabajará. Tenga en cuenta que este servidor proxy será el único punto de acceso para su servidor SSH, por lo que si el proxy deja de funcionar, quedará bloqueado a menos que tenga una dirección de respaldo.
No permitir inicio de sesión de root
En su lugar, cree un nuevo usuario y otorgue a ese usuario el privilegio de sudo. Efectivamente, esto es lo mismo, pero dispone de una gran diferencia: los atacantes potenciales necesitarán saber el nombre de su cuenta de usuario para comenzar a atacar su servidor, debido a que no será tan simple como root@yourserver
.
Aparte de la seguridad, en general es una buena política de Unix no iniciar sesión como root
todo el tiempo, debido a que root
no crea registros y no solicita el acceso a los recursos protegidos.
Cree un nuevo usuario en su servidor SSH:
adduser myfancyusername
y establezca una contraseña para ese usuario:
passwd myfancyusername
No iniciará sesión con esta contraseña debido a que seguirá usando claves SSH, pero es obligatorio. Idealmente, haga esto distinto de su contraseña de root.
Agregar este usuario a /etc/sudoers
para otorgar permisos de administrador:
echo 'myfancyusername ALL=(ALL) ALL' >> /etc/sudoers
Cambiar a ese usuario con su myfancyusername
y verifique que puede volver al usuario root con sudo su
(que no necesita contraseña de root). Si puede, tiene acceso a sudo.
Ahora querrá bloquear el inicio de sesión de root. En /etc/ssh/sshd_config
, querrás cambiar:
#PermitRootLogin yes
Elimina el hastag y cambia «sí» a «no»:
PermitRootLogin no
Reiniciar sshd
y su servidor debería bloquear todas las solicitudes para iniciar sesión como root
.
Configurar la autenticación de dos factores
Esto es ciertamente exagerado, pero si está paranoico con relación a que alguien se apodere de sus claves SSH privadas, puede configurar su servidor SSH para utilizar 2FA.
La forma más sencilla de hacer esto es utilizar Autenticador de Google con un dispositivo Android o iOS, aún cuando SSH admite muchos métodos de dos factores. Con Google Authenticator, se le dará un código QR que puede escanear desde la aplicación móvil Google Authenticator para vincular su teléfono al servidor, y además se le darán algunos códigos de respaldo para recuperar en caso de que su teléfono se pierda. . No almacene estos códigos en su máquina principal, caso contrario, no se trata de dos factores.