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

我在 Go 中创建了一个程序,它接收参数 project_idprivate_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

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

最佳答案

使用 docker 在 Go 应用程序中存储和使用敏感数据的方法有多种。每种方法都有其优点和缺点。

1。在代码中硬编码 secret 。(永远不要这样做)

const (
    PROJECT_NAME = "MyProject"
    PRIVATE_TOKEN="kjdnioqvnocw"

)

  • 优点:没有。永远不要这样做。
  • 缺点:开发人员会将您的生产 secret 视为他们日常工作的一部分。您的 secret 将被检查到源代码管理中。两者都是安全风险。此外,您必须修改代码才能在不同的环境中使用它,例如开发、测试和生产。

2。将 secret 放入环境变量中,从 .env 文件加载。 有两个包可以轻松使用 .env 文件,godotenv和 viper ,我更喜欢 godotenv 因为它更容易。

  • 优点:开发人员不会看到您的生产 secret 。您可以在开发、测试和生产中使用不同的 secret ,而无需修改代码。
  • 缺点:恶意代码可以读取您的 secret 。您应用程序的大部分代码可能是开源库。错误代码可能会在您不知情的情况下悄悄侵入。

3。将 secret 放入专门的 secret 管理器,例如Vault by HashiCorp , Secret Manager by Google Cloud . Parameter Store通过 AWS , Azure Key Vault来自 Azure

  • 优点:恶意代码更难读取您的 secret 信息。您可以审核谁在何时访问了 secret 。您可以为谁更新 secret 以及谁可以读取 secret 分配细粒度的角色。您可以更新和控制您的 secret 。
  • 缺点:这是您学习的额外技术。它可能是您需要设置和管理的额外软件,除非它包含在您使用的云平台中。

所以选择实际上是在上面的第 2 项和第 3 项之间。您选择哪一个将取决于您的 secret 有多敏感以及使用专门的 secret 管理器需要多少额外工作。例如,如果您的项目在 Google Cloud Platform 上运行,Secret Manager 只需一次 API 调用即可。在其他主要云平台上可能同样容易,但我没有使用它们的第一手经验。

https://stackoverflow.com/questions/72903738/

相关文章:

java - 是否可以向 OpenAPI 添加方法?

databricks - Databricks 中的目录

ios - SwiftUI:有条件地隐藏 View 而不重新创建它

javascript - 使用 Object.keys() 获取 searchParams

typescript - 将通用 typescript 类型限制为单个字符串文字值,不允许联合

java - 关闭 AsynchronousSocketChannel 时连接重置错误

r - 按两个数字对列名称进行排序

swiftui - 带有条件绑定(bind)的 SwiftUI 中的错误必须具有可选类型,而不是字符

xaml - 删除开关中的文本

r - 在 R 中使用 dplyr 包 Lag 函数时有没有办法省略 NA?