配置 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 静态链接的 通过使用动态 |
安装 Apache 可移植运行时库
要安装 Apache 可移植运行时库,请使用操作系统的包管理器。
在 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/。
-
必须在 OpenSSL 中安装 FIPS 提供程序。
-
必须将 OpenSSL 配置为默认使用 FIPS 提供程序。
安装正确的 netty-tcnative
库
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
有适用于 x86_64 和 ARM 64 架构编译的 Linux 和 Fedora Linux 变体可用。选择与本地机器操作系统和架构匹配的版本。
-
使用
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.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 证书和密钥说明。
SSL 配置在 SSL 框架配置 中有详细描述。
|
当 OpenSSL 使用 FIPS 支持构建时,这些套件不需要额外配置。
-
设置
dbms.netty.ssl.provider=OPENSSL
-
设置
server.bolt.tls_level=REQUIRED
-
遵循关于如何 通过 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
-
设置额外的 Bolt 配置
遵循 SSL 框架 → 使用加密私钥 中的说明,配置 dbms.ssl.policy.bolt.private_key_password
以从加密密码文件中动态读取密码。密码不得以明文形式设置。
-
本节仅在启用 HTTPS 时适用。
-
遵循关于如何 通过 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
-
设置额外的 HTTPS 配置
遵循 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
-
设置额外的集群配置
遵循 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
-
设置额外的备份配置
dbms.ssl.policy.backup.private_key_password
以从加密密码文件中动态读取密码。密码不得以明文形式设置。