如何使用凭据管理服务解决AK&SK泄露问题

凭据管理,即云凭据管理服务(Cloud Secret Management Service,CSMS),是一种安全、可靠、简单易用的凭据托管服务。用户或应用程序通过凭据管理服务,创建、检索、更新、删除凭据,轻松实现对敏感凭据的全生命周期的统一管理,有效避免程序硬编码或明文配置等问题导致的敏感信息泄露以及权限失控带来的业务风险。

应用场景

保存AK&SK,防止泄露。

应用原理

通过统一身份认证服务(Identity and Access Management,IAM )对弹性云服务器(Elastic Cloud Server,ECS)的委托获取临时访问密钥来保护AK&SK。

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

操作流程

图1 ECS委托操作流程

约束限制

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

操作步骤

IAM创建ECS委托。

a.登录管理控制台。

b.单击页面左侧,选择“管理与监督 > 统一身份认证服务”,默认进入“用户”界面。

c.在左侧导航树中,选择“委托”,进入“委托”页面。

d.单击右上角的“创建委托”。

e.在弹出的“创建委托”对话框中,填写对应参数。参数说明如表 创建委托参数说明所示。

图2 创建委托

表1 创建委托参数说明

    参数名称
    参数说明

    委托名称

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

    委托类型

    选择“云服务”。

    云服务

    选择“弹性云服务器 ECS 裸金属服务器 BMS”。

    持续时间

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

    描述

    (可选)填写委托信息。

    f.单击“下一步”,进入“授权”页面。

    g.单击页面右上角“新建策略”,若已存在需使用的策略忽略此步骤。

    1、在“新建策略”页面配置参数,参数详情如表 新建策略参数说明所示。

    图3 新建策略

    表2 新建策略参数说明

    参数名称
    参数说明

    策略名称

    输入策略名称。

    策略配置方式

    选择“可视化视图”。

    策略内容

    1. 允许:选择“允许”。
    2. 云服务:选择“凭据管理服务CSMS”。
    3. 操作:选择您的读写权限。
    4. 选择资源(可选):选择访问的资源范围。
    5. 特定资源:访问特定的凭据。
    6. 说明:
    7. 可以选择“通过资源路径指定”访问特定的凭据,通过“添加资源路径”加入可以访问的凭据名称。
    8. 所有资源:访问所有凭据。
    9. 请求条件(可选):单击“添加条件”,选择条件键、运算符,填写相应的值。


    策略描述

    (可选)输入策略描述。

    为委托选择策略。勾选策略后,单击“下一步”。

    选择授权范围方案,单击“确定”。

    所有资源:授权后,IAM用户可以根据权限使用帐号中所有资源,包括企业项目、区域项目和全局服务资源。

    指定企业项目资源:授权后,用户根据权限使用已选企业项目中的资源。

    指定区域项目资源:授权后,用户根据权限使用已选区域项目中的资源。

    2、将委托(如ECS_TO_CSMS)赋予ECS实例。

    若ECS实例未创建,请参考自定义购买弹性云服务器。在步骤三:高级配置中,“委托”选择新建的委托(如ECS_TO_CSMS)。

    若ECS实例已创建,请按照如下流程:

    单击页面左侧,选择“管理与监督 > 统一身份认证服务”,进入“弹性云服务器”界面。

    单击需要配置委托的ECS实例的“名称”,进入“基本信息”界面。

    在“管理信息”中,单击选择委托(如ECS_TO_CSMS)。

    图4 选择委托

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

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

    URI

    /openstack/latest/securitykey

    方法

    支持 GET 请求

    返回数据内容:

    {

    "credential":{

    "access": "LDHZK30XXXXXXXXXXXXV",

    "secret":"gyqcdzVXXXXXXXXXXXXXXXXXXXXXXXMl6",

    "securitytoken": "El9FI2C65qXXXXXXXXXXXXXXXXXXXXXnkcaoV",

    "expires_at": "2022-07-14T12:09:24.147000Z"

            }

    }

    说明:提取返回数据中的“access”、“secret”、“securitytoken”用于访问CSMS。

    ECS会为您自动轮换临时凭证,从而确保每次申请的临时凭证安全、有效。

    b.使用临时AK&SK+SecurityToken访问CSMS。

    查询凭证列表示例如下,详情请参见凭据管理服务。

    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.csms.v1.region.CsmsRegion;
    import com.huaweicloud.sdk.csms.v1.*;
    import com.huaweicloud.sdk.csms.v1.model.*;

    public class ListSecretsSolution {

    public static void main(String[] args) {
    String ak ="<YOUR AK>";
    String sk ="<YOUR SK>";
    String securitytoken ="<YOUR SecurityToken>";

    ICredential auth =new BasicCredentials()
    .withAk(ak)
    .withSk(sk)
    .withSecurityToken(securitytoken);

    CsmsClient client =CsmsClient.newBuilder()
    .withCredential(auth)
    .withRegion(CsmsRegion.valueOf("cn-north-1"))
    .build();
    ListSecretsRequest request =new ListSecretsRequest();
    try {
    ListSecretsResponse response =client.listSecrets(request);
    System.out.println(response.toString());
    } catch (ConnectionException e) {
    e.getMessage();
    } catch (RequestTimeoutException e) {
    e.getMessage();
    } catch (ServiceResponseException e) {
    e.getMessage();
    System.out.println(e.getHttpStatusCode());
    System.out.println(e.getErrorCode());
    System.out.println(e.getErrorMsg());
    }
    }
    }