关于linux:让应用签署文件,但不要让它看到密钥

Let an app sign documents, but don't let it see the keys

我想在Linux服务器上对文档和消息进行数字签名。如何安全地存储私钥和密码短语(如果有的话)?

问题是,如果应用程序被盗用,密钥也将被盗用。如果我可以以某种方式让应用程序签名,但又不让它触摸实际按键,那将无法完全解决我的问题(因为攻击者仍然可以在一段时间内对任何内容进行签名),但可以减少影响(例如,我们就不必撤消密钥。)

例如,在SSL服务器的情况下,不会出现此类问题,因为通常没有实际需要应用程序访问密钥。因此,可以将它们半安全地存储在单独的位置。例如。 Web服务器(如nginx)将能够读取密钥,但不能读取应用程序。

我是否想得太多?甚至值得思考吗?


创建一个单独的,轻量级的签名应用程序,该应用程序在UNIX套接字上侦听并以与主应用程序不同的用户身份运行;当您的应用要签名时,它将文件和所有其他信息丢到该套接字上,并取回已签名的文件。

如果应用程序遭到破坏,只要攻击者仍在服务器上,攻击者就仍然能够对其进行签名,但是除非他使用特权升级漏洞获得root用户特权并复制签名应用程序的密钥,否则他将不会能够窃取密钥,然后在不连接服务器的情况下随意签名。

您可以使用标准TCP套接字替换UNIX套接字,并将签名应用程序放置在单独的服务器上以提高安全性;确保在签名应用程序上实现一些基本的访问控制,并且当然要使用正确的防火墙规则,以确保签名服务器永远不会暴露在互联网上,或者通过使用" setuid"二进制代码来简化签名,以简化签名过程。您的应用,在这种情况下,签名二进制文件将以具有其他访问密钥的特权的其他用户身份运行,而webapp本身没有这种特权。

基本上,您应该实施基本软件HSM。


如果您对安全性有很高的要求,可以考虑将密钥移至完全独立的服务器,或者更好的硬件安全模块(但是价格昂贵)。就像您提到的那样,它可以帮助防止密钥丢失,但是如果应用程序遭到破坏,攻击者仍然可以签署他们想要的任何内容。

随后遇到麻烦的主要原因是审核。也就是说,如果您的签名服务器或设备将其签名的所有内容保存在日志中,那么如果仅您的应用程序受到威胁,则您将能够更好地评估损坏程度(假设您正在签名的服务器没有受到破坏)。铅>

是的,这是有好处的,但是您的首要重点应该放在正确保护主应用程序上,因为一旦妥协,即使您将密钥转移到了完善的服务上,您也已经过得很糟糕。