sql >> Base de Datos >  >> RDS >> PostgreSQL

Habilitar FIPS en la base de datos PostgreSQL

No creo que pueda ejecutar Postgres en "modo FIPS" debido a su uso de criptografía no aprobada. Por una auditoría anterior, sé que hace un uso extensivo de MD5 (consulte, por ejemplo, Lista de correo de Postgres:Uso de MD5 . Así que muchas cosas se romperán en la práctica.

No obstante, estos son los pasos para intentar hacerlo a través de OpenSSL. Hay tres partes porque Postgres no es compatible con FIPS y debe realizar algunas modificaciones en Postgres.

Paso uno

Tienes que compilar OpenSSL para la configuración. Este es un proceso de dos pasos. Primero construye el módulo de objetos FIPS; y segundo, crea la biblioteca compatible con FIPS.

Para compilar el módulo de objetos FIPS, primero descargue `openssl-fips-2.n.n.tar.gz. Después de desempacar, realiza:

./configure
make
sudo make install

Después de ejecutar los comandos anteriores, el fipscanister estará ubicado en /usr/local/ssl/fips-2.0 . La biblioteca compatible con FIPS la usará para proporcionar la criptografía validada por FIPS.

En segundo lugar, descarga openssl-1.n.n.tar.gz . Después de desempacar, realiza:

./configure fips shared <other options>
make all
sudo make install

La parte crítica son los fips opción durante la configuración.

Después de ejecutar los comandos anteriores, tendrá una biblioteca compatible con FIPS. La biblioteca estará ubicada en /usr/local/ssl/lib . Usa libcrypto.so y libssl.so como siempre.

La biblioteca compatible con FIPS utiliza el fipscanister , por lo que no necesita preocuparse por lo que hay en /usr/local/ssl/fips-2.0 . Es solo un artefacto de la construcción del módulo de objetos FIPS (algunas manos renuncian).

Paso dos

Encuentra donde Postgres llama a SSL_library_init :

$ grep -R SSL_library_init *
...
src/backend/libpq/be-secure.c:      SSL_library_init();
src/interfaces/libpq/fe-secure.c:           SSL_library_init();

Abra be-secure.c y fe-secure.c y agregue una llamada a FIPS_mode_set .

/* be-secure.c, near line 725 */
static void
initialize_SSL(void)
{
    struct stat buf;

    STACK_OF(X509_NAME) *root_cert_list = NULL;

#if defined(OPENSSL_FIPS)
    int rc;
    rc = FIPS_mode();
    if(rc == 0)
    {
        rc = FIPS_mode_set(1);
        assert(1 == rc);
    }
#endif

    if (!SSL_context)
    {
#if SSLEAY_VERSION_NUMBER >= 0x0907000L
        OPENSSL_config(NULL);
#endif
        SSL_library_init();
        SSL_load_error_strings();
        ...
    }
    ...
}

Si la llamada a FIPS_mode_set tiene éxito, entonces utilizará criptografía validada por FIPS. Si falla, seguirá utilizando la criptografía de OpenSSL, pero no. ser criptografía validada por FIPS.

También deberá agregar los siguientes encabezados a be-secure.c y fe-secure.c :

#include <openssl/opensslconf.h>
#include <openssl/fips.h>

Paso tres

El paso final es asegurarse de que está utilizando la biblioteca compatible con FIPS desde el paso uno. Hágalo a través de CFLAGS y LDFLAGS :

cd postgres-9.3.2
export CFLAGS="-I/usr/local/ssl/include"
export LDFLAGS="-L/usr/local/ssl/lib"

./config --with-openssl <other options>
...