您的服务不应正常root运行。使用单独的用户来存储机密是一种明智的预防措施,但是存储具有root所有权的文件并不比使用另一个专用用户更好。只要您的秘密文件具有600或更少的权限,它就会对其他非root用户安全。无论如何,任何正在运行的东西root都具有完全访问权限。(除非您正在运行一些复杂的 SELinux 设置)
为这个单一应用程序使用两个用户以将秘密管理与正常操作隔离开来可能会有所帮助。要么有两个运行实时通信的守护程序,要么有实用程序命令来操作秘密,通过sudo.
您应该考虑潜在的攻击媒介。
如果配置正确,SQLi 不会授予文件系统访问权限,但路径遍历攻击可以。您应该保护您的应用程序免受其他类型的攻击。
C 库中的漏洞利用(即运行 HTTPS 加密、图像处理等的 OpenSSL)可能是可能的。在暴露于网络的进程上使用单独的用户可以帮助限制范围或增加攻击的难度。
来自其他攻击媒介的入侵可能是一个问题。(SSH,机器上的其他服务)确保任何可能root访问的东西都得到很好的保护。
所有这些考虑因素都应该有助于您保护机密本身。现在的问题是,秘密真的需要明文存储吗?
在最基本的层面上,是的,秘密必须存储在某个地方才能使用。它至少必须存储在内存中,而且还需要某种永久存储。
除了我们讨论过的用户分离之外,将机密卸载到单独的硬件安全模块甚至是单独的小型计算机可能会有所帮助。(即树莓派)这里有一些关于物理分离的讨论。
在极少数情况下,秘密可以在永久存储中自行加密。
如果您担心硬盘驱动器被盗(将机器的其余部分留在后面),那么您可以有一个启动脚本来查询其他一些硬件的唯一标识符,并使用良好的基于密码的密钥派生来派生加密密钥功能; 解密秘密。
如果客户可以提供一部分秘密,那将是有帮助的。我在这里概述了一种从用户密码和会话令牌派生解密密钥的方法。这是一个复杂而有效的系统,它专注于限制一个秘密的存储时间,即使是在内存中也是如此。(假设您不需要自动密码重置)