# Wazuh Azure - мониторинг Microsoft Azure

> Настройка мониторинга Microsoft Azure в Wazuh 4.14 - Activity Logs, Log Analytics, Microsoft Graph API, регистрация приложений и конфигурация azure-logs

Source: https://opennix.org/docs/wazuh/cloud-security/wazuh-azure-monitoring/


Wazuh обеспечивает мониторинг безопасности Microsoft Azure через модуль `azure-logs`, который собирает журналы активности, данные Log Analytics и события Microsoft Graph API. Модуль позволяет отслеживать действия пользователей в Azure-подписках, изменения ресурсов, события аутентификации Microsoft Entra ID и данные из Azure Blob Storage. Интеграция предоставляет единую точку анализа облачных угроз в гибридных средах.

## Поддерживаемые источники данных

Модуль `azure-logs` собирает данные из трех основных источников:

| Источник | Тип данных | Назначение |
|----------|-----------|------------|
| Activity Logs | Журналы подписки | Действия с ресурсами, операции управления, диагностика |
| Log Analytics | Аналитические запросы | Агрегация событий из различных источников Azure |
| Microsoft Graph API | API Microsoft Entra ID | Аудит аутентификации, управление пользователями, политики |

Дополнительно модуль поддерживает:

- **Azure Blob Storage** - сбор журналов из контейнеров Blob Storage
- **Microsoft Intune** - мониторинг управления устройствами и политик соответствия

## Регистрация приложения Azure AD

Для работы модуля необходимо зарегистрировать приложение в Microsoft Entra ID (Azure Active Directory) и получить учетные данные для доступа к API.

### Процедура регистрации

1. Перейдите в **Microsoft Entra ID - App registrations - New registration**
2. Укажите имя приложения (например, `Wazuh-Azure-Monitor`)
3. Выберите поддерживаемые типы аккаунтов (Single tenant для одного тенанта)
4. Зафиксируйте значения:
   - **Application (client) ID** - идентификатор приложения
   - **Directory (tenant) ID** - идентификатор тенанта

### Создание секрета клиента

1. Перейдите в **Certificates & Secrets - New client secret**
2. Укажите описание и срок действия
3. Скопируйте значение секрета (отображается только один раз)

### Назначение разрешений

Для Log Analytics и Activity Logs:
- Назначьте роль **Reader** на уровне подписки Azure

Для Microsoft Graph API:
- Перейдите в **API permissions - Add a permission - Microsoft Graph**
- Добавьте разрешения `AuditLog.Read.All` и `Directory.Read.All` (Application)
- Предоставьте согласие администратора (Grant admin consent)

## Конфигурация модуля azure-logs

Модуль настраивается в `ossec.conf` на сервере Wazuh или агенте. Учетные данные хранятся в отдельных файлах.

### Файл учетных данных

Создайте файл `/var/ossec/wodles/credentials/azure_credentials`:

```
application_id = YOUR_APPLICATION_ID
application_key = YOUR_CLIENT_SECRET
```

Для Azure Storage создайте отдельный файл `/var/ossec/wodles/credentials/storage_credentials`:

```
account_name = YOUR_STORAGE_ACCOUNT
account_key = YOUR_STORAGE_KEY
```

Установите разрешения:

```bash
sudo chown root:wazuh /var/ossec/wodles/credentials/azure_credentials
sudo chmod 640 /var/ossec/wodles/credentials/azure_credentials
```

### Конфигурация Log Analytics

```xml
<wodle name="azure-logs">
  <disabled>no</disabled>
  <run_on_start>yes</run_on_start>

  <log_analytics>
    <auth_path>/var/ossec/wodles/credentials/azure_credentials</auth_path>
    <tenantdomain>mycompany.onmicrosoft.com</tenantdomain>
    <request>
      <query>AzureActivity</query>
      <workspace>12345678-90ab-cdef-1234-567890abcdef</workspace>
      <time_offset>1d</time_offset>
    </request>
  </log_analytics>
</wodle>
```

### Конфигурация Microsoft Graph API

```xml
<wodle name="azure-logs">
  <disabled>no</disabled>
  <run_on_start>yes</run_on_start>

  <graph>
    <auth_path>/var/ossec/wodles/credentials/azure_credentials</auth_path>
    <tenantdomain>mycompany.onmicrosoft.com</tenantdomain>
    <request>
      <query>auditLogs/directoryAudits</query>
      <time_offset>1d</time_offset>
    </request>
    <request>
      <query>auditLogs/signIns</query>
      <time_offset>1d</time_offset>
    </request>
  </graph>
</wodle>
```

### Конфигурация Azure Storage

```xml
<wodle name="azure-logs">
  <disabled>no</disabled>
  <run_on_start>yes</run_on_start>

  <storage>
    <auth_path>/var/ossec/wodles/credentials/storage_credentials</auth_path>
    <container name="insights-activity-logs">
      <blobs>.json</blobs>
      <content_type>json_inline</content_type>
      <time_offset>24h</time_offset>
    </container>
  </storage>
</wodle>
```

### Комбинированная конфигурация

