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

时间:2021-04-14 19:42:31

标签: amazon-cloudformation boto3 aws-secrets-manager

我创建了一个 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"
        }
    }
}

1 个答案:

答案 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}"}'