Conexiones seguras con SSH

SSH, (Secure Shell), es un protocolo de administración remota por el cual los usuarios pueden controlar sus equipos a través de Internet.

Se creó para sustituir a Telnet, un protocolo no cifrado que no ofrecía ningún tipo de seguridad a los usuarios. En cambio, SSH hace uso de las técnicas de criptografía más innovadoras con el claro objetivo de que todas las comunicaciones realizadas entre los usuarios y los servidores remotos sean seguras. Dispone de una herramienta que permite autenticar al usuario remoto para posteriormente transferir las entradas desde el cliente al host y, finalmente, realizar la salida de vuelta a los usuarios.

Instalación del servidor y del cliente

Generalmente SSH suele venir preinstalado en tu distribución Linux, pero si no es así, procede a la instalación de los paquetes correspondientes, que son el servidor (openssh-server) y el cliente (openssh-client).

sudo apt-get install openssh-server openssh-client -y

El paquete openssh-server proporciona el demonio sshd y sftp-server que permite a los clientes ssh y scp establecer conexiones seguras, y a los clientes sftp transferir archivos, también de forma segura.

El paquete openssh-client proporciona los clientes de ssh, scp y sftp, los programas ssh-agent y ssh-add para hacer más cómoda la identificación de clave pública, y las utilidades ssh-keygen, ssh-keyscan, ssh-copy-id y ssh-argv0.

Test SSH

Comprueba que el servidor SSH está habilitado y activo con la siguiente orden:

sudo systemctl status sshd

En la siguiente imagen, resaltado en color verde vemos que es así.

Hay otros comandos como son:

sudo systemctl enable sshd = Habilita el servicio
sudo systemctl disable sshd = Deshabilita el servicio
sudo systemctl start sshd = Inicia el servicio
sudo systemctl stop sshd = Para el servicio
sudo systemctl restart sshd = reinicia el servicio
sudo systemctl reload sshd = recarga el servicio

Nota: La diferencia entre restart y reload es que, en el primer caso, el servicio se detiene y se vuelve a iniciar y en el segundo caso, sigue ejecutándose y vuelve a leer los archivos de configuración.

Archivos de configuración:

SSH dispone de varios archivos de configuración, que son los siguientes:

/etc/ssh/sshd_config: Archivo principal de configuración del servidor SSH.

/etc/ssh/ssh_config: Archivo principal de configuración de los clientes SSH.

~/.ssh/config: Archivo personal de cada usuario. Contiene la configuración utilizada por los clientes SSH. Permite al usuario local utilizar una configuración distinta a la definida en el archivo /etc/ssh/ssh_config.

~/.ssh/known_hosts: Archivo personal de cada usuario. Contiene las firmas digitales de los servidores SSH a los que se conectan los clientes. Cuando éstas firmas cambian, se pueden actualizar ejecutando el comando ssh-keygen -R, pasando el nombre del anfitrión o la IP del anfitrión como argumento. Este comando elimina la entrada correspondiente en el archivo ~/.ssh/known_hosts y, permite añadir de nuevo al anfitrión con una nueva firma digital. La sintaxis genérica sería:

ssh-keygen -R nombre_o_ip_del_servidor_SSH

~/.ssh/authorized_keys: Archivo personal para cada usuario. Contiene los certificados de los clientes SSH, para permitir autenticación hacia servidores SSH sin requerir contraseña.

Configurar SSH

Tras la instalación procederemos a la configuración del servidor, para ello, editaremos el fichero de configuración /etc/ssh/sshd_config.

NOTA: es importante hacer copia de seguridad del archivo /etc/ssh/sshd_config antes de realizar cualquier cambio.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

Abrimos el archivo de confirmación con nano

sudo nano /etc/ssh/sshd_config

Una forma de elevar la seguridad del servidor SSH, consiste en cambiar el número de puerto predeterminado por otro que sólo el administrador del sistema conozca. Aunque cambiar de puerto disminuye considerablemente la posibilidad de una intrusión, en internet hay cientos de robots escaneando IPs y sus respectivos puertos abiertos, con lo que al final acabas siendo encontrado.

Port – De forma predeterminada, el servicio SSH escucha por el puerto 22. Los atacantes buscarán servidores que estén escuchando dicho puerto.Sustituye el 22 a otro puerto, preferiblemente entre el 1024 y 65535.

