通过本文您可以了解凭据托管和使用的基本场景,以及您可以对凭据执行的相关操作。
基本场景
以数据库用户名和口令的托管为例,介绍一个基本的凭据托管和使用场景。

- 管理员在目标数据库配置MyApp访问数据库所需的用户名和密码。
- 管理员在KMS凭据管家创建一个凭据对象MyDbCreds,用来加密存储上述用户名和密码。
- 当MyApp需要访问数据库时,需要向KMS凭据管家请求凭据MyDbCreds。
- KMS凭据管家读取到存储的凭据密文,解密后将明文通过HTTPS返回给MyApp。
- MyApp读取并解析KMS凭据管家返回的凭据明文,获取到用户名和密码,使用该账号可以访问目标数据库。
对应用MyApp而言,通过调用KMS凭据管家的API来获取敏感的凭据,避免了在程序中硬编码凭据带来的信息泄露风险。硬编码凭据和使用KMS凭据管家的应用程序之间的差异,如下图所示。

托管和保护凭据
- 示例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"
}