在 Golang 中使用 docker 将敏感数据作为参数传递

我在Go中创建了一个程序,它接收参数,project_id并且private_token. 基本上这就是我的做法:


project_id := flag.String("project", "", "The id of the project")

private_token := flag.String("pat", "", "The personal access token with api and read user permissions")

flag.Parse()

我创建了以下 docker 镜像:


FROM golang:1.16-alpine


WORKDIR /app


COPY . /app


RUN go build


ENV PROJECT=""

ENV PRIVATE_TOKEN=""


ENTRYPOINT "./my-program" "-project" $PROJECT "-pat" $PRIVATE_TOKEN

我通过运行运行图像:


docker run -e PROJECT=29065042 -e PRIVATE_TOKEN="glpat-1CHf9T8Nz98W8ZzyT7V4" --rm -it my-image-name

如您所见,我正在传递一个私有令牌,这是一个敏感数据。我想知道这是否是将敏感数据从 docker 传递到我的 go 程序的最佳方法,或者是否有更好的模式?


萧十郎
浏览 204回答 2
2回答

一只甜甜圈

有多种方法可以使用 docker 在 Go 应用程序中存储和使用敏感数据。每种方法都有其优点和缺点。1.硬编码代码里面的秘密。(永远不要这样做)const (     PROJECT_NAME = "MyProject"     PRIVATE_TOKEN="kjdnioqvnocw")优点:没有。永远不要这样做。缺点:开发人员会将您的生产机密视为他们日常工作的一部分。您的秘密将被检查到源代码管理中。两者都是安全风险。此外,您必须修改代码以在不同的环境中使用它,例如开发、测试和生产。2. 将秘密放入环境变量中,从 .env 文件加载。 有两个包可以轻松使用.env文件,godotenv和viper,我更喜欢godotenv因为它更容易。优点:开发人员不会看到您的生产机密。您可以在开发、测试和生产中使用不同的秘密,而无需修改代码。缺点:恶意代码可以读取您的秘密。您应用程序的大部分代码可能是开源库。错误的代码可能会在您不知情的情况下潜入。3. 将秘密放入专门的秘密管理器中,例如HashiCorp 的 Vault、Google Cloud 的秘密管理器。AWS的Parameter Store, Azure的Azure Key Vault优点:恶意代码更难读取您的秘密。您可以审核谁在何时访问了机密。您可以为谁更新机密以及谁可以读取机密分配细粒度的角色。您可以更新和版本您的秘密。缺点:这是您学习的附加技术。它可能是您需要设置和管理的附加软件,除非它包含在您使用的云平台中。所以选择实际上是在上面的第 2 项和第 3 项之间。您选择哪一个将取决于您的秘密有多敏感以及使用专门的秘密管理器需要多少额外工作。例如,如果您的项目在 Google Cloud Platform 上运行,Secret Manager 只需一次 API 调用即可。在其他主要的云平台上可能也一样容易,但我对它们没有第一手经验。

沧海一幻觉

ENTRYPOINT "./my-program" "-project" $PROJECT "-pat" $PRIVATE_TOKEN是一个独立的 shell,不能共享以前 Dokerfile 行中的变量,这是使用 Dockerfiles 的权衡。我想建议修改./my-program以阅读config-file类似的内容kubectl。有一个很好的 Viper 包可以帮助实现这种方法。IE: ENTRYPOINT "./my-program" "--config-file" "config.yaml"您应该在 ENTRYPOINT 之前将所有秘密保存在 config.yaml 中参考资料:https ://github.com/spf13/viper
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go