为 FIPS 140-2 兼容性配置 SSL

联邦信息处理标准 (FIPS) 140 是美国政府标准,由美国国家标准与技术研究院 (NIST) 制定,用于认证加密模块,例如 TLS 网络加密中使用的加密模块。虽然 FIPS 140 合规性主要适用于联邦机构及其承包商,但它也用于医疗保健行业,根据像健康保险流通与责任法案 (HIPAA) 这样的法规来保护患者数据。

本指南帮助配置 Neo4j 以 FIPS 兼容的方式使用 TLS/SSL 加密。它是对 *SSL 框架* 文档的补充,因为许多配置流程和要求是相同的。

先决条件

  • 验证运行 Neo4j 的机器是否具有 FIPS 兼容的硬件和操作系统。目前,只有 *Linux 操作系统* 支持 Neo4j FIPS 兼容性。

  • 使用 Neo4j Enterprise 5.23.0 或更高版本。

  • 安装和配置非本地身份验证提供程序,例如 LDAP 或 SSO。请参阅 *身份验证和授权*。

启用 FIPS SSL 提供程序

Neo4j 中的安全网络通过 Netty 库提供,该库支持本地 JDK SSL 提供程序和 Netty 支持的 OpenSSL 派生产品。具体来说,Netty 的 *Forked Tomcat Native* 库称为 *netty-tcnative*。

netty-tcnative 库有多种变体。但是,为了实现 FIPS 合规性,您必须将 netty-tcnative 的动态链接版本与 FIPS 兼容的 OpenSSL 安装一起使用。

动态链接库需要安装以下依赖项[1]

  • Apache Portable Runtime 库

  • 已获得 FIPS 认证的 OpenSSL 版本,其中已安装 FIPS 提供程序并将其设置为默认值。

有关更多信息,请参阅 Forked Tomcat Native

Netty 提供了一个方便的预构建、静态链接版本的 netty-tcnative,它使用 BoringSSL,但未获得 FIPS 认证[2]

通过使用动态 netty-tcnative 库变体与 FIPS 认证的 OpenSSL 安装相结合,Neo4j 的加密操作将由 netty-tcnative 代理到 OpenSSL,从而间接地获得 FIPS 兼容性。

安装 Apache 可移植运行时库

要安装 Apache Portable Runtime Library,请使用操作系统的包管理器。

在 Debian/Ubuntu 中,此软件包通常称为 libapr1

在 Debian 或 Ubuntu 中安装 Apache Portable Runtime 库
apt install -y libapr1

在 RedHat Enterprise Linux 中,此软件包通常称为 apr

在 RedHat 中安装 Apache Portable Runtime 库
dnf install -y apr

安装 OpenSSL

有关如何构建和安装与 FIPS 兼容的 OpenSSL 的说明超出了本文档的范围。安装步骤可能会因操作系统以及您可能对 OpenSSL 拥有的其他安全要求而异。

一般而言

  • 有关已获得 FIPS 认证的 OpenSSL 版本的列表,请参阅 https://openssl-library.org/source/

  • 必须将 FIPS 提供程序安装到 OpenSSL 中。

  • 必须将 OpenSSL 配置为默认使用 FIPS 提供程序。

安装正确的 netty-tcnative

自 Neo4j 5.23.0 以来,netty-tcnative 动态库的构建版本已在 Neo4j 的 lib 目录中提供,位于名为 netty-tcnative 的子文件夹下。

要安装 netty-tcnative 动态库

  1. 找到 Neo4j 的 lib 目录。

    lib 目录的位置取决于安装 Neo4j 所使用的方法。请查看 文件位置 文档以获取正确的位置。

    此位置将被称为 <NEO4J_LIB>

  2. 确保 <NEO4J_LIB> 文件夹中不存在 netty-tcnative-boringssl 库。

    find <NEO4J_LIB> -name "netty-tcnative-boringssl*.jar" -delete
  3. 检查哪些 netty-tcnative 库可用

    ls -l <NEO4J_LIB>/netty-tcnative

    有适用于 Linux 和 Fedora Linux 的变体可用,分别为 x86_64 和 ARM 64 架构编译。选择与本地机器的操作系统和架构匹配的变体。

  4. 使用 ldd 验证依赖项是否已正确安装

    验证 netty-tcnative 依赖项是否已安装
    unzip -d /tmp <NEO4J_LIB>/netty-tcnative/netty-tcnative-*-linux-$(arch).jar
    ldd /tmp/META-INF/native/libnetty_tcnative_linux_*.so
    rm -rf /tmp/META-INF
    验证 Fedora 版本的 netty-tcnative 依赖项是否已安装
    unzip -d /tmp <NEO4J_LIB>/netty-tcnative/netty-tcnative-*-linux-$(arch)-fedora.jar
    ldd /tmp/META-INF/native/libnetty_tcnative_linux_$(arch).so
    rm -rf /tmp/META-INF

    ldd 命令显示库依赖项的列表以及它们在本地机器上加载的位置。

    • 如果缺少任何依赖项,则必须安装它们,否则 Neo4j 无法运行。

    • 列出的 libssl.solibcrypto.so 库必须是之前步骤中使用 OpenSSL 安装的那些库。

  5. 将已验证的 JAR 文件复制到 <NEO4J_LIB>

    只复制 一个 JAR 文件。否则,Neo4j 无法在运行时解析依赖项。如果出现此错误,您将收到类似以下的消息

    "Failed to load any of the given libraries: [netty_tcnative_linux_x86_64, netty_tcnative_linux_x86_64_fedora, netty_tcnative_x86_64, netty_tcnative]".

