【问题标题】:Docker - make my application use secrets instead of env. varsDocker - 让我的应用程序使用秘密而不是环境。变量
【发布时间】:2020-12-17 21:18:33
【问题描述】:

我的 Django 应用程序使用了很多环境变量,总共大约 35 个。目前,所有这些都由我在启动应用程序堆栈之前获取的 .env 文件处理。 我想我不必指出这是一种非常不安全的方式,特别是如果它是关于生产中的密钥......

现在我的问题是我不太了解如何从 .env 文件切换到机密文件,因为我不了解如何在容器中处理机密文件。例如,Django 使用连接字符串连接我的 MySQL 数据库,见下文:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
        'NAME': env.str('MYSQL_DB'),
        'USER': env.str('MYSQL_USER'),
        'PASSWORD': env.str('MYSQL_PWD'),
        'HOST': env.str('MYSQL_HOST'),
        'PORT': env.str('MYSQL_PORT'),
    }
}

大多数时候我使用“env.str”来获取我在启动时传递给容器的变量。那么如何让我的 Django 应用程序与 docker secrets 一起工作,并且如果可能的话,继续以如上所示的方式获取变量?是否可以在我的 docker-entrypoint.sh 开始时加载所有需要的变量,如果可以,如何实现?

我已经想到了这个解决方案:

if [ -f /run/secrets/MYSQL_PWD ]; then
  export MYSQL_PWD=$(< /run/secrets/MYSQL_PWD)
fi

if [ -f /run/secrets/MYSQL_USER ]; then
  export MYSQL_USER=$(< /run/secrets/MYSQL_USER)
fi

在启动时触发以使我的环境变量就位是否有意义? 见:https://github.com/grafana/grafana-docker/issues/149

感谢阅读

【问题讨论】:

  • @IainShelvington 确实,这是一些有用的信息,但对我来说 export $(egrep -v '^#' /run/secrets/* | xargs) 与我上面提到的代码几乎相同更紧凑,感谢分享:D
  • @IainShelvington 为了让我明白,我首先为 docker 创建了所有需要的秘密,以便稍后在 /run/secrets 中可用。从那时起,我只需在入口点脚本中触发 export $(egrep -v '^#' /run/secrets/* | xargs) 以将变量加载到我的容器中,对吗?
  • 如果您想使用 docker secrets 并将其作为应用程序中的环境变量,是的,这是正确的
  • 如果我这样做是否也有一些安全优势,或者如果我这样加载我的秘密,从这个角度来看,我的容器是否仍然“脆弱”?因为这实际上是我想要解决的问题,正如您已经想象的那样^^

标签: python django docker docker-secrets


【解决方案1】:

一种选择是使用您的文件创建一个秘密,然后使用源命令一次性加载所有环境变量。

docker secret create mysecret <path_to_your_env_file>

source /run/secrets/mysecret  // in your entrypoint.sh

【讨论】:

  • 好的,但我是否将所有秘密都保存在一个文件中?
  • 是的,第一个命令是隐藏所有环境变量,最后一个参数是你的文件。如果您愿意,您可以制作多个文件/多个秘密,这取决于您。然后你的秘密就像容器内的普通文件一样可用,你可以使用 source 命令加载你的变量。我更新了我的答案以更清楚。
  • 好的,很好!但无论如何,并不是我所有的服务都需要所有的变量,并且它是一个潜在的攻击媒介,可以将它们全部加载到实际上并不真正需要的地方。我正在使用 celey、redis 等,并不是我的应用程序的所有实例都需要所有 var,所以我想我会坚持使用如上所示的 If 语句,因为它更“细化”,无论如何感谢您指出您的答案:D
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 2018-06-14
  • 2017-08-01
  • 2023-01-22
  • 2016-03-09
  • 1970-01-01
  • 2018-01-21
  • 2021-10-09
相关资源
最近更新 更多