7

坚持使用 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 安全引用

无法在我的实现中使用安全字符串。这个问题有什么解决方法吗?SecureStringAWS去年宣布支持,但找不到文档。我发现的只是使用resolve它只在某些情况下有效。

参考:

1

2

4

3 回答 3

7

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/

于 2019-07-04T16:16:55.507 回答
1

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

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

Secrets Manager 密钥包含 3 个部分:

  • 秘密名称,例如 PROD_DB_PASSWORD
  • 密钥,例如 DB_PASSWORD
  • 和实际的秘密值

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

'{{resolve:secretsmanager:PROD_DB_PASSWORD:SecretString:DB_PASSWORD}}'
于 2019-07-24T18:42:23.173 回答
0

我知道这篇文章已经很老了,但是我遇到了需要使用SecureString的情况,并找到了这篇文章和描述解决方法的博客文章。我认为这可以帮助一些人。

原帖在这里

基本上,您可以像这样在文件夹中创建一个.conf文件.ebextensions

---
packages:
  yum:
    bash: []
    curl: []
    jq: []
    perl: []
files:
  /opt/elasticbeanstalk/hooks/restartappserver/pre/00_resolve_ssm_environment_variables.sh:
    mode: "000700"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      /usr/local/bin/resolve_ssm_environment_variables.sh
 
  /opt/elasticbeanstalk/hooks/appdeploy/pre/00_resolve_ssm_environment_variables.sh:
    mode: "000700"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      /usr/local/bin/resolve_ssm_environment_variables.sh
 
  /opt/elasticbeanstalk/hooks/configdeploy/pre/00_resolve_ssm_environment_variables.sh:
    mode: "000700"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      /usr/local/bin/resolve_ssm_environment_variables.sh
 
  /usr/local/bin/resolve_ssm_environment_variables.sh:
    mode: "000700"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      set -Eeuo pipefail
 
      # Resolve SSM parameter references in the elasticbeanstalk option_settings environment variables.
      # SSM parameter references must take the same form used in CloudFormation, see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm-secure-strings
      # supported forms are:
      # {{resolve:ssm-secure-env:path:version}}
      # {{resolve:ssm-secure-env:path}}
      # {{resolve:ssm-env:path:version}}
      # {{resolve:ssm-env:path}}
      # where "path" is the SSM parameter path and "version" is the parameter version.
 
      if [[ -z "${AWS_DEFAULT_REGION:-}" ]]; then
        # not set so get from configuration
        AWS_DEFAULT_REGION="$(aws configure get region)" || :
      fi
      if [[ -z "${AWS_DEFAULT_REGION:-}" ]]; then
        # not set so get from metadata
        AWS_DEFAULT_REGION="$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region)" || :
      fi
      if [[ -z "${AWS_DEFAULT_REGION:-}" ]]; then
        echo "Could not determine region." 1>&2
        exit 1
      fi
      export AWS_DEFAULT_REGION
 
      readonly CONTAINER_CONFIG_FILE="${1:-/opt/elasticbeanstalk/deploy/configuration/containerconfiguration}"
      readonly TEMP_CONTAINER_CONFIG_FILE="$(mktemp)"
 
      i=0
      for envvar in $(jq -r ".optionsettings[\"aws:elasticbeanstalk:application:environment\"][]" "${CONTAINER_CONFIG_FILE}"); do
        envvar="$(echo "${envvar}" | perl -p \
          -e 's|{{resolve:ssm(?:-secure)-env:([a-zA-Z0-9_.-/]+?):(\d+?)}}|qx(aws ssm get-parameter-history --name "$1" --with-decryption --query Parameters[?Version==\\\x60$2\\\x60].Value --output text) or die("Failed to get SSM parameter named \"$1\" with version \"$2\"")|eg;' \
          -e 's|{{resolve:ssm(?:-secure)-env:([a-zA-Z0-9_.-/]+?)}}|qx(aws ssm get-parameter --name "$1" --with-decryption --query Parameter.Value --output text) or die("Failed to get SSM parameter named \"$1\"")|eg;')"
        export envvar
        jq ".optionsettings[\"aws:elasticbeanstalk:application:environment\"][${i}]=env.envvar" < "${CONTAINER_CONFIG_FILE}" > "${TEMP_CONTAINER_CONFIG_FILE}"
        cp "${TEMP_CONTAINER_CONFIG_FILE}" "${CONTAINER_CONFIG_FILE}"
        rm "${TEMP_CONTAINER_CONFIG_FILE}"
        ((i++)) || :
      done

然后你可以像在 CloudFormation 模板中那样使用它(或者你想要的任何方式,我将它与 Terraform 一起使用)。请注意,有一个额外的-env后缀可以与本机解析器区分开来。

---
AWSTemplateFormatVersion: '2010-09-09'
Resoures:
  BeanstalkEnvironment:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      OptionSettings:
        -
          Namespace: "aws:elasticbeanstalk:application:environment"
          OptionName: SPRING_DATASOURCE_PASSWORD
          Value: !Sub "{{resolve:ssm-secure-env:/my/parameter:42}
于 2022-01-14T15:30:46.610 回答