我创建了一个 CloudFormation 模板,该模板成功创建了一个 IAM 用户和一个访问密钥,并将该访问密钥分配给了 IAM 用户。现在我通过在 CloudFormation 模板的 Outputs
部分输出它来获取 AccessKey 的秘密。
我想知道是否有更安全的方法来创建 AccessKey 并获取其相应的秘密,而无需在 Outputs
部分以纯文本形式将其吐出。
我对此有点困惑,因为 AWS 没有太多关于这样做的信息,而且它确实有哪些小文档直接相互矛盾。 Here AWS 建议执行我上面描述的“检索密钥的一种方法是将其放入输出值”。这似乎是一个安全问题,另一个 AWS 文档 Here 证实了这一点,其中说“我们强烈建议您不要使用此部分来输出敏感信息,例如密码或机密”。
我误解了他们的文档还是直接矛盾?我看到 S/O 评论 Here 建议使用 AWS 秘密管理器,但我无法弄清楚如何将 AccessKey 秘密放入 Secrets Manager 中,在那里它可以通过某些东西更安全地存储和获取像boto3。任何这样的例子都会非常有帮助。我的 CloudFormation 模板如下供参考。
{
"Description": "My CloudFormation Template",
"Outputs": {
"UserAccessKeyId": {
"Description": "The value for the User's access key id.",
"Value": {
"Ref": "UserAccessKey"
}
},
"UserSecretKey": {
"Description": "The value for the User's secret key.",
"Value": {
"Fn::GetAtt": [
"UserAccessKey",
"SecretAccessKey"
]
}
}
},
"Resources": {
"User": {
"Properties": {
"UserName": "myNewUser"
},
"Type": "AWS::IAM::User"
},
"PrimaryUserAccessKey": {
"DependsOn": "User",
"Properties": {
"Status": "Active",
"UserName": "myNewUser"
},
"Type": "AWS::IAM::AccessKey"
}
}
}
答案 0 :(得分:2)
我建议将它放在 Secret 中。您可以让 CloudFormation 将值写入堆栈中的 Secrets Manager,然后您可以通过代码访问它。这样您就可以拥有一个任何人都无需看到或触摸即可使用的秘密。
我认为这样的事情应该可行(注意:我还没有真正尝试过)。
AccessKey:
Type: AWS::IAM::AccessKey
Properties:
Serial: 1
Status: Active
UserName: 'joe'
AccessKeySecret:
Type: AWS::SecretsManager::Secret
Properties:
Name: JoeAccessKey
Description: Joes Access Key
SecretString: !Sub '{"AccessKeyId":"${AccessKey}","SecretAccessKey":"${AccessKey.SecretAccessKey}"}'