PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Habilitar FIPS no banco de dados PostgreSQL


Não acredito que você possa executar o Postgres no "modo FIPS" devido ao uso de criptografia não aprovada. De uma auditoria anterior, sei que ele faz uso extensivo do MD5 (consulte, por exemplo, Lista de discussão Postgres:uso de MD5 . Então, muitas coisas vão quebrar na prática.

Não obstante, aqui estão as etapas para tentar fazê-lo via OpenSSL. Existem três partes porque o Postgres não reconhece FIPS e você precisa fazer algumas modificações no Postgres.

Primeiro passo

Você tem que construir OpenSSL para a configuração. Este é um processo de duas etapas. Primeiro você constrói o Módulo de Objetos FIPS; e, segundo, você cria a Biblioteca Capaz de FIPS.

Para construir o FIPS Object Module, primeiro você deve baixar `openssl-fips-2.n.n.tar.gz. Depois de descompactar, você executa:
./configure
make
sudo make install

Depois de executar os comandos acima, o fipscanister estará localizado em /usr/local/ssl/fips-2.0 . A FIPS Capable Library a usará para fornecer a criptografia validada por FIPS.

Segundo, você baixa openssl-1.n.n.tar.gz . Depois de descompactar, você executa:
./configure fips shared <other options>
make all
sudo make install

A parte crítica é o fips opção durante a configuração.

Depois de executar os comandos acima, você terá uma biblioteca compatível com FIPS. A biblioteca estará localizada em /usr/local/ssl/lib . Use libcrypto.so e libssl.so como sempre.

A FIPS Capable Library usa o fipscanister , então você não precisa se preocupar com o que está em /usr/local/ssl/fips-2.0 . É apenas um artefato da construção do FIPS Object Module (algumas dispensas de mão).

Etapa dois

Descubra onde o Postgres chama 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 e fe-secure.c , e adicione uma chamada para 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();
        ...
    }
    ...
}

Se a chamada para FIPS_mode_set for bem-sucedido, você estará usando a criptografia validada por FIPS. Se falhar, você ainda estará usando a criptografia do OpenSSL, mas não ser criptografia validada por FIPS.

Você também precisará adicionar os seguintes cabeçalhos a be-secure.c e fe-secure.c :
#include <openssl/opensslconf.h>
#include <openssl/fips.h>

Etapa três

A etapa final é garantir que você esteja usando a FIPS Capable Library da etapa um. Faça isso via CFLAGS e 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>
...