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>
...