Перенаправление запросов с веб-сервера, опубликованного в сети Интернет, на веб-сервер, расположенный во внутренней сети организации
Схема стенда, для которой может быть выполнена данная инструкция:
- Внешний веб-сервер: сервер с IIS и модулями ARR и RewriteRule.
- Внутренний веб-сервер: сервер DSS (порт 4430) c CloudProvider (порт 4431).
- Клиент с CloudCSP (cptools), имеющий подключение к внешнему веб-серверу и функционирующий либо в среде ОС MS Windows, либо ОС Astra Linux.
Для обеспечения перенаправления запросов от клиента с CloudCSP, поступающих на порт 4431 внешнего веб-сервера, на внутренний веб-сервер необходимо выполнить следующие действия.
Настройка обратного прокси-сервера на внешнем веб-сервере
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.
3. В панели «Действия» нажать «Server Proxy Settings».
4. Включить режим перенаправления запросов (установить галочку напротив «Enable proxy») и применить изменения.
5. В блоке «Custom Headers» значения параметров остаются без изменений.
6. В блоке «Cache Setting» необходимо снять галочки напротив параметров «Enable disk cache» и «Enable request consolidation». Параметр «Query string support» можно оставить «Ignore query string» или указать «Do not cache».
7. В блоке «Proxy Chain» поле «Proxy Server» должно быть пустым.
8. В блоке «Proxy Type» установить галочку напротив параметра «Use URL Rewrite to inspect incoming Request» и указать адрес внутреннего сервера в параметре «Reverse proxy» (порт указывать не обязательно). При этом необходимо убрать галочку напротив параметра «Enable SSL offloading».
9. В Диспетчере служб IIS перейти в корневой узел веб-сервера и выбрать и открыть модуль «Переопределение URL-адресов».
10. После открытия модуля «Переопределение URL-адресов» необходимо отключить правила, созданные автоматически ранее, при включении и настройки режима проксирования запросов («ARR_server_proxy_SSL» и «ARR_server_proxy»).
11. В панели «Действия» нажать «Добавить правила…». В открывшемся окне «Добавить правила» выбрать «Пустое правило» и нажать кнопку «ОК».
12. Создать необходимые правила для входящего трафика и исходящего трафика и применить изменения.
При создании каждого правила для входящего трафика необходимо задать фильтр (шаблон) запросов (регулярное выражение), которые необходимо перенаправлять на внутренний веб-сервер.
В качестве значения параметра «URL-адрес переопределения» необходимо указывать URL на внутренний веб-сервер с DSS и добавлять подстроку запроса (переменную) вида «{R:0}».
Подзапросы Mfa, signalr, confirmation добавляются при необходимости реализации двухфакторной аутентификации (например, при подтверждении операций электронной подписи) или при необходимости обеспечения работы CloudCSP в среде ОС Astra Linux.
Установка галочки напротив параметра «Не учитывать регистр» осуществляется при необходимости (или в случае изменения приведенных запросов).
Общий перечень всех правил приведен на рисунке ниже, далее следует описание каждого правила в подробностях.
Правило 1
Правило | 1_STS_oauth_authorize |
---|---|
Запрошенный URL-адрес | Соответствует шаблону |
Использование | Регулярные выражения |
Шаблон | ^STS/oauth/authorize |
Логическая группировка | Совпадение со всеми элементами |
Условия | |
Ввод условия Проверить, если входная строка Шаблон |
{SERVER_PORT} Соответствует шаблону ^(4431|4430)$ |
Ввод условия Проверить, если входная строка Шаблон |
{HTTPS} Соответствует шаблону on |
Тип действия | Переопределение |
URL-адрес переопределения | https://<hostname>:{SERVER_PORT}/{R:0} |
Добавить строку запроса | Галочка установлена |
Остановить обработку последующих правил | Галочка установлена |
Правило 2
Правило | 2_STS_Authentication |
---|---|
Запрошенный URL-адрес | Соответствует шаблону |
Использование | Регулярные выражения |
Шаблон | STS/Authentication/.* |
Логическая группировка | Совпадение со всеми элементами |
Условия | |
Ввод условия Проверить, если входная строка Шаблон |
{SERVER_PORT} Соответствует шаблону ^(4431|4430)$ |
Ввод условия Проверить, если входная строка Шаблон |
{HTTPS} Соответствует шаблону on |
Тип действия | Переопределение |
URL-адрес переопределения | https://<hostname>:{SERVER_PORT}/{R:0} |
Добавить строку запроса | Галочка установлена |
Остановить обработку последующих правил | Галочка установлена |
Правило 3
Правило | 3_STS_bundles_font_Content |
---|---|
Запрошенный URL-адрес | Соответствует шаблону |
Использование | Регулярные выражения |
Шаблон | STS/(bundles|Content|fonts)/.* |
Логическая группировка | Совпадение со всеми элементами |
Условия | |
Ввод условия Проверить, если входная строка Шаблон |
{SERVER_PORT} Соответствует шаблону ^(4431|4430)$ |
Ввод условия Проверить, если входная строка Шаблон |
{HTTPS} Соответствует шаблону on |
Тип действия | Переопределение |
URL-адрес переопределения | https://<hostname>:{SERVER_PORT}/{R:0} |
Добавить строку запроса | Галочка установлена |
Остановить обработку последующих правил | Галочка установлена |
Правило 4
Правило | 4_SignServer_rest |
---|---|
Запрошенный URL-адрес | Соответствует шаблону |
Использование | Регулярные выражения |
Шаблон | ^SignServer/rest/api/.* |
Логическая группировка | Совпадение со всеми элементами |
Условия | |
Ввод условия Проверить, если входная строка Шаблон |
{SERVER_PORT} Соответствует шаблону ^(4431|4430)$ |
Ввод условия Проверить, если входная строка Шаблон |
{HTTPS} Соответствует шаблону on |
Тип действия | Переопределение |
URL-адрес переопределения | https://<hostname>:{SERVER_PORT}/{R:0} |
Добавить строку запроса | Галочка установлена |
Остановить обработку последующих правил | Галочка установлена |
Правило 5
Правило | 5_STS_Mfa |
---|---|
Запрошенный URL-адрес | Соответствует шаблону |
Использование | Регулярные выражения |
Шаблон | STS/Mfa.* |
Логическая группировка | Совпадение со всеми элементами |
Условия | |
Ввод условия Проверить, если входная строка Шаблон |
{SERVER_PORT} Соответствует шаблону ^(4431|4430)$ |
Ввод условия Проверить, если входная строка Шаблон |
{HTTPS} Соответствует шаблону on |
Тип действия | Переопределение |
URL-адрес переопределения | https://<hostname>:{SERVER_PORT}/{R:0} |
Добавить строку запроса | Галочка установлена |
Остановить обработку последующих правил | Галочка установлена |
Правило 6
Правило | 6_STS_signalr |
---|---|
Запрошенный URL-адрес | Соответствует шаблону |
Использование | Регулярные выражения |
Шаблон | STS/signalr.* |
Логическая группировка | Совпадение со всеми элементами |
Условия | |
Ввод условия Проверить, если входная строка Шаблон |
{SERVER_PORT} Соответствует шаблону 4431|4430 |
Ввод условия Проверить, если входная строка Шаблон |
{HTTPS} Соответствует шаблону on |
Тип действия | Переопределение |
URL-адрес переопределения | https://<hostname>:{SERVER_PORT}/{R:0} |
Добавить строку запроса | Галочка установлена |
Остановить обработку последующих правил | Галочка установлена |
Правило 7
Правило | rewrite_host_oauth |
---|---|
Предварительное условие | redirect |
Область поиска | Серверная переменная |
Имя переменной | RESPONSE_LOCATION |
Значение переменной | Соответствует шаблону |
Использование | Регулярные выражения |
Шаблон | (https://<hostname>:)(443\d)(.*) |
Логическая группировка | Совпадение со всеми элементами |
Тип действия | Переопределение |
Свойства | https://<hostname>{R:2}{R:3} |
Добавить строку запроса | Галочка установлена |
Остановить обработку последующих правил | Галочка НЕ установлена |
В блоке «Условия» рекомендуется добавить одновременно выполняемые условия (логическая группировка – «Совпадение со всеми»), при которых запросы должны быть перенаправлены (например, запросы поступают на порт 443 внешнего сервера и по защищенному протоколу HTTPS).
Дополнительное условие добавляется и настраивается в панели «Условия». Порт, указанный в запросе к серверу, хранится в
переменной {SERVER_PORT}
. Использование защищенного протокола сетевого взаимодействия определяется переменной
{HTTPS}
(on
или off
).
Дополнительно можно добавить и настроить отдельное правило, в соответствии с которым определяется действие IIS в случае поступления запросов к STS или SignServer на порт сервера, отличный от штатного. Например, при поступлении запросов, содержащих STS или SignServer, не на 443 порт, задается действие «Настраиваемый ответ», в котором можно определить возвращаемые код состояния и код подсостояния. В нижеприведенном примере в соответствии с правилом возвращается http-состояние 503.0.
В связи с тем, что на IIS для кода состояния 503 не определена страница ошибок, можно создать соответствующую страницу html и добавить ее в перечень выводимых IIS.
13.\ После завершения вышеуказанных настроек рекомендуется открыть модуль «Переопределение URL-адресов» для каждого веб-сайта и убедиться в отсутствии правил переопределения адресов или в их отключении при наличии.
Настройка внутреннего сервера с 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.
2. Проверить подключение к Сервису Подписи DSS и убедиться в возможности подключения облачного провайдера и его работоспособности.
Рекомендуется выполнить операции «Протестировать контейнер», «Создание подписи» и «Проверка подписи» и убедиться в отсутствии ошибок в ходе их выполнения.
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 и Сервиса Подписи (проверка отклика от внешнего веб-сервера с указанием ошибки в соответствии с правилом).
Примечание
При проведении данного теста необходимо удалять (или изменять) ранее сохраненные в реестре операционной системы
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