Показать/Скрыть содержание

    Перенаправление запросов с веб-сервера, опубликованного в сети Интернет, на веб-сервер, расположенный во внутренней сети организации

    Схема стенда, для которой может быть выполнена данная инструкция:

    • Внешний веб-сервер: сервер с IIS и модулями ARR и RewriteRule.
    • Внутренний веб-сервер: сервер DSS (порт 4430) c CloudProvider (порт 4431).
    • Клиент с CloudCSP (cptools), имеющий подключение к внешнему веб-серверу и функционирующий либо в среде ОС MS Windows, либо ОС Astra Linux.

    Для обеспечения перенаправления запросов от клиента с CloudCSP, поступающих на порт 4431 внешнего веб-сервера, на внутренний веб-сервер необходимо выполнить следующие действия.

    1. На внешнем веб-сервере настроить обратный прокси-сервер (reverse proxy) (при необходимости, настроить использование SSL);

    2. На внутреннем веб-сервере настроить DSS, указав в качестве доверенных сторон адреса (URL) внешнего веб-сервера, а также настроить конфигурации CloudProvider.

    Настройка обратного прокси-сервера на внешнем веб-сервере

    1. Необходимо загрузить и установить следующие модули для IIS:

    • Модуль ARR (Application Request Routing), доступен для загрузки по ссылке Application Request Routing : The Official Microsoft IIS Site
    • Модуль URL Rewrite, доступен для загрузки по ссылке URL Rewrite : The Official Microsoft IIS Site

    2. После установки модулей ARR и URL Rewrite открыть консоль управления IIS (Диспетчер служб IIS) и выбрать модуль Application Request Routing Cache.

    1.png

    3. В панели «Действия» нажать «Server Proxy Settings».

    2.png

    4. Включить режим перенаправления запросов (установить галочку напротив «Enable proxy») и применить изменения.

    3.png

    5. В блоке «Custom Headers» значения параметров остаются без изменений.

    6. В блоке «Cache Setting» необходимо снять галочки напротив параметров «Enable disk cache» и «Enable request consolidation». Параметр «Query string support» можно оставить «Ignore query string» или указать «Do not cache».

    4.png

    7. В блоке «Proxy Chain» поле «Proxy Server» должно быть пустым.

    8. В блоке «Proxy Type» установить галочку напротив параметра «Use URL Rewrite to inspect incoming Request» и указать адрес внутреннего сервера в параметре «Reverse proxy» (порт указывать не обязательно). При этом необходимо убрать галочку напротив параметра «Enable SSL offloading».

    5.png

    9. В Диспетчере служб IIS перейти в корневой узел веб-сервера и выбрать и открыть модуль «Переопределение URL-адресов».

    6.png

    10. После открытия модуля «Переопределение URL-адресов» необходимо отключить правила, созданные автоматически ранее, при включении и настройки режима проксирования запросов («ARR_server_proxy_SSL» и «ARR_server_proxy»).

    7.png

    11. В панели «Действия» нажать «Добавить правила…». В открывшемся окне «Добавить правила» выбрать «Пустое правило» и нажать кнопку «ОК».

    8.png 9.png 10.png

    12. Создать необходимые правила для входящего трафика и исходящего трафика и применить изменения.

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

    В качестве значения параметра «URL-адрес переопределения» необходимо указывать URL на внутренний веб-сервер с DSS и добавлять подстроку запроса (переменную) вида «{R:0}».

    Подзапросы Mfa, signalr, confirmation добавляются при необходимости реализации двухфакторной аутентификации (например, при подтверждении операций электронной подписи) или при необходимости обеспечения работы CloudCSP в среде ОС Astra Linux.

    Установка галочки напротив параметра «Не учитывать регистр» осуществляется при необходимости (или в случае изменения приведенных запросов).

    Общий перечень всех правил приведен на рисунке ниже, далее следует описание каждого правила в подробностях.

    11.png

    Правило 1

    12.png 13.png

    Правило 1_STS_oauth_authorize
    Запрошенный URL-адрес Соответствует шаблону
    Использование Регулярные выражения
    Шаблон ^STS/oauth/authorize
    Логическая группировка Совпадение со всеми элементами
    Условия
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {SERVER_PORT}
    Соответствует шаблону
    ^(4431|4430)$
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {HTTPS}
    Соответствует шаблону
    on
    Тип действия Переопределение
    URL-адрес переопределения https://<hostname>:{SERVER_PORT}/{R:0}
    Добавить строку запроса Галочка установлена
    Остановить обработку последующих правил Галочка установлена
    Правило 2

    14.png 15.png

    Правило 2_STS_Authentication
    Запрошенный URL-адрес Соответствует шаблону
    Использование Регулярные выражения
    Шаблон STS/Authentication/.*
    Логическая группировка Совпадение со всеми элементами
    Условия
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {SERVER_PORT}
    Соответствует шаблону
    ^(4431|4430)$
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {HTTPS}
    Соответствует шаблону
    on
    Тип действия Переопределение
    URL-адрес переопределения https://<hostname>:{SERVER_PORT}/{R:0}
    Добавить строку запроса Галочка установлена
    Остановить обработку последующих правил Галочка установлена
    Правило 3

    16.png 17.png

    Правило 3_STS_bundles_font_Content
    Запрошенный URL-адрес Соответствует шаблону
    Использование Регулярные выражения
    Шаблон STS/(bundles|Content|fonts)/.*
    Логическая группировка Совпадение со всеми элементами
    Условия
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {SERVER_PORT}
    Соответствует шаблону
    ^(4431|4430)$
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {HTTPS}
    Соответствует шаблону
    on
    Тип действия Переопределение
    URL-адрес переопределения https://<hostname>:{SERVER_PORT}/{R:0}
    Добавить строку запроса Галочка установлена
    Остановить обработку последующих правил Галочка установлена
    Правило 4

    18.png 19.png

    Правило 4_SignServer_rest
    Запрошенный URL-адрес Соответствует шаблону
    Использование Регулярные выражения
    Шаблон ^SignServer/rest/api/.*
    Логическая группировка Совпадение со всеми элементами
    Условия
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {SERVER_PORT}
    Соответствует шаблону
    ^(4431|4430)$
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {HTTPS}
    Соответствует шаблону
    on
    Тип действия Переопределение
    URL-адрес переопределения https://<hostname>:{SERVER_PORT}/{R:0}
    Добавить строку запроса Галочка установлена
    Остановить обработку последующих правил Галочка установлена
    Правило 5

    20.png 21.png

    Правило 5_STS_Mfa
    Запрошенный URL-адрес Соответствует шаблону
    Использование Регулярные выражения
    Шаблон STS/Mfa.*
    Логическая группировка Совпадение со всеми элементами
    Условия
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {SERVER_PORT}
    Соответствует шаблону
    ^(4431|4430)$
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {HTTPS}
    Соответствует шаблону
    on
    Тип действия Переопределение
    URL-адрес переопределения https://<hostname>:{SERVER_PORT}/{R:0}
    Добавить строку запроса Галочка установлена
    Остановить обработку последующих правил Галочка установлена
    Правило 6

    22.png 23.png

    Правило 6_STS_signalr
    Запрошенный URL-адрес Соответствует шаблону
    Использование Регулярные выражения
    Шаблон STS/signalr.*
    Логическая группировка Совпадение со всеми элементами
    Условия
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {SERVER_PORT}
    Соответствует шаблону
    4431|4430
    Ввод условия
    Проверить, если входная строка
    Шаблон
    {HTTPS}
    Соответствует шаблону
    on
    Тип действия Переопределение
    URL-адрес переопределения https://<hostname>:{SERVER_PORT}/{R:0}
    Добавить строку запроса Галочка установлена
    Остановить обработку последующих правил Галочка установлена
    Правило 7

    24.png 25.png 26.png

    Правило rewrite_host_oauth
    Предварительное условие redirect
    Область поиска Серверная переменная
    Имя переменной RESPONSE_LOCATION
    Значение переменной Соответствует шаблону
    Использование Регулярные выражения
    Шаблон (https://<hostname>:)(443\d)(.*)
    Логическая группировка Совпадение со всеми элементами
    Тип действия Переопределение
    Свойства https://<hostname>{R:2}{R:3}
    Добавить строку запроса Галочка установлена
    Остановить обработку последующих правил Галочка НЕ установлена

    В блоке «Условия» рекомендуется добавить одновременно выполняемые условия (логическая группировка – «Совпадение со всеми»), при которых запросы должны быть перенаправлены (например, запросы поступают на порт 443 внешнего сервера и по защищенному протоколу HTTPS).

    27.png

    Дополнительное условие добавляется и настраивается в панели «Условия». Порт, указанный в запросе к серверу, хранится в переменной {SERVER_PORT}. Использование защищенного протокола сетевого взаимодействия определяется переменной {HTTPS} (on или off).

    Дополнительно можно добавить и настроить отдельное правило, в соответствии с которым определяется действие IIS в случае поступления запросов к STS или SignServer на порт сервера, отличный от штатного. Например, при поступлении запросов, содержащих STS или SignServer, не на 443 порт, задается действие «Настраиваемый ответ», в котором можно определить возвращаемые код состояния и код подсостояния. В нижеприведенном примере в соответствии с правилом возвращается http-состояние 503.0.

    28.png

    В связи с тем, что на IIS для кода состояния 503 не определена страница ошибок, можно создать соответствующую страницу html и добавить ее в перечень выводимых IIS.

    29.png

    13.\ После завершения вышеуказанных настроек рекомендуется открыть модуль «Переопределение URL-адресов» для каждого веб-сайта и убедиться в отсутствии правил переопределения адресов или в их отключении при наличии.

    30.png

    Настройка внутреннего сервера с DSS (SignServer)

    Определение дополнительных доверенных Identities

    На сервере DSS необходимо определить дополнительные доверенные Identities для SignServer (через PowerShell).

    Пример:

    $idSignServer = Get-DssRelyingPartyTrust | ? {$_.DisplayName -eq 'SignServer'} | % {$_.Id}
    
    
    $currentIdentities = Get-DssRelyingPartyTrust | ? {$_.DisplayName -eq 'SignServer'} | % {$_.Identities}
    
    $currentIdentities += 'https://hostname:4431/SignServer/rest'
    
    # Id для SignServer можно посмотреть с помощью Get-DssRelyingPartyTrust | ? {$_.DisplayName -eq 'SignServer'} 
    
    Set-DssRelyingPartyTrust -Id $idSignServer -Identities $currentIdentities 
    
    Iisreset
    

    Проверка и коррекция файла конфигурации reverse-proxy.json

    Содержание файла reverse-proxy.json (из каталога C:\cloudprovider на сервере DSS):

    {
      "$schema": "http://dss.cryptopro.ru/schemas/json/reverse-proxy-schema.json",
      "baseAddress": "https://<hostname>:4431/",
      "fallbackApps": {
        "signServer": {
          "appName": "SignServer",
          "baseAddress": "https://<hostname>:4430/SignServer"
        },
        "sts": {
          "appName": "STS",
          "baseAddress": "https://<hostname>:4430/STS"
        }
      },
      "ProxiedApps": [
        {
          "baseAddress": "https://<hostname>:4430/SignServer",
          "appName": "SignServer",
          "appType": "SignServer",
          "documentStore": {
            "baseAddress": "https://<hostname>:4430/DocumentStore",
            "appName": "DocumentStore"
          }
        },
        {
          "baseAddress": "https://<hostname>:4430/STS",
          "appName": "STS",
          "appType": "STS",
          "documentStore": {
            "baseAddress": "https://<hostname>:4430/DocumentStore",
            "appName": "DocumentStore"
          }
        }
      ]
    }
    

    Проверка и коррекция файла конфигурации web.config

    Содержание файла Web.config (из каталога C:\cloudprovider на сервере DSS):

    <?xml version="1.0" encoding="utf-8"?>
    
    <!--
      For more information on how to configure your ASP.NET application, please visit
      https://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.8" />
        <httpRuntime targetFramework="4.8" />
      </system.web>
    
    <system.webServer>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
            <httpRedirect enabled="true" destination="https://<hostname>:4430" exactDestination="true" childOnly="true" />
      </system.webServer>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    Проверка перенаправления запросов

    1. С помощью приложения "Инструменты КриптоПро" (cptools) необходимо указать адреса внешнего веб-сервера (опубликованного в сети Интернет), перенаправляющего запросы на внутренний сервер DSS.

    31.png

    2. Проверить подключение к Сервису Подписи DSS и убедиться в возможности подключения облачного провайдера и его работоспособности.

    32.png 33.png 34.png 35.png

    Рекомендуется выполнить операции «Протестировать контейнер», «Создание подписи» и «Проверка подписи» и убедиться в отсутствии ошибок в ходе их выполнения.

    3. Проверить, что в логах внешнего веб-сервера фиксируются события перенаправления запросов (sc-status - 302).

    Пример:

    #Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken
    
    2021-01-12 10:30:44 W3SVC1 paa-uc hostname GET /STS/oauth/authorize client_id=cryptopro.cloud.csp&response_type=token%20id_token&scope=dss&redirect_uri=https%3A%2F%2Fdss.cryptopro.ru%2Foauth2redirect%2Fcloudcsp&resource=https://hostname:4431/SignServer/rest&license_permissions=65535&response_mode=fragment&prompt=none 4431 - 192.168.62.31 HTTP/1.1 UrlRetriever+{Mozilla+MSIE+6+Win+2000} - - paa-uc 302 0 0 488 371 2884
    

    4. С помощью приложения "Инструменты КриптоПро" (cptools) произвести попытку обратиться на некорректный порт ЦИ DSS и Сервиса Подписи (проверка отклика от внешнего веб-сервера с указанием ошибки в соответствии с правилом).

    36.png

    Примечание

    При проведении данного теста необходимо удалять (или изменять) ранее сохраненные в реестре операционной системы URL-адреса (при удачных подключениях облачного провайдера). Параметры подключения указаны в URL-адресах сервера авторизации ЦИ (STS) и Сервиса Подписи DSS (SignServer). Указанные URL-адреса хранятся (в параметрах auth_URL и rest_URL) в реестре по следующему адресу: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Users\S-1-5-21-1993962763-492894223-1202660629-9829\KeyDevices\Cloud\Default\<server>.

    Необходимо учитывать, что cptools использует для подключения к STS и SignServer URL-адреса, сохраненные в реестре, а не адреса, указанные в поле ввода для соответствующего сервера (обращения к STS и SignServer в любом случае будут по адресам из реестра, вне зависимости от содержания заполненных полей для ввода адресов в приложении cptools). Рекомендуется при проверках также сбрасывать кэш Internet Explorer, после чего проверять подключение облачного провайдера при различных условиях.

    В логах внешнего веб-сервера будут фиксироваться ответы на запросы (sc-status - 503).

    #Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken
    
    2021-01-13 11:56:09 W3SVC1 paa-uc hostname GET /STS/oauth/authorize client_id=cryptopro.cloud.csp&response_type=token%20id_token&scope=dss&redirect_uri=https%3A%2F%2Fdss.cryptopro.ru%2Foauth2redirect%2Fcloudcsp&resource=https://paa-uc:555/SignServer/rest&license_permissions=65535&response_mode=fragment&prompt=none 555 - 192.168.62.31 HTTP/1.1 UrlRetriever+{Mozilla+MSIE+6+Win+2000} - - paa-uc:555 503 0 0 1584 379 1254
    
    2021-01-13 11:56:09 W3SVC1 paa-uc hostname GET /STS/oauth/authorize client_id=cryptopro.cloud.csp&response_type=token%20id_token&scope=dss&redirect_uri=https%3A%2F%2Fdss.cryptopro.ru%2Foauth2redirect%2Fcloudcsp&resource=https://paa-uc:555/SignServer/rest&license_permissions=65535&response_mode=form_post 555 - 192.168.62.31 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.2;+WOW64;+Trident/7.0;+.NET4.0C;+.NET4.0E;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729;+Tablet+PC+2.0;+Zoom+3.6.0) - - paa-uc:555 503 0 0 1584 594 1
    
    В начало © ООО "КРИПТО-ПРО", 2000-2023