在NebulaGraph中启用 SSL 加密¶
SSL 加密是一种常用的网络安全技术,可确保客户端与服务端之间的通信安全。其工作原理主要是通过使用加密算法来保护在网络中传输的数据,防止数据在传输过程中被截获或者篡改。在 SSL 连接建立过程中,服务端会向客户端发送一个包含公钥和一些身份信息的数字证书,这个证书是由受信任的第三方认证机构(Certificate Authority,CA)签发的。客户端会验证这个数字证书,以确认服务端的身份。在 K8s 环境NebulaGraph中,用户可以启用 SSL 加密,并且客户端和服务端都需要验证其身份,以保证客户端与服务端、服务端与服务端之间的通信安全。本文介绍如何在 K8s 环境NebulaGraph中启用 SSL 加密。
前提条件¶
- 已安装 NebulaGraph Operator。
- 已创建NebulaGraph集群。具体步骤参见使用 Kubectl 部署NebulaGraph集群或者使用 Helm 部署NebulaGraph集群。
- 已为客户端、服务端生成证书和对应私钥,并生成 CA 证书。具体步骤参见 Generate Certificates Manually。
配置证书¶
Operator 提供sslCerts
字段指定加密的证书。sslCerts
字段包含三个子字段:serverSecret
、clientSecret
、caSecret
。这三个字段分别用于指定NebulaGraph服务端证书、客户端证书和 CA 证书的 Secret 名称。当用户指定这三个字段时,Operator 会从对应的 Secret 中读取证书内容并挂载到集群的 Pod 中。
在 K8s 集群中,SSL 类型的 Secret 默认使用tls.crt
和tls.key
作为服务器或客户端证书文件和私钥文件的名称,而 CA 证书文件的默认名称是ca.crt
(CA 证书不需要配置私钥)。如果用户更改了证书文件和私钥的名称,需要在sslCerts
字段中添加相应的子字段来指定新的证书和私钥名称,并在创建 Secret 时指定新的名称。
sslCerts:
# 服务端证书 Secret 的名称。
serverSecret: "server-cert"
# 服务端证书的名称,默认为 tls.crt。使用默认名称时,无需配置。
serverPublicKey: ""
# 服务端证书对应的私钥名称,默认为 tls.key。使用默认名称时,无需配置。
serverPrivateKey: ""
# 客户端证书 Secret 的名称。
clientSecret: "client-cert"
# 客户端证书的名称,默认为 tls.crt。使用默认名称时,无需配置。
clientPublicKey: ""
# 客户端证书对应的私钥名称,默认为 tls.key。使用默认名称时,无需配置。
clientPrivateKey: ""
# CA 证书 Secret 的名称。
caSecret: "ca-cert"
# CA 证书的名称,默认为 ca.crt。使用默认名称时,无需配置。
caPublicKey: ""
用户可通过insecureSkipVerify
字段决定客户端是否会验证服务端的证书链和主机名。在生产环境中,建议将其设置为false
以确保通信的安全性。如果设置为true
,客户端将不会验证服务端的证书链和主机名。
sslCerts:
# 用于决定客户端在建立SSL连接时,是否要验证服务器端的证书。
insecureSkipVerify: false
当证书接近到期时,可以通过安装 cert-manager 自动更新 Secret。NebulaGraph会监听证书目录文件的变化,一旦检测到文件变动,便会将新的证书内容加载到内存中。
加密策略¶
NebulaGraph提供了三种加密策略,用户可以根据自己的需求来选择和配置。
-
全部服务间通信加密
如果想加密客户端、Graph 服务、Meta 服务和 Storage 服务之间的所有数据传输,需在每个服务中添加
enable_ssl = true
字段。配置示例:
apiVersion: apps.nebula-graph.io/v1alpha1 kind: NebulaCluster metadata: name: nebula namespace: default spec: sslCerts: serverSecret: "server-cert" clientSecret: "client-cert" caSecret: "ca-cert" graphd: config: enable_ssl: "true" metad: config: enable_ssl: "true" storaged: config: enable_ssl: "true"
-
仅 Graph 服务通信加密
如果 K8s 集群部署在同一个机房内,且只有 Graph 服务的端口向外部开放,可以选择只加密客户端和 Graph 服务之间的数据传输。在这种情况下,其他服务可以在内部网络上无需加密的情况下进行通信。只需在 Graph 服务中添加
enable_graph_ssl = true
字段即可。配置示例:
apiVersion: apps.nebula-graph.io/v1alpha1 kind: NebulaCluster metadata: name: nebula namespace: default spec: sslCerts: serverSecret: "server-cert" caSecret: "ca-cert" graphd: config: enable_graph_ssl: "true"
-
仅 Meta 服务通信加密
如果需要将保密信息传输到 Meta 服务,可以选择加密与 Meta 服务相关的数据传输。在这种情况下,需要在每个组件中添加
enable_meta_ssl = true
配置。配置示例:
apiVersion: apps.nebula-graph.io/v1alpha1 kind: NebulaCluster metadata: name: nebula namespace: default spec: sslCerts: serverSecret: "server-cert" clientSecret: "client-cert" caSecret: "ca-cert" graphd: config: enable_meta_ssl: "true" metad: config: enable_meta_ssl: "true" storaged: config: enable_meta_ssl: "true"
操作步骤¶
-
使用预先生成的服务端、客户端证书和私钥,CA 证书分别创建 Secret。
-
为客户端或服务端创建 SSL 类型 Secret 示例:
kubectl create secret tls <client/server-cert-secret> --key=<client/server.key> --cert=<client/server.crt>
tls
:创建的 Secret 的类型是 TLS,这种类型的 Secret 用于存储 SSL/TLS 证书。<client/server-cert-secret>
:新创建的 Secret 的名称。--key=<client/server.key>
:该 Secret 中存储的私钥文件的路径。--cert=<client/server.crt>
:该 Secret 中存储的证书文件的路径。
-
创建加密 CA 证书 Secret。无需指定 CA 的私钥。
kubectl create secret tls <ca-cert-secret> --key --cert=<ca.crt>
<ca-cert-secret>
:要创建的 Secret 的名称。<ca.crt>
:该 Secret 中存储的 CA 证书文件的路径。
-
-
在对应的集群实例中,增加服务端证书、客户端证书、CA 证书配置和加密策略配置。
例如,对客户端、Graph 服务、Meta 服务和 Storage 服务之间的传输数据加密配置。
apiVersion: apps.nebula-graph.io/v1alpha1 kind: NebulaCluster metadata: name: nebula namespace: default spec: sslCerts: serverSecret: "server-cert" // 服务端证书 Secret 名称。 clientSecret: "client-cert" // 客户端证书 Secret 名称。 caSecret: "ca-cert" // CA 证书 Secret 名称。 graphd: config: enable_ssl: "true" metad: config: enable_ssl: "true" storaged: config: enable_ssl: "true"
-
使用
kubectl apply -f
将集群配置更新到集群中。
这样,就可以在NebulaGraph中启用 SSL 加密了,从而提高数据的安全性。