从 CloudFormation AccessKey 创建中安全地获取访问密钥/秘密

Mic*_*amp 4 aws-cloudformation boto3 aws-secrets-manager

我创建了一个 CloudFormation 模板,该模板成功创建了 IAM 用户和 AccessKey,并将该 AccessKey 分配给 IAM 用户。现在,我通过在OutputsCloudFormation 模板部分中输出 AccessKey 的秘密来获取它。

我想知道是否有更安全的方法来创建 AccessKey 并获取其相应的秘密,而无需在该Outputs部分以纯文本形式吐出它。

我对此有点困惑,因为 AWS 没有太多关于执行此操作的信息,而且它所提供的少量文档直接相互矛盾。这里, AWS 建议执行我上面描述的“检索密钥的一种方法是将其放入输出值”。这似乎是一个安全问题,并且已被另一个 AWS 文档证实,此处显示“我们强烈建议您不要使用此部分输出敏感信息,例如密码或机密”。

我是否误解了他们的文档或者这是直接矛盾?我看到一条 S/O 评论Here建议使用 AWS Secrets Manager,但我无法弄清楚如何将 AccessKey 密钥放入 Secrets Manager,在 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*rth 6

我建议将其放在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}"}'
Run Code Online (Sandbox Code Playgroud)