110.3 Proteger datos con cifrado - Teoria

Conceptos fundamentales de criptografia

Cifrado simetrico vs asimetrico

CaracteristicaSimetricoAsimetrico
ClavesUna sola clave compartidaPar de claves (publica + privada)
VelocidadRapidoLento
Uso tipicoCifrado de datos masivosIntercambio de claves, firma digital
EjemplosAES, 3DES, BlowfishRSA, 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 SSH
  • sshd: Servidor (demonio) SSH
  • scp: Copia segura de archivos
  • sftp: 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 especifica

Generacion 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 existente

Tipos de claves

TipoTamano recomendadoNotas
RSA4096 bitsClasico, compatible
ECDSA256/384/521 bitsBasado en curvas elipticas
Ed25519Fijo (256 bits)Moderno, rapido, recomendado
DSA1024 bitsDeprecado, 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

  1. Generar par de claves en el cliente: ssh-keygen -t ed25519
  2. Copiar clave publica al servidor: ssh-copy-id usuario@servidor
  3. 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 especifica

Esto 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 host

Archivos 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/:

ArchivoDescripcion
ssh_host_rsa_key / ssh_host_rsa_key.pubClave de host RSA (privada/publica)
ssh_host_ecdsa_key / ssh_host_ecdsa_key.pubClave de host ECDSA
ssh_host_ed25519_key / ssh_host_ed25519_key.pubClave de host Ed25519
ssh_host_dsa_key / ssh_host_dsa_key.pubClave 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.pub

Cuando 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 sshd

Transferencia 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 especifica

sftp (SSH File Transfer Protocol)

sftp usuario@host                           # Sesion interactiva
sftp -P 2222 usuario@host                   # Puerto no estandar

Comandos 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_ssh

Ejemplo: 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 servidor

Ejemplo: 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 bastion

Tunel remoto (-R)

Reenviar un puerto en el servidor remoto a un puerto local.

ssh -R puerto_remoto:host_local:puerto_local usuario@servidor_ssh

Ejemplo: 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:3000

Tunel 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 SSH

Opciones 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 opciones

Gestionar 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 privada

Exportar 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.asc

Cifrar 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.gpg

Firmar 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 incluida

Revocacion 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_CLAVE

IMPORTANTE: 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)

NivelSignificado
UnknownNo se sabe si se puede confiar en el propietario
NoneNo se confia en que el propietario verifique identidades
MarginalSe confia parcialmente (se necesitan varias firmas marginales para validar)
FullSe confia completamente en que el propietario verifica identidades correctamente
UltimateConfianza absoluta (normalmente solo para tus propias claves)

Como funciona la Web of Trust

  1. Firmas de claves: Al verificar la identidad de alguien, firmas su clave publica con tu clave privada
  2. Cadenas de confianza: Si confias en Alice y Alice firmo la clave de Bob, puedes confiar en Bob (confianza transitiva)
  3. 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_CLAVE

Servidores 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_CLAVE

Estructura de ~/.gnupg/

ArchivoContenido
pubring.gpg / pubring.kbxAnillo de claves publicas
secring.gpg / private-keys-v1.d/Anillo de claves privadas
trustdb.gpgBase de datos de confianza
gpg.confConfiguracion personal de GPG

Puntos clave para el examen

  1. ssh-keygen: -t tipo (rsa, ecdsa, ed25519), -b bits. Ed25519 es el recomendado
  2. ssh-keygen -l -f archivo muestra la huella digital (fingerprint) de una clave
  3. ssh-copy-id copia la clave publica al authorized_keys del servidor
  4. ~/.ssh/known_hosts almacena claves de host para prevenir MITM
  5. Claves de host del servidor en /etc/ssh/: ssh_host_rsa_key, ssh_host_ecdsa_key, ssh_host_ed25519_key
  6. Permisos: ~/.ssh = 700, clave privada = 600, authorized_keys = 600
  7. /etc/ssh/sshd_config: PermitRootLogin no, PasswordAuthentication no para mayor seguridad
  8. Tunel local -L: Puerto local -> destino remoto; Tunel remoto -R: Puerto remoto -> destino local
  9. scp copia archivos; sftp es interactivo
  10. gpg —encrypt —recipient cifra; gpg —decrypt descifra
  11. gpg —gen-revoke genera certificado de revocacion; importar con gpg --import para revocar
  12. Web of Trust: Modelo descentralizado de confianza. Niveles: unknown, none, marginal, full, ultimate
  13. gpg —sign firma; gpg —verify verifica
  14. 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_keys 600. 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-id copia al authorized_keys del SERVIDOR — La clave publica del cliente se agrega al archivo ~/.ssh/authorized_keys del usuario en el servidor remoto. No confundir: las claves se generan en el CLIENTE y la publica se copia al SERVIDOR
  • Tunel local -L vs tunel remoto -R-L puerto_local:destino:puerto_destino reenvio LOCAL (acceder desde tu maquina a un servicio remoto); -R puerto_remoto:destino:puerto_local reenvio REMOTO (exponer un servicio local en el servidor remoto). El examen puede describir un escenario y preguntar que opcion usar
  • gpg --encrypt necesita --recipient — Sin especificar destinatario, GPG no sabe con que clave publica cifrar. Para cifrado simetrico (con contrasena) se usa gpg --symmetric o gpg -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 RECOMENDADOssh-keygen -t ed25519 genera 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_hosts almacena claves de HOST, no de usuarioknown_hosts contiene las claves publicas de los SERVIDORES a los que te has conectado. authorized_keys contiene claves de USUARIOS autorizados. No confundir los dos archivos
  • gpg --gen-revoke genera 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 con gpg --import para revocar la clave
  • /etc/ssh/sshd_config es la configuracion del SERVIDORsshd_config (con d) configura el demonio SSH; ssh_config (sin d) o ~/.ssh/config configura el CLIENTE SSH. Confundir ambos archivos es un error frecuente en el examen
  • PermitRootLogin prohibit-password — Esta opcion permite login de root SOLO con clave publica (no con contrasena). Es diferente de no (bloquea todo login de root) y yes (permite todo). El examen puede preguntar que valor usar para permitir root solo con claves