【问题标题】:Most secure way to store secrets while building a docker image (Python flask server)构建 docker 映像时存储机密的最安全方法(Python 烧瓶服务器)
【发布时间】:2022-01-21 05:49:08
【问题描述】:

所以目前我正在为我的 python 烧瓶服务器构建一个 docker 映像,我访问代码中的秘密变量的方式是 app.config["SECRET_KEY"] = os.environ.get("todo_secret_key") or "secret"

现在如果我想在没有容器的情况下运行代码,我会使用导出命令(linux)在环境中临时拥有密钥,但我需要它在容器的环境中。

现在,我知道的一些方法是

  1. 在 docker run 命令docker run {imageName} -e {name}={value} 中使用 -e 传递它(不安全,因为我不希望它出现在终端日志中)

  2. 通过指定环境变量在 dockerfile 中传递它(绝对不安全,因为这个文件是公开的)

除了这些方法之外,还有没有更安全的方式来传递变量

P.s 这是我第一次制作图像,如果这是一个愚蠢的问题,请道歉

【问题讨论】:

  • 有一个完整的运营分支讨论了执行此操作的最佳方法,称为“配置管理”
  • --env-file ...?
  • 顺便说一句:我真的很欣赏这样的问题,这些问题简洁明了,并且描述了一个提问者,他们刚刚意识到他们刚刚发现的冰山的庞大规模遥遥无期。
  • 无论采用何种方法,您仍然可以打印环境变量。那你为什么要关心它。请详细说明。
  • @SrinivasReddyThatiparthy 是的,但 docker run ... -e name=secret 可以从任何用户的 ps aux 中看到,即使该用户没有执行到容器中的权限。

标签: python docker environment-variables


【解决方案1】:

如果您担心这个因为您正在构建您的 docker 映像,那么您正试图将您的运行时配置与构建时配置联系得太紧!

请记住,这些阶段是离散的,如果相互关联的话。

开发 -> 构建 -> 测试 -> 部署 -> 测试(非功能性)-> 重复...

任何阶段都不应决定未来阶段的行为。 docker build 是“构建”阶段,因此应该不知道最终部署映像时环境中的正确配置。怎么可能?该配置可能会随着时间而改变!

相反,请使用 configuration management 来处理此类决定。您的 docker 调度程序(Kubernetes 很常见,但其他轻量级执行程序,如 Docker Swarm 或 ECS 也应该这样做)应该有一种读取配置文件并将其注入环境的方法。对配置管理的全面讨论可以(并且已经)填满教科书。

【讨论】:

  • 好吧,所以即使我确实构建了我的映像并稍后发送配置参数,我仍然想知道在运行时传递配置选项的最安全方法是什么( -e 带有运行命令,或者我将文件挂载为卷......或任何其他替代方案?)P.s,我没有使用任何编排工具,我只会使用 docker-compose
  • @jmvaswani 一个常见的关于安全性的回答是“视情况而定”。你在哪里运行代码?如果它只是一台开发人员机器,那么它是否安全并不重要。如果它在云中运行,那么您必须询问您的威胁向量(如果任何终端访问都意味着您已经被骨灰化,那么如果他们可以在终端中发现秘密怎么办)。一般来说,我可能会在运行 docker 容器的机器映像中包含一个.env file
猜你喜欢
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
相关资源
最近更新 更多