Veamos algunas otras opciones interesantes a tener en cuenta a la hora de configurar el servidor:

AddressFamily -Especifica qué familia de direcciones debe utilizar sshd. Los argumentos válidos son any (por defecto), inet (sólo IPv4), o inet6 (sólo IPv6).

ListenAddress – De forma predeterminada, el servicio SSH escuchará peticiones a través de todas las direcciones IP correspondientes a todas las interfaces de red del sistema. La directriz por defecto sería: ListenAddress 0.0.0.0. Si queremos que el servidor solo escuche por la interfaz de red con IP 192.168.1.30, a la cual sólo se puede acceder desde la red local:

ListenAddress 192.168.1.30

LoginGraceTime – Establece el tiempo, en segundos, durante el cual la pantalla de login estará disponible para que el usuario introduzca su nombre de usuario y contraseña, si no lo hace durante ese período de tiempo el login se cerrará, evitando así dejar por tiempo indeterminado pantallas de login sin que nadie las use, o que alguien este intentando mediante un script adivinar un usuario y su contraseña. Si el valor es 0, no hay límite de tiempo para que un usuario se autentique, lo cual no es recomendable ya que de esta forma un atacante podría utilizar ataques de fuerza bruta o usando métodos de diccionario para adivinar la contraseña, por lo tanto no es recomendable dejar esta directriz a 0. Lo podemos dejar en 10 segundos.

LoginGraceTime 10

PermitRootLogin – Probablemente sea la directriz de seguridad más importante que podemos establecer para asegurar nuestro servidor SSH. En los sistemas Unix y Linux se crea por defecto al usuario root, lo que implica que ya conocemos la existencia de al menos un usuario, ¡y que usuario!, con privilegios de adnimistrador. Muchos ataques de fuerza bruta se concentran en atacar al usuario root con la esperanza de que tenga una contraseña débil.
Sabiendo una parte de la ecuación (root) solo será cuestión de tiempo para que alguien con paciencia y suerte vulnere el sistema. En esta directriz denegamos el acceso al usuario root y por lo tanto, cualquier intento de ataque directo al usuario root será inútil.
Al denegar el acceso al usuario root, cada vez que necesitemos realizar tareas administrativas, accederemos como un usuario normal y una vez dentro, utilizando alguno de los comandos su o sudo podremos realizar dichas tareas administrativas. Por lo tanto, denegando el acceso al usuario root, el atacante tendrá que acertar tanto el nombre de un usuario del sistema como su contraseña, algo que disminuye notablemente la probabilidad de una intrusión.

StrictModes – En esta directriz se establece que sshd revisara los modos y permisos de los archivos de los usuarios y el directorio $HOME de el usuario antes de aceptar la sesión. Esto es normalmente deseable porque a veces algunos usuarios dejan sus directorios, accidentalmente, con permiso de escritura para cualquiera. El valor predeterminado es yes, por lo tanto, lo dejaremos con su valor predeterminado.

StrictModes yes

MaxAuthTries – El valor de esta directriz establece el máximo número de intentos de autenticación permitidos por conexión, es decir, la cantidad de veces que podemos equivocarnos al ingresar el usuario y/o contraseña. Una vez que los intentos alcanzan la mitad de este valor, las conexiones fallidas siguientes serán registradas. Después del máximo número de intentos se cerrará la conexión. Es posible volver a intentarlo, pero el límite de intentos por vez evita ataques basados en la persistencia de la conexión.

MaxAuthTries 5

MaxSessions – Especifica el número máximo de sesiones abiertas de shell, inicio de sesión o subsistema (por ejemplo, sftp) permitidas por conexión de red. Los clientes que soportan la multiplexación de conexiones pueden establecer múltiples sesiones. Si se establece MaxSessions a 1, se desactivará la multiplexación de sesiones, mientras que si se establece a 0, se evitarán todas las sesiones de shell, login y subsistema, a la vez que se permite el for- warding. El valor predeterminado es 10.

MaxSessions 10

Con todo esto que hemos aprendido ya puedes entrar a tu sistema remoto de la siguiente forma:

ssh -p 22343 tu_usuario@host_o_IP

Si te interesa saber mas de como proteger tu servidor, puedes ver «Instalar Fail2ban en Debian 12 y que funcione«

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio