SSH (Secure Socket Shell) es una interfaz de línea de comandos y un protocolo para obtener acceso seguro a un servidor Linux remoto. Proporciona una comunicación segura y encriptada a través de una red y permite el intercambio de datos a través de un canal seguro entre dos servidores. Los administradores de sistemas lo utilizan ampliamente para controlar y administrar sus servidores web de forma remota. Este tutorial le muestra cómo asegurar su servidor SSH.
Nota: si bien el tutorial aquí se realiza en Ubuntu, los pasos se aplicarán a la mayoría de las distribuciones de Linux.
Instalar y actualizar SSH
Primero, actualice su sistema e instale los paquetes necesarios en su sistema.
Para actualizar el sistema e instalar el servidor SSH en las máquinas servidor y cliente, ejecute el siguiente comando:
sudo apt update && sudo apt upgrade sudo apt install ssh
Configurar SSH para inicio de sesión sin contraseña
Hay dos métodos diferentes para iniciar sesión en un servidor SSH: autenticación de contraseña y autenticación de clave pública. La autenticación de contraseña es un método muy básico que es fácil de usar y descifrar. El uso de la autenticación de contraseña es muy inseguro, especialmente si se usa una contraseña débil. Por otro lado, las claves SSH brindan una forma fácil y segura de iniciar sesión en un servidor remoto, y este método se recomienda para todos los usuarios.
En su máquina cliente, genere claves SSH con el siguiente comando:
ssh-keygen
Pulse la tecla Intro en cada indicación. Esto producirá dos archivos: “id_rsa.pub” (clave pública) e “id_rsa” (clave privada).
En su servidor, cree la siguiente carpeta (si no existe):
mkdir -p ~/.ssh/
De regreso a su máquina cliente, copie la clave SSH a su servidor usando el siguiente comando:
ssh-copy-id username@your.server.ip.address
En su máquina servidor, asegúrese de que la carpeta «.ssh» tenga los permisos de archivo correctos.
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
Para probar si el método de autenticación de clave pública funciona, intente conectarse a su servidor SSH desde la máquina cliente:
ssh username@your.server.ip.address
Si puede conectarse sin ingresar una contraseña, entonces funciona el método de autenticación de clave pública.
Nota: si está usando Windows, use las instrucciones aquí para generar claves públicas/privadas SSH.
Archivo de configuración SSH seguro
El archivo “/etc/ssh/sshd_config” es el archivo de configuración de todo el sistema para SSH que le permite configurar diferentes opciones para mejorar la seguridad de un servidor SSH. La configuración predeterminada en el archivo de configuración es muy insegura, por lo que primero debe editarla y establecer las opciones adecuadas para mejorar la seguridad.
Para editar el archivo “/etc/ssh/sshd_config”, ejecute:
sudo nano /etc/ssh/sshd_config
Cambiar el puerto de escucha SSH
De manera predeterminada, SSH escucha en el puerto 22. Los atacantes usan escáneres de puertos para ver si un servicio SSH se está ejecutando o no. Es una buena práctica cambiar el puerto predeterminado.
Para cambiar el puerto predeterminado a 2200, cambie:
Port 22
a
Port 2200
Usar solo el protocolo 2
La versión 1 del protocolo contiene vulnerabilidades de seguridad. El Protocolo 2 es la entrada predeterminada en Ubuntu.
Cambie la línea que se muestra a continuación:
Protocol 2
Limitar el acceso de usuarios
Es necesario permitir que solo usuarios específicos inicien sesión en SSH. Puede mejorar su seguridad. De forma predeterminada, esta opción no está disponible en el archivo de configuración de SSH.
Para permitir «usuario1» y «usuario2», agregue la siguiente línea:
AllowUsers user1 user2
Para denegar «usuario1 incorrecto» y «usuario2 incorrecto», agregue la siguiente línea:
DenyUsers baduser1 baduser2
Deshabilitar inicio de sesión raíz
No es necesario iniciar sesión como root a través de ssh en una red. Los usuarios normales también pueden usar su
o sudo
para obtener acceso a nivel raíz. La mayoría de los atacantes intentarán usar el usuario raíz para iniciar sesión. Es un gran riesgo de seguridad, por lo que es una buena práctica denegar el inicio de sesión raíz.
Para deshabilitar el inicio de sesión raíz, cambie la línea
PermitRootLogin prohibit-password
a
PermitRootLogin no
Ocultar último inicio de sesión
Puede ocultar quién inició sesión por última vez cuando un usuario inicia sesión.
cambiar la línea
PrintLastLog yes
a
PrintLastLog no
Todavía puede ver todas las conexiones SSH activas con los métodos de esta lista.
Restringir la interfaz para iniciar sesión
De forma predeterminada, SSH escuchará en todas las interfaces de red. Si desea permitir una conexión SSH desde una dirección IP específica, puede cambiar la línea:
#ListenAddress ::
a
ListenAddress 192.168.68.175
Deshabilitar autenticación de contraseña
El uso de la autenticación de contraseña es un gran riesgo de seguridad si se utiliza una contraseña débil. El uso de «claves ssh» es una buena práctica. Una «clave ssh» puede contener más de 600 caracteres aleatorios y ser difícil de descifrar.
Para esto, cambia la línea.
# PasswordAuthentication yes
a
PasswordAuthentication no
Deshabilitar archivos .rhosts
Los archivos .rhosts especifican qué usuarios pueden acceder a los comandos r (rsh, rcp, rlogin, etc.) en la máquina local sin contraseña. De forma predeterminada, un archivo .rhosts está deshabilitado; si no, cambie las líneas como se muestra a continuación.
IgnoreRhosts yes RhostsAuthentication no RSAAuthentication yes
Deshabilitar la autenticación basada en host
La autenticación basada en host de SSH es más segura que la autenticación .rhosts. Sin embargo, no se recomienda que los anfitriones confíen entre sí. Por defecto, esta opción está deshabilitada.
Si no, cambie la línea como se muestra a continuación:
HostbasedAuthentication no
Establecer un tiempo de espera de gracia de inicio de sesión
El «LoginGraceTime» especifica cuánto tiempo después de una solicitud de conexión esperará el servidor antes de desconectarse. Es una buena práctica reducirlo a 60 segundos.
Para esto, cambia la línea.
LoginGraceTime 2m
a
LoginGraceTime 1m
Establecer conexiones máximas de inicio
Configurar un número máximo adecuado de conexiones simultáneas al demonio SSH puede ser útil contra un ataque de fuerza bruta.
Para esto, cambia la línea.
#MaxStartups 10:30:100
a
MaxStartups 2
Desactivar reenvío
Los atacantes utilizan la técnica de reenvío de puertos para tunelizar las conexiones de red a través de una sesión SSH para iniciar sesión en los sistemas. Por eso, es una buena práctica deshabilitar esta opción.
Para esto, cambia la línea.
X11Forwarding yes
a
X11Forwarding no
Iniciar sesión Más información
De forma predeterminada, SSH registra todo. Si desea registrar más información, como intentos fallidos de inicio de sesión. cambie el valor de esto a «VERBOSE».
Para esto, cambia la línea.
LogLevel INFO
a
LogLevel VERBOSE
Deshabilitar contraseñas vacías
Es necesario denegar usuarios con contraseñas vacías en su servidor. Por defecto, PermitEmptyPasswords
está deshabilitado en Ubuntu.
Si no, cambie la línea como se muestra a continuación.
PermitEmptyPasswords no
Establecer intervalo de tiempo de espera inactivo
De forma predeterminada, esta opción no está disponible en el archivo de configuración de SSH predeterminado, por lo que es una buena práctica establecer un tiempo de espera de inactividad adecuado para evitar una sesión desatendida.
Para ello, agregue las siguientes líneas.
ClientAliveInterval 300 ClientAliveCountMax 0
Modo estricto
Esto evitará el uso de directorios de inicio inseguros y permisos de archivos clave. Por defecto, esta opción está habilitada.
Si no, cambie la siguiente línea:
StrictModes yes
Guarde y salga del archivo «/etc/ssh/sshd_config» y reinicie el servidor SSH.
sudo systemctl restart ssh
SSH seguro mediante envoltorios TCP
Un contenedor TCP proporciona control de acceso basado en host a los servicios de red utilizados para filtrar el acceso de red a Internet. Edite su archivo «/etc/hosts.allow» para permitir SSH solo desde «192.168.68.1» y «192.168.68.175».
sudo nano /etc/hosts.allow
Agregue la siguiente línea:
sshd : 192.168.68.1 192.168.68.175
SSH seguro usando iptables
De forma predeterminada, un servidor SSH solo debe aceptar conexiones desde su LAN u otros sitios remotos. Es una buena práctica permitir que solo direcciones IP específicas accedan a SSH y bloquear el acceso a SSH a direcciones IP no autorizadas.
Para permitir solo conexiones SSH desde «192.168.68.1», establezca las reglas en iptables:
sudo iptables -A INPUT -p tcp -m state --state NEW --source 192.168.68.1 --dport 2200 -j ACCEPT
Deshabilite las conexiones SSH de todos los demás hosts ejecutando el siguiente comando:
sudo iptables -A INPUT -p tcp --dport 2200 -j DROP
Personalice las conexiones SSH en la máquina local
En su máquina local (la máquina que usó para conectarse al servidor remoto), agregue un archivo de configuración para simplificar la opción de línea de comando.
- Cree un archivo de «config» (no se requiere extensión de archivo) en su carpeta «/home/user/.ssh».
- Abra el archivo y agregue las siguientes líneas:
Host sshserver HostName remote.server.ip.address.com Port 2200 User foobar IdentityFile ~/.ssh/remote.server.key
Cambie los detalles de la configuración de su propio servidor remoto.
- Guarde y salga del editor de texto. Para conectarse a su servidor remoto, escriba el siguiente comando:
ssh sshserver
Además de proteger su servidor SSH, también debe utilizar estas herramientas para proteger otras partes de su servidor.
Preguntas frecuentes
La dirección IP de mi máquina local cambió. ¿Todavía es posible acceder a mi servidor a través de SSH?
Si ha habilitado el filtrado de IP, no podrá acceder a su servidor una vez que cambie su dirección IP.
Lo que puede hacer para mitigar este problema es configurar su servidor remoto para aceptar un rango en lugar de una dirección específica. Simplemente configure su firewall para aceptar un rango de IP para conexiones SSH: sudo iptables -A INPUT -p tcp -m state --state NEW --source 192.168.1.0/24 --dport 2200 -j ACCEPT
.
Mi servidor está filtrando a través del archivo de hosts. ¿Es mejor usar también iptables para proteger mi sistema?
En su mayor parte, solo necesita configurar un único filtro para su servidor SSH. El uso de múltiples filtros de IP hará que le resulte difícil solucionar cualquier problema que pueda surgir durante la producción.
Asegúrese de que tanto su firewall como su filtro IP funcionen de la mano para proteger las interfaces de red de su servidor. Por ejemplo, es una buena práctica bloquear cualquier puerto no utilizado a través de su firewall y solo filtrar las conexiones a través de su archivo “/etc/hosts”.
Perdí la clave privada de mi máquina local. ¿Todavía es posible iniciar sesión en mi servidor a través de SSH?
No, no podrá acceder a su servidor si perdió la clave privada. La mejor manera de lidiar con este problema es acceder al servidor físico o a través de una consola raíz de VPS. Vuelva a habilitar la autenticación de contraseña configurando el PasswordAuthentication
variable a «sí», luego reinicie su demonio ssh ejecutando el comando sudo systemctl restart ssh
.
Credito de imagen: Unsplash. Todas las alteraciones y capturas de pantalla por Ramces Red.
Danos tu opinión