Проблема изоляции приложений в 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. Эти тесты содержат слишком много параметров, чтобы перечислить их здесь, но сильно блокируют ваш сервер и дают Вы хорошая поза безопасности.

Просто пара вещей, чтобы вы начали, хотя.

  1. Не помещайте свои сайты на системный диск. Создайте отдельный диск. Это не только для безопасности, но и для предотвращения нехватки места на системном диске, если вы загружаете или генерируете слишком много файлов.
  2. Удалить AppPool и веб-сайт по умолчанию. Даже не используйте папку по умолчанию wwwroot.
  3. Вы хорошо начали с создания отдельных AppPools для каждого веб-сайта, но вы можете сделать этот шаг дальше и ограничить доступ к корневой папке каждого веб-сайта к AppPool, на котором работает этот конкретный веб-сайт.

Попробуйте тесты (эти фрагменты, которые я предоставил, включены в тест), а затем снова запустите тест. Из коробки Windows не будет безопасна для этого типа использования (или для многих, если вы действительно к этому).

Вы можете обойти эту проблему, установив права доступа ntfs в папке "applicationB" с полным запретом "IIS AppPool\AppA" и наоборот.

Отрицать

Другие вопросы по тегам