Saya tidak percaya Anda dapat menjalankan Postgres dalam "mode FIPS" karena penggunaan kriptografi yang tidak disetujui. Dari audit sebelumnya, saya tahu itu menggunakan MD5 secara ekstensif (lihat, misalnya, Daftar Mailing Postgres:Penggunaan MD5 . Jadi banyak hal yang akan rusak dalam latihan.
Meskipun demikian, berikut adalah langkah-langkah untuk mencoba dan melakukannya melalui OpenSSL. Ada tiga bagian karena Postgres tidak sadar FIPS, dan Anda perlu membuat beberapa modifikasi pada Postgres.
Langkah Pertama
Anda harus membangun OpenSSL untuk konfigurasi. Ini adalah proses dua langkah. Pertama Anda membangun Modul Objek FIPS; dan kedua, Anda membangun FIPS Capable Library.
Untuk membangun Modul Objek FIPS, pertama-tama Anda mengunduh `openssl-fips-2.n.n.tar.gz. Setelah membongkar, Anda melakukan:
./configure
make
sudo make install
Setelah Anda menjalankan perintah di atas, fipscanister
akan ditempatkan di /usr/local/ssl/fips-2.0
. Perpustakaan Berkemampuan FIPS akan menggunakannya untuk menyediakan Kriptografi yang Divalidasi FIPS.
Kedua, download openssl-1.n.n.tar.gz
. Setelah membongkar, Anda melakukan:
./configure fips shared <other options>
make all
sudo make install
Bagian penting adalah fips
pilihan selama konfigurasi.
Setelah Anda menjalankan perintah di atas, Anda akan memiliki FIPS Capable Library. Perpustakaan akan berlokasi di /usr/local/ssl/lib
. Gunakan libcrypto.so
dan libssl.so
seperti biasa.
Pustaka Berkemampuan FIPS menggunakan fipscanister
, jadi Anda tidak perlu khawatir tentang apa yang ada di /usr/local/ssl/fips-2.0
. Ini hanya artefak dari pembuatan Modul Objek FIPS (beberapa tangan terlepas).
Langkah Kedua
Temukan tempat Postgres memanggil 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();
Buka be-secure.c
dan fe-secure.c
, dan tambahkan panggilan ke 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();
...
}
...
}
Jika panggilan ke FIPS_mode_set
berhasil, maka Anda akan menggunakan kriptografi tervalidasi FIPS. Jika gagal, Anda masih akan menggunakan kriptografi OpenSSL, tetapi tidak menjadi kriptografi yang Divalidasi FIPS.
Anda juga perlu menambahkan header berikut ke be-secure.c
dan fe-secure.c
:
#include <openssl/opensslconf.h>
#include <openssl/fips.h>
Langkah Ketiga
Langkah terakhir adalah memastikan Anda menggunakan FIPS Capable Library dari langkah pertama. Lakukan melalui CFLAGS
dan 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>
...