将敏感数据传递给 Amazon ECS 容器
您可以将敏感数据(例如数据库凭证)安全地传递到容器中。
应用程序经常使用诸如 API 密钥和数据库凭证之类的密钥来访问其他系统。它们通常由用户名和密码、证书或 API 密钥组成。对这些密钥的访问应仅限于使用 IAM 并在运行时注入到容器中的特定 IAM 主体。
密钥可以从 AWS Secrets Manager 和 Amazon EC2 Systems Manager Parameter Store 无缝注入容器中。这些密钥可以在您的任务中作为以下任何内容引用。
-
它们被引用为使用
secrets
容器定义参数的环境变量。 -
如果您的日志记录平台需要身份验证,它们被引用为
secretOptions
。有关更多信息,请参阅日志记录配置选项。 -
如果从中提取容器的注册表需要身份验证,则使用
repositoryCredentials
容器定义参数的映像将它们作为密钥引用。从 Amazon ECR Public Gallery 中提取映像时使用此方法。有关更多信息,请参阅任务的私有注册表身份验证。
在设置密钥管理时,建议您执行以下操作。
使用 AWS Secrets Manager 或 AWS Systems Manager Parameter Store 来存储密钥材料
您应该将 API 密钥、数据库凭证和其他密钥材料安全地存储在 Secrets Manager 中,或者将其作为加密参数存储在 Systems Manager Parameter Store 中。这些服务之所以相似,是因为它们都是使用 AWS KMS 加密敏感数据的托管键值存储。但是 Secrets Manager 还包括自动轮换密钥、生成随机密钥和在账户之间共享密钥的功能。如果您认为这些功能很重要,请使用 Secrets Manager,否则请使用加密参数。
重要
如果您的密钥发生更改,则必须强制进行新的部署或启动新任务以检索最新的密钥值。有关更多信息,请参阅以下主题:
-
任务 – 停止任务,然后启动它。有关更多信息,请参阅停止 Amazon ECS 任务 和将应用程序作为 Amazon ECS 任务运行。
-
服务 – 更新服务并使用强制新部署选项。有关更多信息,请参阅 使用控制台更新 Amazon ECS 服务。
从加密的 Amazon S3 存储桶中检索数据
您应将密钥存储在加密的 Amazon S3 存储桶中,并使用任务角色来限制对这些密钥的访问权限。这样可以防止环境变量的值无意中泄漏到日志中,以及在运行 docker inspect
时被泄露。执行此操作时,必须编写应用程序以从 Amazon S3 存储桶中读取密钥。有关说明,请参阅为 Amazon S3 存储桶设置默认服务器端加密行为。
使用 sidecar 容器将密钥挂载到卷上
由于环境变量会增加数据泄露的风险,因此您应该运行一个 sidecar 容器,以从 AWS Secrets Manager 中读取密钥并将其写入共享卷中。通过使用 Amazon ECS 容器排序,此容器可以在应用程序容器之前运行和退出。当您执行此操作时,应用程序容器随后会挂载写入密钥的卷。与 Amazon S3 存储桶方法类似,必须编写您的应用程序以从共享卷中读取密钥。由于该卷的作用域仅限于任务,因此该卷将在任务停止后自动删除。有关 sidecar 容器的示例,请参阅 aws-secret-sidecar-injector
在 Amazon EC2 上,可使用 AWS KMS 客户托管密钥对写入密钥的卷进行加密。在 AWS Fargate 上,使用服务托管密钥自动加密卷存储。