我希望给予守护进程风格的进程(即没有用户交互)访问共享的秘密密钥,以便它可以访问共享的,加密的数据文件。访问相同加密数据的用户应用程序将共享密钥存储在用户的OS密钥链(例如OS密钥链或Gnome密钥环等)中。OS密钥链,反过来用用户的登录(或其他特定于用户的)密码来保护密钥。
这里的加密用于在服务器和客户端之间传输公共网络时保护数据。这些数据是来自科学实验的原始数据。大部分是无价值的(即不太可能吸引攻击者投机性地破解加密并浏览数据),但其中一些可能非常有价值,用户希望将其细节保密,直到他们选择公开分享(即保护它不受网络上的临时观察者的影响)。如果不进行科学分析,就很难确定数据的价值,因此,观察用户在未加密线路传输时的活动(包括查询),将为观察者提供一些关于数据价值的线索。
守护进程是系统的查询服务器。它读取共享数据,处理查询,并将结果集的标识符返回给客户端,然后客户端从共享存储中提取标识数据。
我们允许将加密的数据同步到用户的本地工作站/膝上型计算机,因此对磁盘上的数据进行加密最多是对确定的攻击者的一种干扰。我们还允许用户在本地运行查询服务器(仍然由init.d/launchd启动),因此我希望尽我所能保护与守护进程一起存储的密钥。主要风险是,确定的恶意用户能够从其系统上的守护进程中发现密钥。该密钥的公开要求我们更改密钥,更新所有用户的密钥,然后重新加密数据库。
存储守护进程共享密钥的最佳方法是什么?我可以将密钥放在磁盘上并对磁盘上的文件进行加密,但是守护进程必须拥有解密该文件的密钥。这似乎相当于只拥有原始加密数据的共享密钥。我天真的做法是将密钥存储在应用程序的二进制文件中,但我无法想象这是最好的选择。有什么建议吗?
发布于 2011-01-18 21:12:49
这很快就变成了一个“海龟一路下降”的问题。您只需决定在什么时候停止加密,并依赖另一种方法。我认为目标应该是阻止随意的用户,而不是坚决的黑客,以方便地获取受保护的数据。
在一个需要存储DB密码和SSL证书密码的web应用程序中,我尝试了一种类似的方法。我最后所做的是使用不同的主密码在应用程序的配置文件中加密这些密码。主密码存储为应用程序启动脚本设置的环境变量。由于主密码仅在启动脚本中设置,因此可以让单个用户访问该脚本,同时还可以使用标准UNIX文件权限运行该脚本。
我的想法是,要访问这个脚本,否则,您需要已经是根,在这一点上,这并不重要。如果您不能信任root (或者服务器已被黑客攻击),您可能还有其他问题。
此外,在这里有一点安全通过默默无闻,因为所有的细节如何这是没有很好的记录,故意。您必须追溯启动脚本是如何工作的,然后找出使用了哪种算法,如何格式化salt +平面文本,等等。如果您想获得DB密码并获得这个密码,我想您可能已经直接侵入了DB服务器。
发布于 2011-01-19 07:16:24
和往常一样,最好的开始是问自己一些问题:你的威胁模型是什么?你想保护什么?你想保护它不受谁的伤害?你为什么一开始就用密码?从问题上看,所有这些都不清楚。(密码不是魔法精灵尘埃。)如果没有这些问题的答案,我们就不能给你一个解决方案:正确的解决方案将取决于你正在努力实现的目标。
一般说来,这个问题没有很好的解决办法。如果您希望能够在不需要用户参与的情况下启动系统,私钥将在磁盘上的某个地方(或类似的明文)中处于活动状态。就像其他人建议的那样,你很快就会点击“海龟一路下山”。
您可以采取的一个步骤是确保私钥受到文件系统访问控制的保护:例如,通过根用户可以读取私钥,但普通用户不能读取私钥。
注解:有一些复杂的方法,但它们可能不适合你的低成本环境.(1)一种更安全的方法是将私钥存储在连接到服务器的硬件安全模块中。如果服务器被破坏,软件不能窃取私钥(但它仍然可以指示硬件安全模块对任意消息进行签名/解密)。(2)更复杂的方法是使用TPM,并锁定特定软件的私钥。不幸的是,当前的操作系统没有提供很好的支持,因此作为一个系统管理员来做自己是很有挑战性的:它需要大量的开发人员支持。
发布于 2011-01-18 18:23:58
守护进程的帐户没有可用的密钥链吗?
https://security.stackexchange.com/questions/1711
复制相似问题