在CloudFormation模板中引用AWS Parameter Store的安全字符串

时间:2019-07-04 15:43:36

标签: amazon-web-services amazon-cloudformation aws-parameter-store

坚持使用AWS Parameter Store中的SecureString。我试图将数据库密码称为:

DatabasePassword:
    Type: AWS::SSM::Parameter::Value<SecureString>
    NoEcho: 'true'
    Default: /environment/default/database_password
    Description: The database admin account password

这会引发错误:

  

调用CreateStack操作时发生错误(ValidationError):模板格式错误:无法识别的参数类型:SecureString

但是,如果我将此参数称为String而不是SecureString,则会引发另一个错误:

  

调用CreateStack操作时发生错误(ValidationError):模板引用的参数[/ environment / default / database_password]具有CloudFormation不支持的类型。

我确实尝试使用'{{resolve:ssm-secure:parameter-name:version}}',它可用于数据库配置:

MasterUsername: !Ref DatabaseUsername
MasterUserPassword: '{{resolve:ssm-secure:/environment/default/database_password:1}}'

但是,我正在使用AWS Fargate docker容器,在其中将这些值作为环境变量提供:

Environment:
  - Name: DATABASE_HOSTNAME
    Value: !Ref DatabaseHostname
  - Name: DATABASE_USERNAME
     Value: !Ref DatabaseUsername
  - Name: DATABASE_PASSWORD
    Value: '{{resolve:ssm-secure:/environment/default/database_password:1}}'

这会引发错误:

  

调用CreateStack操作时发生错误(ValidationError):[AWS :: ECS :: TaskDefinition / Properties / ContainerDefinitions / Environment]中不支持SSM安全引用

无法在我的实现中使用安全字符串。有没有解决此问题的方法? AWS去年宣布支持SecureString,但找不到该文档。我发现所有使用的resolve仅在某些情况下有效。

参考:

1

2

2 个答案:

答案 0 :(得分:0)

CloudFormation不支持SecureString作为模板参数类型。您可以在下面的文档中对其进行确认,请允许我引用它。

  

此外,AWS CloudFormation 不支持定义模板   参数作为SecureString Systems Manager参数类型。然而,   您可以将安全字符串指定为某些参数的值   通过使用动态参数模式来获得资源。

参考:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-ssm-parameter-types

正如您提到的,您可以使用dynamic parameter patterns“解决”它,但是只有有限的资源支持它。 ECSFargate不会。

参考:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html

也许您可以使用Secrets Manager来解决它,而是将密码设置为容器的环境变量,您的应用程序会在运行时从Secrets Manager获取密码,这也可以提高安全性,密码会不能在容器内使用明文。

下面您可以看到此解决方案的一个示例,该示例不适用于容器,但是使用环境变量和Secrets Manager的“工作方式”是相同的。

参考:https://aws.amazon.com/blogs/security/how-to-securely-provide-database-credentials-to-lambda-functions-by-using-aws-secrets-manager/

答案 1 :(得分:0)

AWS Secrets Manager可以用于获取CloudFormation模板的机密,即使它们不是数据库密码之类的东西。

以下是文档的链接:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager

“秘密管理器”的秘密包括三个部分:

  • 秘密的名字,例如PROD_DB_PASSWORD
  • 秘密的钥匙,例如DB_PASSWORD
  • 还有实际的秘密价值

然后您将使用以下方法在CloudFormation模板中解决上述秘密:

'{{resolve:secretsmanager:PROD_DB_PASSWORD:SecretString:DB_PASSWORD}}'