
# 使用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. [登录管理控制台](https://console.huaweicloud.com)。登录管理控制台。
   
   2. 单击页面左侧![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002684593995.png "点击放大")，选择"管理与监督 \> 统一身份认证服务"，默认进入"用户"界面。
   
   3. 在左侧导航树中，选择"委托"，进入"委托"页面。
   
   4. 单击右上角的"创建委托"。
   
   5. 在弹出的"创建委托"对话框中，填写对应参数。参数说明如[表 创建委托参数说明]所示。
       表1创建委托参数说明 
      | 参数名称 | 参数说明                          |
      |:---|:---|
      | 委托名称 | 填写自定义的委托名称。下文以"ECS_TO_KMS"为例。 |
      | 委托类型 | 选择"云服务"。                      |
      | 云服务  | 选择"ECS BMS"。                  |
      | 持续时间 | 选择持续时间，可选择"永久"、"一天"、"自定义"。    |
      | 描述   | （可选）填写委托信息。                   |
         
      
   
   6. 单击"完成"，并在弹框中单击"立即授权"，进入"授权"页面。
   
   7. 单击页面右上角"新建策略"，如果已存在需使用的策略忽略此步骤。
      1. 在"新建策略"页面配置参数，参数详情如[表 新建策略参数说明](https://support.huaweicloud.com/bestpractice-dew/dew_06_0022.html#dew_06_0022__table167061956191916)所示。
         图1新建策略   
         ![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002640772316.png "点击放大")
         表2新建策略参数说明 
         | 参数名称   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
         |:---|:---|
         | 策略名称   | 输入策略名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
         | 策略配置方式 | 选择"可视化视图"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
         | 策略内容   | - 允许：选择"允许"。  - 云服务：选择"密钥管理服务KMS"。 说明： - 仅添加KMS服务权限时，可能会导致接口调用KMS失败。  - 需要逐个服务添加策略，完成所有策略内容选项的配置后，单击"添加权限"可再添加其他服务的策略内容。     - 操作：选择您的读写权限。  - 选择资源（可选）：选择访问的资源范围。 - 特定资源：访问特定的凭据。 说明： 可以选择"通过资源路径指定"访问特定的凭据，通过"添加资源路径"加入可以访问的凭据名称。   - 所有资源：访问所有凭据。    - 请求条件（可选）：单击"添加条件"，选择条件键、运算符，填写相应的值。   |
         | 策略描述   | （可选）输入策略描述。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
            
         
       
   
   8. 单击"下一步"，为委托选择策略。勾选策略后，单击"下一步"。
   
   9. 选择授权范围方案，建议选择"所有资源"。
      - **所有资源**：授权后，IAM用户可以根据权限使用账号中所有资源，包括企业项目、区域项目和全局服务资源。
      
      - **指定企业项目资源**：授权后，用户根据权限使用已选企业项目中的资源。
      
      - **指定区域项目资源**：授权后，用户根据权限使用已选区域项目中的资源。
      
      
      图2选择授权范围   
      ![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002670772279.png "点击放大") 
   
   10. 单击"确定"，确认信息无误后单击"完成"。
   
   
   
   
2. 将委托（如ECS_TO_KMS）赋予ECS实例。 
   - 如果ECS实例未创建，请参考[自定义购买弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)高级配置的"委托"选择新建的委托（如ECS_TO_KMS）。
   
   - 如果ECS实例已创建，请按照如下流程：
     1. 单击页面左侧![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002654314784.png "点击放大")，选择"计算 \> 弹性云服务器 ECS"，进入"弹性云服务器"界面。
     
     2. 单击需要配置委托的ECS实例的"名称"，进入"基本信息"界面。
     
     3. 在"管理信息"中，单击![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002640932284.png)选择委托（如ECS_TO_KMS）。
        图3选择委托   
        ![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002640772318.png "点击放大") 
      
   
   
   
   
3. 运行在ECS实例上的应用程序调用获取委托临时凭证的API，即可获得用于访问KMS的临时AK\&SK+SecurityToken。 
   1. 获取临时AK\&SK(Security Key 目录下)，详情请参见[元数据获取](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0166.html)。
      - 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"
                          }
        }
        ```
        ![](https://support.huaweicloud.com/bestpractice-dew/public_sys-resources/note_3.0-zh-cn.png)
        - 提取返回数据中的"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);
               }
           }
      }
      ```
      
   
   
   
   
 
