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

Jav*_*een 3 access-keys aws-cloudformation

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

"MyAccessKey" : {
   "Type" : "AWS::IAM::AccessKey",
   "Properties" : {
      "UserName" : { "Ref" : "User12" }
   }
} 
Run Code Online (Sandbox Code Playgroud)

我需要在模板的输出中获取访问密钥ID和秘密密钥。怎么做 ?谢谢

rba*_*rni 6

访问密钥ID和秘密密钥可用作AWS :: IAM :: AccessKey资源的返回值

"Outputs" : {
  "MyAccessKeyId": {
    "Ref" : "MyAccessKey"
  },
  "MySecretKey": {
    "Fn::GetAtt": [ "MyAccessKey", "SecretAccessKey" ]
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以将值放入“AWS::SecretsManager::Secret”,而不是通过“Outputs”公开这些值。 (10认同)
  • 不幸的是,一旦您获得密钥,似乎就无法将其从日志中隐藏起来。如果他们有一个输出标志,表示这只是一个临时输出,您想在之后消失,那就太好了 (3认同)
  • 如果要从日志中隐藏它,则可以创建自定义资源并使用KMS https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html加密密钥 (2认同)
  • @diegosasw 我发布了一个新答案来展示我如何使用“AWS::SecretsManager::Secret”来达到此目的。 (2认同)
  • 他们似乎让你使用他们的 Secrets 命名服务,这真的很烦人。我只需要一次性访问此信息,将其插入我的 CI/CD 工具的秘密管理器中即可。 (2认同)

RH *_*ker 6

CloudFormation 的输出文档指出......

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

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

下面是利用这种方法创建“机器人”用户的模板示例......

---
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}"}'
Run Code Online (Sandbox Code Playgroud)