我在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

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

推荐答案

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

1. Hard-code the secrets inside the code.(never do this)

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

)

  • Pros:无.永远不要这样做.
  • Cons:名开发者将在他们的日常工作中看到您的生产秘密.您的秘密将被判断到源代码管理中.两者都是安全风险.此外,您必须修改代码以在不同的环境中使用它,如开发、测试和生产环境

2. Put secrets in environment variables, loaded from a .env file.

  • Pros:名开发者不会看到你的生产秘密.您可以在开发、测试和生产中使用不同的机密,而无需修改代码.
  • Cons:个恶意代码可以读取你的秘密.应用程序的大部分代码可能是开源库.糟糕的代码可能会不知不觉地潜入.

3. Put secrets in a dedicated secret manager,比如Vault by HashiCorpSecret Manager by Google Cloud.Parameter StoreAWSAzure Key VaultAzure

  • Pros:恶意代码更难读取您的机密.你可以审核谁在何时访问了机密.您可以为谁更新机密以及谁可以阅读机密分配细粒度角色.你可以更新和版本你的秘密.
  • Cons:这是你学到的附加技术.它可能是您需要设置和管理的额外软件,除非它包含在您使用的云平台中.

因此,实际上是在上述第2项和第3项之间进行 Select .你 Select 哪一个取决于你的秘密有多敏感,以及使用专门的秘密管理器需要多少额外工作.例如,如果您的项目在谷歌云平台上运行,则只需调用一次API即可使用Secret Manager.在其他主要的云平台上可能同样容易,但我对它们没有第一手的经验.

Go相关问答推荐

正在使用terratest执行terraform脚本测试,但遇到错误退出状态1

+在具有html/模板Golang的Base64中

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

Cypher 查找(多个)最低 node

使用goqu无法获取响应

如何从Go项目连接Microsoft Access数据库?

杜松子wine 和中间件

最长连续重复的字符golang

Exchange Web 服务 - 使用 soap xml 请求查找所有未读邮件

gopacket:IP-in-IP 数据包上的解码层

在 Cloud Run 中找不到默认凭据

整理时转换值

Golang Oauth2 服务帐户返回空刷新令牌字符串

如何过滤来自 fsnotify 的重复系统消息

从数据库中带有 imageurl 的文件夹中获取图像,并在我的浏览器中用 golang 中的 echo 显示

在 Golang 模板中计算时间/持续时间

未定义 protoc protoc-gen-go 时间戳

每次有人进入我的网站时如何运行特定功能?

gqlgen go,通过添加一个解析器来减少数据库调用

Go模板中的浮点除法