首页 > 解决方案 > 在 IIs 10 上设置 AppPool,keySet 不存在

问题描述

我正在运行 Windows 2016 服务器,我们在其上运行 IIs 10,我需要能够在部署网站之前断言是否有 AppPool 设置。如果它不存在,我需要使用特定用户和密码设置 AppPool。

所有这些都是通过 Azure Devops 使用发布代理完成的。

代理以非管理员身份运行,我所有涉及的帐户都以非管理员身份运行。我根本无意运行任何管理员帐户,出于安全原因,我想为所有相关帐户提供最少的特权。

当我尝试使用设置 AppPool 时appcmd.exe收到错误消息:

KeySet does not exist.

当以管理员身份运行所有内容时,它可以工作(我绝对无意以管理员身份运行任何内容)。

我尝试过的:我已将非管理员帐户添加到IIS_IUSRS组中。

确保用户对文件具有读取权限:76944fb33636aeddb9590521c2e8815a_GUID%ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys文件夹中。

我在这里尝试了所有方法:使用远程计算机上的 IIS 管理器更改应用程序池的标识时出错

有谁真正知道这个问题的原因?

更新:

Microsoft明确建议应使用服务帐户运行代理,我正在这样做,并且我没有兴趣授予构建代理对 1000 台服务器的管理权限,而他们显然实际上并不需要这种权力。我想限制他们的权力,只允许他们做他们需要做的事情。我不敢相信给予一切管理员显然是常态。

标签: windowspowershelliisiis-10appcmd

解决方案


经过大量的谷歌搜索,我的意思是很多。我设法解决了这个问题。让我说,让我感到困惑的是,“最低特权帐户”在 Microsoft 和 Windows 世界中并不常见。

我发现 InfoSecMike 的这篇出色的帖子锁定了 azure devops pipelines

我们对这个话题有完全相同的要求和意见。


显然不需要管理员权限来更新 IIs 配置(因为那太疯狂了,对吧!?)。IIs 配置 API 不关心你有什么权限,你需要的是访问某些文件。但这没有记录。为了简单起见,Microsoft 自己告诉您,您需要成为管理员,并在最好的做法时将所有细节都埋在文档的深处。令我惊讶的是,没有人质疑它。

您需要的是以下内容:

  • 完全访问 C:\Windows\System32\inetsrv\Config
  • 完全访问 C:\inetpub
  • 对 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\ 中三个密钥的读取权限
6de9cb26d2b98c01ec4e9e8b34824aa2_GUID (iisConfigurationKey)
d6d986f09a1ee04e24c949879fdb506c_GUID (NetFrameworkConfigurationKey)
76944fb33636aeddb9590521c2e8815a_GUID (iisWasKey)

如果您确保您的服务帐户是IIS_IUSRS组的成员,则可以获得前 2 个要点。

该组不会让您访问密钥。您需要手动将这 3 个密钥的读取权限授予代理用户。

如果您不授予对这些密钥的访问权限,您将收到晦涩的错误消息

Keyset does not exist ( exception from HRESULT : 0x8009000D)

如果您问我,这是一个不正确的错误,因为它应该IllegalAccessException有适当的理由告诉您您无权读取密钥,因为密钥在那里,它们确实存在(漂亮的代码微软,也许您应该开源这个所以我们可以修复)。


我将带着来自 infosecmike 的这句话离开。

目标是锁定 Azure Pipeline Agent {...} 的权限。我开始用谷歌搜索,很确定我会找到实现这个目标的方法。我没有。没有找到关于这个的答案是令人惊讶的。似乎最小特权原则不再适用于 devops 世界。

这就是为什么我更喜欢 Linux 而不是 Windows。这是一个简单的任务。


推荐阅读