```xml
<wodle name="azure-logs">
  <disabled>no</disabled>
  <run_on_start>yes</run_on_start>

  <log_analytics>
    <auth_path>/var/ossec/wodles/credentials/azure_credentials</auth_path>
    <tenantdomain>mycompany.onmicrosoft.com</tenantdomain>
    <request>
      <query>AzureActivity | where Level == "Error"</query>
      <workspace>12345678-90ab-cdef-1234-567890abcdef</workspace>
      <time_offset>12h</time_offset>
    </request>
  </log_analytics>

  <graph>
    <auth_path>/var/ossec/wodles/credentials/azure_credentials</auth_path>
    <tenantdomain>mycompany.onmicrosoft.com</tenantdomain>
    <request>
      <query>auditLogs/signIns</query>
      <time_offset>1d</time_offset>
    </request>
  </graph>
</wodle>
```

### Параметры модуля

| Параметр | Описание |
|----------|----------|
| `disabled` | Включение или отключение модуля (no/yes) |
| `run_on_start` | Запуск при старте сервиса (yes/no) |
| `auth_path` | Путь к файлу учетных данных |
| `tenantdomain` | Доменное имя тенанта Azure AD |
| `query` | Запрос Log Analytics (KQL) или ресурс Graph API |
| `workspace` | Идентификатор рабочей области Log Analytics |
| `time_offset` | Временное окно для запроса (1d, 12h, 1h) |
| `content_type` | Формат данных в Blob Storage (json_inline, json_file) |

## Интеграция с Log Analytics

Azure Log Analytics Workspace агрегирует данные из различных источников Azure. Модуль Wazuh выполняет запросы KQL (Kusto Query Language) к рабочей области для извлечения событий.

### Получение идентификатора Workspace

1. Перейдите в **Log Analytics workspaces** на портале Azure
2. Выберите рабочую область
3. Скопируйте **Workspace ID** из раздела Overview

### Полезные запросы KQL

Запрос ошибок активности:

```
AzureActivity | where Level == "Error"
```

Запрос событий безопасности:

```
SecurityEvent | where EventID == 4625
```

Запрос изменений ресурсов:

```
AzureActivity | where OperationNameValue contains "write" or OperationNameValue contains "delete"
```

## Примеры алертов

### Подозрительный вход в Azure AD

```json
{
  "rule": {
    "id": "62503",
    "level": 5,
    "description": "Azure AD: Sign-in from unusual location"
  },
  "data": {
    "azure": {
      "category": "SignInLogs",
      "operationName": "Sign-in activity",
      "properties": {
        "userPrincipalName": "user@company.com",
        "ipAddress": "198.51.100.42",
        "location": {
          "countryOrRegion": "CN"
        },
        "status": {
          "errorCode": 0,
          "additionalDetails": "MFA completed"
        }
      }
    }
  }
}
```

### Изменение критического ресурса

```json
{
  "rule": {
    "id": "62510",
    "level": 7,
    "description": "Azure: Critical resource modification detected"
  },
  "data": {
    "azure": {
      "operationName": "Microsoft.Network/networkSecurityGroups/write",
      "category": "Administrative",
      "caller": "admin@company.com",
      "properties": {
        "statusCode": "Created",
        "resource": "production-nsg"
      }
    }
  }
}
```

### Нарушение политики соответствия

```json
{
  "rule": {
    "id": "62520",
    "level": 6,
    "description": "Azure Policy: Non-compliant resource detected"
  },
  "data": {
    "azure": {
      "operationName": "Microsoft.Authorization/policyAssignments/write",
      "category": "Policy",
      "properties": {
        "complianceState": "NonCompliant",
        "policyDefinitionName": "require-tag-on-resources"
      }
    }
  }
}
```

## Сценарии использования

### Обнаружение подозрительных входов

- Входы с нетипичных географических расположений
- Множественные неудачные попытки аутентификации
- Входы с анонимных IP-адресов (Tor, VPN)
- Входы с устройств без MFA при активной политике MFA

### Мониторинг изменений ресурсов

- Создание или удаление виртуальных машин
- Изменение правил Network Security Groups
- Модификация политик доступа Key Vault
- Изменение настроек подписки

### Контроль соответствия требованиям

- Отслеживание ресурсов без обязательных тегов
- Мониторинг незашифрованных хранилищ данных
- Контроль назначения привилегированных ролей Azure RBAC
- Отслеживание отклонений от Azure Policy

## Устранение неполадок

### Модуль не подключается к Azure

- Проверьте корректность Application ID и Client Secret
- Убедитесь, что срок действия секрета не истек
- Проверьте, что приложению назначены необходимые разрешения
- Убедитесь, что согласие администратора предоставлено

### Пустые результаты Log Analytics

- Проверьте правильность Workspace ID
- Убедитесь, что рабочая область содержит данные за запрошенный период
- Протестируйте KQL-запрос в Azure Portal (Log Analytics - Logs)
- Проверьте значение `time_offset` - оно должно покрывать период с данными

### Ошибки аутентификации Microsoft Graph

- Проверьте, что разрешения API назначены как Application, а не Delegated
- Убедитесь, что предоставлено согласие администратора
- Проверьте, что tenant domain указан корректно
- Проверьте журнал `/var/ossec/logs/ossec.log` на предмет ошибок HTTP

### Зависимости Python

Модуль требует Python 3.8-3.13 и дополнительные библиотеки:

```bash
/var/ossec/framework/python/bin/pip3 install azure-storage-blob azure-identity
```

## Связанные разделы

- [Мониторинг облачной безопасности](/docs/wazuh/cloud-security/) - обзор облачных интеграций
- [Office 365](/docs/wazuh/cloud-security/wazuh-office365-monitoring/) - мониторинг Microsoft 365 (использует Azure AD)
- [Возможности Wazuh](/docs/wazuh/capabilities/) - модули безопасности платформы

