Noticias

Cómo desarrollar aplicaciones de Linux para FIPS en Ubuntu

Este es el segundo artículo de nuestra serie sobre FIPS 140 y Ubuntu. La primera parte de esta serie, este artículo, cubre la ejecución de aplicaciones FIPS 140 en Ubuntu, mientras que esta parte se centra en el desarrollo de aplicaciones FIPS 140 en Ubuntu.

¿Qué es FIPS y por qué debería importarle a un desarrollador?

El desarrollo de aplicaciones para entornos regulados y de alta seguridad puede resultar complicado. Existe una gran cantidad de software que sigue diferentes métodos y estándares de desarrollo, pero no siempre apunta a un estándar de protección de datos específico. ¿Cómo puede una gran empresa estar segura de que las aplicaciones criptográficas y las bibliotecas utilizadas están implementando correctamente la criptografía y siguiendo las mejores prácticas? FIPS 140 aborda el tema de la validación de la criptografía desde la perspectiva del regulador estadounidense. Para obtener más información sobre FIPS, lea el primer artículo sobre el tema. En esencia, el estándar FIPS 140 asegura que la criptografía se implemente utilizando diseños seguros conocidos, siga ciertas mejores prácticas, no involucre algoritmos oscuros y que esté debidamente autenticada.

¿Por qué tratar la criptografía de manera diferente?

Hay muy buenas razones para confiar en diseños seguros conocidos; Lo principal es que la criptografía es difícil y fácilmente errónea. Los pequeños errores, como el uso del modo de cifrado incorrecto, pueden significar que los datos cifrados por una aplicación también pueden reconocerse en el estado cifrado. La siguiente imagen (inspirado por la imagen en este gran artículo de Wikipedia) es un buen ejemplo de lo que puede suceder si se usa un modo de cifrado que no es apropiado para la tarea.

Imagen original Imagen encriptada con AES en modo ECB Imagen encriptada con AES en modo CTR

Obviamente, el cifrado AES en el modo Libro de códigos electrónico (ECB) no es lo suficientemente bueno para ocultar patrones en las imágenes. El modo contador (CTR) utilizado en la imagen del extremo derecho parece ser un modo de cifrado más adecuado, ¿verdad? Después de todo, el modo CTR es una parte integral de GCM, que actualmente utiliza TLS. Veamos qué sucede cuando se cifran más imágenes con el modo CTR y la misma clave.

Imagen encriptada con AES en modo CTR Imagen diferente encriptada con AES en modo CTR pero usando la misma clave que la anterior El XOR de las dos imágenes encriptadas anteriores. ¿Puedes adivinar las imágenes originales?

Se revelaron las imágenes encriptadas. Por lo tanto, incluso los modos de cifrado que se utilizan ampliamente para un propósito, como la comunicación segura, no pueden aplicarse ingenuamente a otros propósitos, como el cifrado para almacenamiento.

Sin embargo, incluso con el algoritmo y el modo más apropiados, el panorama de la seguridad cambia tan rápidamente que el software seguro de hace 10 años ya no puede resistir los ataques que explotan las vulnerabilidades recién descubiertas. Por ejemplo, los problemas de sincronización en la implementación criptográfica o los problemas de sincronización en las instrucciones de la CPU como Spectre y Meltdown no se entendían tan ampliamente como en la actualidad. Acciones como agrupar código criptográfico en una aplicación y no actualizarlo durante años «porque funciona», en última instancia, hacen que las aplicaciones se vuelvan inseguras.

Sabiendo esto, podemos ver las razones por las que el estándar FIPS 140 trata la criptografía de manera diferente.

¿Cómo puedo hacer que mi aplicación sea compatible con FIPS?

Hay dos formas en que una aplicación o solución puede ser compatible con FIPS 140. Una es diseñarlo teniendo en cuenta los requisitos de FIPS 140 y pasar por el proceso de validación / certificación criptográfica para toda la aplicación. La otra es aprovechar los componentes criptográficos validados por FIPS del sistema operativo y garantizar que la aplicación siga las instrucciones adecuadas y no introduzca nueva criptografía. Esta publicación trata sobre lo último: cómo puede usar Ubuntu para cumplir con los requisitos de FIPS 140.

