使用 Secrets Manager
使用 Secrets Manager 保护敏感数据,并在数据库凭证、API 键和其他密钥的整个生命周期内对其进行轮换、管理和检索。
创建 Secrets Manager 密钥后,更新应用程序代码以检索该密钥。
注意事项
在 Secrets Manager 中保护敏感数据之前,请查看以下注意事项。
-
仅存储文本数据的机密,这些机密是使用
SecretString
参数 CreateSecret 支持 API。不支持存储二进制数据的密钥,这些数据是使用 CreateSecret API的SecretBinary参数创建的密钥。 -
使用接口 VPC 端点增强安全控制。您必须为 Secrets Manager 创建接口 VPC 端点。有关 VPC 端点的信息,请参阅《AWS Secrets Manager 用户指南》中的将 Secrets Manager 与 VPC 端点结合使用。
-
您的任务使用的 VPC 必须使用 DNS 解析。
所需的 IAM 权限
要使用此功能,您必须具有 Amazon ECS 任务执行角色,并在任务定义中引用它。有关更多信息,请参阅Amazon ECS 任务执行 IAM 角色。
要提供对您创建的 Secrets Manager 密钥的访问权限,请将以下权限手动添加到任务执行角色。有关如何管理权限的信息,请参阅《IAM 用户指南》中的添加和删除 IAM 身份权限。
-
secretsmanager:GetSecretValue
– 在引用 Secrets Manager 密钥时是必需的。
以下示例策略添加了所需的权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:
region
:aws_account_id
:secret:secret_name
" ] } ] }
创建 Secrets Manager 密钥
您可以使用 Secrets Manager 控制台为您的敏感数据创建密钥。有关如何创建密钥的信息,请参阅《AWS Secrets Manager 用户指南》中的创建 AWS Secrets Manager 密钥。
更新应用程序以通过编程方式检索 Secrets Manager 密钥
您可以直接从应用程序调用 Secrets Manager API 来检索密钥。有关如何更新代码以请求密钥的信息,请参阅《AWS Secrets Manager 用户指南》中的从 AWS Secrets Manager 检索密钥。
以下代码示例显示了如何获取 Secrets Manager 密钥值。
class SecretsManagerSecret: """Encapsulates Secrets Manager functions.""" def __init__(self, secretsmanager_client): """ :param secretsmanager_client: A Boto3 Secrets Manager client. """ self.secretsmanager_client = secretsmanager_client self.name = None def get_value(self, stage=None): """ Gets the value of a secret. :param stage: The stage of the secret to retrieve. If this is None, the current stage is retrieved. :return: The value of the secret. When the secret is a string, the value is contained in the `SecretString` field. When the secret is bytes, it is contained in the `SecretBinary` field. """ if self.name is None: raise ValueError try: kwargs = {'SecretId': self.name} if stage is not None: kwargs['VersionStage'] = stage response = self.secretsmanager_client.get_secret_value(**kwargs) logger.info("Got value for secret %s.", self.name) except ClientError: logger.exception("Couldn't get value for secret %s.", self.name) raise else: return response