×

关于 etcd 加密

默认情况下,OpenShift Container Platform 中的 etcd 数据未加密。您可以为集群启用 etcd 加密,以提供额外的数 据安全层。例如,如果 etcd 备份暴露给不正确的方,它可以帮助保护敏感数据丢失。

启用 etcd 加密后,以下 OpenShift API 服务器和 Kubernetes API 服务器资源将被加密:

  • 密钥

  • 配置映射

  • 路由

  • OAuth 访问令牌

  • OAuth 授权令牌

启用 etcd 加密后,将创建加密密钥。您必须拥有这些密钥才能从 etcd 备份中恢复。

Etcd 加密仅加密值,不加密密钥。资源类型、命名空间和对象名称未加密。

如果在备份期间启用了 etcd 加密,则static_kuberesources_<datetimestamp>.tar.gz文件包含 etcd 快照的加密密钥。出于安全原因,请将此文件与 etcd 快照分开存储。但是,此文件是根据相应的 etcd 快照恢复 etcd 以前状态所必需的。

支持的加密类型

以下加密类型受支持,用于在 OpenShift Container Platform 中加密 etcd 数据:

AES-CBC

使用带有 PKCS#7 填充和 32 字节密钥的 AES-CBC 执行加密。加密密钥每周轮换一次。

AES-GCM

使用带有随机 nonce 和 32 字节密钥的 AES-GCM 执行加密。加密密钥每周轮换一次。

启用 etcd 加密

您可以启用 etcd 加密来加密集群中的敏感资源。

在初始加密过程完成之前,请勿备份 etcd 资源。如果加密过程未完成,则备份可能仅部分加密。

启用 etcd 加密后,可能会发生以下几种变化:

  • etcd 加密可能会影响某些资源的内存消耗。

  • 您可能会注意到备份性能的短暂影响,因为领导者必须服务于备份。

  • 磁盘 I/O 可能会影响接收备份状态的节点。

您可以使用 AES-GCM 或 AES-CBC 加密来加密 etcd 数据库。

要将 etcd 数据库从一种加密类型迁移到另一种加密类型,您可以修改 API 服务器的spec.encryption.type字段。etcd 数据到新加密类型的迁移将自动发生。

先决条件
  • 以具有cluster-admin角色的用户身份访问集群。

步骤
  1. 修改APIServer对象

    $ oc edit apiserver
  2. spec.encryption.type字段设置为aesgcmaescbc

    spec:
      encryption:
        type: aesgcm (1)
    1 对于 AES-GCM 加密,设置为aesgcm;对于 AES-CBC 加密,设置为aescbc
  3. 保存文件以应用更改。

    加密过程开始。此过程的完成时间可能需要 20 分钟或更长时间,具体取决于 etcd 数据库的大小。

  4. 验证 etcd 加密是否成功。

    1. 查看 OpenShift API 服务器的Encrypted状态条件,以验证其资源是否已成功加密。

      $ oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      加密成功后,输出显示EncryptionCompleted

      EncryptionCompleted
      All resources encrypted: routes.route.openshift.io

      如果输出显示EncryptionInProgress,则加密仍在进行中。请等待几分钟后再试。

    2. 查看 Kubernetes API 服务器的Encrypted状态条件,以验证其资源是否已成功加密。

      $ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      加密成功后,输出显示EncryptionCompleted

      EncryptionCompleted
      All resources encrypted: secrets, configmaps

      如果输出显示EncryptionInProgress,则加密仍在进行中。请等待几分钟后再试。

    3. 查看 OpenShift OAuth API 服务器的Encrypted状态条件,以验证其资源是否已成功加密。

      $ oc get authentication.operator.openshift.io -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      加密成功后,输出显示EncryptionCompleted

      EncryptionCompleted
      All resources encrypted: oauthaccesstokens.oauth.openshift.io, oauthauthorizetokens.oauth.openshift.io

      如果输出显示EncryptionInProgress,则加密仍在进行中。请等待几分钟后再试。

禁用 etcd 加密

您可以禁用集群中 etcd 数据的加密。

先决条件
  • 以具有cluster-admin角色的用户身份访问集群。

步骤
  1. 修改APIServer对象

    $ oc edit apiserver
  2. encryption字段类型设置为identity

    spec:
      encryption:
        type: identity (1)
    1 identity类型是默认值,表示不执行任何加密。
  3. 保存文件以应用更改。

    解密过程开始。此过程的完成时间可能需要 20 分钟或更长,具体取决于集群的大小。

  4. 验证 etcd 解密是否成功。

    1. 查看 OpenShift API 服务器的Encrypted状态条件,以验证其资源是否已成功解密。

      $ oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      解密成功后,输出显示DecryptionCompleted

      DecryptionCompleted
      Encryption mode set to identity and everything is decrypted

      如果输出显示DecryptionInProgress,则解密仍在进行中。请等待几分钟后再试。

    2. 查看 Kubernetes API 服务器的Encrypted状态条件,以验证其资源是否已成功解密。

      $ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      解密成功后,输出显示DecryptionCompleted

      DecryptionCompleted
      Encryption mode set to identity and everything is decrypted

      如果输出显示DecryptionInProgress,则解密仍在进行中。请等待几分钟后再试。

    3. 查看 OpenShift OAuth API 服务器的Encrypted状态条件,以验证其资源是否已成功解密。

      $ oc get authentication.operator.openshift.io -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      解密成功后,输出显示DecryptionCompleted

      DecryptionCompleted
      Encryption mode set to identity and everything is decrypted

      如果输出显示DecryptionInProgress,则解密仍在进行中。请等待几分钟后再试。