Je ne crois pas que vous puissiez exécuter Postgres en "mode FIPS" en raison de son utilisation d'une cryptographie non approuvée. D'après un audit passé, je sais qu'il utilise largement MD5 (voir, par exemple, Liste de diffusion Postgres :utilisation de MD5 . Donc, beaucoup de choses vont casser à l'entraînement.
Néanmoins, voici les étapes pour essayer de le faire via OpenSSL. Il y a trois parties car Postgres n'est pas compatible FIPS et vous devez apporter quelques modifications à Postgres.
Première étape
Vous devez compiler OpenSSL pour la configuration. Il s'agit d'un processus en deux étapes. D'abord, vous construisez le module d'objet FIPS ; et deuxièmement, vous construisez la bibliothèque compatible FIPS.
Pour construire le module d'objet FIPS, commencez par télécharger `openssl-fips-2.n.n.tar.gz. Après déballage, vous effectuez :
./configure
make
sudo make install
Après avoir exécuté les commandes ci-dessus, le fipscanister
sera situé dans /usr/local/ssl/fips-2.0
. La bibliothèque compatible FIPS l'utilisera pour fournir la cryptographie validée FIPS.
Deuxièmement, vous téléchargez openssl-1.n.n.tar.gz
. Après déballage, vous effectuez :
./configure fips shared <other options>
make all
sudo make install
La partie critique est le fips
option lors de la configuration.
Après avoir exécuté les commandes ci-dessus, vous disposerez d'une bibliothèque compatible FIPS. La bibliothèque sera située dans /usr/local/ssl/lib
. Utilisez libcrypto.so
et libssl.so
comme toujours.
La bibliothèque compatible FIPS utilise le fipscanister
, vous n'avez donc pas à vous soucier de ce qu'il y a dans /usr/local/ssl/fips-2.0
. C'est juste un artefact de la construction du module d'objet FIPS (certaines renonciations à la main).
Étape 2
Trouver où Postgres appelle 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();
Ouvrez be-secure.c
et fe-secure.c
, et ajoutez un appel à 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();
...
}
...
}
Si l'appel à FIPS_mode_set
réussit, vous utiliserez la cryptographie validée FIPS. Si cela échoue, vous utiliserez toujours la cryptographie d'OpenSSL, mais ce ne sera pas être une cryptographie validée FIPS.
Vous devrez également ajouter les en-têtes suivants à be-secure.c
et fe-secure.c
:
#include <openssl/opensslconf.h>
#include <openssl/fips.h>
Étape 3
La dernière étape consiste à vous assurer que vous utilisez la bibliothèque compatible FIPS à partir de la première étape. Faites cela via CFLAGS
et 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>
...