¿Qué son los paquetes criptográficos validados por FIPS?

Los paquetes criptográficos validados por FIPS disponibles en Ubuntu 20.04 son los siguientes:

Nombre del paquete descripción
Fips de imagen de Linux La API de cifrado del kernel de Linux.
libssl1.1 El backend criptográfico de OpenSSL. Esto también incluye la criptografía necesaria para OpenSSH.
libgcrypt20 La biblioteca criptográfica libgcrypt.
cisne fuerte StrongSwan, la implementación de VPN IPSec.

¿Puedo desarrollar aplicaciones compatibles con FIPS con Python, Perl, Ruby y Nodejs?

La respuesta corta es sí, puede desarrollar aplicaciones usando Python, Ruby, Perl y Nodejs en Ubuntu con el paquete OpenSSL validado por FIPS. Esto se debe a que estos lenguajes utilizan OpenSSL directamente para sus operaciones criptográficas o proporcionan enlaces para ello. Por ejemplo, en Python puede utilizar la criptografía de la criptografía Python3.

¿Cómo utilizo correctamente los componentes validados por FIPS?

Además de la documentación de desarrollo, cada paquete validado contiene una política de seguridad adjunta a su certificado que proporciona instrucciones detalladas sobre cómo utilizar el módulo en la sección Guía del usuario. El documento sobre la política de seguridad se puede encontrar haciendo clic en el número de certificado en la tabla anterior en la sección «Archivos asociados». Puede encontrar todos los certificados y políticas emitidos por Canonical consultando el sitio web de NIST.

Para bibliotecas como OpenSSL y libgcrypt, estas instrucciones contienen instrucciones sobre algoritmos específicos, p. Ej.

¿Cómo puedo desarrollar con los paquetes FIPS?

Para comenzar el desarrollo, debe habilitar FIPS en una versión LTS de Ubuntu como 18.04 o 20.04 con una suscripción. Debido a que la misión de Ubuntu es llevar software gratuito a la audiencia más amplia posible, los desarrolladores independientes y las personas pueden acceder a los paquetes FIPS a través de una suscripción personal gratuita. Para el desarrollo empresarial y la ejecución de cargas de trabajo con FIPS, los paquetes validados están disponibles con Ubuntu Pro o una suscripción a Ubuntu Advantage.

Las siguientes instrucciones habilitan el modo FIPS en Ubuntu LTS e instalan la biblioteca de desarrollo openssl.

Paso 1: adjunte su suscripción

Obtenga su token de suscripción en ubuntu.com/advantage y adjúntelo a su sistema. Este paso no es necesario en Ubuntu Pro.

$ sudo apt update
$ sudo apt install ubuntu-advantage-tools
$ sudo ua attach <TOKEN>

Paso 2: active FIPS e instale los archivos de desarrollo

Este paso habilita el modo FIPS e instala los archivos de desarrollo de OpenSSL.

$ sudo ua enable fips-updates

El comando anterior esconde mucha complejidad relacionada con el modo FIPS. Instala los paquetes del repositorio FIPS y agrega una opción de línea de comandos del kernel para habilitar FIPS. Es necesario reiniciar para que el sistema se inicie en modo FIPS.

Ejecute los siguientes comandos para instalar los archivos de desarrollo de OpenSSL.

$ sudo apt update
$ sudo apt install -y libssl-dev

Paso 3: compila y ejecuta una aplicación

Desarrollar aplicaciones en sistemas habilitados para FIPS no es tan diferente de desarrollar aplicaciones en sistemas normales. Intentemos mostrar las diferencias con la siguiente aplicación de muestra y openssl. La aplicación toma un mensaje de tamaño fijo «abc» e imprime su hash.

#include <openssl/evp.h>
#include <openssl/err.h>

