为 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 提供了一个方便的预构建、静态链接版本的 通过使用动态 |
安装 Apache 可移植运行时库
要安装 Apache Portable Runtime Library,请使用操作系统的包管理器。
在 Debian/Ubuntu 中,此软件包通常称为 libapr1
apt install -y libapr1
在 RedHat Enterprise Linux 中,此软件包通常称为 apr
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
动态库
-
找到 Neo4j 的
lib
目录。lib
目录的位置取决于安装 Neo4j 所使用的方法。请查看 文件位置 文档以获取正确的位置。此位置将被称为 <NEO4J_LIB>。
-
确保 <NEO4J_LIB> 文件夹中不存在
netty-tcnative-boringssl
库。find <NEO4J_LIB> -name "netty-tcnative-boringssl*.jar" -delete
-
检查哪些 netty-tcnative 库可用
ls -l <NEO4J_LIB>/netty-tcnative
有适用于 Linux 和 Fedora Linux 的变体可用,分别为 x86_64 和 ARM 64 架构编译。选择与本地机器的操作系统和架构匹配的变体。
-
使用
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.so
和libcrypto.so
库必须是之前步骤中使用 OpenSSL 安装的那些库。
-
-
将已验证的 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 证书和私钥
为了实现 FIPS 兼容性,私钥必须使用密码进行保护。 |
有关更多信息,请参阅 SSL 证书和密钥说明。
配置 Neo4j 以使用 SSL 加密
SSL 配置在 SSL 框架配置 中进行了详细说明。
本节描述了必须 除了 标准的非 FIPS 兼容 SSL 配置之外完成的配置。
Bolt
-
设置
dbms.netty.ssl.provider=OPENSSL
-
设置
server.bolt.tls_level=REQUIRED
-
按照有关如何 在 Bolt 上配置 SSL 的说明进行操作。
-
设置其他 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
-
按照 SSL 框架 → 使用加密的私钥 中的说明配置
dbms.ssl.policy.bolt.private_key_password
以从加密的密码文件动态读取密码。密码 不得 以明文形式设置。
HTTPS
本节仅适用于已启用 HTTPS 的情况。
-
按照有关如何 在 HTTPS 上配置 SSL 的说明进行操作。
-
设置其他 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
-
按照 SSL 框架 → 使用加密的私钥 中的说明配置
dbms.ssl.policy.https.private_key_password
以从加密的密码文件动态读取密码。密码不得以明文形式设置。
集群内加密
为了实现 FIPS 兼容性,如果运行 Neo4j 集群,则必须启用集群内加密。
-
按照说明 配置 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,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
-
按照 SSL 框架 → 使用加密的私钥 中的说明配置
dbms.ssl.policy.cluster.private_key_password
以从加密的密码文件动态读取密码。密码 不得 以明文形式设置。
备份
本节适用于用于执行备份的实例或集群成员。
-
按照有关如何 配置 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,TLS_AES_128_CCM_8_SHA256,TLS_AES_128_CCM_SHA256
-
按照 SSL 框架 → 使用加密的私钥 中的说明配置
dbms.ssl.policy.backup.private_key_password
以从加密的密码文件动态读取密码。密码 不得 以明文形式设置。