通过本文您可以了解凭据托管和使用的基本场景,以及您可以对凭据执行的相关操作。

基本场景

以数据库用户名和口令的托管为例,介绍一个基本的凭据托管和使用场景。

Basic Scenario
  1. 管理员在目标数据库配置MyApp访问数据库所需的用户名和密码。
  2. 管理员在KMS凭据管家创建一个凭据对象MyDbCreds,用来加密存储上述用户名和密码。
  3. 当MyApp需要访问数据库时,需要向KMS凭据管家请求凭据MyDbCreds。
  4. KMS凭据管家读取到存储的凭据密文,解密后将明文通过HTTPS返回给MyApp。
  5. MyApp读取并解析KMS凭据管家返回的凭据明文,获取到用户名和密码,使用该账号可以访问目标数据库。

对应用MyApp而言,通过调用KMS凭据管家的API来获取敏感的凭据,避免了在程序中硬编码凭据带来的信息泄露风险。硬编码凭据和使用KMS凭据管家的应用程序之间的差异,如下图所示。

HardCodeVsSecretsManager

托管和保护凭据

  • 示例1:创建凭据时不指定加密密钥

    使用如下CLI命令创建凭据,KMS凭据管家会使用系统默认加密的方式保护凭据值。

    $ aliyun kms CreateSecret \
        --SecretName db_cred \
        --SecretData "{\"uname\": \"alice\", \"pwd\": \"12****\"}" \
        --VersionId v1

    KMS返回如下结果:

    {
      "Arn": "acs:kms:us-east-1:123456:secret/db_cred",
      "SecretName": "db_cred",
      "VersionId": "v1",
      "RequestId": "0993b6bb-08de-43b1-a93f-f7dbacaf****"
    }
  • 示例2:创建凭据时指定加密密钥

    使用如下CLI命令创建凭据,KMS凭据管家使用指定的KMS主密钥对凭据进行加密。

    $ aliyun kms CreateSecret \
        --SecretName ssh_key \
        --SecretData ssh-key-blob \
        --VersionId v1 \
        --EncryptionKeyId Example-CMK-Id
    说明
    • KMS凭据管家使用指定的CMK产生数据密钥,用于加密保护凭据的明文数据。
    • 此时CreateSecret的调用者还需要具备指定CMK的kms:GenerateDataKey权限。

    KMS返回如下结果:

    {
        "Arn": "acs:kms:us-east-1:123456:secret/ssh_key",
        "SecretName": "ssh_key",
        "VersionId": "v1",
        "RequestId": "990bf04d-09a5-44de-925a-2da1fb43****"
    }

列出和查看凭据元数据

调用ListSecrets接口列出凭据。

$ aliyun kms ListSecrets                                                                                                                          
{
    "SecretList": {
        "Secret": [
            {
                "SecretName": "db_cred",
                "CreateTime": "2020-01-22T03:55:18Z",
                "UpdateTime": "2020-01-22T03:55:18Z"
            },
            {
                "SecretName": "ssh_key",
                "CreateTime": "2020-01-22T03:57:09Z",
                "UpdateTime": "2020-01-22T03:57:09Z"
            }
        ]
    },
    "RequestId": "75aebbde-be68-4cab-ba6e-e4925b61****",
    "PageNumber": 1,
    "PageSize": 10,
    "TotalCount": 2
}

调用DescribeSecret接口,查看指定凭据的元数据。此接口不返回凭据值的明文数据。

$ aliyun kms DescribeSecret --SecretName ssh_key
{
    "Arn": "acs:kms:us-east-1:123456:secret/ssh_key",
    "SecretName": "ssh_key",
    "EncryptionKeyId": "Example-CMK-Id",
    "Description": "",
    "CreateTime": "2020-01-22T03:57:09Z",
    "UpdateTime": "2020-01-22T03:57:09Z",
    "RequestId": "ca61398f-e61e-4552-aa7e-957955f6****"
}

获取凭据值的明文数据

调用GetSecretValue接口,获取被KMS凭据管家加密保护的凭据明文数据。

$ aliyun kms GetSecretValue --SecretName db_cred                    
{
    "SecretName": "db_cred",
    "VersionId": "v1",
    "SecretData": "{\"uname\": \"alice\", \"pwd\": \"12****\"}",
    "SecretDataType": "text",
    "VersionStages": {
        "VersionStage": [
            "ACSCurrent"
        ]
    },
    "CreateTime": "2020-01-22T03:55:18Z",
    "RequestId": "06a380d8-a43c-4cd5-bdd4-e4a8e986****"
}

上述返回值中,参数SecretData为解密后的凭据明文数据。

说明 凭据对象支持多个版本以及对版本进行状态标记,CreateSecret存入的初始版本会被标记为ACSCurrent,GetSecretValue默认返回被标记为ACSCurrent的版本的凭据值。

删除和恢复凭据

删除的凭据,默认可以在30天内恢复。

$ aliyun kms DeleteSecret --SecretName ssh_key   
{
    "SecretName": "ssh_key",
    "RequestId": "3e54b02b-6461-46bb-afd5-dbd29d96****",
    "PlannedDeleteTime": "2020-02-21T04:24:04.58616562Z"
}

删除的凭据,指定恢复窗口为7天。

$ aliyun kms DeleteSecret --SecretName ssh_key --RecoveryWindowInDays 7
{
    "SecretName": "ssh_key",
    "RequestId": "95ec4f18-8f97-4fd5-b7c6-1588979d****",
    "PlannedDeleteTime": "2020-01-29T04:25:14.165242211Z"
}

在恢复窗口期内,可以恢复凭据。

$ aliyun kms RestoreSecret --SecretName ssh_key                                                                                              
{
    "RequestId": "12770cee-92af-42f5-88e0-cbaa7e0c****",
    "SecretName": "ssh_key"
}

强制删除的凭据,不允许恢复。

$ aliyun kms DeleteSecret --SecretName ssh_key --ForceDeleteWithoutRecovery true
{
    "SecretName": "ssh_key",
    "RequestId": "75efc9c3-8e21-4e38-b6e4-486886be****",
    "PlannedDeleteTime": "2020-01-22T12:28:22.006884739+08:00"
}

轮转凭据

如果您需要对凭据进行轮转,请参见凭据的对象模型凭据轮转