【问题标题】:Enable FIPS on PostgreSQL database在 PostgreSQL 数据库上启用 FIPS
【发布时间】:2012-08-16 22:11:17
【问题描述】:

有人可以指定在 Postgres 数据库上启用 FIPS 的步骤吗?我已经用谷歌搜索了,但找不到任何具体的东西。

【问题讨论】:

  • FIPS = 联邦信息处理标准?
  • 您可能想要编辑您的问题并进行更详细的解释。见stackoverflow.com/faq#howtoask。定义“FIPS”?您究竟想要启用什么,您希望启用它做什么?是什么让您想到可以启用称为“FIPS”的东西?你习惯从另一个数据库吗?如果有,是哪一个?您在 Google 中没有找到任何具体的内容,好吧,您发现了什么?链接?请跟进,否则此问题将被关闭。
  • 是的,联邦信息处理标准 140-2,我希望 postgres 数据库应该在 FIPS 兼容模式下安装/运行。如果它在兼容模式下运行,则数据传输过程使用 aes-128 等加密算法。我寻找这个的原因是我们的产品符合 FIPS 标准,我想测试它是否可以与符合 FIPS 标准的通信数据库。
  • 指定目标操作系统将有助于澄清问题。

标签: postgresql openssl fips


【解决方案1】:

有人可以指定在 Postgres 数据库上启用 FIPS 的步骤吗?

我不相信您可以在“FIPS 模式”下运行 Postgres,因为它使用了未经批准的加密技术。从过去的审计中,我知道它广泛使用了 MD5(例如,请参阅 Postgres Mailing List: Use of 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.solibssl.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.cfe-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.cfe-secure.c

#include <openssl/opensslconf.h>
#include <openssl/fips.h>

第三步

最后一步是确保您从第一步开始使用 FIPS 功能库。通过CFLAGSLDFLAGS 执行此操作:

cd postgres-9.3.2
export CFLAGS="-I/usr/local/ssl/include"
export LDFLAGS="-L/usr/local/ssl/lib"

./config --with-openssl <other options>
...

【讨论】:

  • PostgreSQL 绝对可以在正确配置的 RHEL 系统上以 FIPS 模式运行。请参阅下面关于 buzz3791 的 STIG 的答案。
  • @JosephConway - OpenSSL 可能会提供经过 FIPS 验证的加密技术,但这并不意味着 Postrgres 正在使用它。如果 Postgres 仍在使用 MD5,那么它们肯定不符合 FIPS 140-2。我知道只有一个 MD5 异常,那就是 TLS 中的 PRF 函数。唯一确定的方法是审核 Postgres。但我已经好几年没有这样做了。
  • 我很高兴有时间离线讨论,但我们已经在 PostgreSQL STIG 中解决了这个问题。如果您根据 Red Hat 文档在操作系统级别将 OpenSSL 置于 FIPS 模式(并且 Ubuntu 和 SUSE 有类似的选项),那么 PostgreSQL 确实使用它。我已经在实时会话中使用 gdb 验证了这一点。您还必须避免使用 MD5 进行密码散列,但这很容易通过使用 pg_hba.conf 中的外部(LDAP、GSS、Kerberos 等)或 cert auth 方法(或 pg10 中的 scram-sha-256)来完成。跨度>
【解决方案2】:

对于 Red Hat Linux 上的 PostgreSQL,https://public.cyber.mil/stigs/downloads/ 网站有一个用于 PostgreSQL 9.x 的安全技术实施指南,其中包含此检查。

Rule Title: PostgreSQL must implement NIST FIPS 140-2 validated 
cryptographic modules to protect unclassified information requiring
confidentiality and cryptographic protection, in accordance with the data
owners requirements.
STIG ID:    PGS9-00-008200
Rule ID:    SV-87645r1_rule
Vuln ID:    V-72993

“修复文本”为

Configure OpenSSL to be FIPS compliant. 

PostgreSQL uses OpenSSL for cryptographic modules. To configure OpenSSL to
be FIPS 140-2 compliant, see the official RHEL Documentation:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-Federal_Standards_And_Regulations-Federal_Information_Processing_Standard.html

For more information on configuring PostgreSQL to use SSL, see supplementary
content APPENDIX-G.

Joseph Conway 指出“STIG 所指的附录 G 在 PostgreSQL STIG 补充文件中,而不是 [postgresql.org] 文档。您可以在此处获取补充文件(以及 STIG 的其余部分):https://dl.dod.cyber.mil/wp-content/uploads/stigs/zip/U_PGS_SQL_9-x_V2R1_STIG.zip

【讨论】:

【解决方案3】:

据我了解,您正在考虑尝试确保可以使用 AES 算法对传入和传出 PostgreSQL 的数据进行加密。虽然 FIPS 远远超出了这一点,也远远超出了问答中可以提出的问题,但至少这个问题很容易回答。

简单的解决方案是将 SSL 与您选择的证书颁发机构一起使用(如果您使用的是 Active Directory,则可以使用证书服务器,否则您可以使用 OpenSSL 来运行您自己的证书颁发机构)。然后,您可以指定要使用的加密标准(请参阅official docs)。从那里将使用加密,并且您的服务器将通过您的客户端进行身份验证。您还可以设置客户端证书并要求对其进行身份验证。

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多