我正在尝试保护在两个上下文(本地开发、云部署)中在 docker 容器中运行的 api-server 的敏感数据(密码、令牌等),并且正在寻找有关如何做到这一点的建议,给定以下约束:
在构建时需要一些敏感数据,在运行时需要一些敏感数据。
docker compose
在本地,为了开发,docker 容器是通过yaml 文件创建的(以及其他需要的容器) 。对于远程部署(在 Google Cloud Platform 的 - GCP - “Cloud Run”上),容器是使用 GCP 的“Cloud Build”服务创建的:本质上是一个远程运行的包装器
docker build
和我的 Dockerfile。容器不在集群中运行,因此使用创建/管理的“秘密”
docker secret
不是一个选项。
在本地,我可以使用docker compose
文件的“每个服务”文件机密机制(请参阅此处的文档)将敏感信息放置到一个静默创建、安全许可的/run/secrets/
目录中,该目录在容器内持久可用。这解决了运行时需要的敏感数据(或者在运行时和构建时都需要) - 但是只在构建时需要的敏感数据呢?似乎还没有(见这里)支持安全的构建时特定的秘密(即没有类似于/的docker compose
docker build
BuildKit
--secret
参数);只是标准的构建参数,它可以(不安全地)出现在构建输出中,并在构建后保留在构建工件中。
远程(在 GCP 的“云构建”的上下文中)我可以使用docker build
/BuildKit
的--secret
args 获取仅构建时间的敏感信息(基于此处的提示),但我还没有看到如何处理运行时所需的敏感信息-时间,因为(不像docker compose
),docker build
不会默默地创建一个持久的,严格许可的/run/secrets/
目录......我可以手动创建和(也许?)收紧在我的 Dockerfile 中/run/secrets/
使用的目录的权限 - 但是(和相关操作)将在构建输出,并会导致可能不安全的中间构建工件。COPY
COPY
总而言之:docker compose
似乎为运行时提供了解决方案,但不是构建时(即“文件机密”,放置在 中/run/secrets
),而docker build
/BuildKit
似乎为构建时(即--secret
参数)提供了安全解决方案,但不是运行时。
这是准确的吗?有没有人发现这个困境,即想出如何使用 docker compose来保护构建时数据,以及在使用时如何保护运行时数据docker build
?
我知道有 3rd-party 秘密存储(Vault,Secret Manager等),但想知道如果不引入这种额外的复杂性/依赖层,什么是/将是可能的......
如果不可能同时拥有安全的构建时机密和安全的运行时机密:考虑到上述上下文,从安全角度来看,哪个更重要?
谢谢。