Tôi không tin rằng bạn có thể chạy Postgres ở "chế độ FIPS" vì nó sử dụng mật mã không được chấp thuận. Từ một cuộc kiểm tra trước đây, tôi biết nó sử dụng rộng rãi MD5 (ví dụ:xem Danh sách gửi thư Postgres:Sử dụng MD5 . Vì vậy, rất nhiều thứ sẽ bị phá vỡ trong thực tế.
Mặc dù vậy, đây là các bước để thử và thực hiện qua OpenSSL. Có ba phần vì Postgres không biết FIPS và bạn cần thực hiện một số sửa đổi đối với Postgres.
Bước một
Bạn phải xây dựng OpenSSL cho cấu hình. Đây là một quy trình gồm hai bước. Đầu tiên, bạn xây dựng Mô-đun đối tượng FIPS; và thứ hai, bạn xây dựng Thư viện khả dụng FIPS.
Để xây dựng Mô-đun đối tượng FIPS, trước tiên bạn tải xuống `openssl-fips-2.n.n.tar.gz. Sau khi giải nén, bạn thực hiện:
./configure
make
sudo make install
Sau khi bạn chạy các lệnh trên, fipscanister
sẽ được đặt tại /usr/local/ssl/fips-2.0
. Thư viện có khả năng FIPS sẽ sử dụng nó để cung cấp Mật mã đã được xác thực FIPS.
Thứ hai, bạn tải xuống openssl-1.n.n.tar.gz
. Sau khi giải nén, bạn thực hiện:
./configure fips shared <other options>
make all
sudo make install
Phần quan trọng là fips
trong khi định cấu hình.
Sau khi bạn chạy các lệnh trên, bạn sẽ có Thư viện khả năng FIPS. Thư viện sẽ được đặt tại /usr/local/ssl/lib
. Sử dụng libcrypto.so
và libssl.so
như mọi khi.
FIPS Capable Library sử dụng fipscanister
, vì vậy bạn không cần phải lo lắng về những gì trong /usr/local/ssl/fips-2.0
. Nó chỉ là một tạo tác từ việc xây dựng Mô-đun Đối tượng FIPS (một số từ bỏ).
Bước hai
Tìm nơi Postgres gọi 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();
Mở be-secure.c
và fe-secure.c
và thêm cuộc gọi đến 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();
...
}
...
}
Nếu cuộc gọi đến FIPS_mode_set
thành công, sau đó bạn sẽ sử dụng mật mã được xác thực FIPS. Nếu nó không thành công, bạn sẽ vẫn sử dụng mật mã của OpenSSL, nhưng nó sẽ không là mật mã được xác thực bởi FIPS.
Bạn cũng sẽ cần thêm các tiêu đề sau vào be-secure.c
và fe-secure.c
:
#include <openssl/opensslconf.h>
#include <openssl/fips.h>
Bước ba
Bước cuối cùng là đảm bảo bạn đang sử dụng FIPS Capable Library từ bước một. Làm điều đó qua CFLAGS
và 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>
...