跳转至

在NebulaGraph中启用 SSL 加密

SSL 加密是一种常用的网络安全技术,可确保客户端与服务端之间的通信安全。其工作原理主要是通过使用加密算法来保护在网络中传输的数据,防止数据在传输过程中被截获或者篡改。在 SSL 连接建立过程中,服务端会向客户端发送一个包含公钥和一些身份信息的数字证书,这个证书是由受信任的第三方认证机构(Certificate Authority,CA)签发的。客户端会验证这个数字证书,以确认服务端的身份。在 K8s 环境NebulaGraph中,用户可以启用 SSL 加密,并且客户端和服务端都需要验证其身份,以保证客户端与服务端、服务端与服务端之间的通信安全。本文介绍如何在 K8s 环境NebulaGraph中启用 SSL 加密。

前提条件

配置证书

Operator 提供sslCerts字段指定加密的证书。sslCerts字段包含三个子字段:serverSecretclientSecretcaSecret。这三个字段分别用于指定NebulaGraph服务端证书、客户端证书和 CA 证书的 Secret 名称。当用户指定这三个字段时,Operator 会从对应的 Secret 中读取证书内容并挂载到集群的 Pod 中。

在 K8s 集群中,SSL 类型的 Secret 默认使用tls.crttls.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"
    

操作步骤

  1. 使用预先生成的服务端、客户端证书和私钥,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 证书文件的路径。
  2. 在对应的集群实例中,增加服务端证书、客户端证书、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"
    
  3. 使用kubectl apply -f将集群配置更新到集群中。

这样,就可以在NebulaGraph中启用 SSL 加密了,从而提高数据的安全性。


最后更新: June 9, 2023