Windows/IIS 如何保护证书,或者我不应该在 Windows 服务器上运行 Apache Webserver?

信息安全 tls 证书 网络服务器 iis
2021-09-04 18:08:33

如果我遵循一位同事的推理,如果您想保证 https 证书的安全,您似乎永远不应该在 Windows 服务器上运行 Apache Webserver 或 Tomcat。

在这个问题演变成 Windows 与 Linux 巨魔之战之前,让我解释一下。

例如,当将 Apache Tomcat 用于 https 网站时,私钥存储在密钥库中。为了让 Tomcat 能够使用这个密钥,我们有三个选项:

  1. 不在密钥库上使用密码;
  2. 启动Tomcat服务时需要输入keystore密码;
  3. 密钥库密码在配置文件中以纯文本形式设置。

使用选项 3 似乎是最常用的。但是任何有权访问此文件和密钥库的人都可以提取私钥。显然,您可以文件系统保护密钥库和配置文件。似乎 linux 提供了更多选项来区分不同进程对这些文件的访问。这个推理导致了我开始的结论。

我不熟悉 Windows 或 IIS 如何处理这个问题,但希望这在引擎盖下的工作方式类似。我的问题是我不确定。如果没有人输入密码,IIS 如何在 Windows 中使用证书?或者只是存储在注册表中而不是配置文件中?设置高证书安全性是否等于选项 2?

谁能向我解释这是如何工作的?

顺便提一句。我对 HSM 不感兴趣。现在我很想知道 Windows/IIS 是否以及如何保护不使用选项 3 的证书或私钥。

我已经搜索过,但找不到确凿的答案。我浏览了 30 个标有“证书”的页面并使用了 google。我发现很难从他们那里得到明确的答案。下面我提到了我发现的一些帮助的来源。我真的希望你能帮助我或指出我正确的来源。

stackExchange 上的安全性:

  • 我的私钥在 Windows 数字证书存储中的安全性如何?
  • 我应该如何在服务器上存储 SSL 密钥?
  • 如何存储应用程序的私有 RSA 密钥?
  • 跨平台证书存储有哪些好的设计实践?

微软:

  • [TechNet 博客] 什么是 Windows 中的强密钥保护?
  • [TechNet, EFS] 如何存储私钥

各种网站:

  • [ServerFault] 如何管理 Web 服务器 SSL 私钥保护(密码与无密码)?
  • [CodingHorror] 保持私钥私密
  • [SecurityInnovation] 如何测试不安全的密钥存储漏洞
  • [RootSecurity] 如何从 Microsoft 证书存储中导出“不可导出”证书
  • [赛门铁克] 攻击者如何从数字证书中窃取私钥
1个回答

一个通用的注释如下:如果您可以重新启动机器,并且服务器会自动再次运行,而无需任何进一步的人为干预,那么根据定义,机器磁盘内容包含机器访问私钥所需的所有内容。相应地,获得机器完全访问权限的人(Linux 上的“root”,Windows 上的“Administrator”)也将能够恢复私钥。

在 Windows 上,基于软件的私钥存储在DPAPI中。简而言之,私钥与一个帐户(“本地机器”存储的机器自己的帐户)相关联,并且保护最终依赖于使用帐户密码作为密钥的加密。对于自动启动的 IIS,相应的密码必须写在系统内部的某处。可以有加密和间接层,但任何有足够权利的人都可以解开它。有关如何实际执行此操作的指示,请参阅此答案。

此外,如果有人在实时机器上获得了管理权限,那么他可以直接附加到正在运行的 Web 服务器进程并使用ReadProcessMemory()直接掠夺其 RAM 内容。

因此,任何保护最终都将取决于操作系统如何防止未经授权的用户获得管理员权限。从这个角度来看,Apache/Tomcat 和 IIS 之间没有太大区别:您可以将 Apache 的私钥存储在一个文件中,并设置一些 ACL 以使该文件只能由运行 Apache 的特定用户读取。具有管理权限的人将能够绕过它,但是,如上所述,他们可以在机器上做任何事情。


现在可以有数量上的微妙之处。下到机器的核心,就是内核;内核代码,顾名思义,就是上帝。它可以读写所有的RAM,访问所有的硬件。内核也是决定谁可以做什么的看门人。在内核看来,每个应用程序代码都以一组权限运行,这些权限准确地描述了代码可以做什么。一些特权是上帝等效的,这意味着拥有该特权的进程可以或多或少直接地安排获得与内核相同的权力。在传统的 Linux 系统中,任何 root 进程都是上帝等价的,因为 root 可以创建和加载内核模块,即直接将自定义代码放入内核本身。通过传递性,任何可以控制具有上帝等效权限的进程的进程也是上帝等效的。

上帝等效的过程是攻击者的多汁目标。这样的过程越多,它们中的一个就越有可能具有可利用的漏洞,从而使攻击者可以实现神性。因此,减少上帝等效过程的大小和范围可能有助于提高实际安全性。在机器的深处,仍然会有一些与上帝等效的代码(如果只有内核本身的话),但微调可能有助于保持代码的小。

默认情况下,Linux 和 Windows 在这方面大致相同(许多进程以 root / 系统帐户运行),但提供了不同的工具来减少它。在 Linux 上,您将使用chroot,更一般地说,使用 SELinux在 Windows 上,您可以使用组策略进行大量调整和限制。在这两种情况下,很容易把自己锁在外面,所以要小心。


摘要: Windows 上的 Apache/Tomcat 没有任何问题。IIS 使用的对私钥应用的保护与对文件的访问权限没有本质上的不同或更强。一个好的系统管理员会在这两种情况下,在同一台机器上实现相似的安全级别。

无论如何,最好不要让任何非特权用户在包含敏感数据的服务器上运行任意代码。经验表明,当允许攻击者在本地运行非特权代码时,可利用漏洞的数量会急剧增加。