Configurar claves para SSH en Linux
Secure Shell -también conocido como SSH o intérprete de órdenes seguro- es un protocolo criptográfico de red que permite a los usuarios conectarse y realizar acciones en equipos remotos, de una forma segura, a través de una red insegura, garantizando la confidencialidad e integridad de las comunicaciones.
SSH con contraseña vs claves SSH
Uso de contraseña
Para conectarnos a un servidor usando el protocolo de Shell Segura tenemos dos opciones. La primera consiste en especificar un usuario y contraseña seguido del nombre o IP del host remoto:
ssh usuario@servidor
En este caso se nos pedirá la contraseña del usuario cada vez que establezcamos una conexión con él. Esto tiene dos desventajas fundamentales. La primera es que siempre tendremos que escribir (y por tanto recordar) la contraseña.
La segunda, más relevante, es que nos obliga a enviar la contraseña del usuario a través de un medio que podría no ser seguro. Además, dicha contraseña podría ser adivinada mediante un ataque de fuerza bruta.
Uso de claves criptográficas
La segunda opción es la de utilizar las denominadas claves SSH, que nos permiten una forma mucho más segura de inicio de sesión remota. Las claves criptográficas son practicamente imposibles de descifrar mediante ataques de fuerza bruta.
Si generamos un conjunto de claves SSH (pública y privada) podemos colocar la clave pública en cualquier servidor e iniciar sesión en él directamente desde cualquier cliente que ya tenga la clave privada en su poder.
Cuando se produce el intercambio de comunicación entre ambos equipos -el servidor al que nos conectamos con su clave pública y el cliente con su clave privada- el sistema se desbloquea sin necesidad de contraseña y tampoco de usuario. La clave privada será la que nos autentique en el servidor remoto. Mejor aún, porque también podemos proteger la clave criptográfica con una clave, para conseguir una robusta seguridad en SSH.
Relacionado – Auditar conexiones SSH con SSHAudit
Generar claves SSH en Linux
El proceso para generar el conjunto de claves pública / privada en Linux es similar en la mayoría de distribuciones. Primero, deberemos saber que las claves públicas y privadas se almacenan normalmente en el directorio:
/home/<usuario>/.ssh
Dentro de este directorio oculto podremos ver claves que, en caso de existir, tendrán el nombre de id_rsa (privada) e id_rsa.pub para la clave pública.
Como su nombre indica, la clave privada es «privada» y por tanto deberá permanecer almacenada de forma segura. La clave pública será la que podremos compartir libremente con cualquier host.
Vamos a generar nuestra clave SSH de la siguiente forma:
ssh-keygen
Se nos pedirá confirmar un nombre (usaremos el predefinido en este caso) y se nos preguntará si queremos establecer una passphrase o contraseña.
Cuando terminemos ya tendremos nuestro par de claves Secure Shell generado, se usará por defecto el algoritmo RSA con longitud 2048, al menos en el sistema Fedora que estoy utilizando, pero también podemos especificar el tipo de clave usando este formato:
ssh-keygen -t <tipo>
Las claves generadas tendrán el siguiente aspecto:
Instalar la clave SSH pública en en servidor
Ahora es momento de pasar nuestra clave pública al host remoto con el siguiente comando:
ssh-copy-id <usuario@servidor>
O bien:
ssh-copy-id <servidor>
El comando anterior nos muestra la ruta origen desde donde se instalará la clave pública. Obviamente, deberemos confirmar con la contraseña que somos quien decimos ser.
Inicio de sesión SSH
La salida del comando nos informa del copiado de nuestra clave, además de sugerirnos iniciar sesión ahora de la siguiente forma:
ssh usuario@servidor
En el caso de que hayamos generado una clave privada con contraseña, se nos pedirá como en la siguiente imagen:
En caso de haber generado una clave sin establecer contraseña, el inicio de sesión será inmediato:
Aprende más – Como configurar FTPS y SFTP en Ubuntu
Conclusiones
Hemos visto los pasos y lo sencillo que es generar una pareja de claves para acceder por SSH de forma sencilla y segura. Ahora bien, ten en cuenta que a pesar de la comodidad que supone no usar una contraseña para la clave privada, en el caso de que esta caiga eventualmente en manos ajenas, no contarás con ese mecanismo de seguridad que podría darte un tiempo precioso.
Categories
deweloper View All
Trabajo como consultor de ciberseguridad y me gusta lo que hago. Aficionado a la informática / tecnología en general, me gusta compartir con la gente lo poco que sé. También soy aficionado al deporte y los videojuegos.
Hola, muy bueno el post. Solo agregar que cuando escribis «nos obliga a enviar la contraseña del usuario a través de un medio que podría no ser seguro» no es cierto ya que el intercambio de claves se reliaza mediante un canal seguro utilizando el protocolo diffie-hellman.. saludos..!
Hola Andrés, me alegro de que te haya gustado. Sobre lo que dices no te falta razón: hay un mecanismo de cifrado (en este caso DH) encargado de garantizar la confidencialidad e integridad. En tal afirmacion introduje el matiz «podría» refiriéndome a que en el futuro podría darse alguna vulnerabilidad en dicho estandar. Utilizando el par de claves se mitigaría el problema, aunque por supuesto el uso de claves entraña otros retos como la necesidad de rotación de claves para evitar ataques. Pero más preocupante que lo anterior es la tendencia que existe desde hace años a atacar mediante fuerza bruta las credenciales de shell segura, como explican muy bien en este artículo de Sucuri: https://blog.sucuri.net/2013/07/ssh-brute-force-the-10-year-old-attack-that-still-persists.html
Saludos y gracias por venir y sobre todo por aportar tus conocimientos.