将 RDS 密码获取到 ECS 上 docker 容器的最佳实践
Best practice for getting RDS password to docker container on ECS
我正在为 运行 我的 docker 容器使用 Postgres Amazon RDS 和 Amazon ECS。
问题是。将 RDS 数据库的用户名和密码放入 ECS 上的 docker 容器 运行 的最佳做法是什么?
我看到几个选项:
- 将凭据构建到 docker 映像中。我不喜欢这样,因为从那时起每个有权访问图像的人都可以获得密码。
- 将凭据放入 ECS 的自动缩放组使用的启动配置的用户数据中。使用这种方法,我的 ECS 集群上的所有 docker 个图像 运行 都可以访问凭据。我也不太喜欢那样。这样,如果黑客在我的任何服务(甚至不使用数据库的服务)中发现安全漏洞,他将能够获得数据库的凭据。
- 将凭据放入 S3 并使用 ECS 服务器具有的 IAM 角色控制对该存储桶的访问限制。与将它们放在用户数据中的缺点相同。
- 将凭据放入ECS的任务定义中。我在这里没有看到任何缺点。
您认为最好的方法是什么?我错过了任何选项吗?
此致,
托比亚斯
从不推荐将其构建到容器中。难以分发和更改。
将它放入ECS实例中并不能帮助您的容器使用它。它们是孤立的,您最终会在所有实例上使用它们,而不仅仅是容器需要它们的地方。
将它们放入 S3 意味着您必须将该功能写入您的容器。这是另一个配置的地方。
将它们放入您的任务定义是推荐的方式。您可以为此使用 environment
部分。它很灵活。这也是像 Heroku 和 Elastic Beanstalk 这样的 PaaS 产品如何使用 Ruby on rails 和其他服务的数据库连接字符串。最后一个好处是,它可以轻松地将容器用于不同的数据库(如开发、测试、生产),而无需重建容器或构建奇怪的功能
接受的答案建议在任务定义中配置环境变量。此配置深埋在 ECS Web 控制台中。你必须:
- 导航到任务定义
- Select 正确的任务和修订
- 选择创建新修订(不允许编辑现有版本)
- 向下滚动到容器部分,select 正确的容器
- 向下滚动到环境变量部分
- 添加您的配置
- 保存配置和任务修改
- 选择使用新任务修订更新您的服务
This tutorial has screenshots说明去哪里。
完全披露:本教程主要介绍来自 Bitnami 的容器,我在 Bitnami 工作。然而,这里表达的想法是我自己的,而不是 Bitnami 的意见。
尽管在任务定义中将凭据放入环境变量当然很方便,但它通常被认为不是特别安全 -- 其他进程可以访问您的环境变量。
我并不是说你不能这样做——我敢肯定有很多人都在这样做,但我也不会称之为 "best practice"。使用 Amazon Secrets Manager 或 SSM Parameter Store 肯定更安全,尽管从那里获取您的凭据以供使用有其自身的挑战,并且在某些平台上,这些挑战可能会使配置数据库连接变得更加困难。
不过,这个问题的任何人 运行 至少要意识到使用任务定义作为秘密似乎是个好主意……应该说……不受欢迎?
我正在为 运行 我的 docker 容器使用 Postgres Amazon RDS 和 Amazon ECS。 问题是。将 RDS 数据库的用户名和密码放入 ECS 上的 docker 容器 运行 的最佳做法是什么?
我看到几个选项:
- 将凭据构建到 docker 映像中。我不喜欢这样,因为从那时起每个有权访问图像的人都可以获得密码。
- 将凭据放入 ECS 的自动缩放组使用的启动配置的用户数据中。使用这种方法,我的 ECS 集群上的所有 docker 个图像 运行 都可以访问凭据。我也不太喜欢那样。这样,如果黑客在我的任何服务(甚至不使用数据库的服务)中发现安全漏洞,他将能够获得数据库的凭据。
- 将凭据放入 S3 并使用 ECS 服务器具有的 IAM 角色控制对该存储桶的访问限制。与将它们放在用户数据中的缺点相同。
- 将凭据放入ECS的任务定义中。我在这里没有看到任何缺点。
您认为最好的方法是什么?我错过了任何选项吗?
此致, 托比亚斯
从不推荐将其构建到容器中。难以分发和更改。
将它放入ECS实例中并不能帮助您的容器使用它。它们是孤立的,您最终会在所有实例上使用它们,而不仅仅是容器需要它们的地方。
将它们放入 S3 意味着您必须将该功能写入您的容器。这是另一个配置的地方。
将它们放入您的任务定义是推荐的方式。您可以为此使用 environment
部分。它很灵活。这也是像 Heroku 和 Elastic Beanstalk 这样的 PaaS 产品如何使用 Ruby on rails 和其他服务的数据库连接字符串。最后一个好处是,它可以轻松地将容器用于不同的数据库(如开发、测试、生产),而无需重建容器或构建奇怪的功能
接受的答案建议在任务定义中配置环境变量。此配置深埋在 ECS Web 控制台中。你必须:
- 导航到任务定义
- Select 正确的任务和修订
- 选择创建新修订(不允许编辑现有版本)
- 向下滚动到容器部分,select 正确的容器
- 向下滚动到环境变量部分
- 添加您的配置
- 保存配置和任务修改
- 选择使用新任务修订更新您的服务
This tutorial has screenshots说明去哪里。
完全披露:本教程主要介绍来自 Bitnami 的容器,我在 Bitnami 工作。然而,这里表达的想法是我自己的,而不是 Bitnami 的意见。
尽管在任务定义中将凭据放入环境变量当然很方便,但它通常被认为不是特别安全 -- 其他进程可以访问您的环境变量。
我并不是说你不能这样做——我敢肯定有很多人都在这样做,但我也不会称之为 "best practice"。使用 Amazon Secrets Manager 或 SSM Parameter Store 肯定更安全,尽管从那里获取您的凭据以供使用有其自身的挑战,并且在某些平台上,这些挑战可能会使配置数据库连接变得更加困难。
不过,这个问题的任何人 运行 至少要意识到使用任务定义作为秘密似乎是个好主意……应该说……不受欢迎?