文档首页/ 密码安全中心 DEW/ 最佳实践/ 密钥管理/ 使用ECS实例委托安全访问KMS
更新时间:2026-08-25 GMT+08:00
分享

使用ECS实例委托安全访问KMS

密钥管理服务(KMS)提供密钥的全生命周期管理和数据加解密能力,通过IAM为ECS配置委托,获取临时访问密钥,保护AK和SK安全。临时密钥有效期短、刷新频繁,更安全。操作包括创建委托、配置策略、授权、赋予ECS实例,通过API访问KMS,ECS自动轮换临时凭证。

应用场景

保存密钥,通过临时访问的方式防止AK&SK泄露。

应用原理

通过统一身份认证服务(IAM)为弹性云服务器(ECS)配置委托,以获取临时访问密钥,从而保护Access Key(AK)和Secret Key(SK)的安全。

访问凭证按照时效性可分为永久凭证和临时凭证,相较于永久性访问凭证,例如用户名和密码,临时访问密钥因为有效期短且刷新频率高,所以安全性更高。因此,您可以为ECS实例授予IAM委托,使ECS实例内的应用程序可以使用临时AK&SK+SecurityToken访问KMS,不需要保存临时访问密钥,每次需要时动态获取,也可以缓存在内存里定时更新。

约束限制

管理员账号或拥有ECS权限的IAM用户才能为ECS实例配置委托。

操作步骤

  1. IAM创建ECS委托。

    1. 登录管理控制台。登录管理控制台。
    2. 单击页面左侧,选择管理与监督 > 统一身份认证服务,默认进入“用户”界面。
    3. 在左侧导航树中,选择“委托”,进入“委托”页面。
    4. 单击右上角的“创建委托”
    5. 在弹出的“创建委托”对话框中,填写对应参数。参数说明如表 创建委托参数说明所示。
      表1 创建委托参数说明

      参数名称

      参数说明

      委托名称

      填写自定义的委托名称。下文以“ECS_TO_KMS”为例。

      委托类型

      选择“云服务”

      云服务

      选择“ECS BMS”

      持续时间

      选择持续时间,可选择“永久”“一天”“自定义”

      描述

      (可选)填写委托信息。

    6. 单击“完成”,并在弹框中单击“立即授权”,进入“授权”页面。
    7. 单击页面右上角“新建策略”,如果已存在需使用的策略忽略此步骤。
      1. “新建策略”页面配置参数,参数详情如表 新建策略参数说明所示。
        图1 新建策略
        表2 新建策略参数说明

        参数名称

        参数说明

        策略名称

        输入策略名称。

        策略配置方式

        选择“可视化视图”

        策略内容

        • 允许:选择“允许”
        • 云服务:选择“密钥管理服务KMS”
          说明:
          • 仅添加KMS服务权限时,可能会导致接口调用KMS失败。
          • 需要逐个服务添加策略,完成所有策略内容选项的配置后,单击“添加权限”可再添加其他服务的策略内容。
        • 操作:选择您的读写权限。
        • 选择资源(可选):选择访问的资源范围。
          • 特定资源:访问特定的凭据。
            说明:

            可以选择“通过资源路径指定”访问特定的凭据,通过“添加资源路径”加入可以访问的凭据名称。

          • 所有资源:访问所有凭据。
        • 请求条件(可选):单击“添加条件”,选择条件键、运算符,填写相应的值。

        策略描述

        (可选)输入策略描述。

    8. 单击“下一步”,为委托选择策略。勾选策略后,单击“下一步”
    9. 选择授权范围方案,建议选择“所有资源”
      • 所有资源:授权后,IAM用户可以根据权限使用账号中所有资源,包括企业项目、区域项目和全局服务资源。
      • 指定企业项目资源:授权后,用户根据权限使用已选企业项目中的资源。
      • 指定区域项目资源:授权后,用户根据权限使用已选区域项目中的资源。
      图2 选择授权范围
    10. 单击“确定”,确认信息无误后单击“完成”

  2. 将委托(如ECS_TO_KMS)赋予ECS实例。

    • 如果ECS实例未创建,请参考自定义购买弹性云服务器高级配置的“委托”选择新建的委托(如ECS_TO_KMS)。
    • 如果ECS实例已创建,请按照如下流程:
      1. 单击页面左侧,选择计算 > 弹性云服务器 ECS,进入“弹性云服务器”界面。
      2. 单击需要配置委托的ECS实例的“名称”,进入“基本信息”界面。
      3. “管理信息”中,单击选择委托(如ECS_TO_KMS)。
        图3 选择委托

  3. 运行在ECS实例上的应用程序调用获取委托临时凭证的API,即可获得用于访问KMS的临时AK&SK+SecurityToken。

    1. 获取临时AK&SK(Security Key 目录下),详情请参见元数据获取
      • URI

        http://169.254.169.254/openstack/latest/securitykey

      • 方法

        支持 GET 请求

      • 返回数据内容:
        {
              "credential":{
                  "access": "LDHZK30XXXXXXXXXXXXV",
                  "secret":"gyqcdzVXXXXXXXXXXXXXXXXXXXXXXXMl6",
                  "securitytoken": "El9FI2C65qXXXXXXXXXXXXXXXXXXXXXnkcaoV",
                  "expires_at": "2022-07-14T12:09:24.147000Z"
                          }
        }
        • 提取返回数据中的“access”“secret”“securitytoken”用于访问KMS,无需本地存储。
        • ECS会为您自动轮换临时凭证,从而确保每次申请的临时凭证安全、有效。
    2. 使用临时ak、sk和SecurityToken访问KMS。
      package com.huaweicloud.sdk.test;
      
      import com.huaweicloud.sdk.core.auth.ICredential;
      import com.huaweicloud.sdk.core.auth.BasicCredentials;
      import com.huaweicloud.sdk.core.exception.ConnectionException;
      import com.huaweicloud.sdk.core.exception.RequestTimeoutException;
      import com.huaweicloud.sdk.core.exception.ServiceResponseException;
      import com.huaweicloud.sdk.kms.v2.region.KmsRegion;
      import com.huaweicloud.sdk.kms.v2.*;
      import com.huaweicloud.sdk.kms.v2.model.*;
      
      public class ListSecretsSolution {
          public static void main(String[] args) {      
              String ak = "<access>";        
              String sk = "<secret>";
              String securitytoken = "<securitytoken>";
              ICredential auth = new BasicCredentials()
                      .withAk(ak)
                      .withSk(sk)
                      .withSecurityToken(securitytoken);
              final KmsClient kmsClient = KmsClient.newBuilder().withCredential(auth)
                  .withRegion(new Region("__need replace__", "__need replace__")).build();
      
              final ListKeysRequest listKeysRequest = new ListKeysRequest().withBody(new     ListKeysRequestBody());
              final ListKeysResponse listKeysResponse = kmsClient.listKeys(listKeysRequest);
              System.out.println(listKeysResponse);
               }
           }
      }

相关文档