生成 SSL 证书和私钥

Neo4j SSL 加密需要 证书,该证书符合 X.509 标准,以及 PKCS #8 格式的私钥,两者都以 PEM 格式编码。

为了实现 FIPS 兼容性,私钥必须使用密码进行保护。

有关更多信息,请参阅 SSL 证书和密钥说明

配置 Neo4j 以使用 SSL 加密

SSL 配置在 SSL 框架配置 中进行了详细说明。

本节描述了必须 除了 标准的非 FIPS 兼容 SSL 配置之外完成的配置。

Bolt

  1. 设置 dbms.netty.ssl.provider=OPENSSL

  2. 设置 server.bolt.tls_level=REQUIRED

  3. 按照有关如何 在 Bolt 上配置 SSL 的说明进行操作。

  4. 设置其他 Bolt 配置

    dbms.ssl.policy.bolt.trust_all=false
    dbms.ssl.policy.bolt.tls_level=REQUIRED
    dbms.ssl.policy.bolt.tls_versions=TLSv1.2,TLSv1.3
    dbms.ssl.policy.bolt.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
  5. 按照 SSL 框架 → 使用加密的私钥 中的说明配置 dbms.ssl.policy.bolt.private_key_password 以从加密的密码文件动态读取密码。密码 不得 以明文形式设置。

HTTPS

本节仅适用于已启用 HTTPS 的情况。

  1. 按照有关如何 在 HTTPS 上配置 SSL 的说明进行操作。

  2. 设置其他 HTTPS 配置

    dbms.ssl.policy.https.trust_all=false
    dbms.ssl.policy.https.tls_level=REQUIRED
    dbms.ssl.policy.https.tls_versions=TLSv1.2,TLSv1.3
    dbms.ssl.policy.https.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
  3. 按照 SSL 框架 → 使用加密的私钥 中的说明配置 dbms.ssl.policy.https.private_key_password 以从加密的密码文件动态读取密码。密码不得以明文形式设置。

集群内加密

为了实现 FIPS 兼容性,如果运行 Neo4j 集群,则必须启用集群内加密。

  1. 按照说明 配置 SSL 以进行集群内通信

  2. 设置其他集群配置

    dbms.ssl.policy.cluster.enabled=true
    dbms.ssl.policy.cluster.tls_level=REQUIRED
    dbms.ssl.policy.cluster.client_auth=REQUIRED
    dbms.ssl.policy.cluster.tls_versions=TLSv1.2,TLSv1.3
    dbms.ssl.policy.cluster.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
  3. 按照 SSL 框架 → 使用加密的私钥 中的说明配置 dbms.ssl.policy.cluster.private_key_password 以从加密的密码文件动态读取密码。密码 不得 以明文形式设置。

备份

本节适用于用于执行备份的实例或集群成员。

  1. 按照有关如何 配置 SSL 以进行备份通信 的说明进行操作。

  2. 设置其他备份配置

    dbms.ssl.policy.backup.enabled=true
    dbms.ssl.policy.backup.client_auth=REQUIRED
    dbms.ssl.policy.backup.trust_all=false
    dbms.ssl.policy.backup.tls_versions=TLSv1.2,TLSv1.3
    dbms.ssl.policy.backup.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
  3. 按照 SSL 框架 → 使用加密的私钥 中的说明配置 dbms.ssl.policy.backup.private_key_password 以从加密的密码文件动态读取密码。密码 不得 以明文形式设置。