static
int digest_message(const unsigned char *message, size_t message_len,
		   unsigned char *output, unsigned int max_output_size,
		   const EVP_MD *type)

	EVP_MD_CTX *mdctx;
	int output_size = EVP_MD_size(type);

	if (output_size > max_output_size)
		return -1;

	if ((mdctx = EVP_MD_CTX_new()) == NULL) 
		ERR_print_errors_fp(stderr);
		return -1;
	

	if (1 != EVP_DigestInit_ex(mdctx, type, NULL)) 
		ERR_print_errors_fp(stderr);
		return -1;
	

	if (1 != EVP_DigestUpdate(mdctx, message, message_len)) 
		ERR_print_errors_fp(stderr);
		return -1;
	

	if (1 != EVP_DigestFinal_ex(mdctx, output, &output_size)) 
		ERR_print_errors_fp(stderr);
		return -1;
	

	EVP_MD_CTX_free(mdctx);

	return output_size;


int main()

	unsigned char out[64];
	int out_len;
	int i;

	out_len = digest_message("abc", 3, out, sizeof(out), EVP_md5());
	if (out_len == -1) 
		fprintf(stderr, "could not hashn");
		return 1;
	

	for (i = 0; i < out_len; i++) 
		printf("%.2x", out[i]);
	

	fputc('n', stdout);
	return 0;

Ahora intentemos compilarlo y ejecutarlo en el sistema Ubuntu en el que anteriormente habilitamos FIPS.

$ gcc app.c -lcrypto -o app && ./app
140652539485056:error:060800C8:digital envelope routines:EVP_DigestInit_ex:disabled for FIPS:../crypto/evp/digest.c:135:
could not hash

La aplicación no se pudo ejecutar y no se generó ningún hash. Esto se debe a que la aplicación utiliza el algoritmo hash MD5 heredado, que no está permitido en los sistemas habilitados para FIPS 140-2. Es decir, el modo FIPS de Ubuntu evita que las aplicaciones en OpenSSL, pero también en otros paquetes validados, utilicen algoritmos no aprobados.

Para que la aplicación genere un hash, debería reemplazar la entrada en digest_message () con un hash, que está permitido en FIPS 140-2, por ejemplo, EVP_sha256().

Anular FIPS

Prohibir que las aplicaciones utilicen algoritmos prohibidos protege al usuario del sistema de las aplicaciones que utilizan criptografía no permitida por FIPS 140-2. Sin embargo, hay casos en los que se utiliza un algoritmo criptográfico para fines no criptográficos. Por ejemplo, MD5 se usa para calcular un identificador que se usa para compatibilidad con versiones anteriores de un protocolo más antiguo que se incluye en un protocolo seguro (por ejemplo, Radius sobre TLS).

En estos casos, un desarrollador puede anular las comprobaciones internas estableciendo la bandera EVP_MD_CTX_FLAG_NON_FIPS_ALLOW. Esta bandera debe establecerse inmediatamente después de la llamada a EVP_MD_CTX_new Como se muestra abajo.

	if ((mdctx = EVP_MD_CTX_new()) == NULL) 
		ERR_print_errors_fp(stderr);
		return -1;
	

	EVP_MD_CTX_set_flags(mdctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);

	if (1 != EVP_DigestInit_ex(mdctx, type, NULL)) 
		ERR_print_errors_fp(stderr);
		return -1;
	

Verifique que la aplicación se esté ejecutando en modo FIPS

OpenSSL 1.1.1 ofrece la FIPS_mode() Función para comprobar si la biblioteca está funcionando en modo FIPS. Dado que esta función ya no está disponible en OpenSSL 3.0, un método más general para verificar que la aplicación se está ejecutando en modo FIPS es examinar el archivo /proc/sys/crypto/fips_enabled.

Si el kernel de Ubuntu FIPS está presente y se ejecuta con FIPS habilitado, el /proc/sys/crypto/fips_enabled El archivo existe y contiene el byte 0x31 (carácter ‘1’ en ASCII). En Ubuntu, esto indica que FIPS está habilitado.

Resumir

Ubuntu permite el desarrollo y ejecución de aplicaciones que cumplen con el estándar de protección de datos FIPS 140-2. El enfoque que estamos adoptando proporciona un conmutador en todo el sistema que es transparente para las aplicaciones y simplifica el desarrollo al garantizar que las aplicaciones que utilizan algoritmos no compatibles no se ejecuten. Utilice su suscripción personal gratuita o su suscripción a Ubuntu Advantage para desarrollar aplicaciones con los paquetes FIPS de Ubuntu.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba