使用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实例配置委托。
操作步骤
- IAM创建ECS委托。
- 登录管理控制台。登录管理控制台。
- 单击页面左侧
,选择,默认进入“用户”界面。 - 在左侧导航树中,选择“委托”,进入“委托”页面。
- 单击右上角的“创建委托”。
- 在弹出的“创建委托”对话框中,填写对应参数。参数说明如表 创建委托参数说明所示。
- 单击“完成”,并在弹框中单击“立即授权”,进入“授权”页面。
- 单击页面右上角“新建策略”,如果已存在需使用的策略忽略此步骤。
- 在“新建策略”页面配置参数,参数详情如表 新建策略参数说明所示。 图1 新建策略
表2 新建策略参数说明 参数名称
参数说明
策略名称
输入策略名称。
策略配置方式
选择“可视化视图”。
策略内容
- 允许:选择“允许”。
- 云服务:选择“密钥管理服务KMS”。 说明:
- 仅添加KMS服务权限时,可能会导致接口调用KMS失败。
- 需要逐个服务添加策略,完成所有策略内容选项的配置后,单击“添加权限”可再添加其他服务的策略内容。
- 操作:选择您的读写权限。
- 选择资源(可选):选择访问的资源范围。
- 特定资源:访问特定的凭据。 说明:
可以选择“通过资源路径指定”访问特定的凭据,通过“添加资源路径”加入可以访问的凭据名称。
- 所有资源:访问所有凭据。
- 特定资源:访问特定的凭据。
- 请求条件(可选):单击“添加条件”,选择条件键、运算符,填写相应的值。
策略描述
(可选)输入策略描述。
- 在“新建策略”页面配置参数,参数详情如表 新建策略参数说明所示。
- 单击“下一步”,为委托选择策略。勾选策略后,单击“下一步”。
- 选择授权范围方案,建议选择“所有资源”。
- 所有资源:授权后,IAM用户可以根据权限使用账号中所有资源,包括企业项目、区域项目和全局服务资源。
- 指定企业项目资源:授权后,用户根据权限使用已选企业项目中的资源。
- 指定区域项目资源:授权后,用户根据权限使用已选区域项目中的资源。
图2 选择授权范围
- 单击“确定”,确认信息无误后单击“完成”。
- 将委托(如ECS_TO_KMS)赋予ECS实例。
- 如果ECS实例未创建,请参考自定义购买弹性云服务器高级配置的“委托”选择新建的委托(如ECS_TO_KMS)。
- 如果ECS实例已创建,请按照如下流程:
- 单击页面左侧
,选择,进入“弹性云服务器”界面。 - 单击需要配置委托的ECS实例的“名称”,进入“基本信息”界面。
- 在“管理信息”中,单击
选择委托(如ECS_TO_KMS)。 图3 选择委托
- 单击页面左侧
- 运行在ECS实例上的应用程序调用获取委托临时凭证的API,即可获得用于访问KMS的临时AK&SK+SecurityToken。
- 获取临时AK&SK(Security Key 目录下),详情请参见元数据获取。
- URI
- 方法
- 返回数据内容:
{ "credential":{ "access": "LDHZK30XXXXXXXXXXXXV", "secret":"gyqcdzVXXXXXXXXXXXXXXXXXXXXXXXMl6", "securitytoken": "El9FI2C65qXXXXXXXXXXXXXXXXXXXXXnkcaoV", "expires_at": "2022-07-14T12:09:24.147000Z" } }
- 提取返回数据中的“access”、“secret”、“securitytoken”用于访问KMS,无需本地存储。
- ECS会为您自动轮换临时凭证,从而确保每次申请的临时凭证安全、有效。
- 使用临时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); } } }
- 获取临时AK&SK(Security Key 目录下),详情请参见元数据获取。