1

我有一个使用嵌入式 Jetty 在 Linux 上运行的现有 Java Web 应用程序。该应用程序使用 jsvc 加载,它以 root 身份运行,侦听端口 443,并将请求中继到 Java 应用程序,该应用程序在端口 8443 上以较低权限的用户“appname”运行。

目前,应用程序从我们称为“secrets.properties”的文件中读取加密密钥。它可由“root”写入,由“appname”读取(技术上,由“appname”组的成员读取)。然而,我的偏好是该文件只能由“root”读取,并且 jsvc 读取该文件并将该文件的内容(甚至只是一个属性)传递给应用程序。我的目标是,如果有人能够破坏该应用程序并使用该应用程序的“appname”帐户获得系统访问权限,那么他们将无法检索密钥。

如果没有运行“ps -ex”的人可以看到密钥,这可能吗?

4

1 回答 1

1

他们可能无法检索密钥,但他们仍然可以使用它

由于攻击者现在控制了应用程序,他们可以发送他们想要的任何消息以及对它们进行签名/加密的任何消息,相信应用程序没有受到损害,尽职尽责地对它们进行签名或加密。如果您只是尝试对来自应用程序的数据进行身份验证,那么这样做毫无意义。

无论如何,如果服务器遭到破坏,您将明智地撤销您的密钥,因此它也不会为您保存它们。

现在,如果您担心长期存在的密钥泄露,攻击者可以读取之前发送(但不再存储在应用程序中)的消息,那又是一个不同的问题。我建议使用具有完美前向保密性的加密系统。如果您使用经过身份验证的 Diffie-Helmen 密钥交换,则TLS/SSL 具有此功能,这是其中包含 ECDHE 或 DHE 的方案(例如 ECDHE-ECDSA-AES128-GCM-SHA256 或 TLS-DHE-RSA-with-AES-256-CBC-沙)

如果由于某种原因您仍然担心密钥被泄露,您可以编写一个代理。它既可以作为 root 运行,也可以作为不同的组运行并将密钥交给它。对于 TLS/SSL,这很容易。对于一些自定义加密/签名系统,谁知道。但同样,几乎没有理由要这样做。

于 2012-05-02T06:25:46.807 回答