Conexiones seguras SSL/TLS - SSH
Principios, herramientas y protocolos de criptografía Yann Frauel – Semestre 2007-1
1. Secure Socket Layer / Transport Layer Security
SSL/TLS
SSL desarrollado por Netscape (v2, v3)
Estandarizado por IETF como TLS
TLS 1.0 sería SSL 3.1 (parecido a SSL 3.0 pero incompatible)
Versión actual TLS 1.1 (RFC 4346)
Comunicación segura a través de Internet
➔
Confidencialidad
➔
Autenticación (del servidor)
➔
Integridad
Corre debajo de los protocolos usuales ➔
HTTP, FTP, POP...
SSL/TLS
Encripción simétrica
Claves públicas para
➔
Autenticación
➔
Intercambio de claves
PKI centralizado ➔
Autoridades de certificación
➔
Certificados X.509
Algoritmos negociados ➔
Claves públicas: RSA, DSA, Diffie-Hellman
➔
Cifrados simétricos: RC2, RC4, IDEA, DES, 3DES, AES
➔
Funciones de hash: MD5, SHA-1
SSL/TLS
TLS 1.1 Protocolo de negociación (handshake prot.)
Protocolo de alertas
Protocolo de paquetes (record protocol)
TCP/IP
Protocolo de datos de aplicación
Función seudo-aleatoria
Función seudo-aleatoria PRF para expansión de secreto
A partir de un secreto compartido, genera las claves: ➔
Clave MAC cliente
➔
Clave MAC servidor
➔
Clave cifrado cliente
➔
Clave cifrado servidor
Basada en funciones de hash
Usa una función auxiliar P_hash
P_hash y PRF generan un flujo de clave
Función seudo-aleatoria Función auxiliar P_hash (secreto, semilla) Semilla
+
Estado A
HMAC_hash
HMAC_hash
P_hash
Secreto Inicialmente A = Semilla
Función seudo-aleatoria Función PRF (secreto, etiqueta, semilla) Secreto S1
S1
S2
P_MD5 (S1, Etiqueta + Semilla)
⊕
Etiqueta + Semilla
S2
P_SHA1 (S2, Etiqueta + Semilla)
PRF
Función seudo-aleatoria
PRF segura si al menos MD5 o SHA1 seguro
Requiere diferente número de iteraciones para P_MD5 y P_SHA1 (16 vs 20 bytes)
Etiqueta es un nombre ASCII que describe en que ámbito se está usando la función
Protocolo de negociación (handshake protocol)
Autenticación por claves públicas (certificados) ➔
Servidor
➔
Cliente (opcional)
Negociación de los parámetros de la sesión ➔
Identificador de sesión
➔
Algoritmos de firma, cifrado, MAC, compresión
Establecimiento del secreto compartido (48 bytes)
Protocolo de negociación Servidor
Cliente
Client hello Versión de SSL del cliente (3.2) ● Sello de tiempo ● 28 bytes aleatorios ● ID de sesión (para reabrir sesión) o vacío ● Lista de combinaciones de algoritmos (intercambio de clave, cifrado, MAC) ● Lista de algoritmos de compresión (incluye null) ●
Protocolo de negociación Servidor
Cliente
Server hello Mejor versión de SSL del servidor compatible con la versión del cliente ● Sello de tiempo ● 28 bytes aleatorios ● ID de sesión ● Combinación de algoritmos escogida ● Algoritmos de compresión escogido ●
Protocolo de negociación Servidor
Cliente
Server certificate (opcional) Certificado X.509 del servidor Certificado X.509 de la Autoridad de Certificación 1 Certificado X.509 de la Autoridad de Certificación 2 ...
Protocolo de negociación Servidor
Cliente
Server key exchange (opcional) Parámetros para establecer el secreto común ● RSA: clave pública temporal para cifrar el secreto ● Diffie-Hellman: p, g, gx Firma (incluye los números aleatorios de Client_hello y Server_hello)
Sólo si la información contenida el el certificado no es suficiente
Protocolo de negociación Servidor
Cliente
Certificate request (opcional)
Pide al cliente que se autentique
Protocolo de negociación Servidor
Cliente
Server hello done
El cliente verifica la validez del certificado del servidor
Protocolo de negociación Servidor
Cliente
Client certificate (opcional) Certificado X.509 del cliente Certificado X.509 de la Autoridad de Certificación 1 Certificado X.509 de la Autoridad de Certificación 2 ... Sólo si el servidor mandó un Certificate request
Protocolo de negociación Servidor
Cliente
Client key exchange Establecimiento del pre-secreto común ● RSA: genera 48 bytes aleatorios y los cifra con la clave RSA (temporal o permanente) ● Diffie-Hellman: genera y manda gy
Secreto principal = 48 primeros bytes de PRF (pre-secreto, “master secret”, No. aleatorio cliente + No. aleatorio servidor)
Protocolo de negociación Servidor
Cliente
Certificate verify (opcional) Firma de la compilación de todos los mensajes de negociación anteriores
Protocolo de negociación Servidor
Cliente
Change cipher spec
Pide aplicar los nuevos parámetros negociados
Protocolo de negociación Servidor
Cliente
Finished Primeros 12 bytes de PRF (secreto principal, “client finished”, MD5(negociación) + SHA1(negociación) )
Notifica el fin de la secuencia y permite verificar que los nuevos parámetros funcionan
Protocolo de negociación Servidor
Cliente
Change cipher spec
Pide aplicar los nuevos parámetros negociados
Protocolo de negociación Servidor
Cliente
Finished Primeros 12 bytes de PRF (secreto principal, “server finished”, MD5(negociación) + SHA1(negociación) )
Generación de las claves
Generar PRF (secreto principal, “key expansion”, No. aleatorio cliente + No. aleatorio servidor)
Partir este flujo aleatorio en ➔
Clave MAC cliente
➔
Clave MAC servidor
➔
Clave cifrado cliente
➔
Clave cifrado servidor
Protocolo de alertas
Manda mensajes de control ➔
Errores (advertencias o fatales)
➔
Terminación
Paquetes comprimidos, cifrados por la capa del protocolo de paquetes
Protocolo de datos de aplicación
Pasa los datos de la capa superior (HTTP, FTP...) a la capa de protocolo de paquetes para ser comprimidos, cifrados, etc.
Protocolo de paquetes (record protocol)
Proporciona privacidad ➔
Proporciona integridad ➔
Encripción simétrica MAC con clave (HMAC_MD5, HMAC_SHA1)
Encapsula los datos de la capa superior ➔
Fragmenta en bloques menores que 16384 bytes
➔
Comprime (opcional)
➔
Calcula MAC
➔
Cifra
Protocolo de paquetes (record protocol) Estructura de los paquetes: cifrado de flujo
➔ ➔ ➔
Tipo de contenido (alerta, negociación, aplicación) Versión del protocolo (3.2) Longitud del bloque cifrado
➔ ➔
Contenido (comprimido) MAC
Protocolo de paquetes (record protocol) Estructura de los paquetes: cifrado de bloques
➔ ➔ ➔
Tipo de contenido (alerta, negociación, aplicación) Versión del protocolo (3.2) Longitud del bloque cifrado
➔ ➔ ➔ ➔ ➔
Vector de inicialización Contenido (comprimido) MAC Relleno (hasta múltiple del tamaño de bloque) Longitud del relleno
2. Secure Shell SSH
Protocolo SSH 2.0
RFCs 4250-4246
Establecer un canal seguro entre cliente y servidor
➔
Sesión de comandos remota (reemplaza telnet, rsh, rlogin)
➔
Transmisión de archivos (sftp, scp)
➔
Re-envio de puertos (Ej. X11, correo, VNC...)
Tres capas ➔
Capa de transporte
➔
Capa de autenticación del usuario
➔
Capa de conexión
SSH2 incompatible con SSH1 (obsoleto)
Protocolo SSH 2.0
Confidencialidad (encripción)
Integridad (MAC)
Autenticación
➔
Computadora servidor
➔
Computadora cliente (opcional)
➔
Usuario
Basado en claves públicas
Protocolo de capa de transporte
RFC 4253
Protocolo de bajo nivel
Corre encima de TCP/IP (puerto 22)
Asegura la autenticación del servidor
Proporciona encripción, integridad y compresión (opcional)
Maneja el intercambio de clave inicial y las renovaciones (recomendadas después de 1GB transmitidos o 1 hora)
Todos los algoritmos son negociados
Protocolo de capa de transporte Negociación de los algoritmos
Lista de algoritmos preferidos
Lista de algoritmos preferidos
Cliente
Lista de algoritmos preferidos: ● Intercambio de clave (Diffie-Hellman, varios parámetros) ● Clave del servidor (dsa*, rsa) ● Encripción Cliente-Servidor (3des-cbc*, aes128-cbc, rc4...) ● Encripción Servidor-Cliente (idem) ● MAC Cliente-Servidor (hmac-sha1*, hmac-md5,...) ● MAC Servidor-Cliente (idem) ● Compresión Cliente-Servidor (none*, zlib...) ● Compresión Servidor-Cliente (idem) *
Servidor
requerido
Protocolo de capa de transporte Intercambio de clave (Diffie-Hellman) Servidor
Cliente
X = gx mod p
Y = gy mod p K = X y mod p
X
H=hash( KS | X | Y | K ) K = Y x mod p
s = firmaKs (H) KS, Y, s
H=hash( KS | X | Y | K ) VerificaKs (H,s) Opcional: verifica validez de KS , clave pública del servidor (base de datos local o certificado)
Protocolo de capa de transporte Intercambio de clave (Diffie-Hellman)
Firma con KS autentica servidor (≠ D-H original)
H = identificador de sesión (usado para aut. usuario)
K = secreto compartido, usado para derivar las claves simétricas y Vectores de Inicialización (a través de un hash con H y constantes)
No verificar la validez de KS es más cómodo pero posibilidad de ataque del Hombre-en-el-Medio ➔
Solución intermedia: aceptar 1ra vez y memorizar KS en una base de datos local
Protocolo de capa de transporte Paquetes binarios
Longitud del paquete ● Longitud del relleno ● Datos (eventualmente comprimidos) ● Relleno aleatorio (hasta múltiple del tamaño de bloque, min. 4 B) ●
MAC
MAC = MAC ( Clave, Número de secuencia, Paquete no cifrado )
Protocolo de autenticación del usuario
Definido en el RFC 4252
Corre encima de la capa de transporte
Varios métodos posibles
➔
Clave pública (requerida): RSA, DSA
➔
Contraseña
➔
Basado en computadora cliente
➔
Interactivo
➔
...
El servidor puede escoger cuales métodos admite
Autenticación por clave pública
SSH_MSG_USERAUTH_REQUEST Nombre del usuario Nombre del servicio requerido “publickey” Algoritmo de clave pública usado Clave pública del usuario
Firma (con clave del usuario)
¿Clave aceptable? ¿Firma válida?
Servidor
SSH_MSG_USERAUTH_SUCCESS o SSH_MSG_USERAUTH_FAILURE + lista de métodos restantes
Cliente
Autenticación por contraseña
SSH_MSG_USERAUTH_REQUEST Nombre del usuario Nombre del servicio requerido “password” Contraseña en claro
Verifica par usuario/contraseña en su base de datos Servidor
SSH_MSG_USERAUTH_SUCCESS o SSH_MSG_USERAUTH_FAILURE + lista de métodos restantes
Cliente
Autenticación basada en computadora cliente
SSH_MSG_USERAUTH_REQUEST Nombre del usuario Nombre del servicio requerido “hostbased” Algoritmo de clave pública usado Clave pública de la computadora cliente Nombre de la computadora cliente Nombre del usuario en la compu cliente
Firma (con clave de la compu cliente) ¿Clave pertenece a la comput cliente? ¿Firma válida? ¿Usuario autorizado? (opcional)
Servidor
SSH_MSG_USERAUTH_SUCCESS o SSH_MSG_USERAUTH_FAILURE + lista de métodos restantes
Cliente
Autenticación interactiva
Definida en el RFC 4256
El servidor pide datos y el usuario contesta usando el teclado
Permite extender los métodos de identificación sin modificar el programa cliente ➔
Ej.1: Reto-respuesta
➔
Ej. 2: Contraseña de uso único
➔
...
Autenticación interactiva Cliente
SSH_MSG_USERAUTH_REQUEST Nombre del usuario Nombre del servicio requerido “keyboard-interactive” Métodos preferidos (opcional)
Servidor
Autenticación interactiva Cliente
Despliega “Nombre de la petición” Despliega “Instrucciones” Despliega “Prompt ” y captura “Respuesta ” 1 1 ... Despliega “Prompt ” y captura “Respuesta ” n n
SSH_MSG_USERAUTH_INFO_REQUEST Nombre de la petición Instrucciones Número de prompts n
Prompt1 Echo 1
Promptn Echo n
Servidor
...
Autenticación interactiva
SSH_MSG_USERAUTH_INFO_RESPONSE Número de respuestas n
Respuesta1
...
Respuestan
Verifica las respuestas Servidor
SSH_MSG_USERAUTH_SUCCESS o SSH_MSG_USERAUTH_FAILURE + lista de métodos restantes o SSH_MSG_USERAUTH_INFO_REQUEST
Cliente
Protocolo de conexión
Definido en el RFC 4254
Corre encima de la capa de autenticación del usuario
Proporciona
➔
Ejecución de comandos
➔
Sesiones interactivas
➔
Re-envío de puertos
Canales multiplexados en un solo túnel cifrado ➔
Peticiones de apertura y cierre de canal
➔
Envío de entradas, salidas, señales
➔
...