Установка и настройка обратного прокси-сервера в Azure Service Fabric

Необязательный обратный прокси-сервер в службе Azure Service Fabric помогает микрослужбам, работающим в кластере Service Fabric, обнаруживать другие службы с конечными точками HTTP и обмениваться данными с этими службами. См. дополнительные сведения об обратном прокси-сервере в Azure Service Fabric. В этой статье показано, как установить и настроить обратный прокси-сервер в кластере.

Включение обратного прокси-сервера с помощью портала Azure

Обратный прокси-сервер можно включить во время создания кластера Service Fabric на портале Azure. На портале Azure нельзя добавить обратный прокси-сервер к существующему кластеру.

Чтобы настроить обратный прокси-сервер при создании кластера с помощью портала Azure, сделайте следующее:

  1. На шаге 2 (настройка кластера) выберите для параметра Конфигурация типа узла значение Включить обратный прокси-сервер.

    Включение обратного прокси-сервера на портале

  2. (Необязательно.) Для защиты обратного прокси-сервера можно настроить TLS/SSL-сертификат. На шаге 3 (безопасность) в разделе Настройка параметров безопасности кластера выберите для параметра Тип конфигурации значение Пользовательский. Затем в разделе SSL-сертификат обратного прокси-сервера установите флажок Включить SSL-сертификат для обратного прокси-сервера и введите данные сертификата.

    Настройка защищенного обратного прокси-сервера на портале

    Если вы не хотите настраивать сертификат для обратного прокси-сервера при создании кластера, это можно сделать позже с помощью шаблона Resource Manager для группы ресурсов кластера. См. дополнительные сведения о включении обратного прокси-сервера с помощью шаблонов Azure Resource Manager.

Включение обратного прокси-сервера с помощью шаблонов Azure Resource Manager

Обратный прокси-сервер в Service Fabric можно включить для кластера Azure с помощью шаблона Azure Resource Manager. Вы можете включить обратный прокси-сервер при создании кластера или позже, обновив параметры кластера.

Для нового кластера вы можете создать пользовательский шаблон Resource Manager или использовать готовый пример шаблона.

Примеры шаблонов Resource Manager, которые помогут вам настроить защищенный обратный прокси-сервер для кластера Azure, см. на GitHub. В руководстве по настройке обратного прокси-сервера HTTPS в защищенном кластере README-файла приведены примеры шаблонов и инструкции по настройке защищенного обратного прокси-сервера с сертификатом и обновлению сертификатов.

Если кластер уже существует, вы можете экспортировать шаблон Resource Manager для группы кластерных ресурсов с помощью портала Azure, PowerShell или Azure CLI.

Подготовив шаблон Resource Manager, вы можете включить обратный прокси-сервер:

  1. Определите порт обратного прокси-сервера в разделе Parameters шаблона.

    "SFReverseProxyPort": {
        "type": "int",
        "defaultValue": 19081,
        "metadata": {
            "description": "Endpoint for Service Fabric Reverse proxy"
        }
    },
    
  2. Укажите порт для каждого типа узлов в разделе типа ресурсаMicrosoft.ServiceFabric/clusters.

    Порт идентифицируется по имени параметра reverseProxyEndpointPort.

    {
        "apiVersion": "2021-06-01",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
       "nodeTypes": [
          {
           ...
           "reverseProxyEndpointPort": "[parameters('SFReverseProxyPort')]",
           ...
          },
        ...
        ],
        ...
    }
    
  3. Чтобы настроить TLS/SSL-сертификаты для порта обратного прокси-сервера, добавьте сертификат в объект reverseProxyCertificate в шаблоне ресурса Microsoft.ServiceFabric/clusters.

    {
        "apiVersion": "2021-06-01",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        "dependsOn": [
            "[concat('Microsoft.Storage/storageAccounts/', parameters('supportLogStorageAccountName'))]"
        ],
        "properties": {
            ...
            "reverseProxyCertificate": {
                "thumbprint": "[parameters('sfReverseProxyCertificateThumbprint')]",
                "x509StoreName": "[parameters('sfReverseProxyCertificateStoreName')]"
            },
            ...
            "clusterState": "Default",
        }
    }
    

    Можно также указать общее имя для сертификатов обратного прокси-сервера с помощью объекта reverseProxyCertificateCommonNames в шаблоне кластера ресурсов.

Поддержка сертификата обратного прокси-сервера, отличного от сертификата кластера

Если сертификат обратного прокси-сервера отличается от сертификата, который защищает кластер, то указанный ранее сертификат необходимо установить на виртуальную машину и добавить в список управления доступом (ACL), чтобы предоставить Service Fabric к нему доступ. Для этого можно использовать раздел типа ресурсаMicrosoft.Compute/virtualMachineScaleSets. Чтобы установить сертификат, добавьте его в osProfile. Раздел extension шаблона позволяет обновить сертификат в списке управления доступом.

