使用 AWS Systems Manager Parameter Store
Systems Manager Parameter Store 提供了密钥的安全存储和管理。可以将密码、数据库字符串、 Amazon Elastic Compute Cloud(Amazon EC2)实例 ID、Amazon Machine Image(AMI)ID 和许可证代码等数据存储为参数值。可以将值存储为纯文本或加密数据。
使用 Systems Manager Parameter Store 存储密钥后,请更新应用程序代码以检索密钥。
注意事项
在 Systems Manager Parameter Store 中保护敏感数据之前,请查看以下注意事项。
-
仅支持存储文本数据的密钥。不支持存储二进制数据的密钥。
-
使用接口 VPC 端点增强安全控制。
-
您的任务使用的 VPC 必须使用 DNS 解析。
所需的 IAM 权限
要使用此功能,您必须具有 Amazon ECS 任务执行角色,并在任务定义中引用它。这允许容器代理提取必要的 Systems Manager 资源。有关更多信息,请参阅Amazon ECS 任务执行 IAM 角色。
对于使用 EC2 启动类型的任务,必须使用 ECS 代理配置变量 ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true
才能使用此功能。您可以在创建容器实例的过程中将其添加到 ./etc/ecs/ecs.config
文件中,也可以将其添加到现有实例中,然后重新启动 ECS 代理。有关更多信息,请参阅Amazon ECS 容器代理配置。
要提供对您创建的 Systems Manager Parameter Store 参数的访问权限,请将以下权限作为策略手动添加到任务执行角色。有关如何管理权限的信息,请参阅《IAM 用户指南》中的添加和删除 IAM 身份权限。
-
ssm:GetParameters
— 当您在任务定义中引用 Systems Manager Parameter Store 参数时是必需的。 -
secretsmanager:GetSecretValue
— 当您直接引用 Secrets Manager 密钥或者您的 System Manager Parameter Store 参数在任务定义中引用 Secrets Manager 密钥时,这是必需的。 -
kms:Decrypt
— 仅当您的密钥使用客户托管键而不是默认键时才需要。您的自定义密钥的 ARN 应添加为资源。
以下示例策略添加了所需的权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters", "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:ssm:
region
:aws_account_id
:parameter/parameter_name
", "arn:aws:secretsmanager:region
:aws_account_id
:secret:secret_name
", "arn:aws:kms:region
:aws_account_id
:key/key_id
" ] } ] }
创建密钥
您可以使用 Systems Manager 控制台为您的敏感数据创建 Systems Manager Parameter Store 参数。有关更多信息,请参阅《AWS Systems Manager 用户指南》中的创建 Systems Manager 参数(控制台)或创建 Systems Manager 参数(AWS CLI)。
更新应用程序以通过编程方式检索 Systems Manager Parameter Store 密钥
要检索存储在 Systems Manager Parameter Store 参数中的敏感数据,请在您的应用程序中插入以下代码。
import boto3 import os print("SSM Parameter Store Demo using Python SDK") ssm = boto3.client("ssm") MY_ENV = os.environ["MY_ENV"] raw_my_username = ssm.get_parameter(Name=f"/sandbox/{MY_ENV}/username") raw_my_password = ssm.get_parameter(Name=f"/sandbox/{MY_ENV}/password", WithDecryption=True) my_username = raw_my_username['Parameter']['Value'] my_password = raw_my_password['Parameter']['Value'] print(f"Username: {my_username}") print(f"Password: {my_password}") return f"Successfully fetched credentials on {MY_ENV} environment = {my_username}:{my_password}"