Nie wierzę, że można uruchomić Postgresa w „trybie FIPS” ze względu na użycie niezatwierdzonej kryptografii. Z poprzedniego audytu wiem, że w szerokim zakresie wykorzystuje MD5 (patrz na przykład Lista mailingowa Postgres:korzystanie z MD5 . Tak więc wiele rzeczy zepsuje się w praktyce.
Niezależnie od tego, oto kroki, aby spróbować to zrobić za pośrednictwem OpenSSL. Są trzy części, ponieważ Postgres nie obsługuje FIPS i musisz wprowadzić pewne modyfikacje w Postgresie.
Krok pierwszy
Musisz zbudować OpenSSL do konfiguracji. Jest to proces dwuetapowy. Najpierw budujesz moduł obiektowy FIPS; a po drugie, budujesz bibliotekę zgodną z FIPS.
Aby zbudować moduł obiektowy FIPS, najpierw pobierz `openssl-fips-2.n.n.tar.gz. Po rozpakowaniu wykonujesz:
./configure
make
sudo make install
Po uruchomieniu powyższych poleceń fipscanister
będzie zlokalizowany w /usr/local/ssl/fips-2.0
. Biblioteka zgodna ze standardem FIPS użyje go do zapewnienia kryptografii zatwierdzonej przez FIPS.
Po drugie, pobierasz openssl-1.n.n.tar.gz
. Po rozpakowaniu wykonujesz:
./configure fips shared <other options>
make all
sudo make install
Najważniejszą częścią jest fips
opcja podczas konfiguracji.
Po uruchomieniu powyższych poleceń będziesz mieć bibliotekę zgodną z FIPS. Biblioteka będzie znajdować się w /usr/local/ssl/lib
. Użyj libcrypto.so
i libssl.so
jak zawsze.
Biblioteka obsługująca FIPS używa fipscanister
, więc nie musisz się martwić o zawartość /usr/local/ssl/fips-2.0
. To tylko artefakt z budowy modułu obiektowego FIPS (niektóre rękoczyny).
Krok drugi
Dowiedz się, gdzie Postgres wywołuje 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();
Otwórz be-secure.c
i fe-secure.c
i dodaj wywołanie do 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();
...
}
...
}
Jeśli wywołanie FIPS_mode_set
się powiedzie, będziesz używać kryptografii FIPS Validated. Jeśli to się nie powiedzie, nadal będziesz korzystać z kryptografii OpenSSL, ale nie być kryptografią z certyfikatem FIPS.
Będziesz także musiał dodać następujące nagłówki do be-secure.c
i fe-secure.c
:
#include <openssl/opensslconf.h>
#include <openssl/fips.h>
Krok trzeci
Ostatnim krokiem jest upewnienie się, że korzystasz z biblioteki FIPS Capable Library z kroku pierwszego. Zrób to za pomocą CFLAGS
i 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>
...