SSH usando Public Keys
Introduccion
En nuestro rubro, cuando se nos pide configurar o revisar la configuracion de algun servidor y/o equipo de red, hemos escuchado las siguientes frases:
- Remoteate al servidor
- Usa PuTTy para entrar por SSH
Entre otros. Como puedes ver, ingresar a un servidor remotamente es el pan de cada dia de nosotros los guerreros de la red. Sin embargo, hay ocasiones en las cuales se requiere tener una doble capa de seguridad al momento de acceder remotamente al equipo debido a que puede existir algún tipo creyéndose un hacker de hollywood tratando de entrar por fuerza bruta a la red.
Para solventar esto, en este artículo te enseñaré a usar SSH con llaves públicas, de modo que, solo mediante el uso de la llave se podrá entrar, es decir, no será necesario usar el password de usuario.
La teoría de llaves públicas y privadas es un poco extensa, si desean que hable sobre ello en alguna próxima publicación, por favor deja tus comentarios en la zona de comentarios.
Dicho esto, listaremos los útiles escolares...perdón, los materiales utilizados en este artículo:
- VMWare o VirtualBox
- CentOS 7
- Cygwin
Generalmente hago mis labs en Linux, pero en esta ocasión especial lo hare en Windows debido a que hay más usuarios de Windows pululando por la red y porque tengo dual boot en mi laptop :P
Recopilando Información
Comenzamos comprobando la IP de nuestro servidor, iniciar el servicio SSHD y comprobar de que efectivamente, SSHD se encuentra en ejecución:

Luego, veremos si es posible llegar desde nuestro ordenador:

Hasta aquí vemos que SSH es una buena opción para poder ingresar a nuestro servidor externo, trabaja con encriptación y tal. Se podria decir que usar SSH es como colocar en nuestra puerta un candado y solo nosotros poseemos la llave, pero como podrás imaginar, si alguien roba esa llave, enfrentariamos un grave problema de seguridad.
Para esto se usará una llave pública y una privada. Para hacer una analogía, podríamos decir que la llave pública y la llave privada son dos piezas que forman un cerrojo y una tercera llave (llamada passphrase) será la que se usará para abrir dicho cerrojo.
En resumen, sin una de las mitades (llave pública/privada) o la tercera llave (passphrase), nunca se podrá abrir la cerradura...es como tratar de invocar a Sheng Long sin tener las 7 esferas del dragón!
Como te darás cuenta, esto implica una capa extra de seguridad. Veremos cómo implementarlo a continuación
Generando las llaves pública y privada
Comenzamos creando las llaves pública y privada en nuestro equipo:

Pasemos a descifrar los jeroglíficos que nos muestra la terminal:
- pwd: muestra el directorio actual (lo que se conoce como absolute path)
- ssh-keygen -t rsa: programa para la creacion de las llaves publica/privada. Notar que ssh-keygen tiene más opciones que por motivos de espacio no abordaremos en este artículo, pero si quieren un desarrollo de todas las opciones, deja tu comentario en la sección de comentarios.
- Enter file in which to save the key: en este paso el programa nos pedirá el archivo en el cual se guardará la llave. Entre paréntesis se muestra el último directorio donde fue creado la llave. En mi caso, le estoy asignando mi directorio personal y usando un nombre de archivo id_rsa
- No es necesario crear el archivo previamente, si no se encuentra, el programa lo creará automáticamente.
- Enter passphrase: para agregar la capa extra de seguridad, ingresamos un passphrase (contraseña) para asegurar las llaves. Se cuidadoso pues no se muestra ningún caracter al momento de escribirlo
Finalmente, las llaves son creadas y se guardan en el directorio seleccionado.
Veamos como quedó; ingresamos ls -a y cat para listar y leer los archivos respectivamente:

Solo hay letras, números y símbolos sin sentido, es pura basura! Si alguien intenta pasar un sniffer, solo verá basura y más basura en la red.
Esto es la genialidad de la encriptación. Por supuesto que podríamos hacerlo más seguro aplicando otras técnicas de criptografía, pero eso será para una próxima aventura :P
Luego, copiaremos la llave pública en nuestro servidor. Puedes usar el metodo que mas te guste. En nuestro caso, como es un entorno de laboratorio bastará con usar a nuestros buenos e inseparables amigos Ctrl+C y Ctrl+V. El archivo destino sera /root/.ssh/authorized_keys

NOTA: En caso de no tener el directorio .ssh, podemos crearlo y también el archivo authorized_keys dentro de él usando los comandos:
- mkdir .ssh
- cd .sss
- touch authorized_keys

Configurando daemon SSH
Nótese que el archivo authorized_keys lo estoy guardando en /root/.ssh La razón de esto es que tendremos que configurar el archivo sshd_config para decirle al daemon SSH que usaremos autenticación por llave pública y no autenticación normal (user y password).
Para configurar el archivo puedes usar el editor de texto de tu preferencia: vim, nano, emacs, etc. En mi caso usare vi (es lo primero que aprendí cuando comencé a usar Linux :))

Buscamos las líneas que hablan sobre autenticación y las re-configuramos:

No olvides de reiniciar el servicio SSH luego de esto, para el caso de CentOS 7 es:
- systemctl stop sshd.service
- systemctl start sshd.service
NOTA: En el caso de CentOS 7 se encuentra en /etc/ssh/sshd_config Sin embargo, la localización del archivo puede variar para distintas distribuciones de linux, en caso de no tener problemas, por favor referirse a la documentación de la distro usada. Si eres perezoso para buscar, también puedes escribirnos o dejar un comentario, asi nos ayudas a aprender mucho mas :D
Prueba de fuego
Bien, una vez terminada la configuración, es momento de probar nuestras llaves.
Primera prueba: SSH al servidor usando user y password debe fallar.
Usaremos el comando ssh root@192.168.108.128

Vamos bien! Esto demuestra que se elimino la linea PasswordAuthentication en el archivo sshd_config
Segunda prueba: usar las llaves para logearse con SSH.
Usaremos el comando ssh -i id_rsa root@192.168.108.128
…redoble de tambores por favor…

Eureka!! Login exitoso, una capa más de seguridad añadida a nuestro servidor :)
Alguien tiene una cerveza para celebrar? :D