nibbles: Y las llaves apá!

Key Management
"Is the provisions made in a cryptography system design that are related to generation, exchange, storage, safeguarding, use, vetting, and replacement of keys. It includes cryptographic protocol design, key servers, user procedures, and other relevant protocols.
Successful key management is critical to the security of a cryptosystem. In practice it is arguably the most difficult aspect of cryptography because it involves system policy, user training, organizational and departmental interactions, and coordination between all of these elements."
-- from wikipedia [search: key management]

Overview
Recuerdo cuando me dieron mi primer par de llaves de la casa, hicieron un pequeño collar de tela y en el pusieron dos llaves: entrada principal y puerta. Era bastante cómodo no preocuparse por saber donde estaban las llaves, simplemente me remitía al cuello y listo! (ábrete sésamo)
Sin embargo, no todo es así de simple actualmente; ahora tenemos llaves para el auto, para el patio, para la entrada, para el trabajo y si nos vamos al plano virtual: contraseñas. Si, esas "palabras" que nos sirven para "abrir" coloquialmente nuestros archivos y servicios; tenemos llaves para todo y eso, le agrega ciertamente un toque de caos a nuestra "organizada" vida, no se diga cuando se tienen mas de 10 servicios entonces se torna más complicado administrarnos.

Para quienes hacemos uso de servidores UNIX, SSH es el servicio que nos permite administrarlos de manera remota, si bien es necesario seguir haciendo uso de contraseñas para ingresar, nos ofrece la posibilidad de hacer uso de un esquema de autenticación mediante "llaves", como una analogía de la vida: si nosotros tenemos llaves para entrar a nuestra casa, la lógico es que tengamos llaves para ingresar a los servidores que administramos, aún se trate de 1, de 10 o más equipos sin proporcionar una sola contraseña, este esquema se le conoce como: Autenticación por Llave Pública (Public Key Authentication System), in~short: Teoría de Protocolos fue una de mis materias favoritas.
Este algoritmo de autenticación se basa en el uso de un par de llaves criptográficas conocidas como llave pública (Public Key) y llave privada (Private Key), la ventaja de usar un sistema de autenticación basado en llaves es la posibilidad de establecer sesiones seguras con diversas entidades sin hacer uso de una contraseña por cada sesión establecida.
Es importante resaltar que mientras que este tipo de sistemas es relativamente seguro, los riesgos de seguridad son posibles derivados en su mayor parte por descuido del usuario.

Generando nuestro par de llaves OpenSSH
Para la creación del par de llaves se requiere del comando ssh-keygen, de las opciones que nos interesan es la longitud de la llave, el tipo de algoritmo para generarla así como un comentario que nos será útil para una identificación posterior. Listo a continuación las opciones que vamos a usar:
Option Description
-v Verbose mode
Causes ssh-keygen to print debugging messages about its
progress. This is helpful for debugging moduli generation.
-b bits Number of bits in the key to create
Specifies the number of bits in the key to create. For RSA keys,
the minimum size is 768 bits and the default is 2048 bits.
Generally, 2048 bits is considered sufficient.
-t typeSpecify type of key to create
Specifies the type of key to create. The possible values are
"rsa1" for protocol version 1 and "dsa", "ecdsa" or "rsa" for
protocol version 2
-C commentProvide new comment

Para poder darle sentido a esta nota técnica, vamos a plantear el siguiente problema:
"Andrés necesita que uno de sus procesos ejecute un reporte y transfiera los archivos de forma automática hacia otro servidor, donde otro proceso los retomará para la generación de un concentrado. Se necesita generar de un par de llaves para que el proceso de reportes copie los archivos generados del servidor 10.103.22.55 al servidor 192.168.1.77..."

Luego entonces vamos a proceder con los siguientes pasos:
  1. Generar un par de llaves
  2. Validar nuestra par de llaves
  3. Instalar nuestro par público en el servidor remoto
Y en el camino haremos unas observaciones que seguramente les serán de utilidad:
  • Validar permisos de usuario a nivel archivo y directorio
  • Asignarle una contraseña a nuestra llave privada
  • Agregar nuestra llave al llavero de nuestra sesión de usuario
  • Configurar nuestro cliente de manera explicita, cuando tenemos más de dos llaves
1
Generar un par de llaves
- Esto lo realizaremos en el servidor 192.168.1.77 (por pura conveniencia, pero lo puedes realizar donde creas conveniente)
ssh-keygen -v -b 2048 \
-t rsa \
-C ‘| Proceso Reportes - reportes(at)hp.com' \
-f reportes.key

