Configuración de seguridad básica en SSH

Recuerdo en el pasado cuando me conectaba a un servidor vía Telnet y subía archivos a través de FTP. Todo ello sin encriptar claro. Eso de la seguridad no era un problema en aquellos días.

Si sigues conectándote a tu servidor sin un mínimo de seguridad es que te van las emociones fuertes. Hoy en día hay alternativas mucho más seguras y fáciles de usar que harán, al menos, un poco más difícil que alguien se cuele en tu servidor.

En este artículo voy a hablar de una configuración mínima de seguridad con SSH. Dado que yo tengo experiencia unicamente con servidores Linux (la mayoría de ellos Ubuntu y Plesk) todo el resto del artículo se aplicará a este tipo de servidores.

Consejos básicos

En mi opinión estas son las reglas básicas que debes seguir para hacer las conexiones vía SSH a tu servidor más seguras:

  • Crea, por lo menos, un usuario con acceso sudo.
  • Bloquea el acceso al usuario root.
  • Obliga a los usuarios a usar una llave ssh (ssh key) en lugar de meter su clave cada vez (más seguro y más cómodo).
  • Cambia el puerto SSH por defecto (esto es casi un des-consejo, yo ya casi no lo hago).

Crea un usuario con acceso sudo

Como bien sabrás, el usuario root puede hacer y deshacer lo que quiera en un sistema. El resto de usuarios solo pueden acceder a lo que les permita este super-usuario.

Sin embargo, existe un grupo especial, el de los sudoers que son usuarios que pueden ejecutar comandos como si fuesen el usuario root. Para ejecutar un comando como root deben poner sudo delante del comando. Por ejemplo:

$ sudo vi /etc/ssh/sshd_config # Esto solo puede hacerlo un sudoer

Podemos usar alguno de los usuarios que tenemos en el sistema o podemos crear un usuario específicamente para esto.

Crear un nuevo usuario

Los siguientes comando hay que ejecutarlos con el usuario root:

$ useradd gorka

Establecemos una clave para el nuevo usuario:

passwd gorka

Y lo añadimos al grupo sudo:

usermod -aG sudo gorka

Otra forma de dar acceso sudo a un usuario (opcional)

En algunos sistemas (como en Plesk) no existe el grupo sudo. En estos casos para dar acceso sudo a un usuario podemos editar el fichero /etc/sudoers usando:

$ visudo

NOTA: Es evidente que para poder editar este fichero tenemos que usar al usuario root.

NOTA 2: visudo usa el editor vi. Para poder editar el fichero pulsa la tecla 'i'. Cuando termines la edición y quieras guardar y salir pulsa la tecla 'ESC' y luego :wq (write+quit). Si quieres salir pero no guardar los cambios que has hecho pulsa 'ESC' y teclea q! (salir sin guardar).

Busca la línea que dice:

root ALL=(ALL) ALL

y debajo añade una nueva línea. En mi caso yo añadiría esto:

gorka ALL=(ALL) ALL

Reiniciar el servicio ssh

A partir de ahora el usuario gorka ya puede trabajar como si fuera root. Eso sí, cada vez que ejecute un comando sudo tendrá que meter su clave (bueno, no cada vez no, porque nos permite ejecutar varios comandos seguidos sin tener que repetir la clave siempre).

Por ejemplo, al ejecutar:

$ sudo vi /etc/ssh/sshd_config
[sudo] password for gorka:

Nos pedirá su clave de usuario (no la clave root).

Bloquea el acceso al usuario root

Es muy cómodo trabajar con el usuario root; no hay que andar metiendo la clave como con un usuario sudoer y podemos movernos libremente por todo el sistema.

El problema es que si alguien, de alguna manera, se hace con nuestra clave de administrador también podrá hacer lo que quiera.

