110.3 Proteger datos con cifrado - Teoria
Conceptos fundamentales de criptografia
Cifrado simetrico vs asimetrico
| Caracteristica | Simetrico | Asimetrico |
|---|---|---|
| Claves | Una sola clave compartida | Par de claves (publica + privada) |
| Velocidad | Rapido | Lento |
| Uso tipico | Cifrado de datos masivos | Intercambio de claves, firma digital |
| Ejemplos | AES, 3DES, Blowfish | RSA, DSA, ECDSA, Ed25519 |
Firma digital
- Se firma con la clave privada del remitente
- Se verifica con la clave publica del remitente
- Garantiza autenticidad (quien lo envio) e integridad (no fue modificado)
PKI (Public Key Infrastructure)
- Infraestructura para gestionar certificados digitales
- Las Autoridades de Certificacion (CA) firman certificados
- Se basa en la confianza transitiva (confias en la CA, confias en los certificados que firma)
SSH (Secure Shell)
Descripcion
- Protocolo para acceso remoto seguro y transferencia de archivos
- Reemplaza a telnet, rsh, rlogin (inseguros)
- Puerto por defecto: 22 (TCP)
- Version actual: SSH-2
Componentes
ssh: Cliente SSHsshd: Servidor (demonio) SSHscp: Copia segura de archivossftp: Transferencia de archivos via SSH (interactivo)
Comando ssh
ssh usuario@host # Conectar a un host
ssh -p 2222 usuario@host # Puerto no estandar
ssh usuario@host comando # Ejecutar comando remoto
ssh -X usuario@host # X11 forwarding (aplicaciones graficas)
ssh -v usuario@host # Modo verbose (depuracion)
ssh -i ~/.ssh/mi_clave usuario@host # Usar clave especificaGeneracion de claves: ssh-keygen
ssh-keygen # Genera par de claves (RSA por defecto)
ssh-keygen -t rsa -b 4096 # RSA de 4096 bits
ssh-keygen -t ecdsa -b 521 # ECDSA de 521 bits
ssh-keygen -t ed25519 # Ed25519 (moderno, recomendado)
ssh-keygen -t dsa # DSA (deprecado, evitar)
ssh-keygen -f ~/.ssh/mi_clave # Nombre de archivo personalizado
ssh-keygen -C "comentario" # Agregar comentario
ssh-keygen -p # Cambiar passphrase de una clave existenteTipos de claves
| Tipo | Tamano recomendado | Notas |
|---|---|---|
| RSA | 4096 bits | Clasico, compatible |
| ECDSA | 256/384/521 bits | Basado en curvas elipticas |
| Ed25519 | Fijo (256 bits) | Moderno, rapido, recomendado |
| DSA | 1024 bits | Deprecado, no usar |
Archivos generados
~/.ssh/id_rsa- Clave privada (NUNCA compartir)~/.ssh/id_rsa.pub- Clave publica (se copia al servidor)
Permisos requeridos:
~/.ssh/ -> 700 (drwx------)
~/.ssh/id_rsa -> 600 (-rw-------)
~/.ssh/id_rsa.pub -> 644 (-rw-r--r--)
Autenticacion por clave publica
Proceso
- Generar par de claves en el cliente:
ssh-keygen -t ed25519 - Copiar clave publica al servidor:
ssh-copy-id usuario@servidor - Conectar sin contrasena:
ssh usuario@servidor
ssh-copy-id
ssh-copy-id usuario@host # Copiar clave publica al servidor
ssh-copy-id -i ~/.ssh/mi_clave.pub usuario@host # Clave especificaEsto agrega la clave publica al archivo ~/.ssh/authorized_keys del usuario en el servidor.
~/.ssh/authorized_keys
Archivo en el servidor que contiene las claves publicas autorizadas para acceder a esa cuenta.
ssh-ed25519 AAAAC3NzaC1... usuario@cliente
ssh-rsa AAAAB3NzaC1... otro@equipo
Permisos: 600 o 644
ssh-agent y ssh-add
El agente SSH almacena las claves privadas descifradas en memoria, evitando tener que introducir la passphrase repetidamente.
# Iniciar el agente
eval $(ssh-agent)
# Agregar clave al agente
ssh-add # Agrega ~/.ssh/id_rsa por defecto
ssh-add ~/.ssh/mi_clave # Clave especifica
ssh-add -l # Listar claves en el agente
ssh-add -D # Eliminar todas las claves del agente
# Cerrar el agente
ssh-agent -k~/.ssh/known_hosts
Almacena las claves de host de los servidores a los que te has conectado. Protege contra ataques man-in-the-middle.
- Al conectar por primera vez, se pregunta si aceptar la clave del servidor
- En conexiones posteriores, se verifica que la clave coincida
- Si la clave cambia (alerta de seguridad), SSH rechaza la conexion
# Eliminar una entrada (si la clave del servidor cambio legitimamente)
ssh-keygen -R hostArchivos de clave de host del servidor: /etc/ssh/
El servidor SSH tiene sus propias claves (host keys) que identifican al servidor de forma unica. Se almacenan en /etc/ssh/:
| Archivo | Descripcion |
|---|---|
ssh_host_rsa_key / ssh_host_rsa_key.pub | Clave de host RSA (privada/publica) |
ssh_host_ecdsa_key / ssh_host_ecdsa_key.pub | Clave de host ECDSA |
ssh_host_ed25519_key / ssh_host_ed25519_key.pub | Clave de host Ed25519 |
ssh_host_dsa_key / ssh_host_dsa_key.pub | Clave de host DSA (deprecada) |
# Listar los archivos de claves de host
ls -la /etc/ssh/ssh_host_*
# Ver la huella digital (fingerprint) de una clave de host
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
# 256 SHA256:abcdef... root@servidor (ED25519)
# Ver la huella en formato MD5 (antiguo)
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub -E md5
# Regenerar claves de host (si se comprometen)
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""ssh-keygen -l -f archivo: Muestra la huella digital (fingerprint) de una clave. Util para:
- Verificar la identidad de un servidor comparando la huella con un valor conocido
- Comprobar que tipo y tamano de clave tiene un servidor o usuario
- Funciona tanto con claves publicas como privadas (solo muestra la huella, no la clave privada)
# Ver fingerprint de una clave de usuario
ssh-keygen -l -f ~/.ssh/id_ed25519.pub
# Ver fingerprint de una clave de host
ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pubCuando un cliente se conecta por primera vez a un servidor SSH, la huella digital mostrada corresponde a la clave de host del servidor. Esta huella se almacena en ~/.ssh/known_hosts del cliente.
~/.ssh/config
Archivo de configuracion del cliente SSH para simplificar conexiones.
# Configuracion global
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
# Atajo para un servidor
Host produccion
HostName 192.168.1.50
User admin
Port 2222
IdentityFile ~/.ssh/clave_prod
Host desarrollo
HostName dev.ejemplo.com
User developer
ForwardAgent yes
Con esta configuracion, ssh produccion equivale a ssh -p 2222 -i ~/.ssh/clave_prod admin@192.168.1.50.
/etc/ssh/sshd_config
Configuracion del servidor SSH (demonio sshd).
# Puerto
Port 22
# Permitir login de root
PermitRootLogin no # no | yes | prohibit-password | forced-commands-only
# Autenticacion por contrasena
PasswordAuthentication no # Deshabilitar (solo claves)
# Autenticacion por clave publica
PubkeyAuthentication yes
# Usuarios permitidos
AllowUsers admin juan maria
# o por grupo:
AllowGroups ssh-users
# X11 Forwarding
X11Forwarding yes
# Protocolo
Protocol 2 # Solo SSH-2 (ya es lo predeterminado)
# Autenticacion por host
HostbasedAuthentication no
Despues de modificar, reiniciar sshd:
systemctl restart sshdTransferencia de archivos: scp y sftp
scp (Secure Copy)
scp archivo usuario@host:/ruta/destino # Copiar al servidor
scp usuario@host:/ruta/archivo ./local # Copiar desde el servidor
scp -r directorio usuario@host:/ruta/ # Copiar directorio recursivo
scp -P 2222 archivo usuario@host:/ruta/ # Puerto no estandar
scp -i clave archivo usuario@host:/ruta/ # Con clave especificasftp (SSH File Transfer Protocol)
sftp usuario@host # Sesion interactiva
sftp -P 2222 usuario@host # Puerto no estandarComandos dentro de sftp:
ls # Listar remoto
lls # Listar local
cd /ruta # Cambiar directorio remoto
lcd /ruta # Cambiar directorio local
get archivo # Descargar archivo
put archivo # Subir archivo
mget *.txt # Descargar multiples archivos
mput *.txt # Subir multiples archivos
mkdir dir # Crear directorio remoto
rm archivo # Eliminar archivo remoto
exit / quit / bye # Salir
Tuneles SSH (Port Forwarding)
Tunel local (-L)
Reenviar un puerto local a un puerto remoto a traves del tunel SSH.
ssh -L puerto_local:host_destino:puerto_destino usuario@servidor_sshEjemplo: Acceder a un servicio web (puerto 80) en un servidor remoto a traves del puerto local 8080:
ssh -L 8080:localhost:80 usuario@servidor
# Ahora http://localhost:8080 accede al puerto 80 del servidorEjemplo: Acceder a una base de datos detras de un bastion:
ssh -L 3306:servidor-db:3306 usuario@bastion
# Ahora localhost:3306 conecta a servidor-db:3306 a traves del bastionTunel remoto (-R)
Reenviar un puerto en el servidor remoto a un puerto local.
ssh -R puerto_remoto:host_local:puerto_local usuario@servidor_sshEjemplo: Hacer accesible un servicio web local (puerto 3000) en el servidor remoto como puerto 8080:
ssh -R 8080:localhost:3000 usuario@servidor
# Ahora servidor:8080 accede a localhost:3000Tunel SOCKS (-D)
Crear un proxy SOCKS dinamico.
ssh -D 1080 usuario@servidor
# Configurar navegador para usar proxy SOCKS en localhost:1080
# Todo el trafico del navegador se envia a traves del tunel SSHOpciones utiles para tuneles
ssh -N -f -L 8080:localhost:80 usuario@servidor-N: No ejecutar comandos remotos (solo tunel)-f: Pasar a segundo plano despues de autenticar
GPG (GNU Privacy Guard)
Descripcion
- Implementacion libre del estandar OpenPGP
- Permite cifrar, descifrar, firmar y verificar datos
- Usa cifrado asimetrico (par de claves publica/privada)
- Directorio de claves:
~/.gnupg/
Generar claves
gpg --gen-key # Generar par de claves (interactivo)
gpg --full-generate-key # Generar con todas las opcionesGestionar claves
gpg --list-keys # Listar claves publicas
gpg --list-secret-keys # Listar claves privadas
gpg --fingerprint # Mostrar huellas digitales
gpg --delete-key ID # Eliminar clave publica
gpg --delete-secret-key ID # Eliminar clave privadaExportar e importar claves
# Exportar clave publica
gpg --export -a "Nombre" > clave_publica.asc
gpg --export --armor ID > clave_publica.asc
# Importar clave publica de alguien
gpg --import clave_publica.asc
# Exportar clave privada (backup)
gpg --export-secret-keys -a "Nombre" > clave_privada.ascCifrar y descifrar
# Cifrar para un destinatario (cifrado asimetrico)
gpg --encrypt --recipient destinatario@email.com archivo.txt
# Genera: archivo.txt.gpg
# Cifrar con armadura ASCII (texto)
gpg --encrypt --armor --recipient destinatario@email.com archivo.txt
# Genera: archivo.txt.asc
# Cifrado simetrico (con contrasena)
gpg --symmetric archivo.txt
gpg -c archivo.txt
# Descifrar
gpg --decrypt archivo.txt.gpg
gpg --decrypt archivo.txt.gpg > archivo_descifrado.txt
gpg -d archivo.txt.gpgFirmar y verificar
# Firmar un archivo (firma separada)
gpg --sign archivo.txt # Genera archivo.txt.gpg (firma incluida)
gpg --detach-sign archivo.txt # Genera archivo.txt.sig (firma separada)
gpg --clearsign archivo.txt # Firma en texto claro (archivo.txt.asc)
gpg --armor --detach-sign archivo.txt # Firma separada en ASCII
# Verificar firma
gpg --verify archivo.txt.sig archivo.txt # Verificar firma separada
gpg --verify archivo.txt.asc # Verificar firma incluidaRevocacion de claves GPG
Si una clave privada se compromete o ya no se necesita, es necesario revocarla para informar a otros usuarios que ya no deben confiar en ella.
# Generar un certificado de revocacion (hacer esto JUSTO DESPUES de crear la clave)
gpg --gen-revoke ID_CLAVE > revocacion.asc
gpg --output revocacion.asc --gen-revoke ID_CLAVE
# Se recomienda guardar el certificado de revocacion en un lugar seguro (USB, papel impreso)Cuando se necesite revocar la clave:
# Importar el certificado de revocacion al anillo de claves
gpg --import revocacion.asc
# Verificar que la clave esta marcada como revocada
gpg --list-keys ID_CLAVE
# Mostrara: [revoked] junto a la clave
# Enviar la clave revocada a un servidor de claves para notificar a todos
gpg --keyserver hkps://keys.openpgp.org --send-keys ID_CLAVEIMPORTANTE: GPG genera automaticamente un certificado de revocacion al crear una clave (almacenado en ~/.gnupg/openpgp-revocs.d/). Es buena practica hacer una copia de seguridad de este certificado inmediatamente.
Modelo de confianza GPG (Web of Trust)
GPG utiliza un modelo descentralizado de confianza llamado Web of Trust (Red de Confianza), diferente al modelo centralizado de PKI/CA.
Niveles de confianza de propietario (owner trust)
| Nivel | Significado |
|---|---|
| Unknown | No se sabe si se puede confiar en el propietario |
| None | No se confia en que el propietario verifique identidades |
| Marginal | Se confia parcialmente (se necesitan varias firmas marginales para validar) |
| Full | Se confia completamente en que el propietario verifica identidades correctamente |
| Ultimate | Confianza absoluta (normalmente solo para tus propias claves) |
Como funciona la Web of Trust
- Firmas de claves: Al verificar la identidad de alguien, firmas su clave publica con tu clave privada
- Cadenas de confianza: Si confias en Alice y Alice firmo la clave de Bob, puedes confiar en Bob (confianza transitiva)
- Validez: Una clave se considera valida si:
- Esta firmada por una clave con confianza full, o
- Esta firmada por al menos 3 claves con confianza marginal
# Editar la confianza de una clave
gpg --edit-key ID_CLAVE
gpg> trust
# Seleccionar nivel: 1=undefined, 2=none, 3=marginal, 4=full, 5=ultimate
# Firmar la clave publica de otra persona (tras verificar su identidad)
gpg --sign-key ID_CLAVE
# Ver las firmas de una clave
gpg --list-sigs ID_CLAVEServidores de claves
# Buscar clave en un servidor
gpg --keyserver hkps://keys.openpgp.org --search-keys email@ejemplo.com
# Enviar clave publica a un servidor
gpg --keyserver hkps://keys.openpgp.org --send-keys ID_CLAVE
# Recibir clave de un servidor
gpg --keyserver hkps://keys.openpgp.org --recv-keys ID_CLAVEEstructura de ~/.gnupg/
| Archivo | Contenido |
|---|---|
pubring.gpg / pubring.kbx | Anillo de claves publicas |
secring.gpg / private-keys-v1.d/ | Anillo de claves privadas |
trustdb.gpg | Base de datos de confianza |
gpg.conf | Configuracion personal de GPG |
Puntos clave para el examen
- ssh-keygen:
-ttipo (rsa, ecdsa, ed25519),-bbits. Ed25519 es el recomendado ssh-keygen -l -f archivomuestra la huella digital (fingerprint) de una clave- ssh-copy-id copia la clave publica al
authorized_keysdel servidor - ~/.ssh/known_hosts almacena claves de host para prevenir MITM
- Claves de host del servidor en
/etc/ssh/: ssh_host_rsa_key, ssh_host_ecdsa_key, ssh_host_ed25519_key - Permisos: ~/.ssh = 700, clave privada = 600, authorized_keys = 600
- /etc/ssh/sshd_config:
PermitRootLogin no,PasswordAuthentication nopara mayor seguridad - Tunel local
-L: Puerto local -> destino remoto; Tunel remoto-R: Puerto remoto -> destino local - scp copia archivos; sftp es interactivo
- gpg —encrypt —recipient cifra; gpg —decrypt descifra
- gpg —gen-revoke genera certificado de revocacion; importar con
gpg --importpara revocar - Web of Trust: Modelo descentralizado de confianza. Niveles: unknown, none, marginal, full, ultimate
- gpg —sign firma; gpg —verify verifica
- Cifrado asimetrico: Clave publica cifra, clave privada descifra. Clave privada firma, clave publica verifica
Trampas del examen
Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:
- Permisos de
~/.ssh/— El directorio debe ser 700, la clave privada 600,authorized_keys600. Cualquier permiso mas abierto hace que SSH rechace las claves SILENCIOSAMENTE. El examen puede describir un fallo de autenticacion por clave y la causa es permisos incorrectos ssh-copy-idcopia alauthorized_keysdel SERVIDOR — La clave publica del cliente se agrega al archivo~/.ssh/authorized_keysdel usuario en el servidor remoto. No confundir: las claves se generan en el CLIENTE y la publica se copia al SERVIDOR- Tunel local
-Lvs tunel remoto-R—-L puerto_local:destino:puerto_destinoreenvio LOCAL (acceder desde tu maquina a un servicio remoto);-R puerto_remoto:destino:puerto_localreenvio REMOTO (exponer un servicio local en el servidor remoto). El examen puede describir un escenario y preguntar que opcion usar gpg --encryptnecesita--recipient— Sin especificar destinatario, GPG no sabe con que clave publica cifrar. Para cifrado simetrico (con contrasena) se usagpg --symmetricogpg -c, que no necesita destinatario- Cifrar con clave PUBLICA, descifrar con PRIVADA — Para cifrado asimetrico, se cifra con la clave publica del destinatario y se descifra con su clave privada. Para firma digital es al reves: se firma con la clave PRIVADA del remitente y se verifica con su clave PUBLICA
- Ed25519 es el tipo de clave SSH RECOMENDADO —
ssh-keygen -t ed25519genera claves modernas, rapidas y seguras. DSA esta deprecado y no debe usarse. RSA sigue siendo valido con 4096 bits. El examen puede preguntar cual es el algoritmo recomendado ~/.ssh/known_hostsalmacena claves de HOST, no de usuario —known_hostscontiene las claves publicas de los SERVIDORES a los que te has conectado.authorized_keyscontiene claves de USUARIOS autorizados. No confundir los dos archivosgpg --gen-revokegenera certificado de revocacion — Se debe generar JUSTO DESPUES de crear la clave y guardarlo en lugar seguro. Si la clave privada se compromete, se importa el certificado congpg --importpara revocar la clave/etc/ssh/sshd_configes la configuracion del SERVIDOR —sshd_config(con d) configura el demonio SSH;ssh_config(sin d) o~/.ssh/configconfigura el CLIENTE SSH. Confundir ambos archivos es un error frecuente en el examenPermitRootLogin prohibit-password— Esta opcion permite login de root SOLO con clave publica (no con contrasena). Es diferente deno(bloquea todo login de root) yyes(permite todo). El examen puede preguntar que valor usar para permitir root solo con claves