Jag tror inte att du kan köra Postgres i "FIPS-läge" på grund av dess användning av icke-godkänd kryptografi. Från en tidigare revision vet jag att den använder MD5 i stor utsträckning (se till exempel Postgres e-postlista:Användning av MD5 . Så massor av saker kommer att gå sönder i praktiken.
Hur som helst, här är stegen för att försöka göra det via OpenSSL. Det finns tre delar eftersom Postgres inte är FIPS-medvetet, och du måste göra några ändringar i Postgres.
Steg ett
Du måste bygga OpenSSL för konfigurationen. Detta är en tvåstegsprocess. Först bygger du FIPS-objektmodulen; och för det andra bygger du FIPS Capable Library.
För att bygga FIPS-objektmodulen laddar du först ner `openssl-fips-2.n.n.tar.gz. Efter uppackning utför du:
./configure
make
sudo make install
När du har kört ovanstående kommandon, fipscanister
kommer att finnas i /usr/local/ssl/fips-2.0
. FIPS Capable Library kommer att använda det för att tillhandahålla FIPS-validerad kryptografi.
För det andra laddar du ner openssl-1.n.n.tar.gz
. Efter uppackning utför du:
./configure fips shared <other options>
make all
sudo make install
Den kritiska delen är fips
alternativ under konfigurering.
När du har kört ovanstående kommandon kommer du att ha ett FIPS-kapabelt bibliotek. Biblioteket kommer att finnas i /usr/local/ssl/lib
. Använd libcrypto.so
och libssl.so
som alltid.
FIPS Capable Library använder fipscanister
, så du behöver inte oroa dig för vad som finns i /usr/local/ssl/fips-2.0
. Det är bara en artefakt från att bygga FIPS Object Module (någon hand som avstår).
Steg två
Hitta var Postgres anropar 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();
Öppna be-secure.c
och fe-secure.c
, och lägg till ett anrop till 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();
...
}
...
}
Om anropet till FIPS_mode_set
lyckas, kommer du att använda FIPS-validerad kryptografi. Om det misslyckas kommer du fortfarande att använda OpenSSL:s kryptografi, men det kommer inte vara FIPS Validerad kryptografi.
Du måste också lägga till följande rubriker i be-secure.c
och fe-secure.c
:
#include <openssl/opensslconf.h>
#include <openssl/fips.h>
Steg tre
Det sista steget är att se till att du använder FIPS Capable Library från steg ett. Gör det via CFLAGS
och 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>
...