PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Abilita FIPS sul database PostgreSQL

Non credo che tu possa eseguire Postgres in "modalità FIPS" a causa del suo utilizzo di crittografia non approvata. Da un audit passato, so che fa ampio uso di MD5 (vedi, ad esempio, Mailing List di Postgres:uso di MD5 . Quindi un sacco di cose si romperanno in pratica.

Nonostante ciò, ecco i passaggi per provare a farlo tramite OpenSSL. Ci sono tre parti perché Postgres non è compatibile con FIPS e devi apportare alcune modifiche a Postgres.

Fase uno

Devi creare OpenSSL per la configurazione. Questo è un processo in due fasi. Per prima cosa costruisci il modulo oggetti FIPS; e in secondo luogo, crei la libreria compatibile con FIPS.

Per creare il modulo oggetti FIPS, prima devi scaricare `openssl-fips-2.n.n.tar.gz. Dopo aver disimballato, esegui:

./configure
make
sudo make install

Dopo aver eseguito i comandi precedenti, fipscanister si troverà in /usr/local/ssl/fips-2.0 . La libreria compatibile FIPS lo utilizzerà per fornire la crittografia convalidata FIPS.

In secondo luogo, scarichi openssl-1.n.n.tar.gz . Dopo aver disimballato, esegui:

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

La parte critica è il fips opzione durante la configurazione.

Dopo aver eseguito i comandi precedenti, avrai una libreria compatibile con FIPS. La libreria si troverà in /usr/local/ssl/lib . Usa libcrypto.so e libssl.so come sempre.

La libreria compatibile con FIPS utilizza il fipscanister , quindi non devi preoccuparti di cosa c'è in /usr/local/ssl/fips-2.0 . È solo un artefatto della costruzione del modulo oggetti FIPS (qualche mano rinuncia).

Fase due

Trova dove Postgres chiama 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();

Apri be-secure.c e fe-secure.c e aggiungi una chiamata 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();
        ...
    }
    ...
}

Se la chiamata a FIPS_mode_set riesce, quindi utilizzerai la crittografia convalidata FIPS. Se fallisce, continuerai a utilizzare la crittografia di OpenSSL, ma non essere crittografia convalidata FIPS.

Dovrai anche aggiungere le seguenti intestazioni a be-secure.c e fe-secure.c :

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

Fase tre

Il passaggio finale è assicurarsi di utilizzare la libreria compatibile con FIPS dal passaggio uno. Fallo tramite 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>
...