- Vamos a utilizar las siguientes extensiones, para identificar nuestros archivos (key / pub)
mv reportes.key.pub reportes.pub

2
Validar nuestra par de llaves
Para hacer esta validación, confirmaremos la huella digital de nuestra llave y la generaremos nuevamente a fin de comprobar que la llave pública corresponde a su par privado, veamos entonces:
- Extraer en fingerprint (huella digital) de nuestra llave pública:
ssh-keygen -l -f reportes.pub

- Eliminamos nuestra llave pública, verificamos el directorio y la generamos nuevamente usando la llave privada:
ssh-keygen -y -f reportes.key > reportes.pub

- Extraemos nuevamente el fingerprint (huella digital) y comparamos visualmente

3
Instalar nuestro par público en el servidor remoto
Como desde un principio generamos nuestro par de llaves en el servidor remoto, solo vamos a anexar la llave publica al registro de llaves autorizadas (authorized_keys) y procederemos a validar conectividad.
- Ingresar al directorio .ssh dentro del home del usuario:
cd $HOME/.ssh

- Agregar la llave pública al registro de llaves autorizadas:
awk -F'|' '{print "#"$2"\n"$0"\n"}' ~/hp.com/reportes.pub >> authorized_keys


- Asignamos permisos de escritura/lectura solo al usuario
chmod 0600 authorized_keys

- Verificamos que nuestra configuración es correcta, desde el servidor origen (10.103.22.55) vamos a establecer una sesión con el servidor remoto (192.168.1.77) y ejecutaremos dos comandos (ifconfig y ls) para dar por valida nuestra prueba de conectividad:
ssh -i reportes.key 192.168.1.77 "ifconfig en1; ls -l ~/hp.com"


Hasta este punto, este tipo de configuración es válido para sistemas HP-UX, Linux y OS X ya que hemos usado los comandos que por defecto encontrarás en una instalación de OpenSSH.
Sin embargo, es posible que te encuentres con algunos problemas, así que listaremos los más comunes y las posibles soluciones.

Permisos
Verifica que los permisos de usuario a nivel archivo y directorio sean los correctos, de otra manera aunque hayas llevado a cabo los pasos anteriormente mencionados, no podrás establecer una sesión usando un esquema de llave pública:
Permissions Directory / File
0700${HOME}
0700${HOME}/.ssh
0600${HOME}/.ssh/authorized_keys


Asignar una contraseña
Bajo este procedimiento creamos un par de llaves sin contraseña, si por alguna razón fuera necesario asignarle una contraseña para poder usarla, entonces usaremos el comando ssh-keygen nuevamente:
ssh-keygen -p -f reportes.key

Considera que cuando asignamos una contraseña, ya no será posible usarla en procesos automáticos ya que requerirá de usar la contraseña que hemos asignado para liberar la llave privada.


Llavero personal
Como mencionamos al principio de la nota, esto es como una analogía de nuestro andar diario; es posible usar un llavero personal para administrar nuestras llaves, para esto usaremos el comando ssh-add que nos permitira gestionar nuestras llaves personales.
- Listar las llaves en nuestro llavero
ssh-add -l


- Anexar una llave personal a nuestro llavero y validar su existencia
ssh-add ~/keystore/andres.aquino-at-gmail.com.key




Varias llaves
Como podrán imaginar estos escenarios solo contemplan una llave, pero que sucede cuando tenemos que conectarnos a diferentes equipos y cada uno de ellos contemplan distintas llaves, es en estos casos que haremos uso de un archivo de configuración por sesión de usuario: config, vamos a ver un ejemplo:


Es en este archivo donde se establecen parámetros de configuración específicos por usuario, así como la llave a usar cuando se establecen sesiones hacia determinados servidores; es de mucha ayuda cuando se usan los comandos sftp y scp (por la complejidad que significa el incluir la llave a usar).

Conclusión
Sencillo, verdad?
No es mi intención con esta nota describir a detalle la gama de opciones que es posible usar con OpenSSH, sino esos pequeños detalles que nos pueden llevar tiempo el resolverlos.
Se me han pasado mencionar otras opciones, como el uso del verbose o de la ejecución en linea cambiando un puerto para observar el registro de ejecución, así como otros parámetros; pero bueno.. lo dejaremos para otro post que es hora de ir a dormir.

Referencias


buen camino!

Popular Posts