PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Włącz FIPS w bazie danych PostgreSQL

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skonfigurować replikację klastrów do klastrów dla PostgreSQL

  2. Postgres upsert:rozróżnij wiersze nowe i zaktualizowane

  3. Jak przekonwertować ciągi dat na znacznik czasu bez znajomości formatu daty?

  4. Postgres type {field type} to tylko powłoka

  5. PostgreSQL Upsert (w przypadku konfliktu) z tymi samymi wartościami w Insert i Update