配置 SSL 以兼容 FIPS 140-2

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

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

前提条件

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

  • 使用 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 可移植运行时库

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

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

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

通过使用动态 netty-tcnative 库变体并结合 FIPS 认证的 OpenSSL 安装,Neo4j 的加密操作会通过 netty-tcnative 委托给 OpenSSL,从而间接实现 FIPS 兼容性。

安装 Apache 可移植运行时库

要安装 Apache 可移植运行时库,请使用操作系统的包管理器。

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

在 Debian 或 Ubuntu 中安装 Apache 可移植运行时库
apt install -y libapr1

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

在 RedHat 中安装 Apache 可移植运行时库
dnf install -y apr

安装 OpenSSL

本文档不涵盖如何构建和安装 FIPS 兼容 OpenSSL 的说明。安装步骤可能因操作系统以及您对 OpenSSL 可能有的其他安全要求而异。

通常

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

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

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

安装正确的 netty-tcnative

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

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

  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
    验证 netty-tcnative Fedora 变体依赖项是否已安装
    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 证书和私钥

生成 SSL 证书和私钥

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

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

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

配置 Neo4j 使用 SSL 加密

SSL 配置在 SSL 框架配置 中有详细描述。

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

    • 以下 FIPS 兼容密码套件组适用于 TLSv1.2

    • 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

  • 它们需要在应用程序或 OpenSSL 设置中进行额外配置。

    • 使用 TLSv1.3 时,OpenSSL 默认支持以下密码套件:

    • TLS_AES_256_GCM_SHA384

      TLS_AES_128_GCM_SHA256

当 OpenSSL 使用 FIPS 支持构建时,这些套件不需要额外配置。

  1. Bolt

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

  3. 设置 server.bolt.tls_level=REQUIRED

  4. 遵循关于如何 通过 Bolt 配置 SSL 的说明。

    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
  5. 设置额外的 Bolt 配置

遵循 SSL 框架 → 使用加密私钥 中的说明,配置 dbms.ssl.policy.bolt.private_key_password 以从加密密码文件中动态读取密码。密码不得以明文形式设置。

HTTPS

  1. 本节仅在启用 HTTPS 时适用。

  2. 遵循关于如何 通过 HTTPS 配置 SSL 的说明。

    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
  3. 设置额外的 HTTPS 配置

遵循 SSL 框架 → 使用加密私钥 中的说明,配置 dbms.ssl.policy.https.private_key_password 以从加密密码文件中动态读取密码。密码不得以明文形式设置。

集群内加密

  1. 为了 FIPS 兼容性,如果您正在运行 Neo4j 集群,则必须启用集群内加密。

  2. 遵循 配置 SSL 用于集群内通信 的说明。

    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
  3. 设置额外的集群配置

遵循 SSL 框架 → 使用加密私钥 中的说明,配置 dbms.ssl.policy.cluster.private_key_password 以从加密密码文件中动态读取密码。密码不得以明文形式设置。

备份

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

  2. 遵循关于如何 配置 SSL 用于备份通信 的说明。

    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
  3. 设置额外的备份配置


遵循 SSL 框架 → 使用加密私钥 中的说明,配置 dbms.ssl.policy.backup.private_key_password 以从加密密码文件中动态读取密码。密码不得以明文形式设置。
© . All rights reserved.