将Hash安全地存储在Docker映像中

时间:2018-07-06 17:36:29

标签: python-3.x security docker encryption

我正在使用Docker构建一系列应用程序,并希望安全地存储我的api密钥,数据库访问密钥等。为了使我的应用程序更安全,我将配置文件存储在受密码保护,压缩,音量设置为只读。我可以使用ZipFile python软件包来访问它以读取配置,包括使用密码。

但是,出于明显的原因,我不想在图像中显式存储密码。我玩过passlib来生成密码的哈希值并进行比较。虽然我可以将哈希存储在图像的文件中,但是我可以生成哈希而不将值存储在图像的层中。

这样做会是一个好习惯吗?我想到的Dockerfile如下所示:

FROM my_custom_python_image:3.6

WORKDIR /app

COPY . /app

RUN python -m pip install -r requirements.txt

RUN python create_hash.py --token 'mysecret' >> myhash.txt

# The rest of the file here

create_hash.py如下所示:

from passlib.hash import pbkdf2_sha256
import argparse

# Logic to get my argparse token flag 

hash = pbkdf2_sha256.encrypt(args.token, rounds=200000, salt_size=16)
print(hash)

如果我的Dockerfile没有存储在图像中,并且文件系统是只读的,那么我存储到--token的值是否被存储?如果是,这里有什么好的解决方法?同样,最终目标是使用context.verify(user_token, hash)user_token传递给ZipFile,而不是将密码明确存储在任何地方

2 个答案:

答案 0 :(得分:1)

您应该在运行时部署(而不是构建时间)中传递这些值。

它使您的应用程序更灵活(因为仅需更改参数即可在不同的环境中使用),并且安全性更高(因为根本就没有密钥)。

在部署过程中安全传递值在很大程度上取决于部署的环境和功能

答案 1 :(得分:1)

RUN命令中的所有内容稍后都将通过docker history可见。

向这样的应用程序提供密码之类的配置的最安全,易于访问的方法是,将配置文件放入具有适当权限的主机目录中,然后使用docker run -v或类似的选项将其装入正在运行的目录中。容器。根据您对主机系统的信任程度,将选项作为环境变量进行传递也可以很好地起作用(任何可以运行docker inspect或其他在系统上具有root访问权限的人都可以看到,但他们也可以读取配置文件)

通过您提出的方法,我怀疑您将需要实际的密码(而不是哈希)来解密文件。同样,配置的性质在某种程度上与应用程序无关,这意味着您可能正因为数据库主机名更改而需要重建应用程序,而这并不是您通常想要的。