{
  "apiVersion": "[variables('vmssApiVersion')]",
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  ....
    "osProfile": {
        "adminPassword": "[parameters('adminPassword')]",
        "adminUsername": "[parameters('adminUsername')]",
        "computernamePrefix": "[parameters('vmNodeType0Name')]",
        "secrets": [
          {
            "sourceVault": {
              "id": "[parameters('sfReverseProxySourceVaultValue')]"
            },
            "vaultCertificates": [
              {
                "certificateStore": "[parameters('sfReverseProxyCertificateStoreValue')]",
                "certificateUrl": "[parameters('sfReverseProxyCertificateUrlValue')]"
              }
            ]
          }
        ]
      }
 ....
 "extensions": [
        {
            "name": "[concat(parameters('vmNodeType0Name'),'_ServiceFabricNode')]",
            "properties": {
                    "type": "ServiceFabricNode",
                    "autoUpgradeMinorVersion": false,
                    ...
                    "publisher": "Microsoft.Azure.ServiceFabric",
                    "settings": {
                      "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
                      "nodeTypeRef": "[parameters('vmNodeType0Name')]",
                      "dataPath": "D:\\\\SvcFab",
                      "durabilityLevel": "Bronze",
                      "testExtension": true,
                      "reverseProxyCertificate": {
                        "thumbprint": "[parameters('sfReverseProxyCertificateThumbprint')]",
                        "x509StoreName": "[parameters('sfReverseProxyCertificateStoreValue')]"
                      },
                },
                "typeHandlerVersion": "1.0"
            }
        },
    ]
  }

Примечание

Чтобы в существующем кластере включить обратный прокси-сервер с сертификатом, отличающимся от сертификата кластера, необходимо сначала установить сертификат обратного прокси-сервера и обновить список управления доступом в кластере. Завершите развертывание шаблона Azure Resource Manager, используя описанные выше параметры, прежде чем начинать развертывание для включения обратного прокси-сервера с помощью шагов 1–3.

Включение обратного прокси-сервера в автономных кластерах

Для автономных кластеров обратный прокси-сервер включается в файле ClusterConfig.json. Вы можете включить обратный прокси-сервер при создании кластера или позже, обновив конфигурацию существующего кластера. Дополнительные сведения о параметрах в файле ClusterConfig.json см. в описании параметров автономного кластера.

Следующие шаги описывают настройки, позволяющие включить обратный прокси-сервер и, если потребуется, защитить его с помощью сертификата X.509.

  1. Чтобы включить обратный прокси-сервер, задайте значение reverseProxyEndpointPort для типа узла в разделе properties в конфигурации кластера. Следующий код JSON показывает, как задать порт конечной точки обратного прокси-сервера с номером 19081 для узлов с типом "NodeType0":

        "properties": {
           ... 
            "nodeTypes": [
                {
                    "name": "NodeType0",
                    ...
                    "reverseProxyEndpointPort": "19081",
                    ...
                }
            ],
           ...
        }
    
  2. (Необязательно.) Для защиты обратного прокси-сервера настройте сертификат в разделе безопасности на странице свойств.

    • Для среды разработки или тестирования можно использовать параметр ReverseProxyCertificate:

           "properties": {
               ...
               "security": {
                   ...
                   "CertificateInformation": {
                       ...
                       "ReverseProxyCertificate": {
                           "Thumbprint": "[Thumbprint]",
                           "ThumbprintSecondary": "[Thumbprint]",
                           "X509StoreName": "My"
                       },
                       ...
                   }
               },
               ...
           }
      
    • Для рабочей среды мы рекомендуем использовать параметр ReverseProxyCertificateCommonNames:

           "properties": {
               ...
               "security": {
                   ...
                   "CertificateInformation": {
                       ...
                       "ReverseProxyCertificateCommonNames": {
                         "CommonNames": [
                             {
                               "CertificateCommonName": "[CertificateCommonName]"
                             }
                           ],
                           "X509StoreName": "My"
                       },
                       ...
                   }
               },
               ...
           }
      

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

Изменив настройки в файле ClusterConfig.json для включения обратного прокси, выполните инструкции из руководства по обновлению конфигурации кластера, чтобы применить эти настройки к кластеру.

Предоставление обратного прокси-сервера на общедоступном порту с помощью Azure Load Balancer

Чтобы обращаться к обратному прокси-серверу за пределами кластера Azure, настройте правила Azure Load Balancer и зонд работоспособности Azure для порта обратного прокси-сервера. Эти действия можно выполнить с помощью портала Azure или шаблона Resource Manager в любое время после создания кластера.

Предупреждение

Настройка порта обратного прокси-сервера в подсистеме балансировки нагрузки обеспечит адресацию извне кластера всех микрослужб в этом кластере, которые предоставляют конечную точку HTTP. Это означает, пользователь-злоумышленник может обнаружить внутренние микрослужбы. Это представляет серьезную уязвимость, например:

  • Пользователь-злоумышленник может многократно выполнять атаку типа "отказ в обслуживании", вызывая внутреннюю службу, у которой нет достаточно защищенного направления атак.
  • Пользователь-злоумышленник может доставлять неправильно сформированные пакеты во внутреннюю службу, вызывая непредвиденное поведение.
  • Внутренняя служба может возвращать персональные или конфиденциальные сведения, не предназначенные для предоставления службам вне кластера, в результате чего пользователь-злоумышленник может завладеть подобной информацией.

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

