加密云盘存储卷

使用云盘加密功能,系统会将传输到云盘的数据自动进行加密,并在读取数据时自动解密。云盘加密适用于有高安全性或合规性要求的应用场景,您无需自建和维护密钥管理基础设施,即可保护数据的隐私性和自主性。本文介绍如何使用阿里云密钥管理服务KMS(Key Management Service)中管理的密钥对集群中的云盘存储卷数据加密。

前提条件

功能介绍

ECS加密采用行业标准的AES-256加密算法,利用密钥加密云盘。密钥可以是服务密钥和普通密钥(BYOK)。在加密解密的过程中,实例的性能几乎没有衰减。创建加密的数据盘并将其挂载到ECS实例后,以下数据会被自动加密,并在读取数据时自动解密。具体步骤,请参见加密数据盘

  • 加密云盘中的静态数据。

  • 加密云盘和实例间传输的数据(不包括操作系统内的数据)。

  • 加密云盘从实例传递到后端存储集群的数据。

  • 从加密云盘创建的所有快照,并且该快照的加密密钥与云盘的加密密钥保持相同。

  • 从加密快照创建的所有云盘。

使用限制

  • 支持加密的数据盘包括ESSD云盘、SSD云盘、高效云盘和普通云盘。

  • 不支持加密本地盘。

  • 非加密云盘不能直接转换成加密云盘。

  • 加密云盘不能直接转换为非加密云盘。

(可选)步骤一:配置KMS访问权限

使用KMS的BYOK方式加密密钥时,需要为ECS实例授予KMS的访问权限,即创建阿里云服务角色并进行授权。操作步骤如下:

  1. 创建用于访问KMS的RAM角色。如果已有AliyunECSDiskEncryptDefaultRole角色,可直接进行授权。

    1. 使用阿里云账号或RAM管理员账号登录RAM控制台

    2. 在左侧导航栏,选择身份管理 > 角色

    3. 角色页面,单击创建角色

    4. 创建角色页面,选择可信实体类型为阿里云服务,然后单击下一步

    5. 选择角色类型为普通服务角色

    6. 输入角色名称为AliyunECSDiskEncryptDefaultRole,然后选择受信服务为云服务器

    7. 单击完成,然后单击关闭

  2. 为上一步创建的RAM角色授权。

    1. 在左侧导航栏选择权限管理 > 授权,然后单击新增授权

    2. 新增授权页面,选择授权范围为账号级别,在授权主体中搜索已创建的RAM角色AliyunECSDiskEncryptDefaultRole并选中。

    3. 根据需要选择权限是系统策略AliyunKMSFullAccess或自定义权限策略AliyunECSDiskEncryptCustomizedPolicy。

      重要

      AliyunKMSFullAccess权限相对较大,如果需要更细粒度的权限控制,可参考下面步骤创建自定义权限策略AliyunECSDiskEncryptCustomizedPolicy。

      展开查看如何创建自定义权限策略AliyunECSDiskEncryptCustomizedPolicy

      1. 在左侧导航栏,选择权限管理 > 权限策略

      2. 权限策略页面,单击创建权限策略

      3. 创建权限策略页面,单击脚本编辑页签,将如下自定义授权策略的内容拷贝到编辑框中。

        {
            "Version": "1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "kms:DescribeKey",
                        "kms:GenerateDataKey",
                        "kms:Decrypt",
                        "kms:TagResource"
                    ],
                    "Resource": "*"
                }
            ]
        }
      4. 单击确定

    4. 单击确认新增授权,然后单击关闭

步骤二:加密云盘数据卷

在创建云盘时才可以启用云盘加密,而挂载或卸载云盘时并不需要进行加密相关的配置和操作。

  1. 配置StorageClass参数。

    1. 将以下内容复制到sc-kms.yaml文件中。

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: csi-disk-encrypted
      provisioner: diskplugin.csi.alibabacloud.com
      parameters:
          fsType: ext4
          type: cloud_ssd
          encrypted: "true"
          kmsKeyId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      reclaimPolicy: Delete
      说明
      • encrypted:配置创建的云盘是否为加密云盘,true表示生成加密云盘。

      • kmsKeyId:表示创建加密云盘使用的KMS密钥,不配置时会使用默认的CMK;当encryptedfalse时,此配置不生效。

    2. 执行以下命令创建StorageClass。

      kubectl create -f sc-kms.yaml
    3. 执行以下命令查看生成的StorageClass。

      kubectl get sc csi-disk-encrypted

      预期输出:

      NAME                 PROVISIONER                       AGE
      csi-disk-encrypted   diskplugin.csi.alibabacloud.com   9m5s
  2. 创建PVC。

    1. 将以下内容复制到sc-pvc.yaml文件中。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: disk-pvc
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        storageClassName: csi-disk-encrypted
    2. 执行以下命令创建PVC。

      kubectl create -f sc-pvc.yaml
    3. 执行以下命令查看创建的PVC。

      kubectl get pvc

      预期输出:

      NAME             STATUS   VOLUME                        CAPACITY   ACCESS MODES   STORAGECLASS             AGE
      disk-pvc         Bound    d-wz92s6d95go6ki9x****        25Gi       RWO            csi-disk-encrypted       10m
    4. 执行以下命令查看PV。

      kubectl get pv

      预期输出:

      NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS        REASON        AGE
      d-wz92s6d95go6ki9x****   25Gi       RWO            Retain           Bound    default/disk-pvc     csi-disk-encrypted                10m

      从以上预期输出可得,创建的云盘ID为:d-wz92s6d95go6ki9x****

  3. 查看加密云盘是否生效。

    1. 登录ECS管理控制台

    2. 在左侧导航栏,选择存储与快照 > 块存储

    3. 云盘页面可看到d-wz92s6d95go6ki9x****云盘处于已加密状态。