通过CloudFormation声明IAM访问密钥资源

14

我在我的模板中创建了一个带有访问密钥的用户:

"MyAccessKey" : {
   "Type" : "AWS::IAM::AccessKey",
   "Properties" : {
      "UserName" : { "Ref" : "User12" }
   }
} 

我需要在模板的输出中获取访问密钥ID和密钥。 如何做到这一点? 谢谢

2个回答

28

CloudFormation的输出文档指出...

CloudFormation不会删除或混淆您在输出部分中包含的任何信息。我们强烈建议您不要使用此部分输出敏感信息,例如密码或秘密。

一个更安全的选择是创建一个包含用户访问和秘密密钥的AWS::SecretsManager::Secret 资源。

下面是使用此方法利用“bot”用户创建模板的示例...

---
AWSTemplateFormatVersion: 2010-09-09
Description: example bot user

Resources:

  Bot:
    Type: AWS::IAM::User
    Properties:
      Path: /bot/
      UserName: !Ref AWS::StackName

  BotCredentials:
    Type: AWS::IAM::AccessKey
    Properties:
      Status: Active
      UserName: !Ref Bot

  BotCredentialsStored:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: !Sub /bot/credentials/${Bot}
      SecretString: !Sub '{"ACCESS_KEY":"${BotCredentials}","SECRET_KEY":"${BotCredentials.SecretAccessKey}"}'

用户应该如何从 Secrets Manager 中获取秘钥? - Mr Pablo
如果用户拥有足够的 IAM 权限,则可以通过 Secrets 服务控制台或使用 get-secret-value 命令通过 CLI 检索该值。 - RH Becker

14

可以从 AWS::IAM::AccessKey 资源的 返回值 中获取Access Key ID和Secret Key:

"Outputs" : {
  "MyAccessKeyId": {
    "Ref" : "MyAccessKey"
  },
  "MySecretKey": {
    "Fn::GetAtt": [ "MyAccessKey", "SecretAccessKey" ]
  }
}

4
抱歉,一旦您获得了密钥,似乎没有办法从日志中隐藏它。如果有一个输出标志,指示这只是您想要在之后消失的临时输出,那就太好了。 - Mark Adamson
2
如果您想从日志中隐藏此内容,可以创建自定义资源并使用KMS加密密钥。https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html - user1530779
12
或者,您可以将值放入AWS::SecretsManager::Secret而不是通过“Outputs”公开这些值。 - RH Becker
@RHBecker,你是怎么做到的?有没有关于这方面的好例子或文档可以参考?谢谢。 PS:我找到了这个链接https://binx.io/blog/2017/09/22/deploying-secrets-with-aws-cloudformation/。 - diegosasw
5
我已经发布了一个新的答案,展示如何使用 AWS::SecretsManager::Secret 达到这个目的。 - RH Becker
2
真的很烦人,他们似乎强制你使用他们的秘密管理服务。我只需要一次性访问这些信息,在我的CI/CD工具的秘密管理器中插入它,就可以了。 - LostBalloon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接