集群内 SSL 加密演示
本文档提供了一个分步演示,说明了如何将自签名 SSL 证书部署到因果集群的成员实例中,以实现集群内加密。步骤概述如下:
-
生成并安装加密对象
-
创建 SSL 策略
-
使用 SSL 策略配置因果集群
-
验证集群的安全操作
这些内容在 Neo4j 操作手册中进行了更详细的描述: https://neo4j.ac.cn/docs/operations-manual/current/clustering/intra-cluster-encryption/#intra-cluster-encryption-example-deployment
让我们逐步了解 SSL 证书的创建、部署和验证演示。
安装 OpenSSL
证书可以由受信任的证书颁发机构 (CA) 签名,也可以像本例一样是自签名的。我们将使用 OpenSSL 创建一个自签名证书。首先,我们需要安装 OpenSSL 才能创建自签名证书。
Mac
在 OSX 上,可以使用 macports 安装 OpenSSL,如下所述: https://www.macports.org/install.php
或者,可以通过 homebrew 包管理器安装,如下所示:
$ brew install openssl
验证安装
安装完成后,可以通过运行 brew info openssl
或 openssl version -a
来检查版本、安装目录以及其他安装功能。
$ openssl version -a
LibreSSL 2.8.3
built on: date not available
platform: information not available
options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: information not available
OPENSSLDIR: "/private/etc/ssl"
创建 Neo4j SSL 框架目录结构
Neo4j SSL 框架 需要创建以下目录结构:
<NEO4J_HOME>/certificates
└── cluster
├── revoked
└── trusted
从 <NEO4J_HOME> 运行以下命令以创建上述结构:
---
$ mkdir certificates/cluster
$ mkdir certificates/cluster/trusted
$ mkdir certificates/cluster/revoked
---
创建 SSL 证书和密钥
使用以下命令创建证书 cert.pem
和密钥 key.pem
,确保将 xxx
更改为证书的有效天数:
$ sudo openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days XXX
或者,对于相对较小的密钥长度:
$ sudo openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
以下描述了上述 openssl 命令中使用的每个参数:
-
req:PKCS#10 证书请求和证书生成实用程序。
-
x509:输出自签名证书而不是证书请求。
-
newkey:创建新的证书请求和新的私钥。请注意 rsa:nbits,其中 nbits 是位数,生成大小为 nbits 的 RSA 密钥。
-
keyout:指定将新创建的私钥写入的文件名。
-
out:指定要写入的输出文件名,默认为标准输出。
-
days:使用 -x509 选项时,此选项指定证书的认证天数(默认为 30 天)。
以下是执行的 openssl 生成命令的输出:
$ sudo openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
Password:
Generating a 4096 bit RSA private key
..................................................................................................................................................++
................................................................................................++
writing new private key to 'key.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [AU]:UK
State or Province Name (full name) [Some-State]:London
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Neo4j
Organizational Unit Name (eg, section) []:CS
Common Name (e.g. server FQDN or YOUR name) []:CS
Email Address []:myemail@email.com
以下命令然后使用上面创建的 .pem 文件生成 public.crt
和 private.key
文件:
$ sudo openssl x509 -outform pem -in cert.pem -out public.crt
$ openssl rsa -in key.pem -out private.key
部署 SSL 证书和密钥
将上面创建的 private.key
和 public.crt
放入 $NEO4J_HOME/certificates/cluster
中。然后将 public.crt
放入 $NEO4J_HOME/certificates/cluster/trusted 中。
certificates
└── cluster
├── private.key
├── public.crt
├── revoked
└── trusted
└── public.crt
然后将以下内容添加到集群中每个实例的 neo4j.conf 文件中,确保适当地替换 [Absolute_Path_Of_$NEO4J_HOME]
:
dbms.ssl.policy.cluster.enabled=true
dbms.ssl.policy.cluster.base_directory=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster
dbms.ssl.policy.default.base_directory=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster
dbms.ssl.policy.default.trusted_dir=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster/trusted
dbms.ssl.policy.default.revoked_dir=<<Absolute_Path_Of_$NEO4J_HOME>>/certificates/cluster/revoked
dbms.ssl.policy.cluster.ciphers=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
dbms.ssl.policy.cluster.client_auth=REQUIRE
验证集群内加密
现在,我们可以初始化所有集群实例。初始化并可用后,我们可以使用 nmap 工具(有时与 openssl 一起部署,否则需要单独安装)验证 SSL 加密,如下所示,以检查可用的 SSL 密码:
$ nmap --script ssl-enum-ciphers -p 5000 localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2022-07-07 14:18 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000049s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
5000/tcp open upnp
| ssl-enum-ciphers:
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
| compressors:
| NULL
| cipher preference: indeterminate
| cipher preference error: Too few ciphers supported
| warnings:
| Key exchange (secp256r1) of lower strength than certificate key
|_ least strength: A
Nmap done: 1 IP address (1 host up) scanned in 0.31 seconds
其中端口 5000
是默认的因果集群发现管理端口。上述配置还将在端口 6000
和 7000
上启用 SSL,它们分别是因果集群事务端口和因果集群 RAFT 端口。有关 Neo4j 端口用法的详细信息,请参阅以下链接:
另一个确认方法是在 Neo4j 的 debug.log 文件中查找类似以下内容的调试消息:
2022-07-08 09:30:28.006+0000 INFO [o.n.s.c.SslPolicyLoader] Loaded SSL policy 'CLUSTER' = SslPolicy{keyCertChain=Subject: EMAILADDRESS=myemail@email.com, CN=neo4j.local, OU=Support, O=Neo4j, L=London, ST=London, C=UK, Issuer: EMAILADDRESS=myemail@email.com, CN=neo4j.local, OU=Support, O=Neo4j, L=London, ST=London, C=UK, ciphers=[TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384], tlsVersions=[TLSv1.2], clientAuth=REQUIRE}
参考
此页面是否有帮助?