Журналы диагностики для Шлюза приложений
Шлюз приложений журналы предоставляют подробные сведения о событиях, связанных с ресурсом и его операциями. Эти журналы доступны для таких событий, как 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 и классическое развертывание: сведения о моделях развертывания и состоянии ресурсов.
расположения служба хранилища
У вас есть следующие параметры для хранения журналов в предпочтительном расположении.
- Рабочая область Log Analytic. Рекомендуется использовать готовые запросы, визуализации и задания оповещений на основе определенных условий журнала.
- служба хранилища Azure учетной записи: служба хранилища учетные записи лучше всего использовать для журналов, когда журналы хранятся в течение длительного времени и проверяются при необходимости.
- Центры событий Azure. Центры событий — отличный вариант интеграции с другими средствами управления сведениями о безопасности и событиями (SIEM) для получения оповещений о ресурсах.
- Интеграция Azure Monitor с продуктами партнеров
Дополнительные сведения о назначениях параметров диагностики Azure Monitor.
Включение ведения журнала с помощью PowerShell
Ведение журнала действий автоматически включается для каждого ресурса Resource Manager. Нужно включить ведение журналов доступа и производительности, чтобы начать сбор связанных данных. Вот как можно включить ведение журнала:
Запишите или запомните ИД ресурса учетной записи хранения, где хранятся данные журнала, в формате: /subscriptions/<идентификатор_подписки>/resourceGroups/<имя_группы_ресурсов>/providers/Microsoft.Storage/storageAccounts/<имя_учетной_записи_хранения>. Можно использовать любую учетную запись хранения в подписке. Получить эти сведения можно на портале Azure.
Запишите или запомните идентификатор ресурса шлюза приложений, для которого нужно включить ведение журнала. в формате: /subscriptions/<идентификатор_подписки>/resourceGroups/<имя_группы_ресурсов>/providers/Microsoft.Network/applicationGateways/<имя_шлюза_приложений>. Получить эти сведения можно на портале.
Включите ведение журнала диагностики с помощью следующего командлета 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
На портале Azure найдите нужный ресурс и выберите Параметры диагностики.
Для шлюза приложений доступны три журнала:
- журнал доступа;
- журнал производительности;
- журнал брандмауэра.
Чтобы начать сбор данных, нажмите Включить диагностику.
На странице Параметры диагностики представлены параметры журналов диагностики. В этом примере для хранения журналов используется Log Analytics. хранения журналов диагностики можно также использовать концентраторы событий и учетную запись хранения.
Введите имя для параметров, подтвердите их и нажмите Сохранить.
Журнал действий
На портале 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.
Следующие шаги
- См. сведения о визуализации журналов счетчиков и событий с помощью журналов Azure Monitor.
- Прочтите запись блога Visualize your Azure Activity Log with Power BI (Визуализация журналов действий Azure с помощью Power BI).
- Прочтите запись блога View and analyze Azure Audit Logs in Power BI and more (Просмотр и анализ журналов аудита Azure с помощью Power BI и других средств).