Para añadir una capa extra de seguridad podemos bloquear el acceso al usuario root. Si alguien se hace con su clave no podrá usarla porque no tendrá permitido el acceso al servidor. De esta forma, si se quieren colar en nuestro servidor necesitarán la clave de administrador Y el nombre de usuario y la clave de un usuario con acceso sudo. Nunca está de más complicar la vida a los posibles atacantes.

Así que, lo más adecuado es trabajar siempre con un usuario normal que pueda luego ejecutar comandos a través de sudo.

Cuando tengamos un usuario que pueda trabajar como super-administrador ya podemos bloquear el acceso al root.

Editaremos el fichero /etc/ssh/sshd_config:

$ sudo nano /etc/ssh/sshd_config

NOTA: En lugar del editor nano puede usar el que prefieras, como vi. Yo uso nano porque estoy muy acostumbrado a él.

Busca la línea que dice:

PermitRootLogin yes

y cámbialo a:

PermitRootLogin no

Por último reinicia el servicio ssh para aplicar los cambios:

$ sudo service sshd restart

A partir de ahora ya no podremos entrar en el servidor con ssh usando el usuario root.

¡No la cagues!

Antes de deshabilitar el usuario root asegúrate de que puedes entrar con otro usuario que tiene acceso a sudo. Si no permites el acceso a root y ningún usuario puede ejecutar comandos como super-usuario ya no podrás modificar nada en el sistema.

Si metes la pata que llamar llorando y suplicando al servicio técnico de tu servidor para pedirles que te activen el root. Tranquilo, te ayudarán, pero prepárate a pagar.

NOTA: Hay sistemas, como Plesk, que pueden resolverte la papeleta, pero es mejor andar con cuidado.

Obliga a los usuarios a usar una llave ssh (ssh-key)

Otra forma de hacer más seguro el acceso ssh es obligando a los usuarios a usar ssh keys (llaves ssh) y no permitir entrar en el sistema con contraseña.

En este otro artículo explico cómo conectarse con ssh sin introducir la clave cada vez - instalación de una llave.

Una vez generada y copiada la llave ssh en el servidor podemos configurarlo para que no se pueda acceder a él usando contraseña.

Primero edita el fichero sshd_config:

$ sudo nano /etc/ssh/sshd_config

Busca la línea que dice:

PasswordAuthentication yes

O puede que esté así (con el símbolo # que indica que esta línea está comentada y no se procesa):

# PasswordAuthentication no

Y cámbiala por:

PasswordAuthentication no

Por último reinicia el servicio ssh:

$ sudo service sshd restart

De nuevo ¡no la cagues!

Antes de deshabilitar el acceso a ssh con contraseña asegúrate de que funcionan las ssh-keys. Si no funciona correctamente ya sabes... no podrás acceder al servidor.

Cambia el puerto SSH por defecto

Hay un último “truquillo” que solía usar antes que consistía en cambiar el puerto con el que nos conectamos a ssh. Por defecto, este puerto es el 22 pero podemos cambiarlo por el que queramos.

La idea era simple. Cuando un posible atacante busca puertos abiertos espera que el ssh esté en el puerto 22. Si lo cambiamos tendrá que adivinar cuál de los puertos disponibles es el de ssh. O puede que piense que tenemos cerrado el acceso ssh.

Pero en la práctica esto nos complica más la vida a nosotros que a un posible atacante. Puede que olvidemos cuál era el puerto que usábamos. Si tenemos algún colaborador externo le estamos complicando la vida. Si hay alguna aplicación o sistema automático que accede vía ssh tenemos que cambiar la configuración del puerto por defecto.

A un posible atacante no le cuesta mucho tiempo saber si el puerto es ssh. Así que esta es una opción que ya solo uso en máquinas locales.

Autor:
Nivel: Principiante
Palabras clave:
Fecha publicado:
Fecha actualizado: 02-09-2016

Otros capítulos de la misma serie

Este capítulo es parte de la serie: Configuración de un servidor.

Y muchos más en preparación.

Disponible en los planes: Laravel hero PHP a tope