Database 加密数据库:环境变量中的机密与Docker机密?

Database 加密数据库:环境变量中的机密与Docker机密?,database,docker,encryption,cryptography,Database,Docker,Encryption,Cryptography,我正在开发一个应用程序,我希望对数据库中的特定字段/表进行加密,因为我将存储敏感信息 我正在研究两种可能的解决方案:将加密秘密存储在环境变量中或Docker Secrets中 我刚刚了解了Docker的秘密——所以我不能完全确定它意味着什么 环境变量是存储数据库字段加密机密的合适位置吗? 改用Docker Secrets怎么样?为什么它比环境变量更安全?攻击者可以用与环境变量相同的方式检查它吗?一天结束时,您的进程需要有解码形式的加密密钥才能使用它。在标准Docker中,只有两个选项可以将其放到

我正在开发一个应用程序,我希望对数据库中的特定字段/表进行加密,因为我将存储敏感信息

我正在研究两种可能的解决方案:将加密秘密存储在环境变量中或Docker Secrets中

我刚刚了解了Docker的秘密——所以我不能完全确定它意味着什么

环境变量是存储数据库字段加密机密的合适位置吗?


改用Docker Secrets怎么样?为什么它比环境变量更安全?攻击者可以用与环境变量相同的方式检查它吗?

一天结束时,您的进程需要有解码形式的加密密钥才能使用它。在标准Docker中,只有两个选项可以将其放到那里:将其传递到环境变量中,或将其存储在绑定装入容器的文件中

传统观点认为,通过文件传递秘密比通过环境变量传递秘密更安全。有时可能会看到另一个进程的环境(
ps-E
xargs-n1-0echo
),这将泄露这些秘密。一个文件可以被设置为0400模式,除其所有者以外的任何人都无法读取,这是一个更简单的方法。在Docker空间中,
Docker inspect
一方面也可以显示环境变量;另一方面,任何可以运行任何Docker命令的人都可以轻松地获得根访问权限;正确设置文件系统权限是一件棘手的事情

各种集群系统都有其他传输秘密值的方法。您提到了,但它们是Docker Swarm cluster manager的一个特性;库伯内特斯;Nomad已经和金库秘密管理员联系过了。安装到容器中的方式各不相同,但是(Swarm secrets除外),您可以选择文件或环境变量。对于Kubernetes Secrets,在一个Secret对象中存储一些凭证,并让进程(POD)将其作为一个环境变量使用,这一点尤其常见

这两个大问题是,您试图保护自己不受什么影响,以及您是否处于集群环境中

  • 如果您在一个节点上,并且您是唯一的用户,那么环境变量就可以了;如果没有一个本地外壳,它们是无法恢复的

  • 如果您在一个节点上有多个用户,您可能无法保护这个秘密:任何可以运行任何
    docker
    命令的人都可以
    docker检查您的容器以查找其环境变量,但是,他们也可以
    docker自己运行一个安装主机文件系统的根shell,并随心所欲地四处查看。如果Docker套接字和sudo访问被锁定,那么基于文件的方法可能更好

  • 如果您在集群环境中,请继续使用它的秘密机制,但以任何更方便的形式使用它。通常只有群集管理员可以直接登录到节点,并且群集API不会显示机密值(除非您有权读回机密对象)


可能重复:另请参见:我在一个节点上–由
用户
您是指管理员吗?我是唯一的管理员也。我特别尝试保护我的系统,以防在发生数据库破坏之类的情况时,潜在的敏感信息被泄露。这不是财务信息,而是用户可能希望保密的信息。这里要点中的“用户”指的是能够访问系统的用户。如果只有受信任的管理员可以登录到系统本身,那么您可能就没事了。对于多人登录的系统,例如通过Docker运行Jupyter笔记本电脑的系统,存在一些常见的SO问题,所有这些用户如果愿意利用它,都有根等效访问权限。