LPIC-1 Tema 110.3: seguridad de datos con cifrado
Última entrega sobre las certificaciones LPIC-1. Con el tema 110.3, sobre seguridad de datos, se termina lo referente a estos exámenes. Así que en futuras entradas daremos paso a LPIC-2. Pero antes, deberías conocer lo necesario para ser capaz de asegurar los datos y las comunicaciones.
Es decir, deberías conocer lo básico sobre OpenSSH, tanto uso como configuración, entender el rol de las claves, usar GnuPG (GPG) para cifrar, descifrar, firmar y verificar ficheros, e incluso comprender acerca del tunelado SSH…
Llegados a este punto, se ha visto todo lo que deberías conocer para aprobar los exámenes. He intentado que estén lo más actualizados posibles, aunque ya sabes que de vez en cuando LPI revisa el contenido y quita o agrega cosas en función de cómo han avanzado estos sistemas. Por ejemplo, posiblemente los próximos cambios para futuras revisiones sean acerca de las herramientas ifup/ifdown y las net-tools (legacy), que terminarán desapareciendo de estas certificaciones, al igual que TCP wrappers…
Además, ya sabrás que hubo cambios importantes para las LPI Essential y LPIC-1 v5.0, que ahora son bastante más fáciles que antes. No obstante, como empezó con la versión anterior de LPIC-1, no he modificado el contenido de los artículos para bajar su nivel.
ÍNDICE:
Sobre SSH
Es importante que sepas manejar SSH, además de configurar la configuración relacionada con él. Ya sabes que Secure Shell es un protocolo y un programa que lo implementa. La función es proveer a un usuario de acceso remoto a un sistema mediante un canal seguro con información cifrada. Es muy útil para la administración remota de servidores.
Es complicado no alargar demasiado el artículo y explicar este tema tan complejo, pero intentaré condensarlo lo máximo posible, dando por hecho algunas cosas…
Introducción
El objetivo de SSH es establecer una conexión segura para que:
- Nadie pueda hacerse pasar por el servidor previsto. Se puede comprobar que te has conectado al mismo servidor al que te habías conectado anteriormente.
- Que nadie pueda interceptar o capturar la información. El tráfico tiene un cifrado fuerte.
- Y proporcionar túneles seguros para otros protocolos no seguros como X11.
Existe el paquete OpenSSH en varias versiones (v1 y v2), y existen paquetes para implementar el cliente SSH y el servidor SSH. Una vez se tiene todo instalado y configurado, la secuencia de eventos para la conexión es:
- Se realiza el enlace de cifrado para que el cliente pueda verificar que está conectando al servidor correcto. Si la clave del host al que se intenta acceder ha cambiado, entonces SSH lanzará una advertencia y termina la conexión de forma inmediata para evitar spoofing y ataques MiM. Si coincide, prosigue el proceso…
- Una capa de transporte entre el cliente y el servidor remoto se cifra mediante cifrado asimétrico.
- Se produce la autenticación del cliente en el servidor, para que lo acepte.
- El cliente ya está listo para interactuar con el servidor remoto a través de la conexión cifrada. Podrá ejecutar todos los comandos que necesite para la administración remota…
Comandos básicos
En cuanto a los comandos que se pueden usar, básicamente son:
- ssh: usar SSH para una conexión remota es bastante sencillo. Puedes establecer una conexión de esta forma:
#Ejemplo de conexión a un servidor registrándose con el usuario prueba ssh prueba@servidor.dominio.es #También se puede usar la IP ssh root@192.168.7.4 #Más información man ssh #Tunel seguro para el protocolo X11 ssh -X usuario@nombrehost #Trusted X11 forwarding (acelerar la velocidad) ssh -Y usuario@nombrehost #Comprimir datos ssh -X -C usuario@nombrehost
- ssh-keygen: es el comando que sirve para generar el par de claves necesarias para la autentificación, cuando no se quiere introducir la contraseña de usuario. SSH acepta ambas formas, pero con el par de llaves, quien posea las clave podrá acceder de forma más cómoda y segura.
#Ejemplo para generar un par de claves (privada-publica) usando RSA ssh-keygen -t rsa #También puedes usar simplemente (y seleccionar los parámetros en el prompt interactivo) ssh-keygen
- ssh-agent: gestiona las claves privadas cuando se usa autenticación de clave pública. Es útil para establecer ciertas variables de entorno en el shell para trabajar con este protocolo. Por ejemplo:
#Ejemplo de uso ssh-agent #Puedes usar estas variables sin necesidad de establecerlas manualmente con eval `ssh-agent`
- ssh-add: incorpora entidades al agente SSH. Por ejemplo:
#Si lo ejecutas por primera vez no tendrá ninguna llave ssh-add #Puedes listar las claves privadas actuales a las que puede acceder el agente con ssh-add -l #Para mostrar las llaves públicas ssh-add -L #Para eliminar todas las claves usadas por el agente ssh-add -D
Ficheros importantes
Por un lado tienes algunos ficheros interesantes como:
- /etc/ssh/moduli: grupos Diffie-Hellman para intercambios de claves al comienzo del proceso.
- /etc/ssh/sshd_config: fichero de configuración para el demonio.
- /etc/pam.d/sshd: fichero de configuración PAM (lo explicaré más adelante) para el demonio.
- /etc/sysconfig/sshd: fichero de configuración del servicio correspondiente a SSH.
Cuando se usan el par de claves para la autenticación en SSH, los ficheros con las claves se almacenarán en unos ficheros que también debes conocer. Y es que, al usar ssh-keygen se van a generar una serie de ficheros, que luego serán comprobados para verificar la conexión.
Por ejemplo, las claves privadas (sin extensión) y públicas (.pub) que usará el demonio SSH estarán en (para los diferentes tipos de algoritmos de cifrado):
- /etc/ssh/ssh_host_rsa_key y ssh_host_rsa_key.pub
- /etc/ssh/ssh_host_dsa_key y ssh_host_dsa_key.pub
- /etc/ssh/ssh_host_ecdsa_key y ssh_host_ecdsa_key.pub
- /etc/ssh/ssh_host_ed25519_key y ssh_host_ed25519_key.pub
Puedes usar ssh-copy-id para copiar las claves.
Para poder acceder al servidor sin contraseña deberemos añadir la clave pública al fichero ~/.ssh/authorized_keys del usuario remoto. Es un fichero específico para cada usuario, con una lista de claves públicas autorizadas para servidores. Así, cuando el cliente se conecta al servidor, el servidor autentica al cliente comprobando su clave pública firmada almacenada en este fichero.
Otros ficheros específicos para cada usuario son los de claves privadas y públicas del usuario. Son los ficheros generados cuando se crean el par de claves, y tienen nombres como id_tipo-algoritmo para la clave privada para el cliente, y otro id_tipo-algoritmo.pub para la pública:
- ~/.ssh/id_rsa y id_rsa.pub
- ~/.ssh/id_dsa y id_dsa.pub
- ~/.ssh/id_ecdsa y id_ecdsa.pub
- ~/.ssh/id_ed25519 y id_ed25519.pub
Para ciertas configuraciones de seguridad de hosts remotos, es importante el fichero /etc/ssh_known_hosts y ~/.ssh/known_hosts. Contendrá la lista de claves de host conocidas en el sistema o cuenta de los servidores aceptados por el usuario. Si no hubiera claves almacenadas en estos ficheros cuando SSH lo comprueba para un servidor remoto, se le pregunta al usuario si confía en la nueva clave de host remoto. Si el usuario confirma la clave, la clave del host remoto se agrega al fichero ~/.ssh/known_hosts del usuario antes de que solicite la contraseña. Esto es importante para prevenir conexiones a servidores incorrectos.
Sobre GPG
Con GPG podrás cifrar y descifrar datos, además de poder firmar y verificar ficheros. Por eso, puede ser una herramienta interesante de cara a la seguridad:
Uso de GPG
Aquí tienes algunos ejemplos habituales de uso de las herramientas:
- gpg: GNU Private Guard es una implementación libre de PGP, un programa para cifrar y firmar digitalmente. Se puede usar tanto cifrado simétrico como asimétrico. Aquí tienes algunos ejemplos:
#Cifrar de forma simétrica un fichero gpg --symetric /home/privado/info.txt #Descifrar el fichero gpg --decrypt -o /home/privado/info.txt /home/privado/info.gpg #Proceso de cifrado asimétrico (generación del par de claves, etc.) gpg --gen-key gpg --encrypt -r isaac@correo.es /home/privado/info.txt #Para descifrar un fichero cifrado asimétricamente gpg --decryt -o /home/privado/info.txt /home/privado/info.gpg #Para que otrosp uedan firmar o descifrar, puedes exportar las claves públicas o importar claves públicas gpg --export nombre_usuario #Si no especificas usuario se exportan todas gpg --export #Para importar claves usando un fichero de clave pública que nos hayan pasado gpg --import fichero_clave #Firmar un documento gpg –-sign nat.pdf #Verificar un documento firmado para comprobar que no ha sido manipulado gpg --verify nat.pdf.gpg #Más información man gpg
- gpg-agent: se usa como demonio para solicitar y almacenar en caché la contraseña de la llave. Es útil cuando se usa GPG desde un programa externo como un cliente de correo.
Configuración
En cuanto a la configuración de GPG, la puedes encontrar en el directorio ~/.gnupg/. Dentro encontrarás ficheros de configuración para el entorno GPG… Cuando se ejecuta GPG para crear el par de claves se generará éste directorio y su contenido.