Чтобы обратный прокси-сервер для изолированного кластера был общедоступным, правильный способ реализации будет зависеть от системы, в которой размещен кластер. Описание этих способов выходит за рамки этой статьи. Но при этом по-прежнему остается актуальным предупреждение о предоставлении общего доступа к обратному прокси-серверу.

Предоставление обратного прокси-сервера с помощью портала Azure

  1. На портале Azure щелкните группу ресурсов для кластера, затем щелкните подсистему балансировки нагрузки для кластера.

  2. Чтобы добавить зонд работоспособности для порта обратного прокси-сервера, в левой части окна подсистемы балансировки нагрузки в разделе Параметры щелкните Зонды работоспособности. Затем щелкните Добавить в верхней части окна зондов работоспособности, введите сведения о порте обратного прокси-сервера, а затем щелкните ОК. По умолчанию для обратного прокси-сервера используется порт 19081, если вы не указали другое значение при создании кластера.

    Настройка зонда работоспособности для обратного прокси-сервера

  3. Чтобы добавить зонд работоспособности для порта обратного прокси-сервера, в разделе Параметры в левой части окна подсистемы балансировки нагрузки щелкните Зонды работоспособности. Затем щелкните Добавить в верхней части окна "Правила балансировка нагрузки" и введите сведения о порте обратного прокси-сервера. В поле Порт задайте номер порта, на котором будет предоставляться обратный прокси-сервер, в поле Внутренний порт — значение, указанное при настройке обратного прокси-сервера, а в поле Зонд работоспособности — значение для зонда работоспособности, которое вы настроили на предыдущем шаге. Задайте нужные значения для других полей и щелкните ОК.

    Настройка правила подсистемы балансировки нагрузки для обратного прокси-сервера

Предоставление обратного прокси-сервера через шаблоны Resource Manager

Приведенный ниже код JSON использует тот же шаблон, что и в разделе Включение обратного прокси-сервера с помощью шаблонов Azure Resource Manager. Изучите этот раздел, если вам нужны сведения о создании шаблона Resource Manager или экспорте шаблона для существующего кластера. Изменения следует вносить в раздел типа ресурсаMicrosoft.Network/loadBalancers.

{
    "apiVersion": "[variables('lbApiVersion')]",
    "type": "Microsoft.Network/loadBalancers",
    ...
    ...
    "loadBalancingRules": [
        ...
        {
            "name": "LBSFReverseProxyRule",
            "properties": {
                "backendAddressPool": {
                    "id": "[variables('lbPoolID0')]"
                },
                "backendPort": "[parameters('SFReverseProxyPort')]",
                "enableFloatingIP": "false",
                "frontendIPConfiguration": {
                    "id": "[variables('lbIPConfig0')]"
                },
                "frontendPort": "[parameters('SFReverseProxyPort')]",
                "idleTimeoutInMinutes": "5",
                "probe": {
                    "id": "[concat(variables('lbID0'),'/probes/SFReverseProxyProbe')]"
                },
                "protocol": "tcp"
            }
        }
    ],
    "probes": [
        ...
        {
            "name": "SFReverseProxyProbe",
            "properties": {
                "intervalInSeconds": 5,
                "numberOfProbes": 2,
                "port":     "[parameters('SFReverseProxyPort')]",
                "protocol": "tcp"
            }
        }  
    ]
}

Настройка поведения для обратного прокси-сервера с помощью параметров структуры

Вы можете изменять поведение обратного прокси-сервера, используя параметры структуры в шаблоне Resource Manager для кластеров, размещенных в Azure, или в файле ClusterConfig.json для автономных кластеров. Параметры, управляющие поведением обратного прокси-сервера, находятся в разделе ApplicationGateway/Http, который находится в разделе fabricSettings в свойствах кластера.

Например, вы можете задать значение DefaultHttpRequestTimeout, чтобы настроить время ожидания запросов на обратном прокси-сервере. Следующий фрагмент JSON устанавливает в этом параметре значение 180 секунд:

{
"fabricSettings": [
          ...
          {
            "name": "ApplicationGateway/Http",
            "parameters": [
              {
                "name": "DefaultHttpRequestTimeout",
                "value": "180"
              }
            ]
          }
        ],
        ...
}

Примечание

Обратный прокси-сервер имеет ограничение в 16 КБ для заголовков и не поддерживает изменение порогового значения на большее.

Дополнительные сведения об обновлении параметров структуры для кластеров Azure см. в руководстве по настройке параметров кластера с помощью шаблонов Resource Manager. Для автономных кластеров см. руководство по настройке параметров кластера для автономных кластеров.

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

Дальнейшие действия