PARCIAL I REDES II.pdf
Document Details
Uploaded by AltruisticNumber
Tags
Full Transcript
CRIPTOGRAFÍA La criptografía es la práctica de codificar información de manera que no se pueda decodificar sin acceder a la clave de descifrado requerida. La criptografía consta de dos operaciones principales: Cifrado: transforma la información de texto en...
CRIPTOGRAFÍA La criptografía es la práctica de codificar información de manera que no se pueda decodificar sin acceder a la clave de descifrado requerida. La criptografía consta de dos operaciones principales: Cifrado: transforma la información de texto en claro en texto cifrado mediante una clave de cifrado. Descifrado: transforma el texto cifrado en texto en claro mediante una clave de descifrado. Tiene como objetivos: Confidencialidad: el mensaje llega solamente al destinatario correspondiente. Los datos se mantienen seguros tanto en tránsito, reposo como en uso. Integridad: el mensaje de salida corresponde al mensaje de entrada, no sufre alteraciones tanto intencionales sin autorización como de errores de transmisión. La integridad de los mensajes se verifica a través de la firma digital y se usa en criptosistemas de clave pública o privada. Autenticación: verifica la identidad de los usuarios de clave secreta compartida. Ejemplo: desafío/respuesta. No repudio: brinda seguridad al destinatario de que el mensaje fue hecho por el remitente y evita que el remitente niegue haber enviado el mensaje. Esto solo lo ofrecen los criptosistemas de clave pública o asimétrica, no los de clave privada o simétrica. Estos dos primeros corresponden con la siglas de la CIA (Confidentiality Integrity Availability), uno de los pilares de la ciberseguridad. La tercera sigla, disponibilidad, NO tiene nada que ver con la criptografía. La criptografía no puede garantizarla. Imaginemos el corte de un cable o un fallo en la conexión. Algunos conceptos importantes: Sistema criptográfico: son los diferentes elementos que permiten aplicar la criptografía. Criptoanálisis: es el estudio de las vulnerabilidades de los sistemas criptográficos. El criptoanálisis se usa para “quebrar” o “romper” dichos sistemas y probar que son seguros (inquebrables). Seguridad Informática: se aplica a toda forma de almacenar, procesar o transformar información y debe garantizar CIA. Utiliza métodos físicos (guardia, candado, llaves, controles de acceso, etc.) y lógicos (cifras, claves, contraseñas y privilegios de usuario). Una comunicación segura cumple con los principios de autenticación, no repudio, privacidad y anonimato. Además, una comunicación debe: Asumir que el canal siempre es inseguro. Utilizar los métodos para comunicar información en un canal inseguro: Códigos o claves: expresiones previamente establecidas o reconocidas solo por los participantes de la comunicación NO forman parte de la criptografía. Ejemplo: doble sentido. Cifras: criptografía. Esteganografía: técnica para ocultar archivos dentro de otro, ya sea digital (imagen, texto o video) o física (micropuntos, tinta invisible o oculto en un texto). CRIPTOGRAFÍA HISTÓRICA Métodos criptográficos anteriores a la era de la informática moderna, que no dependen de las matemáticas, como lo hacen muchos métodos modernos, sino de técnicas para codificar el texto. Típicamente se usaban los cifrados de sustitución y de transposición: Cifrados de sustitución: cambia un carácter o símbolo por otro. La sustitución de caracteres puede ser un método relativamente fácil de cifrar información. Ejemplo: Cesar. Cifrados de transposición o permutación: cambiar las letras de lugar (difusión), por ejemplo, cifrado por filas, columnas, vallas o zigzag. Aumenta la seguridad al utilizar una clave, la cual se ordena de forma alfabética. Tiene como desventaja que el texto en claro y el texto cifrado presentan las mismas letras. Transposición por grupos: si el texto en claro se agrupa por bloques, por ejemplo de ocho bits, y sobre los bloques se realiza la misma operación de permutación, es transposición por grupos. Transposición por series: mayor fortaleza, pero requiere leer todo el texto para cifrar. Ejemplo: primero se toman la serie de números primos, luego los pares y por último los restantes en orden para obtener el criptograma. En el caso del cifrado por filas o columnas el criptoanálisis (ataque) puede realizarse mediante la anagramación, la cuál consiste en comparar bloques en busca de encontrar los digramas más utilizados del lenguaje (DE, ES, EN, OS, etc.). Cifrado por Sustitución Monoalfabética: relación uno a uno de cada letra del alfabeto, esto quiere decir que una letra siempre corresponde con otra, siendo la misma en todos los casos. No necesariamente tienen que pertenecer al mismo alfabeto y existen n! combinaciones posibles, siendo n la cantidad de letras del alfabeto. Muy débil ante el análisis de frecuencia, tedioso ante ataques por fuerza bruta. Ejemplos: César, ROT13, A1Z26, etc. Este cifrado es una mejora del cifrado César, donde una letra se puede corresponder con cualquier otra siempre que sea única. No hay patrón regular k. Existen 26! combinaciones en el alfabeto inglés, mientras que 25 parejas del cifrado César. Cifrado por Sustitución Polialfabética: múltiples alfabetos de sustitución para el mismo mensaje. En el cifrado polialfabético se utilizan múltiples alfabetos y se cifra o descifra cada letra con un alfabeto u otro en función de una clave. En general, aplica diversos cifrados monoalfabéticos. Fuerte ante el análisis de frecuencia. Ejemplo: Vigenere. Video explicativo Análisis de Frecuencia En el español las letras que más se utilizan son la E, la A y la O. A partir de esto, se pueden buscar las letras más repetidas en el mensaje cifrado y hacer una correspondencia hasta encontrar un resultado coherente. En el siguiente ejemplo se asumiría que el 6 corresponde a la letra E: Aunque, este análisis presenta la desventaja que no es aplicable si no se cuenta con gran parte de texto cifrado, porque en una frase puede no ser válida la correspondencia. Principio de Kerchoff y Shannon La seguridad de una cifra debe depender de la clave utilizada y no del método de cifrado (Kerchoff) y el enemigo conoce el sistema (Shannon). Explicación de Cifrados Históricos Cesar: alfabeto desplazado tres posiciones a la derecha para cifrar y a la izquierda para descifrar. ROT13: alfabeto desplazado trece posiciones a la derecha para cifrar y a la izquierda para descifrar. A1Z26: cada letra se sustituye por su posición en el alfabeto y viceversa. Atbash: cada letra se sustituye por su inversa en el alfabeto y viceversa. Vigenere: imaginemos que tenemos la clave “MECA” y el texto plano “Criptogramas Resueltos”. El primer paso es poner la clave la cantidad de veces que sea necesaria para hacer una correspondencia con el mensaje: Al tener esto, para cifrar, nos fijamos en la tabla Vigenere, haciendo coincidir la letra de la clave con la letra del texto en plano y obteniendo la letra que las intersecta. Ejemplo: M y C = O. En el caso de querer descifrar, tenemos que hacer coincidir en la misma línea la letra de la clave con la letra del texto cifrado, obteniendo en la entrada de texto plano la letra correspondiente. Ejemplo: M y O = C. CRIPTOGRAFÍA MODERNA La longitud de la clave criptográfica es un factor fundamental para determinar la solidez del sistema criptográfico y la probabilidad de que el cifrado no se verá vulnerado a través de técnicas criptoanalíticas. Los atacantes pueden interceptar mensajes y descifrarlos, insertar mensajes falsos, suplantar la identidad, tomar el control de la conexión e impedir que el servicio sea utilizable (DoS), debido a esto la importancia de la solidez del sistema criptográfico. A partir de los años 50, con el uso de las computadoras, los cifrados en vez de trabajar sobre los símbolos del mensaje trabajan con la representación binaria de ellos (cifrados digitales). Además, utilizan: Cifras híbridas de sustitución/transposición. Cifrado por bloques. Operador XOR. Conceptos Importantes Cifrados: algoritmos utilizados para hacer operaciones de cifrado y descifrado. Pareja de cifrado: conjunto de cifrados y longitudes de claves admitidos por el sistema. Tipos de Cifrados Cifrado de bloque: operan en bloques (conjunto de bits) de un mensaje y aplican el algoritmo de cifrado al bloque de mensaje completo al mismo tiempo. Ejemplos: cifrados de transposición, DES, AES, Blowfish, etc. Este tipo de cifrado hace una correspondencia con un bloque de k bits (64 bits o más) con otro para cifrar y descifrar. Ampliamente utilizado en protocolos seguros de Internet (PGP correo electrónico seguro, SSL seguridad en conexiones TCP y Ipsec seguridad al transporte de la capa red). Número de correspondencias: 2k! Desventaja: al cambiar la clave se debe cambiar toda la tabla por completo y una tabla de 64 bits requiere una entrada de 264 valores. Esto se solucionó usando funciones que simulan la generación de tablas permutadas aleatoriamente. Cifrado de flujo: operan por un carácter (un bit) a la vez. Ejemplos: Cesar, polialfabéticos, enigma, etc. Cifrado XOR: solo da verdadero cuando ambos valores son distintos. Sistemas de claves: Simétrica (o criptografía de clave secreta y clave privada): las claves del receptor y el remitente son iguales y deben mantenerse en secreto. La clave se distribuye a todos los participantes de la comunicación, no importa cuantos sean. Todos utilizan la misma clave para cifrar y descifrar. Empleado principalmente para realizar cifrado masivo y proporciona únicamente el servicio de confidencialidad. Los tipos de técnicas de cifrado simétrico son por bloques o flujo. Ventaja: entre 10000 y 100000 veces más rápido que los cifrados asimétricos. Desventaja: distribución de claves, no implementa el no repudio, no es escalable y se deben regenerar con frecuencias las claves privadas. Imaginemos que queremos quitar a alguien de la comunicación: conoce la clave y debe ser cambiada. En relación a la escalabilidad, siendo n la cantidad de participantes, se requieren las siguientes claves: Asimétrica (o criptografía de clave pública): se emplea una pareja de claves, una conocida por todo el mundo y otro solo por el propietario de la clave, asignadas a cada usuario. Implica mayor lógica computacional. Los usuarios comparten sus claves públicas con quienes se va a comunicar sin debilitar el sistema, mientras la otra clave nunca se comparte con otros usuarios. El remitente cifra el mensaje con la clave pública del destinatario y el destinatario descifra el mensaje con su propia clave privada, sin necesidad de compartir claves privadas. No hay forma que a partir de la clave pública se llegue a la privada. Las claves de los sistemas de claves públicas deben ser más largas que los sistemas de claves privadas, para producir criptosistemas de fortaleza similar. Ventaja: mayor escalabilidad al generar por usuario nuevo un solo par de claves pública/privada, permite eliminar a un usuario de la comunicación con facilidad revocando su clave, solo se regeneran las claves cuando la clave privada se ve comprometida, proporciona integridad, autenticación y no repudio, y la distribución de claves es sencilla ya que los usuarios solo deben poner su clave pública a disposición para unirse a la comunicación. Desventaja: baja velocidad de operación. Por esta razón las aplicaciones que desean intercambiar de forma segura grandes cantidades de información utilizan criptografía de clave pública para establecer una comunicación y luego intercambiar una clave simétrica. Explicación de Cifrados Modernos Simétricos DES: En el año 1974, nuevo desarrollo a partir del algoritmo Lucifer en el que destaca entre sus inventores la figura de Horst Feistel. Un año más tarde, en 1975, la NSA aplica severas restricciones a dicho algoritmo, haciendo que la clave de 128 bits del original Lucifer se reduzca a 56 bits. Veinte años después, sucumbe DES a finales de los noventa ante un ataque por fuerza bruta en red. DES cifra bloques de 64 bits con una clave también de 64 bits, pero que se ve reducida a 56 al eliminar el octavo bit de cada byte que se usa para control de paridad. Por cada bloque de texto, realiza 16 vueltas, usando claves diferentes generadas a partir de la clave principal. DES divide el bloque de texto en dos mitades de 32 bits cada una, y sólo una de esas mitades la mezcla con la clave correspondiente a esa vuelta. A la siguiente vuelta, utiliza la otra mitad y repite el mismo procedimiento hasta la vuelta número 16 en que ya genera el criptograma de 64 bits del primer bloque de texto. Como durante el cifrado las claves de cada una de las 16 vueltas se obtienen aplicando desplazamientos de bits a la izquierda, las claves de descifrado se calculan realizando los mismos desplazamientos pero ahora hacia la derecha, y se descifra yendo desde la vuelta 16 hasta la vuelta 1. Cajas S (cajas de sustitución): se trata de la fase más importante del algoritmo, donde se sustituyen cadenas de 48 bits que son el resultado de una operación entre bits del bloque de texto y bits de una clave de vuelta, por cadenas de 32 bits. Será muy fácil obtener esos 32 bits de salida, pero resultará computacionalmente muy difícil hacer lo contrario. Las cajas S son usadas para oscurecer la relación entre la clave y el texto cifrado. 3DES: Como la clave de 56 bits es muy pequeña y en los años noventa dicho valor era ya vulnerable frente a ataques distribuidos por fuerza bruta, en 1998 Matías y Meyer de IBM proponen el algoritmo triple DES en formato EDE. Se trata de un cifrado triple que evita el ataque denominado “Encuentro a Medio Camino” de un cifrado doble y que tiene una fortaleza de 168 bits si las tres claves son diferentes, o bien de 112 bits si usamos sólo dos claves diferentes. Si las tres claves son iguales, el sistema es compatible con el DES simple. Ataques de fuerza bruta hechos a DES: El DES es débil ante el divide y vencerás, dado que la clave es un valor aleatorio que se encuentra dentro de un espacio de claves, en el caso del DES desde desde el valor 0 hasta 2^56, puede plantearse el ataque de manera que cada máquina atacante busque en una zona de dicho espacio. Si dividimos el espacio de ataque en n zonas iguales, lógicamente una de las máquinas dará con la clave y para ello habrá necesitado un tiempo n veces menor que si se enfrentara sola ante este reto. Todos los algoritmos simétricos presentan esta debilidad ante un ataque por fuerza bruta. Realizar un ataque por fuerza bruta a una clave aleatoria de n bits, significará en media tener que realizar 2^(n-1) intentos. Por ejemplo, si una clave de 8 bits tiene 2^8, es decir 256 estados posibles, intentar adivinar un valor en ese espacio, debería costar en media 2^7, esto es 128 intentos. Si pensamos ahora en una clave simétrica de 128 bits el tiempo crecería de sobre manera, ya que cada bit que se añade a la clave duplica el tiempo de ataque. No obstante, es conveniente aclarar que esta fortaleza es sólo probabilística; nada impide que se puedan acertar esos 128 bits en pocos intentos, si bien esto es altamente improbable. AES: en el año 1997, el NIST convoca un concurso internacional para el desarrollo de un nuevo algoritmo estándar de cifrado simétrico que permita sustituir al DES, cuya debilidad comenzaba a quedar de manifiesto a partir de ese año ante los ataques lanzados por RSA, conocidos como desafíos DES. A finales del año 2000, se proclama vencedor al algoritmo Rijndael, de los investigadores belgas Vincent Rijmen y John Daemen. AES es un algoritmo que procesa bloques completos de texto en claro de 128 bits, con claves estándar de 128, 192 ó 256 bits. Usa una matriz de estado de tamaño 4x4 cuyas 16 celdas (o bytes) van cambiando de valor de acuerdo a los procesos que ejecuta el algoritmo, usando para ello técnicas de sustitución y permutación, en algunos casos con operaciones polinómicas dentro de un cuerpo. Todas las operaciones de cifra, dentro de la matriz de estado, se realizan sobre bytes, en palabras de 32 bits que se escriben de arriba hacia abajo y de izquierda a derecha. Para una clave de 128 bits, el algoritmo realizará 10 vueltas, si la clave es de 192 bits serán 12 vueltas y para una clave de 256 bits, la cifra requiere de 14 vueltas. En cada una de estas vueltas se usará una clave de vuelta generada a partir de la clave maestra o principal. El algoritmo de cifrado comienza con la función denominada AddRoundKey, que realiza la suma xor exclusivo entre los bytes del mensaje y los bytes de la clave. Para una clave de 128 bits se calcularán 10 subclaves, una por cada vuelta, y se realizarán las siguientes cuatro operaciones durante 9 vueltas: SubBytes, ShiftRows, MixColumns y AddRoundKey. Para finalizar, se repiten solo las operaciones SubBytes, ShiftRows y AddRoundKey, dando lugar a una matriz de estado final con los 16 bytes que formarán el criptograma resultado de cifrar el primer bloque de texto en claro. Para el descifrado se recorrerá el algoritmo en sentido inverso, y se usarán las funciones inversas de estas operaciones: InversoSubBytes, InversoShiftRows, InversoMixColumns e InversoAddRoundKey. ○ SubBytes: ejecuta una sustitución de cada uno de los 16 bytes de la matriz de estado mediante una tabla. ○ ShiftRows: consiste en una permutación de las filas del estado, de forma que la primera fila no rota la segunda rota 1 byte, la tercera rota 2 bytes y la cuarta rota 3 bytes. ○ MixColumns: consiste en multiplicar cada una de las columnas de la matriz de estado por un polinomio fijo. ○ AddRoundKey: realiza la suma xor exclusivo de la clave de cada vuelta con los valores de la matriz de estado. Generación de las 10 subclaves necesarias en el caso de una cifra con AES de 128 bits: se utiliza una función denominada Expansión de Clave, que consiste en lo siguiente: modificar la matriz de estado de la clave inicial mediante la operación RotWord, que rota el primer byte de la última palabra de 4 bytes de la matriz. Después, aplicar a esa palabra resultante la operación SubBytes, y posteriormente sumar xor exclusivo esta palabra con la palabra que se encuentra 3 posiciones más atrás, y con un vector conocido como RCON diferente para cada una de las 10 vueltas, dando origen así a la primera palabra de la nueva clave. A continuación se repite 3 veces la suma xor exclusivo ahora sólo entre la nueva palabra con la ubicada 3 espacios atrás, hasta formar la matriz clave de la ronda 1. Este proceso se repite hasta obtener las 10 subclaves necesarias. Asimétricos Intercambio de Claves Seguro de Diffie y Hellman (algoritmo importante para las cifras asimétricas): en noviembre de 1976 dos investigadores de la Universidad de Stanford, Whitfield Diffie y Martin Hellman, proponen un algoritmo para intercambiar una clave secreta de manera computacionalmente segura, usando para ello funciones matemáticas de un solo sentido o unidireccionales. Esto significa que, si bien el sistema puede romperse matemáticamente, para los valores estándar de miles de bits que se usan en la práctica, el problema se vuelve intratable, tanto en recursos de cálculo como en tiempo. Y ahí radica su seguridad. Las funciones matemáticas unidireccionales son funciones que en una dirección tienen una solución fácil, o bien requieren de un tiempo de cómputo pequeño, pero que en cambio, su cálculo en sentido inverso se vuelve intratable, bien por el exceso de recursos que deben utilizarse o bien por el inmenso tiempo de cómputo necesario para su resolución. Este efecto se observa cuando los números con los que se está tratando son muy grandes. Tal sería el caso, por ejemplo, del producto de dos números primos grandes. Este problema que es conocido como de la Factorización Entera, fue utilizado por Rivest, Shamir y Adleman para el diseño del sistema RSA en 1978. No obstante, Diffie y Hellman usaron en su propuesta la función de un solo sentido conocida como el Problema del Logaritmo Discreto, cuyo enunciado es el siguiente: Encontrar el resultado de la expresión α^β mod n = x conocidos α, β y n, es sencilla y rápida, incluso para números grandes. Sin embargo, si conocemos ahora los valores de x, α y n, encontrar el valor del exponente β = logα x mod n se convierte en un problema de muy difícil solución para números grandes. Alicia y Bernardo, que se encuentran distantes, eligen un primo p y un número α que sea generador de ese primo. Ambos son valores públicos. Acto seguido, cada uno elige un número secreto que no conoce el otro. Así, Alicia elige un número a y Bernardo elige el número b. A continuación realizan el siguiente protocolo: Alicia usa su clave secreta a, calcula α^a mod p = x1 y se lo envía a Bernardo. Bernardo usa su clave secreta b, calcula α^b mod p = x2 y se lo envía a Alicia. Bernardo recibe x1 = α^a mod p y con su clave secreta b calcula x1^b mod p = (α^a)^b mod p. Alicia recibe x2 = α^b mod p y con su clave secreta a calcula x2^a mod p = (α^b)^a mod p. La clave intercambiada entre Alicia y Bernardo será α^ab mod p = α^ba mod p = K. Como se observa, una vez terminado el protocolo ambos comparten un mismo valor K que puede usarse como clave de sesión de forma segura. Ningún intruso, pese a conocer los valores públicos, podría calcular K. Existe una variante del algoritmo que permite intercambiar entre cliente y servidor una clave K previamente generada por el cliente, y por tanto no requiere que el protocolo se ejecute simultáneamente como en el caso anterior. RSA: en febrero de 1978, es decir, poco más de un año después de aquel intercambio de clave propuesto por Diffie y Hellman, otros tres investigadores norteamericanos,en este caso del Instituto Tecnológico de Massachusetts MIT, Ron Rivest, Adi Shamir y Leonard Adleman, proponen un sistema de cifra que llevará las iniciales de sus apellidos, algoritmo que se patenta como RSA. El algoritmo RSA basa su fortaleza en la dificultad computacional de factorizar un número compuesto muy grande, producto de dos primos grandes; un problema inabordable para la capacidad mundial de cómputo en 2016, con magnitudes por encima de mil bits. Los usuarios Alicia y Bernardo eligen cada uno un módulo de cifra n = pq siendo p y q primos de un tamaño igual o superior a 512 bits. Hoy en día es recomendable que sean de 1.024 bits. Los valores de los primos p y q serán un secreto, sólo conocido por el propietario de esa clave. En el caso de Alicia, ese módulo será nA = pA * qA y en el caso de Bernardo será nB = pB * qB. Cada usuario calculará el indicador de Euler phi de ese módulo n, que en este caso de dos primos es igual a (p - 1)(q - 1). Así, Alicia calcula phi(nA) = (pA - 1)(qA - 1), y Bernardo calcula phi(nB) = (pB - 1)(qB - 1). Ambos serán números secretos muy grandes, conocidos también como trampa. Cada usuario elegirá un valor de clave pública e mayor que 1 y menor que phi(n). Para asegurarse de que exista el inverso multiplicativo y, por tanto, la existencia de la clave privada inversa de esa clave pública, debe cumplirse que el mcd [e, phi(n)] = 1. No obstante, por razones de seguridad y eficiencia, el valor estándar de esa clave pública será 65.537, es decir, el número 4 de Fermat. Usando el algoritmo extendido de Euclides, cada usuario calcula su clave privada d. Alicia calcula dA = inv [eA, phi(nA)], y Bernardo calcula dB = inv [(eB, phi(nB)]. Alicia y Bernardo hacen público el cuerpo o módulo de cifra n y su clave pública e y guardan en secreto la clave privada d. Además, también guardan en secreto los primos p y q, que le servirán para acelerar la operación de descifrado mediante el Teorema Chino de los Restos. Si las claves públicas y privadas de Alicia y Bernardo son las que se indican, Alicia podría realizar las dos siguientes operaciones criptográficas: Primero. Enviar el número secreto N igual a 1.234 a Bernardo. Calcula N^eB mod nB, que será el criptograma C, es decir, 1.234^17 mod 46.031 = 15.017. Bernardo recuperará ese número secreto calculando C^dB mod nB, es decir, 15.017^37.553 mod 46.031 = 1.234. Segundo. Firmar un documento representado por el número 4.321, resultado de aplicar una función hash a dicho documento. El criptograma C será igual a h(M)^dA mod nA, es decir, 4.321^23.131 mod 42.593 = 8.162 Bernardo comprobará la firma de Alicia calculando C^eA mod nA, es decir, 8.162^31 mod 42.593 = 4.321. No. Con RSA siempre cifraremos números. Como RSA es un algoritmo de clave pública y su velocidad es unas 1.000 veces menor que la de los algoritmos simétricos o de clave secreta, en la práctica nunca cifraremos mensajes con RSA, salvo como ejercicio de laboratorio. En ese caso, dado que la cifra debe hacerse siempre sobre números que formen parte del cuerpo de cifra o módulo n, deberíamos codificar el mensaje y agrupar bits o bytes, de forma que el bloque a cifrar sea siempre menor que n Ataques a RSA: en RSA existirán algunos números que no se cifrarán, es decir, que al cifrarlos se transmiten en claro. A ese conjunto se le llama números no cifrables NNC. Siempre existirán como mínimo 9 números no cifrables; a saber, el 0, el 1, el n-1 y otros 6 más que no se conocen. Para encontrar estos números, habrá que realizar un ataque por fuerza bruta a los primos p y q, algo intratable para valores actuales de 512 bits mínimo. Podremos conocer la cantidad de esos números, pero no sus valores. Puesto que estos valores no cifrables se distribuyen en todo el espacio n de la clave, y que el número que se cifra por lo general es una clave de sesión simétrica o bien el hash para la firma digital, en ambos casos tan sólo de unas centenas de bits, la probabilidad de que en una clave de al menos mil bits uno de sus números no cifrables sea precisamente ese número de tan pocas centenas de bits, es completamente despreciable. Por lo tanto, para valores reales, esta particularidad no se traduce en una vulnerabilidad del sistema. Las claves privadas parejas CPP son un conjunto de números que cumplen la misma función que la clave privada. Es decir, descifran lo que se ha cifrado con la clave pública en un intercambio de clave, al igual que lo hace la propia clave privada. Sucedería lo mismo en el caso de una firma digital, puesto que permitirían firmar un hash sin usar la clave privada del firmante, sino otro número. En RSA siempre existirá como mínimo una clave privada pareja. A diferencia de los números no cifrables, las claves privadas parejas pueden conocerse y entre ellas existirá una separación constante, siendo una de ellas precisamente la clave privada. No obstante, no debemos preocuparnos por ello ya que todas ellas se encontrarán muy cerca del cuerpo de cifra de al menos 1.024 bits y, por lo tanto, será imposible adivinar esos valores. Nuevamente, para claves reales, esto no puede considerarse una vulnerabilidad. Observa que, al igual que existen claves privadas parejas, existirá el mismo número de claves públicas parejas. Al ser públicas, puede parecer que esto no tiene mayor importancia; sin embargo, ello nos permitiría comprobar una firma digital sobre un documento con un número diferente al de la clave pública del emisor, conocida y aceptada por todos. Una situación que podría poner en entredicho la idoneidad del sistema ante terceros, en tanto dichos valores de claves parejas se desconocen y no son públicos. Los ataques por factorización y paradoja del cumpleaños, permitirían romper RSA al encontrar la clave privada, no aplicando fuerza bruta. Al factorizar el módulo n y conocer así los primos p y q, se podrá calcular la clave privada d simplemente usando el algoritmo extendido de Euclides. En el caso del ataque mediante la paradoja del cumpleaños, se encontrará directamente el valor de la clave privada, o bien una clave privada pareja. Por su parte, un ataque mediante el cifrado cíclico, permitiría encontrar el mensaje secreto cifrado con RSA, sin necesidad de conocer la clave privada del destinatario o víctima. Pero, a diferencia de los otros dos, no se romperá el sistema de cifra. Hay que tener en cuenta que para las claves RSA actuales, con un cuerpo de cifra de al menos 1.024 bits, ninguno de estos tres ataques son viables. Elgamal: en 1985, el investigador egipcio Taher Elgamal propone sendos algoritmos de cifra y firma digital que llevan su nombre. Aunque el algoritmo es seguro, no logra desbancar a RSA como estándar de cifra, si bien una variación de su algoritmo de firma, conocido como DSS, se establece como estándar de firma digital por el NIST en 1994. Como el algoritmo de Elgamal se basa en el problema del logaritmo discreto, cada usuario elegirá como cuerpo de cifra un primo p grande y una raíz primitiva alfa del mismo. Ambos números serán públicos. Hecho esto, cada usuario elegirá como clave privada un número aleatorio dentro de p, conocido genéricamente como lambda, y calculará su clave pública beta como alfa ^ lambda mod p. Al igual que el sistema de Diffie y Hellman, la seguridad del algoritmo reside en que para descubrir la clave privada lambda, conocidos los valores públicos p, alfa y beta, el atacante deberá enfrentarse al problema del logaritmo discreto en un primo grande, un problema intratable con la capacidad de cómputo actual para los valores cercanos a los mil bits. Si Alicia desea enviar el número N confidencialmente a Bernardo, por ejemplo una clave de sesión en Internet, realizará las operaciones que se indican a continuación: Alicia hará uso de la clave pública de Bernardo, es decir, el módulo p_B, el generador alfa_B y la clave pública beta_B. Además, usará un número aleatorio ni que ella misma generará. Como se observa, Alicia enviará a Bernardo dos valores dentro del cuerpo de cifra p. Para el descifrado del criptograma, Bernardo utilizará su clave privada b, que le permitirá deshacer la cifra que ha realizado Alicia. Observa que para despejar el valor del secreto N de la ecuación, es necesario realizar una operación de división, que está permitida en este caso porque en realidad se multiplica por el inverso. Recuerda que en Elgamal el cuerpo de cifra es un primo, por lo que todos los posibles valores de las operaciones modulares tendrán un inverso asegurado. Si Alicia desea enviar a Bernardo un mensaje M firmado digitalmente, primero calculará el hash de ese mensaje h(M) y después lo cifrará usando su clave privada a, según el proceso que se indica. Para ello, Alicia generará un valor aleatorio conocido como H, que no tiene factores en común con el indicador de Euler phi de p_A. Ahora calcula r, la primera parte de la firma, y tras resolver una congruencia en phi de p_A en la que interviene el hash del mensaje, obtiene la segunda parte de esa firma, el valor s. Hecho esto, Alicia enviará a Bernardo el texto en claro M y esos dos valores, r y s. Para comprobar la firma de Alicia, Bernardo usará la clave pública de Alicia, es decir, p_A, alfa_A y beta_A. Bernardo, después de realizar los cálculos que se indican sobre los valores de r y s recibidos, obtiene un valor K. Calculará ahora en destino el hash del texto en claro recibido, que llamaremos M' por que podría ser distinto al mensaje M original enviado, obteniendo h(M'). Finalmente, comprueba si el valor K encontrado anteriormente, es igual al resultado de la operación alfa_A ^ h(M') mod p_A. Si ambos valores coinciden, Bernardo comprueba que la firma de Alicia es correcta y válida. Hash Genera un valor único a partir de un mensaje muy largo llamado resumen de mensaje. El remitente puede enviar el mensaje junto a este resumen, para que el destinatario pueda verificar la integridad de los datos. Este resumen siempre es del mismo tamaño, independientemente del mensaje. Si al hacerle hash al mensaje recibido los resúmenes coinciden, se puede afirmar que no se alteró. Los mensajes deben ser idénticos para que se obtenga el mismo resumen. Esto es ampliamente utilizado en firma digital y no hace uso de claves, por lo que no es un algoritmo de cifra. Es utilizado para la firma digital porque emula un huella en forma de bits y es útil para la autenticación. También es usado para almacenar en servidores contraseñas, para evitar el robo de las mismas. Propiedades Unidireccionalidad: a partir del hash no poder averiguar el mensaje. Compresión: comprimir el mensaje que, en general, tendrá más bits que el resumen. Facilidad de cálculo: es fácil y rápido. Difusión de bits: el resumen debe ser una función compleja de todos los bits del mensaje. Si se modifica un bit debería cambiar en la mitad (otro dijo por ahí la mitad) de sus bits con respecto al anterior. Resistencia débil a colisiones: sólo se cumplirá si es computacionalmente imposible que conocido un mensaje M encontremos un mensaje M´ que tengan como resultado el mismo hash. Resistencia fuerte a colisiones: nos indica que es computacionalmente imposible que conocido un mensaje M encontremos un mensaje M´ que tengan como resultado el mismo hash. Si esto no se cumple será débil ante la paradoja del cumpleaños. Versiones de Hash MD5: las siglas MD5 corresponden a Message Digest número 5, un algoritmo de resumen desarrollado en 1991 por Ron Rivest. Aunque ha sido muy popular, entre otras razones por su alta velocidad, desde sus comienzos se detectaron algunos fallos en el diseño. Con el paso de los años y el aumento en la capacidad de cómputo, estos fallos se han convertido en graves, razón por la cual hoy en día no es recomendable su uso. El hash MD5 entrega un resumen de 128 bits, esto es 32 caracteres hexadecimales, independientemente del tamaño que tenga el archivo de entrada. El mensaje se agrupa en bloques de 512 bits, con 16 palabras de 32 bits. Para completar el último bloque de 512 bits, se aplicará un relleno de un uno seguido de tantos ceros como haga falta, reservando los últimos 64 bits para indicar el tamaño del mensaje o archivo. Internamente, MD5 trata las palabras en representación little endian, es decir, primero se leen los bytes menos significativos y después los bytes más significativos. Por lo tanto, la palabra de 32 bits Amor, que en hexadecimal es 41 6D 6F 72, se leerá 72 6F 6D 41. MD5 usa 4 vectores públicos de 32 bits cada uno, conocidos como A, B, C y D, y que se mezclarán con las 16 palabras del texto en claro, también de 32 bits, realizando para cada bloque de entrada de 512 bits un total de 64 vueltas. Terminadas las primeras 64 vueltas, los vectores iniciales ABCD habrán cambiado varias veces de valor, y serán los nuevos 4 vectores que se mezclarán con el segundo bloque de 512 bits de entrada. Esta acción se va encadenando con los siguientes bloques, hasta que el último valor de los vectores ABCD es el resumen de 128 bits de todo el documento. A cada bloque del texto de entrada se le aplicarán 16 vueltas con 4 funciones distintas, de forma tal que el número total de vueltas por bloque será igual a 16*4 = 64. La seguridad de MD5 ante ataques basados en la paradoja del cumpleaños, tiene una fortaleza teórica igual a 2^(128/2) es decir, 2^64 intentos. No obstante, hoy en día ésta se ha reducido a menos de 2^24, un valor extremadamente pequeño. Existen infinidad de ejemplos de colisiones para MD5, estos últimos 10 años los ataques incluso han permitido generar dos certificados digitales X.509 distintos, pero cuyo hash MD5 sobre el que se firmará digitalmente su integridad, colisiona. Por lo tanto, ambos certificados, el verdadero y el falso, serían válidos ante un tercero, porque los ha firmado una Autoridad Certificadora, con todos los peligros que esto conlleva. NTLM: 128 bits de resumen, para Windows. En esta versión hay colisiones, el administrador puede ver que dos usuarios tienen la misma contraseña. SHA1: las siglas SHA corresponden a algoritmo de hash seguro. Un algoritmo de resumen propuesto por la NSA y adoptado como estándar federal por el NIST en 1993. Antes de los dos años se detectan vulnerabilidades, por lo que en 1995 proponen un nuevo algoritmo conocido como SHA-1, pasando el anterior a denominarse SHA-0 y no recomendarse su uso. Aunque el diseño de SHA-1 es muy similar al de MD5, entregará un resumen de 160 bits en vez de los 128 de MD5, y su fortaleza es también mayor. Al igual que MD5, el mensaje se agrupa en bloques de 512 bits, con 16 palabras de 32 bits. Para completar el último bloque de 512 bits, se aplicará un relleno de un uno seguido de tantos ceros como haga falta, reservando los últimos 64 bits para indicar el tamaño del mensaje o archivo. Internamente, SHA-1 trata las palabras en representación big endian, es decir, primero se leen los bytes más significativos y después los bytes menos significativos, que en el fondo es la forma natural de hacerlo. Por lo tanto, la palabra de 32 bits Amor, que en hexadecimal es 41 6D 6F 72, se leerá 41 6D 6F 72. SHA-1 utiliza 5 vectores públicos de 32 bits, conocidos como A, B, C, D y E, que se mezclarán con las palabras del texto en claro, también de 32 bits, realizando para cada bloque de entrada de 512 bits un total de 80 vueltas. Terminadas las primeras 80 vueltas, los vectores iniciales A, B, C, D, E, habrán cambiado varias veces de valor y serán los nuevos 5 vectores que se mezclarán con el segundo bloque de 512 bits de entrada. Esta acción se va encadenando con los siguientes bloques, hasta que el último valor de los vectores A, B, C, D, E es el resumen de 160 bits de todo el documento. A cada bloque del texto de entrada se le aplicarán 20 vueltas, con 4 funciones distintas, de forma tal que el número total de vueltas por bloque será igual a 20*4 = 80. Pero, ¿cómo podemos generar 80 palabras de 32 bits a partir sólo de los 512 bits de entrada? Cada bloque de 16 palabras del mensaje se expandirá en 80 palabras, de forma que las palabras de 0 a 15 se corresponde a los 512 bits del bloque, y las 64 palabras restantes, de la 16 hasta la 79, se obtienen mediante una operación lógica entre las palabras anteriores. La siguiente animación muestra las operaciones que se realizan sobre cada bloque de entrada en SHA-1, así como los desplazamientos del registro de vectores. La fortaleza de SHA-1 ante ataques basados en la paradoja del cumpleaños, se ha visto hoy en día mermada desde los hipotéticos 2^(160/2), esto es 2^80 intentos, a menos de 2^50, un valor preocupante. SHA2 Y SHA3: MD5 y SHA1 no son seguro, pero pasarán algunos años hasta que se generalice el uso del nuevo estándar SHA-3, ¿qué hacemos? La solución temporal es usar la familia SHA-2, en sus diferentes versiones. La NSA desarrolla en 2001 una familia de algoritmos hash conocida como SHA-2, que consiste en un conjunto de cuatro funciones hash de 224, 256, 384 y 512 bits. En los hashes de 224 y de 256 bits, se trabaja con palabras de 32 bits, los bloques de entrada son de 512 bits y se realizan 64 vueltas. En cambio, en los hashes de 384 y de 512 bits, se trabaja con palabras de 64 bits, la entrada es de 1.024 bits y se realizan 80 vueltas. Como se observa en la animación de SHA-256, se usan 8 vectores de 32 bits cada uno, por lo que el resumen será de 8x32 = 256 bits. Las operaciones en color azul son similares a las de MD5 y SHA-1, Wt son 64 palabras de 32 bits que se obtienen de una forma similar a como lo hace la expansión en SHA-1, se cuenta con 64 constantes Kt y la suma sigue siendo mod 2^32. En diciembre de 2010, el NIST selecciona el algoritmo Keccak, siendo declarado como estándar mundial en agosto de 2015 por ese mismo organismo y llamado SHA-3. El algoritmo SHA-3 no tiene un esquema como los de la familia SHA y MD5. Se trata de un sistema conocido como esponja, en el que la entrada es una cadena de bits de cualquier longitud, que son absorbidos por esa esponja, y se obtiene una salida del tamaño de bits que se desee, simplemente exprimiendola. En su concepción, el algoritmo es bastante más complejo e internamente funciona como un array de tres dimensiones, con movimientos de permutación similares a los que se realizan sobre un cubo de Rubik. La siguiente figura muestra la fortaleza de las funciones hash más conocidas, basadas en el ataque por la paradoja del cumpleaños, sus valores teóricos y los que en realidad hoy se han alcanzado. En Linux, se usa un mecanismo un poco más completo, se guarda el hash de la contraseña del usuario concatenada (la contraseña) con algo llamado “salt”. Que es un valor aleatorio anexado al usuario al crear su cuenta. Las versiones actuales de Linux usan SHA512 y las más viejas SHA256 y MD5. Firma Digital Es un mecanismo por el cual un receptor puede validar la identidad o el origen de un mensaje, aporta autenticación y no repudio, y se basa en la criptografía simétrica. Si queremos autenticación se cifra con la clave privada del emisor y si queremos confidencialidad se cifra con la clave pública del receptor. La clave pública de uno solo puede ser descifrado con la clave privada del mismo. Si Bob quiere garantizar a otros usuarios que un mensaje con su nombre fue enviado por él, primero crea un resumen con un algoritmo de hash, luego encripta el mensaje con su clave privada y cualquier usuario puede verificar la firma si descifra el resumen usando la clave pública de Bob y verifica que el mensaje descifrado sea exacto. Ataques La forma más común de controlar el acceso a las computadoras son las contraseñas, pero pueden ser descubiertas o evadir los sistemas de autenticación. En los inicios de los sistemas informáticos las contraseñas son almacenadas en texto en claro, sin protección criptográficas. Esto era muy peligroso ante robos y porque los administradores del sistema podían ver la contraseña de los usuarios. A partir de esto, se empezó a almacenar las contraseñas cifradas, pero esto no evitaba que el administrador las descifrara con una llave del sistema. Ataque de fuerza bruta y de diccionario: intentan de forma repetida adivinar la contraseña. El ataque de fuerza bruta va probando todas las contraseñas, haciendo combinaciones de caracteres. El diccionario es a partir de un listado de palabras pregeneradas. En diccionario los intentos son menores, pero más elaborados. Ambos pueden ser online o offline. Online es cuando se trata de adivinar la contraseña interactuando directamente con el sistema hasta obtener una respuesta positiva. Existen herramientas que permiten esto: Hydra Bruteforce y Ncrack. Una opción para combatir esto es bloquear una cuenta por un tiempo si hay demasiados intentos fallidos. Esto último puede ser contraproducente, porque el atacante puede hacerlo adrede para causar una denegación de servicio. A nivel Offline, es cuando el atacante pudo conseguir el repositorio de las cuentas de usuarios. El atacante prueba contraseñas, calcula el hash de las mismas y verifica coincidencias. Tenemos como herramienta para esto John the Ripper. En general se hacen ataques híbridos, es decir se diccionario y si no funciona se fuerza bruta. Ataque del arcoiris o rainbow: optimiza el ataque offline mediante el uso de tablas arcoiris, que son valores hash precalculados. Son bases de datos bastante grandes. Esto hace que no se deba calcular el hash en cada intento para adivinar la contraseña, que puede llegar a ser tedioso, y se hace la comparación directa. En contraseñas de 8 bits la probabilidad de éxito de este ataque es de 96.8%. Esto se puede reducir con el uso del salt como en sistemas Linux o contraseñas complejas y extensas. Ataque del cumpleaños: basado en la paradoja del cumpleaños. Indica que de 23 personajes hay una probabilidad del 50.7% de que dos cumplan años el mismo días y para un grupo de 57 personas o más personas es mayor que el 99.6% la probabilidad. Esto se asocia a las colisiones de hash, que significa que dos entradas diferentes entregan el mismo hash. Esto hace que se puedan usar ambas contraseñas para ingresar al sistema, aprovechando la colisión. Esto se combate con algoritmos más fuertes que entreguen hash más largos. PROTOCOLO SSH SSH o Secure Shell, es un protocolo de administración remota que le permite a los usuarios controlar y modificar sus servidores remotos a través de Internet, utilizando un mecanismo de autenticación. Es un reemplazo de Telnet y gracias a él es posible autenticar un usuario remoto, transferir entradas desde el cliente al host y retransmitir la salida de vuelta al cliente. También podemos redirigir el tráfico de X para ejecutar programas gráficos a través de la propia sesión SSH. SSH es una parte fundamental en la seguridad de las comunicaciones en entornos de red. Su principal función es proporcionar un método seguro para acceder y gestionar sistemas remotos a través de una conexión cifrada, garantizando la confidencialidad e integridad de los datos transmitidos, incluso si son interceptados. La autenticación segura es otra característica clave de SSH, utilizando métodos robustos como claves públicas y contraseñas para lograrlo. Además, SSH no solo se limita al acceso remoto, sino que facilita la transferencia segura de archivos mediante herramientas SCP y SFTP, y permite copiar datos de manera segura, tanto archivos como carpetas, a través del protocolo SFTP (SSH FTP), un protocolo hecho desde cero y que no tiene nada que ver con FTPS o FTPES (FTP sobre SSL/TLS). SSH utiliza por defecto el protocolo TCP de la capa de transporte, y el puerto 22, no obstante, podremos cambiar el número de puerto para mitigar posibles escaneos de bots al servicio SSH. En resumen, SSH proporciona: Confidencialidad (los datos van cifrados punto a punto). Autenticación (podremos autenticarnos frente al servidor SSH de múltiples maneras: con usuario/clave, criptografía de clave pública e incluso podremos configurar un segundo factor de autenticación). Integridad (si los datos se modifican o los modifica un usuario malintencionado se podrá detectar, ya que usa HMAC para comprobar la integridad de todos y cada uno de los datos). Funcionamiento: 1. Cliente y Servidor coinciden en un número primo muy grande. Este número se conoce como “valor semilla” (seed value). 2. Ambas partes acuerdan un mecanismo de cifrado común para generar otro conjunto de valores manipulando los valores semillas mediante algún algoritmo como por ejemplo AES. 3. Las partes generan de forma independiente, otro número primo independiente que se usa para producir una clave privada secreta para la interacción. 4. La clave privada y el algoritmo de cifrado (AES), se usan para calcular una clave pública que se distribuye a la otra computadora. 5. Las partes usan su clave privada personal, la clave pública compartida de la otra máquina y el número primo original para crear una clave compartida final. Esta clave se calcula de forma independiente en ambos equipos, pero producirá la misma clave de cifrado en ambos lados. 6. Ahora que ambas partes tienen una clave compartida, pueden cifrar sistemáticamente toda la sesión SSH. La misma clave se puede usar para cifrar y descifrar. Negociación de cifrados: cuando un cliente intenta conectarse al servidor a través de TCP, el servidor presenta los protocolos de cifrado y las versiones respectivas que soporta. Si el cliente tiene un par similar de protocolo y versión, se alcanza un acuerdo y se inicia la conexión con el protocolo aceptado. El servidor también usa una clave pública asimétrica que el cliente puede usar para verificar la autenticidad del host. Una vez establecido esto, las dos partes usan el algoritmo de claves Diffie-Hellman para crear una clave simétrica. Así el cliente y el servidor llegan a una clave de cifrado compartida que se usará en adelante para cifrar toda la sesión de comunicación. Ventajas: Multiplataforma: puede ser implementado en diferentes sistemas operativos de forma estándar, lo cual hace que la creación de canales seguros entre diferentes equipos, tanto locales como remotos, sea más sencilla. Administración: da la posibilidad de administrar routers, servidores, plataformas de virtualización y otros Sistemas Operativos. Conexión: este protocolo se utiliza para conectarse a servidores y realizar cambios sobre los mismos desde un terminal. Sus claves SSH pueden ayudar a automatizar estos accesos, que en muchas ocasiones utilizan scripts, diferentes sistemas de backup y otras herramientas de gestión para la configuración. Criptografía: todo el tráfico generado al utilizar este protocolo está encriptado. Desde la transferencia de un archivo, navegar por internet o ejecutar algún tipo de comando, todo se encuentra protegido. Puesto que su diseño es para poder realizar gestiones y trabajar más allá del propio lugar donde se encuentra el usuario, las claves SSH hacen que el inicio de sesión sea único, por lo cual los usuarios pueden cambiar entre diferentes cuentas sin necesidad de introducir contraseñas para cada uno. Flexibilidad: Este es muy utilizado para ejecutar scripts y otros software que permiten a los programas y sistemas acceder a los datos que establezcamos y a los recursos de forma remota, sin perder seguridad. Desventajas: Complejidad de configuración: usuarios sin experiencia en la administración de sistemas podrían tener serios problemas para configurar un protocolo SSH. Gestión de claves: del mismo modo, en entornos con muchos usuarios y servidores, la gestión de las claves puede ser complicada y aburrida por su distribución, rotación y revocación de las mismas. Fuerza bruta y ataques de diccionario: este tipo de protocolos son objetivos comunes de este tipo de ataques, por lo que la seguridad se reduce bastante al usarlos y podríamos ser vulnerables si no adoptamos otras medidas Rendimiento en conexiones lentas: SSH puede experimentar problemas de rendimiento en redes de baja velocidad o alta latencia, afectando la transferencia de datos. Sobrecarga por cifrado: el cifrado y descifrado de datos en tiempo real podría potenciar la lentitud de la conexión. Interfaz de línea de comandos: SSH es principalmente una herramienta de línea de comandos, lo que puede ser una desventaja muy importante para usuarios que no están acostumbrado a ello. Caídas de conexión: Las conexiones SSH pueden ser interrumpidas por problemas de red, lo que podría estropear e interrumpir mucho trabajo. OpenSSH Hay que tener en cuenta que OpenSSH (Open Secure Shell) es una herramienta gratuita de código abierto para el protocolo SSH, disponible para sistemas operativos basados en Unix y Linux. Es el programa servidor/cliente SSH más utilizado por los routers, switches, servidores, etc. OpenSSH ofrece: alta configuración del servidor SSH. se puede usar el cliente SSH de esta herramienta para conectarse a un servidor remoto. Al utilizarlo, se recomienda: Actualizaciones: Mantener todos los sistemas actualizados a la última versión es crucial. Estas van a incluir mejoras de seguridad y corrección de errores, por lo cual es importante mantenerse al día. Utilizar claves SSH: Lo mejor es generar el par de claves, entre la pública y la privada, y configurar el servidor para que solo permita la autenticación mediante estos mismos códigos. Por lo cual, los accesos no autorizados serán mucho más complicados. Contraseñas seguras: En caso de que optemos por utilizar contraseñas, estas deben ser todo lo robustas posibles. Cambio de puertos: El SSH de forma predefinida utiliza el puerto 22. Realizar el cambio por uno que sea menos común, puede dificultar mucho los intentos de accesos no autorizados. Limitar accesos por IP: Es recomendable establecer limitaciones. Permitir solo las conexiones desde las direcciones IP específicas o rango de las mismas, hará que el acceso sea mucho más exclusivo. OpenSSH utiliza tres tipos de cifrado, lo que es una ventaja ofrecida por este protocolo para asegurar las transferencias de información entre el host y el cliente. Simétrico: ya se ha mencionado en este documentos anteriormente. Lo que hace que este algoritmo sea seguro, es que la clave no se transmite entre el cliente y el host. En su defecto, ambos comparten datos públicos y luego los manipulan para realizar el cálculo de la clave secreta de forma independiente. En el caso de que otro equipo capture los datos compartidos, no podrá calcular dicha clave, pues el algoritmo no es conocido. Asimétrico: aquí cabe mencionar que el cifrado asimétrico no se usa para cifrar la conexión SSH por completo, en su lugar solo se usa durante el intercambio de claves. Antes de iniciar la conexión se genera el par de claves temporales y se comparten las claves privadas para poder generar la clave secreta, y poder realizar la conexión. Hash: ○ Garantía de integridad de los datos: durante la comunicación SSH, se utilizan algoritmos de hash para garantizar que los datos transmitidos no hayan sido modificados durante la transmisión. Antes de enviar los datos, se calcula un resumen criptográfico (hash) de los mismos utilizando algoritmos como SHA-256. Al llegar al destino, se recalcula el hash y se compara con el hash recibido para verificar la integridad de los datos. ○ Autenticación del servidor: en SSH, el servidor envía su clave pública al cliente para que este pueda verificar su identidad durante la conexión. Para aumentar la confianza en la clave pública del servidor, se envía también un resumen (hash) de la misma, calculado con algoritmos de hash como SHA-256. El cliente puede verificar que la clave pública recibida coincide con su hash correspondiente, lo que ayuda a detectar posibles intentos de suplantación de identidad del servidor. Instalación y puesta en marcha del servidor OpenSSH: Lo primero es verificar que está instalado con aptitude search ssh, esto muestra: La sigla i significa que está instalado, p purgado (eliminado) y v virtual (paquetes que se instalarán al instalar alguno de los otros servicios). Una vez instalado, lo utilizamos de la siguiente forma: ssh {user}@{host} El comando ssh le indica al sistema que se abrirá una conexión segura y cifrada, {user} es el nombre de la cuenta a la que queremos entrar y {host} es la dirección IP o el nombre de dominio del equipo al que nos vamos a conectar. Ejemplos: ssh [email protected] o también ssh [email protected] Nota: el host es el servidor remoto al que nos queremos conectar, mientras que el cliente es el equipo que estamos usando para acceder al host. En caso de no tener ssh instalado, debemos: Al querer realizar la configuración de SSH, debemos modificar el siguiente archivo: En el siguiente archivo se encuentran las claves públicas y los hosts conocidos. También es donde se pueden configurar las claves criptográficas RSA/DSA. Es un directorio oculto y hay un directorio por cada usuario que haya en el sistema operativo y que se conecte a un servidor remoto. Instrucciones para arrancar, apagar y reiniciar el servidor: Al momento de configurar SSH, debemos poner en sshd_config las siguientes configuraciones para máxima seguridad: Por defecto, los bots siempre intentan atacar el puerto 22 y al usuario «root», por eso debemos: 1. Cambiar el puerto 22 por defecto: Port 22445 2. Bloquear el acceso root en las conexiones remotas: PermitRootLogin no Desactivando al propio usuario root, y usando «sudo» para elevar a permisos de superusuario, evitaremos esto. También podemos optar por «PermitRootLogin without-password» donde se permite autenticación pero no con usuario y contraseña, sino con claves criptográficas RSA. 3. Delimitar tiempo permitido para establecer la contraseña: LoginGraceTime n 4. Establecer números de intentos permitidos para introducir la contraseña: MaxAuthTries n 5. Establecer números de logins permitidos simultáneos desde una IP, para evitar la fuerza bruta con varias sesiones a la vez: MaxStartups n 6. Delimitar en un lista los usuarios permitidos, los usuarios que en ella no figuren no podrán conectarse: AllowUsers 7. Delimitar en una “lista negra” los usuarios denegados, los usuarios que en ella no figuren podrán conectarse: DenyUsers 8. Lo mismo que en los dos casos anteriores, pero en grupos de usuarios: AllowGroups/DenyUsers Formas de autenticación Usuario y clave Habilitarlo: PasswordAuthentication yes Deshabilitar: PasswordAuthentication no Al deshabilitarlo, para no quedarnos sin acceso al servidor, debemos permitir el inicio de sesión con claves criptográficas. Si solo vamos a acceder por claves criptográficas, podemos negar conexiones donde se interactúe por teclado: ChallengeResponseAuthentication no Clave pública (mediante criptografía y sin poner contraseñas) Habilitarlo: PubkeyAuthentication yes En este punto, se debe permitir (de momento) la autenticación con usuario/clave. Desde el ordenador donde nos queramos conectar al servidor con claves criptográficas, debemos crear dichas claves y pasárselas al servidor. Para crear unas claves RSA de 4096 bits tenemos que poner en el cliente SSH la siguiente orden: Posteriormente nos permitirá poner a la clave privada una contraseña de paso, de esta forma, si perdemos la llave privada no pasará nada porque no podrán conectarse, debido a que es necesario siempre introducir una contraseña de paso para poder realizar la conexión correctamente. Una vez que hayamos creado la clave pública y privada en nuestro equipo, debemos enviar la clave pública al servidor SSH donde nos queramos conectar: En esta salida, el usuario deberá confirmar que quiere añadir la identidad e introducir las credenciales de login para la cuenta que se quiere utilizar en ese servicio. Por este motivo es importante que en el servidor aún mantengamos la posibilidad de autenticarnos con usuario/clave. Una vez completado este proceso, tendríamos que ser capaces de hacer inicio de sesión en este equipo sin introducir la contraseña: Recordar poner la directiva «PasswordAuthentication no» para no permitir accesos vía usuario y clave. Usuario y clave con One Time Password (verificación en dos pasos) Autenticación con usuario/contraseña y un OTP con Google Authenticator o Latch OTP para entrar en la sesión. Lo primero que debemos hacer es instalar dependencias necesarias: Una vez que las dependencias están instaladas en nuestro sistema ya podemos descargar el software para la doble autenticación: Ya tenemos instalado Google Authenticator en nuestro sistema operativo. Los siguientes pasos a seguir son la configuración de la herramienta para poderla utilizar en nuestro SSH. Para comenzar con la configuración de Google Authenticator simplemente debemos teclear en el terminal: A continuación veremos un sencillo asistente desde el terminal. Lo primero que nos preguntará es si queremos que nuestros tokens de acceso estén basados en el tiempo. A continuación veremos la clave privada, la clave de verificación y los códigos de emergencia si no tenemos nuestro móvil a mano. Debemos guardar todos estos datos de forma segura de manera que podamos recuperar el acceso en caso de pérdida de la clave de autenticación. Después le decimos que guarde los cambios en el archivo de nuestra carpeta /home y nos preguntará si queremos que cada token sea utilizado una única vez, aunque eso limite a un inicio de sesión cada 30 segundos. Para protegernos frente a posibles ataques MITM seleccionamos que sí. Por último, nos preguntará si queremos ampliar el periodo de validez de cada código en lugar de solo 1 minuto y 30 segundos (para evitar problemas de sincronización de tiempo). Para evitar ataques de fuerza bruta también podemos limitar las conexiones a 3 por cada 30 segundos. El siguiente paso que debemos hacer es abrir el fichero de configuración de «sshd» para indicarle que utilice este módulo para el inicio de sesión. Y añadiremos al final del fichero la siguiente línea: Guardamos los cambios y abrimos el fichero sshd_config con el siguiente comando: Y cambiamos la línea «ChallengeResponseAuthentication no» por «ChallengeResponseAuthentication yes». Reiniciamos el servidor con «sudo /etc/init.d/ssh restart» y una vez que vuelva a arrancar, ya tendremos la autenticación en dos pasos habilitada. NETPLAN Utilidad para configurar fácilmente redes en Linux. Utiliza ficheros de configuración.yamp, un lenguaje de marca inspirado en xml. Todos tienen que estar en la carpeta /etc/netplan En la anterior carpeta hay un fichero yamp que contiene todos los demás ficheros yamp. Nosotros podemos configurar el adaptador de red como direccionamiento estático o dinámico (por DHCP) en este archivo. En el caso de dinámico: Nota: no es tabulación, sino 2, 4 o 6 espacios en función del nivel. netplan apply: revisa la sintaxis del archivo y si es correcta lo guarda, lo actualiza. netplan generate: revisa únicamente sintaxis. ip addresses show (o ip ad en su versión reducida): permite ver los nombres de nuestros adaptadores de red. En el ejemplo siguiente lo y enp0s3 (siendo dinámico), el primero es uno virtual que se utiliza para que los sistemas puedan conectarse consigo mismos: ip route show (o ip ro en su versión reducida): permite ver el gateway. En el caso de direccionamiento dinámico para el adaptador de red: En este caso se muestran dos adaptadores de red estáticos configurados en el mismo archivo, podrían ser dos archivos distintos.yamp en el mismo fichero. En el caso de addresses son las direcciones DNS. También podemos querer dar prioridad en el enrutamiento cuando son dinámicos, es decir, con DHCP, para esto indicamos el de mayor prioridad con el menor número en route-metric: