Журналы диагностики для Шлюза приложений

Шлюз приложений журналы предоставляют подробные сведения о событиях, связанных с ресурсом и его операциями. Эти журналы доступны для таких событий, как Access, Activity, Firewall и Performance (только для версии 1). Подробные сведения в журналах полезны при устранении неполадок или создании панели мониторинга аналитики путем использования этих необработанных данных.

Журналы доступны для всех ресурсов Шлюз приложений; однако для их использования необходимо включить их коллекцию в выбранном расположении хранилища. Вход в Шлюз приложений Azure включен службой Azure Monitor. Рекомендуется использовать рабочую область Log Analytics, так как можно легко использовать предопределенные запросы и задавать оповещения на основе определенных условий журнала.

Типы журналов диагностики

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

  • Журнал действий. В журналах действий Azure (прежнее название — операционные журналы и журналы аудита) можно просматривать все операции, отправляемые в вашу подписку Azure, и состояние этих операций. Записи этого журнала собираются по умолчанию, и их можно просмотреть на портале Azure.
  • Журнал доступа. Этот журнал позволяет просматривать закономерности доступа к Шлюзу приложений и анализировать важные сведения. В журнале указаны IP-адрес вызывающего объекта, запрашиваемый URL-адрес, время задержки ответа, код возврата, входящие и исходящие байты. Журнал доступа собирается каждые 60 секунд. Этот журнал содержит одну запись для каждого экземпляра шлюза приложений. Экземпляр Шлюза приложений определяется свойством instanceId.
  • Журнал производительности. С помощью этого журнала можно просматривать, как работают экземпляры шлюза приложений. Этот журнал записывает сведения о производительности для каждого экземпляра, включая общее количество обслуживаемых запросов, пропускную способность в байтах, общее количество обслуживаемых запросов, количество неудачных запросов и число неработоспособных и неработоспособных экземпляров серверной части. Данные для журнала производительности собираются каждые 60 секунд. Журнал производительности доступен только для номера SKU версии 1. Для номера SKU версии 2 используйте метрики для данных производительности.
  • Журнал брандмауэра. Этот журнал можно использовать для просмотра запросов, которые были зарегистрированы в режиме обнаружения или предотвращения в шлюзе приложений, в котором настроен брандмауэр веб-приложения. Журналы брандмауэров собираются каждые 60 секунд.

Примечание.

Журналы доступны только для ресурсов, развернутых в модели развертывания с помощью Azure Resource Manager. Журналы нельзя использовать для ресурсов в классической модели развертывания. Чтобы получить более полное представление об этих двух моделях, см. статью Развертывание с помощью Azure Resource Manager и классическое развертывание: сведения о моделях развертывания и состоянии ресурсов.

расположения служба хранилища

У вас есть следующие параметры для хранения журналов в предпочтительном расположении.

  1. Рабочая область Log Analytic. Рекомендуется использовать готовые запросы, визуализации и задания оповещений на основе определенных условий журнала.
  2. служба хранилища Azure учетной записи: служба хранилища учетные записи лучше всего использовать для журналов, когда журналы хранятся в течение длительного времени и проверяются при необходимости.
  3. Центры событий Azure. Центры событий — отличный вариант интеграции с другими средствами управления сведениями о безопасности и событиями (SIEM) для получения оповещений о ресурсах.
  4. Интеграция Azure Monitor с продуктами партнеров

Дополнительные сведения о назначениях параметров диагностики Azure Monitor.

Включение ведения журнала с помощью PowerShell

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

  1. Запишите или запомните ИД ресурса учетной записи хранения, где хранятся данные журнала, в формате: /subscriptions/<идентификатор_подписки>/resourceGroups/<имя_группы_ресурсов>/providers/Microsoft.Storage/storageAccounts/<имя_учетной_записи_хранения>. Можно использовать любую учетную запись хранения в подписке. Получить эти сведения можно на портале Azure.

    Screenshot of storage account endpoints

  2. Запишите или запомните идентификатор ресурса шлюза приложений, для которого нужно включить ведение журнала. в формате: /subscriptions/<идентификатор_подписки>/resourceGroups/<имя_группы_ресурсов>/providers/Microsoft.Network/applicationGateways/<имя_шлюза_приложений>. Получить эти сведения можно на портале.

    Screenshot of app gateway properties

  3. Включите ведение журнала диагностики с помощью следующего командлета PowerShell:

    Set-AzDiagnosticSetting  -ResourceId /subscriptions/<subscriptionId>/resourceGroups/<resource group name>/providers/Microsoft.Network/applicationGateways/<application gateway name> -StorageAccountId /subscriptions/<subscriptionId>/resourceGroups/<resource group name>/providers/Microsoft.Storage/storageAccounts/<storage account name> -Enabled $true     
    

Совет

Для журналов действий отдельная учетная запись хранения не требуется. За использование хранилища для журналов доступа и производительности взимается плата.

Включение ведения журнала на портале Azure

  1. На портале Azure найдите нужный ресурс и выберите Параметры диагностики.

    Для шлюза приложений доступны три журнала:

    • журнал доступа;
    • журнал производительности;
    • журнал брандмауэра.
  2. Чтобы начать сбор данных, нажмите Включить диагностику.

    Turning on diagnostics

  3. На странице Параметры диагностики представлены параметры журналов диагностики. В этом примере для хранения журналов используется Log Analytics. хранения журналов диагностики можно также использовать концентраторы событий и учетную запись хранения.

    Starting the configuration process

  4. Введите имя для параметров, подтвердите их и нажмите Сохранить.

Журнал действий

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

журнал доступа;

Журнал доступа создается, только если он включен для каждого экземпляра шлюза приложений, как описано выше. Данные хранятся в учетной записи хранения, указанной при включении ведения журнала. Каждая операция доступа Шлюза приложений регистрируется в журнале в формате JSON, как показано ниже.

Для Шлюза приложений и SKU брандмауэра веб-приложения версии 2

Примечание.

Дополнительные сведения о прокси-сервере TLS/TCP см . в справочнике по данным.

значение Описание
instanceId Экземпляр шлюза приложений, который обрабатывает запрос.
clientIP IP-адрес немедленного клиента Шлюз приложений. Если другой прокси-сервер выполняет внешний интерфейс шлюза приложений, отобразится IP-адрес этого внешнего прокси-сервера.
httpMethod Метод HTTP, используемый для запроса.
requestUri URI полученного запроса.
UserAgent Агент пользователя из заголовка HTTP-запроса.
httpStatus Код состояния HTTP, возвращаемый клиенту из шлюза приложений.
httpVersion Версия HTTP для запроса.
receivedBytes Размер полученного пакета (в байтах).
sentBytes Размер отправленного пакета (в байтах).
clientResponseTime Разница во времени (в секундах) между первым байтом и последним шлюзом приложений байтов, отправляемых клиенту. Полезно при анализе времени обработки Шлюз приложений для ответов или медленных клиентов.
timeTaken Время (в секундах), которое требуется для обработки первого байта запроса клиента и его последнего байта, отправленного в ответе клиенту. Важно отметить, что в поле Time-Taken обычно указывается время передачи пакетов запросов и ответов по сети.
WAFEvaluationTime Время (в секундах), которое требуется для обработки запроса WAF.
WAFMode Значение может быть либо обнаружением, либо предотвращением
transactionId Уникальный идентификатор для сопоставления запроса, полученного от клиента
sslEnabled Используется ли обмен данными с внутренними пулами TLS. Допустимые значения: on и off.
sslCipher Набор шифров, используемый для обмена данными TLS (если включен протокол TLS).
sslProtocol Используемый протокол SSL/TLS (если TLS включен).
serverRouted Внутренний сервер, на который шлюз приложений направляет запрос.
serverStatus Код состояния HTTP внутреннего сервера.
serverResponseLatency Задержка ответа (в секундах) от внутреннего сервера.
host Адрес, указанный в заголовке узла запроса. Если перезапись осуществляется с помощью перезаписи заголовков, это поле содержит обновленное имя узла
originalRequestUriWithArgs Это поле содержит исходный URL-адрес запроса
requestUri Это поле содержит URL-адрес после операции перезаписи в Шлюзе приложений
вышестоящий SourcePort Исходный порт, используемый Шлюз приложений при инициировании подключения к целевому объекту серверной части
originalHost Это поле содержит исходное имя узла запроса
error_info Причина ошибки 4xx и 5xx. Отображает код ошибки для неудачного запроса. Дополнительные сведения о коде ошибки.
contentType Тип содержимого или данных, которые обрабатываются или передаются шлюзом приложений.
{
    "timeStamp": "2021-10-14T22:17:11+00:00",
    "resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroupName}/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
    "listenerName": "HTTP-Listener",
    "ruleName": "Storage-Static-Rule",
    "backendPoolName": "StaticStorageAccount",
    "backendSettingName": "StorageStatic-HTTPS-Setting",
    "operationName": "ApplicationGatewayAccess",
    "category": "ApplicationGatewayAccessLog",
    "properties": {
        "instanceId": "appgw_2",
        "clientIP": "185.42.129.24",
        "clientPort": 45057,
        "httpMethod": "GET",
        "originalRequestUriWithArgs": "\/",
        "requestUri": "\/",
        "requestQuery": "",
        "userAgent": "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/52.0.2743.116 Safari\/537.36",
        "httpStatus": 200,
        "httpVersion": "HTTP\/1.1",
        "receivedBytes": 184,
        "sentBytes": 466,
        "clientResponseTime": 0,
        "timeTaken": 0.034,
        "WAFEvaluationTime": "0.000",
        "WAFMode": "Detection",
        "transactionId": "592d1649f75a8d480a3c4dc6a975309d",
        "sslEnabled": "on",
        "sslCipher": "ECDHE-RSA-AES256-GCM-SHA384",
        "sslProtocol": "TLSv1.2",
        "sslClientVerify": "NONE",
        "sslClientCertificateFingerprint": "",
        "sslClientCertificateIssuerName": "",
        "serverRouted": "52.239.221.65:443",
        "serverStatus": "200",
        "serverResponseLatency": "0.028",
        "upstreamSourcePort": "21564",
        "originalHost": "20.110.30.194",
        "host": "20.110.30.194",
        "error_info":"ERRORINFO_NO_ERROR",
        "contentType":"application/json"
    }
}

Примечание.

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

Для Шлюза приложений Стандартный и SKU брандмауэра веб-приложения версии v1

значение Описание
instanceId Экземпляр шлюза приложений, который обрабатывает запрос.
clientIP IP-адрес источника запроса.
clientPort Порт источника запроса.
httpMethod Метод HTTP, используемый для запроса.
requestUri URI полученного запроса.
RequestQuery Server-Routed: экземпляр внутреннего пула, который был отправлен запрос.
X-AzureApplicationGateway-LOG-ID: идентификатор корреляции, используемый для запроса. Его можно использовать для устранения проблем с трафиком на внутренних серверах.
SERVER-STATUS — код отклика HTTP, полученный шлюзом приложений из серверной части.
UserAgent Агент пользователя из заголовка HTTP-запроса.
httpStatus Код состояния HTTP, возвращаемый клиенту из шлюза приложений.
httpVersion Версия HTTP для запроса.
receivedBytes Размер полученного пакета (в байтах).
sentBytes Размер отправленного пакета (в байтах).
timeTaken Время (в миллисекундах), необходимое для обработки запроса и отправки ответа. Вычисляется как промежуток времени от момента, когда шлюз приложений получает первый байт HTTP-запроса, до завершения отправки ответа. Важно отметить, что в поле Time-Taken обычно указывается время передачи пакетов запросов и ответов по сети.
sslEnabled Используется ли обмен данными с внутренними пулами TLS/SSL. Допустимые значения: on и off.
host Имя узла, для которого запрос был отправлен на внутренний сервер. Если переопределяется имя внутреннего узла, это имя отражает это.
originalHost Имя узла, для которого запрос был получен Шлюз приложений от клиента.
{
    "resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/PEERINGTEST/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
    "operationName": "ApplicationGatewayAccess",
    "time": "2017-04-26T19:27:38Z",
    "category": "ApplicationGatewayAccessLog",
    "properties": {
        "instanceId": "ApplicationGatewayRole_IN_0",
        "clientIP": "191.96.249.97",
        "clientPort": 46886,
        "httpMethod": "GET",
        "requestUri": "/phpmyadmin/scripts/setup.php",
        "requestQuery": "X-AzureApplicationGateway-CACHE-HIT=0&SERVER-ROUTED=10.4.0.4&X-AzureApplicationGateway-LOG-ID=874f1f0f-6807-41c9-b7bc-f3cfa74aa0b1&SERVER-STATUS=404",
        "userAgent": "-",
        "httpStatus": 404,
        "httpVersion": "HTTP/1.0",
        "receivedBytes": 65,
        "sentBytes": 553,
        "timeTaken": 205,
        "sslEnabled": "off",
        "host": "www.contoso.com",
        "originalHost": "www.contoso.com"
    }
}

Сведения об коде ошибки

Если шлюз приложений не может завершить запрос, он сохраняет один из следующих кодов причин в поле error_info журнала доступа.

Ошибки 4XX (Коды ошибок 4xx указывают, что возникла проблема с запросом клиента, и Шлюз приложений не может выполнить его.)
ERRORINFO_INVALID_METHOD Клиент отправил запрос, который не соответствует RFC. Возможные причины: клиент, использующий метод HTTP, который не поддерживается сервером, методом с ошибками, несовместимой версией протокола HTTP и т. д.
ERRORINFO_INVALID_REQUEST Сервер не может выполнить запрос из-за неправильного синтаксиса.
ERRORINFO_INVALID_VERSION Шлюз приложений получил запрос с недопустимой или неподдерживаемой версией HTTP.
ERRORINFO_INVALID_09_METHOD Клиент отправил запрос с протоколом HTTP версии 0.9.
ERRORINFO_INVALID_HOST Значение, указанное в заголовке Host, отсутствует, неправильно отформатировано или не соответствует ожидаемому значению узла (если прослушиватель "Базовый" отсутствует, а имена узлов многосайтовых прослушивателей совпадают с узлом).
ERRORINFO_INVALID_CONTENT_LENGTH Длина содержимого, указанного клиентом в заголовке content-Length, не соответствует фактической длине содержимого в запросе.
ERRORINFO_INVALID_METHOD_TRACE Клиент отправил метод HTTP TRACE, который не поддерживается шлюзом приложений.
ERRORINFO_CLIENT_CLOSED_REQUEST Клиент закрыл подключение к шлюзу приложений до истечения периода ожидания простоя. Проверьте, больше ли период времени ожидания клиента, чем период ожидания простоя для шлюза приложений.
ERRORINFO_REQUEST_URI_INVALID Указывает проблему с универсальным идентификатором ресурса (URI), предоставленной в запросе клиента.
ERRORINFO_HTTP_NO_HOST_HEADER Клиент отправил запрос без заголовка узла.
ERRORINFO_HTTP_TO_HTTPS_PORT Клиент отправил обычный HTTP-запрос на порт HTTPS.
ERRORINFO_HTTPS_NO_CERT Указывает, что клиент не отправляет действительный и правильно настроенный сертификат TLS во время взаимной проверки подлинности TLS.
Ошибки 5XX Description
ERRORINFO_UPSTREAM_NO_LIVE Шлюз приложений не может найти активные или доступные серверы серверной части для обработки входящих запросов
ERRORINFO_UPSTREAM_CLOSED_CONNECTION Сервер серверной части неожиданно закрыл подключение или до полной обработки запроса. Это может произойти из-за достижения внутренних серверов ограничений, сбоя и т. д.
ERRORINFO_UPSTREAM_TIMED_OUT Установленное TCP-соединение с сервером было закрыто, так как подключение заняло больше времени, чем настроенное значение времени ожидания.

журнал производительности;

Журнал производительности создается, только если он включен для каждого экземпляра шлюза приложений, как описано выше. Данные хранятся в учетной записи хранения, указанной при включении ведения журнала. Данные журнала производительности формируются с интервалом в 1 минуту. Они доступны только для номера SKU версии 1. Для номера SKU версии 2 используйте метрики для данных производительности. В журнал записываются следующие данные:

значение Описание
instanceId Экземпляр шлюза приложений, для которого формируются данные о производительности. Если экземпляров шлюза приложений несколько, каждому экземпляру будет соответствовать определенная строка.
healthyHostCount Количество работоспособных узлов в серверном пуле.
unHealthyHostCount Количество неработоспособных узлов в серверном пуле.
requestCount Число обрабатываемых запросов.
latency Средняя задержка (в миллисекундах) запросов от экземпляра к серверной части, обрабатывающей запросы.
failedRequestCount Количество невыполненных запросов.
throughput Средняя пропускная способность (в байтах в секунду) с момента создания последнего журнала.
{
    "resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroupName}/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
    "operationName": "ApplicationGatewayPerformance",
    "time": "2016-04-09T00:00:00Z",
    "category": "ApplicationGatewayPerformanceLog",
    "properties":
    {
        "instanceId":"ApplicationGatewayRole_IN_1",
        "healthyHostCount":"4",
        "unHealthyHostCount":"0",
        "requestCount":"185",
        "latency":"0",
        "failedRequestCount":"0",
        "throughput":"119427"
    }
}

Примечание.

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

журнал брандмауэра.

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

значение Описание
instanceId Экземпляр шлюза приложений, для которого формируются данные о брандмауэре. Если экземпляров шлюза приложений несколько, каждому экземпляру будет соответствовать определенная строка.
clientIp IP-адрес источника запроса.
clientPort Порт источника запроса.
requestUri URL-адрес полученного запроса.
ruleSetType Тип набора правил. Доступное значение — OWASP.
ruleSetVersion Используемая версия набора правил. Возможные значения: 2.2.9 и 3.0.
ruleId Идентификатор правила события-триггера.
message Понятное сообщение для события-триггера. Дополнительные сведения приведены в разделе details.
действие Действие, выполняемое с запросом. Доступные значения заблокированы и разрешены (для настраиваемых правил), совпадают (если правило соответствует части запроса) и обнаружены и заблокированы (для обязательных правил, в зависимости от того, находится ли WAF в режиме обнаружения или предотвращения).
site Сайт, для которого создан журнал. В нашем случае возможно только значение Global, так как применяются глобальные правила.
details Сведения о событии-триггере.
details.message Описание правила.
details.data Определенные данные из запроса, которые соответствуют правилу.
details.file Файл конфигурации, содержащий правило.
details.line Номер строки в файле конфигурации, активировавшей событие.
hostname Имя узла или IP-адрес Шлюза приложений.
transactionId Уникальный идентификатор для данной транзакции, который помогает сгруппировать несколько нарушений правил, произошедших в одном запросе.
{
    "timeStamp": "2021-10-14T22:17:11+00:00",
    "resourceId": "/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroupName}/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/{applicationGatewayName}",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_2",
        "clientIp": "185.42.129.24",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "920350",
        "message": "Host header is a numeric IP address",
        "action": "Matched",
        "site": "Global",
        "details": {
            "message": "Warning. Pattern match \\\"^[\\\\d.:]+$\\\" at REQUEST_HEADERS:Host .... ",
            "data": "20.110.30.194:80",
            "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf",
            "line": "791"
        },
        "hostname": "20.110.30.194:80",
        "transactionId": "592d1649f75a8d480a3c4dc6a975309d",
        "policyId": "default",
        "policyScope": "Global",
        "policyScopeName": "Global"
    }
}

Просмотр и анализ журнала действий

Данные журнала действий можно просматривать и анализировать с помощью любого из следующих методов:

  • Средства Azure. Информацию из журналов действий можно получать с помощью Azure PowerShell, Azure CLI, Azure REST API или портала Azure. Пошаговые инструкции для каждого метода подробно описаны в статье Activity operations with Resource Manager (Выполнение операций в журналах действий с помощью Resource Manager).
  • Power BI. Если у вас еще нет учетной записи Power BI, вы можете использовать бесплатную пробную версию. С помощью приложение-шаблонов Power BI можно анализировать данные.

Просмотр и анализ журналов доступа, производительности и брандмауэра

Журналы Azure Monitor позволяют собирать файлы журналов счетчиков и событий из вашей учетной записи хранилища BLOB-объектов. Эта служба предоставляет средства визуализации и эффективные возможности поиска для анализа журналов.

Вы также можете подключиться к учетной записи хранения и извлечь записи журнала JSON для журналов доступа и производительности. После скачивания JSON-файлов их можно преобразовать в формат CSV и просматривать в Excel, Power BI или другом средстве визуализации данных.

Совет

Если вы знакомы с Visual Studio и основными понятиями изменения значений констант и переменных в C#, то можете использовать инструменты преобразования журналов, доступные на сайте GitHub.

Анализ журналов доступа через GoAccess

Мы опубликовали шаблон Resource Manager, который устанавливает и запускает популярный анализатор журналов GoAccess для журналов доступа шлюза приложений. GoAccess предоставляет ценную статистику трафика HTTP, такую как уникальные посетители, запрошенные файлы, узлы, операционные системы, браузеры, коды состояния HTTP и многое другое. Дополнительные сведения см. в файле сведений в папке шаблона Resource Manager на GitHub.

Следующие шаги