Не вярвам, че можете да стартирате Postgres в "FIPS режим" поради използването на неодобрена криптография. От минал одит знам, че използва широко MD5 (вижте например Пощенски списък на Postgres:Използване на MD5 . Така че много неща ще се повредят на практика.
Независимо от това, ето стъпките, за да опитате да го направите чрез OpenSSL. Има три части, тъй като Postgres не познава FIPS и трябва да направите някои модификации в Postgres.
Първа стъпка
Трябва да изградите OpenSSL за конфигурацията. Това е процес от две стъпки. Първо изграждате обектния модул FIPS; и второ, изграждате библиотека с възможност за FIPS.
За да изградите обектния модул FIPS, първо изтеглете `openssl-fips-2.n.n.tar.gz. След разопаковането изпълнявате:
./configure
make
sudo make install
След като изпълните горните команди, fipscanister
ще се намира в /usr/local/ssl/fips-2.0
. Библиотеката с възможност за FIPS ще го използва, за да предостави валидирана от FIPS криптография.
Второ, изтегляте openssl-1.n.n.tar.gz
. След разопаковането изпълнявате:
./configure fips shared <other options>
make all
sudo make install
Критичната част е fips
опция по време на конфигуриране.
След като изпълните горните команди, ще имате библиотека с възможност за FIPS. Библиотеката ще се намира в /usr/local/ssl/lib
. Използвайте libcrypto.so
и libssl.so
както винаги.
Библиотеката с възможност за FIPS използва fipscanister
, така че не е нужно да се притеснявате какво има в /usr/local/ssl/fips-2.0
. Това е просто артефакт от изграждането на FIPS обектен модул (някое махане на ръка).
Втора стъпка
Намерете къде Postgres извиква 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();
Отворете be-secure.c
и fe-secure.c
и добавете извикване към 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();
...
}
...
}
Ако извикването на FIPS_mode_set
успее, тогава ще използвате криптография, валидирана от FIPS. Ако не успее, пак ще използвате криптографията на OpenSSL, но тя не да бъде валидирана от FIPS криптография.
Ще трябва също да добавите следните заглавки към be-secure.c
и fe-secure.c
:
#include <openssl/opensslconf.h>
#include <openssl/fips.h>
Трета стъпка
Последната стъпка е да се уверите, че използвате библиотеката с възможност за FIPS от първа стъпка. Направете това чрез CFLAGS
и 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>
...