4

我有一个 python 脚本,它在 AWS 中创建一些访问密钥并将它们存储在秘密管理器中。

但是,当我存储密钥时,我收到一条错误消息:

The secret value can't be converted to key name and value pairs

秘密像这样存储在秘密管理器中(混淆了密钥):

[{'Access Key': 'AKIA5AODVC64THTZNML7'}, {'Secret Key': 'SecretSecretsecretSecretSecretSecretSecr'}]

我的脚本使用这些行来创建秘密:

secret_name = 'my_secret'
secret_description = 'describing the secret'
kms_key_id = create_kms_key()
key_info = str([{"Access Key":access_key},{"Secret Key":secret_key}])
aws_secret = `secrets_client.create_secret(Name=secret_name,Description=secret_description,KmsKeyId=kms_key_id,SecretString=key_info,Tags=[{'Key': 'Name','Value': user_name}])`

如何将访问/密钥转换为机密管理器足够理解以转换为密钥/值对的格式?

4

3 回答 3

2

首先,您应该重新考虑是否真的需要在 Secrets Manager 中存储 AWS 访问密钥。您打算如何获取将用于调用 Secrets Manager 的凭据?

例如,查看使用临时角色凭据- 不要使用您必须从 SecretsManager 获取另一个凭据对的凭据。使用您必须获得的信用来代替临时信用。

对于您的实际问题,您似乎正在尝试在控制台中查看秘密值(因为此时会显示错误“秘密值无法转换为键名和值对”)。您用于创建机密的 python 代码片段工作正常。当控制台无法将 SecretString 解析为键值对时会显示该错误。这是预期的行为,因为您在 SecretString 中的顶级 obj 是一个数组。

如果单击红色错误显示框正上方的“纯文本”选项卡,您将看到存储的 SecretString,而无需任何尝试解析为键值对。

于 2019-09-24T22:47:18.973 回答
2

首先,您可以将 AWS Access Key 和 Secret Key 存储在 AWS Secret Manager 中,但我强烈不建议这样做。但我仍然可以提供一个解决方案来轻松做到这一点:

  1. 手动将您的秘密值放入 json 或使用 pysecret.
from pysecret import AWSSecret

aws_profile = "my_aws_profile"
aws = AWSSecret(profile_name=aws_profile)

secret_id = "my-example-secret"
secret_data = {
    "iam_user_1": {
        "access_key": "AAAAAAAAAAAAAAAAAAAAA",
        "secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    "iam_user_2": {
        "access_key": "BBBBBBBBBBBBBBBBBBBBB",
        "secret_key": "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
    }
}
aws.deploy_secret(name=secret_id, secret_data=secret_data) # or you can pass kms_key_id if you created a custom kms key
  1. 在 lambda 函数或任何 python 代码中读取您的秘密值
aws = AWSSecret(profile_name=aws_profile) # in lambda code, don't need ``profile_name=aws_profile``

access_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.access_key") # AAAAAAAAAAAAAAAAAAAAA
secret_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.secret_key") # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

access_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.access_key") # BBBBBBBBBBBBBBBBBBBBB
secret_key = aws.get_secret_value(secret_id="my-example-secret", key="iam_user_1.secret_key") # YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

我创建了一个名为 pysecret 的开源库,这是 AWS Secret Manager 集成的文档:https ://github.com/MacHu-GWU/pysecret-project#aws-key-management-service-and-secret-manager-integration

第二

当您想要创建 AWS 访问密钥对时,想想谁将使用它,是人还是机器。如果是机器,请使用 IAM 角色而不是 IAM 用户。如果是人类,则应由人类负责安全地存储它,而不是 AWS Secret Manager。

希望这能回答你的问题。

于 2019-10-11T16:42:50.703 回答
0

这通过添加json.dumps在文本值中发送 json 对我有用:

import json
secret_name = 'my_secret'
secret_description = 'describing the secret'
kms_key_id = create_kms_key()
key_info = str(json.dumps([{"Access Key":access_key},{"Secret Key":secret_key}]))
aws_secret = `secrets_client.create_secret(Name=secret_name,Description=secret_description,KmsKeyId=kms_key_id,SecretString=key_info,Tags=[{'Key': 'Name','Value': user_name}])`
于 2021-11-11T20:14:38.027 回答