# Wazuh Office 365 - мониторинг аудита Microsoft 365

> Настройка мониторинга Office 365 в Wazuh 4.14 - Management Activity API, регистрация приложений Azure AD, конфигурация office365 wodle и типы контента

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


Wazuh обеспечивает мониторинг безопасности Microsoft 365 через модуль `office365`, который собирает журналы аудита из Office 365 Management Activity API. Модуль отслеживает действия пользователей в Exchange Online, SharePoint Online, Microsoft Teams, Azure Active Directory и событиях DLP. Интеграция позволяет обнаруживать подозрительные входы, несанкционированный доступ к почтовым ящикам, нарушения политик DLP и административные действия в рамках тенанта Microsoft 365.

## Office 365 Management Activity API

Office 365 Management Activity API - это REST API, предоставляющий доступ к журналам аудита и активности из различных сервисов Microsoft 365. API использует модель подписок: клиент подписывается на определенные типы контента и периодически запрашивает новые события.

### Типы контента

| Тип контента | Описание |
|-------------|----------|
| `Audit.AzureActiveDirectory` | События аутентификации, управления пользователями и группами в Microsoft Entra ID |
| `Audit.Exchange` | Действия с почтовыми ящиками, правилами транспорта, антиспамом |
| `Audit.SharePoint` | Операции с файлами, сайтами, разрешениями в SharePoint и OneDrive |
| `Audit.General` | События рабочих нагрузок, не вошедших в другие категории (Teams, Power BI) |
| `DLP.All` | Срабатывания политик Data Loss Prevention для Exchange, SharePoint и OneDrive |

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

Для работы модуля необходимо зарегистрировать приложение в Microsoft Entra ID и предоставить разрешения для доступа к Management Activity API.

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

1. Перейдите на [portal.azure.com](https://portal.azure.com) в раздел **Microsoft Entra ID - App registrations**
2. Нажмите **New registration**
3. Укажите имя (например, `Wazuh-Office365-Monitor`)
4. Выберите **Accounts in this organizational directory only** (Single tenant)
5. Зафиксируйте значения из раздела Overview:
   - **Application (client) ID**
   - **Directory (tenant) ID**

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

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

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

1. Перейдите в **API permissions - Add a permission**
2. Выберите **Office 365 Management APIs**
3. Выберите **Application permissions**
4. Добавьте следующие разрешения:

| Разрешение | Описание |
|-----------|----------|
| `ActivityFeed.Read` | Чтение данных активности организации |
| `ActivityFeed.ReadDlp` | Чтение событий DLP, включая обнаруженные конфиденциальные данные |

5. Нажмите **Grant admin consent for [Your Organization]**

## Конфигурация модуля office365

Модуль настраивается в `ossec.conf` на сервере Wazuh.

### Базовая конфигурация

```xml
<office365>
  <enabled>yes</enabled>
  <interval>1m</interval>
  <curl_max_size>1M</curl_max_size>
  <only_future_events>yes</only_future_events>
  <api_auth>
    <tenant_id>YOUR_TENANT_ID</tenant_id>
    <client_id>YOUR_CLIENT_ID</client_id>
    <client_secret>YOUR_CLIENT_SECRET</client_secret>
    <api_type>commercial</api_type>
  </api_auth>
  <subscriptions>
    <subscription>Audit.AzureActiveDirectory</subscription>
    <subscription>Audit.Exchange</subscription>
    <subscription>Audit.SharePoint</subscription>
    <subscription>Audit.General</subscription>
    <subscription>DLP.All</subscription>
  </subscriptions>
</office365>
```

### Конфигурация для государственных организаций (GCC)

```xml
<office365>
  <enabled>yes</enabled>
  <interval>5m</interval>
  <curl_max_size>1M</curl_max_size>
  <only_future_events>yes</only_future_events>
  <api_auth>
    <tenant_id>YOUR_TENANT_ID</tenant_id>
    <client_id>YOUR_CLIENT_ID</client_id>
    <client_secret>YOUR_CLIENT_SECRET</client_secret>
    <api_type>gcc-high</api_type>
  </api_auth>
  <subscriptions>
    <subscription>Audit.AzureActiveDirectory</subscription>
    <subscription>Audit.Exchange</subscription>
  </subscriptions>
</office365>
```

### Мультитенантная конфигурация

При мониторинге нескольких тенантов Microsoft 365 добавьте несколько блоков `api_auth`:

```xml
<office365>
  <enabled>yes</enabled>
  <interval>1m</interval>
  <curl_max_size>1M</curl_max_size>
  <only_future_events>yes</only_future_events>
  <api_auth>
    <tenant_id>TENANT_ID_1</tenant_id>
    <client_id>CLIENT_ID_1</client_id>
    <client_secret>CLIENT_SECRET_1</client_secret>
    <api_type>commercial</api_type>
  </api_auth>
  <api_auth>
    <tenant_id>TENANT_ID_2</tenant_id>
    <client_id>CLIENT_ID_2</client_id>
    <client_secret>CLIENT_SECRET_2</client_secret>
    <api_type>commercial</api_type>
  </api_auth>
  <subscriptions>
    <subscription>Audit.AzureActiveDirectory</subscription>
    <subscription>Audit.General</subscription>
  </subscriptions>
</office365>
```

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

| Параметр | Значение по умолчанию | Описание |
|----------|-----------------------|----------|
| `enabled` | yes | Включение или отключение модуля |
| `interval` | 10m | Интервал опроса API (s/m/h/d) |
| `curl_max_size` | 1M | Максимальный размер ответа API |
| `only_future_events` | yes | Сбор только новых событий после первого запуска |
| `tenant_id` | - | Идентификатор тенанта Azure AD |
| `client_id` | - | Идентификатор приложения (Application ID) |
| `client_secret` | - | Секрет клиента |
| `api_type` | commercial | Тип подписки (commercial, gcc, gcc-high) |

### API-точки доступа по типу подписки

| Тип | URL |
|-----|-----|
| Enterprise | `https://manage.office.com/api/v1.0/{tenant_id}/activity/feed/{operation}` |
| GCC | `https://manage-gcc.office.com/api/v1.0/{tenant_id}/activity/feed/{operation}` |
| GCC High | `https://manage.office365.us/api/v1.0/{tenant_id}/activity/feed/{operation}` |
| DoD | `https://manage.protection.apps.mil/api/v1.0/{tenant_id}/activity/feed/{operation}` |

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

### Подозрительный вход в учетную запись

```json
{
  "rule": {
    "id": "91545",
    "level": 6,
    "description": "Office 365: Suspicious sign-in activity detected"
  },
  "data": {
    "office365": {
      "Workload": "AzureActiveDirectory",
      "Operation": "UserLoginFailed",
      "UserId": "user@company.com",
      "ClientIP": "198.51.100.42",
      "ResultStatus": "Failed",
      "LogonError": "InvalidUserNameOrPassword",
      "DeviceProperties": {
        "OS": "Windows 10",
        "BrowserType": "Chrome"
      }
    }
  }
}
```

### Доступ к почтовому ящику другого пользователя

```json
{
  "rule": {
    "id": "91550",
    "level": 7,
    "description": "Office 365: Mailbox accessed by non-owner"
  },
  "data": {
    "office365": {
      "Workload": "Exchange",
      "Operation": "MailboxLogin",
      "UserId": "admin@company.com",
      "MailboxOwnerUPN": "ceo@company.com",
      "ClientIP": "10.0.1.50",
      "LogonType": 1,
      "ResultStatus": "Succeeded"
    }
  }
}
```

### Срабатывание политики DLP

```json
{
  "rule": {
    "id": "91560",
    "level": 10,
    "description": "Office 365: DLP policy violation detected"
  },
  "data": {
    "office365": {
      "Workload": "Exchange",
      "Operation": "DlpRuleMatch",
      "UserId": "user@company.com",
      "PolicyDetails": [{
        "PolicyName": "Credit Card Number Detection",
        "Rules": [{
          "RuleName": "Block external sharing of credit cards",
          "Severity": "High",
          "ConditionsMatched": {
            "SensitiveInformation": [{
              "SensitiveInformationTypeName": "Credit Card Number",
              "Count": 3
            }]
          }
        }]
      }]
    }
  }
}
```

### Административное действие

```json
{
  "rule": {
    "id": "91570",
    "level": 8,
    "description": "Office 365: Admin role assigned to user"
  },
  "data": {
    "office365": {
      "Workload": "AzureActiveDirectory",
      "Operation": "Add member to role",
      "UserId": "globaladmin@company.com",
      "ObjectId": "user@company.com",
      "ModifiedProperties": [{
        "Name": "Role.DisplayName",
        "NewValue": "Global Administrator"
      }]
    }
  }
}
```

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

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

- Множественные неудачные попытки входа (brute force)
- Входы с географически удаленных локаций в короткий промежуток (impossible travel)
- Входы с анонимных IP-адресов
- Успешный вход после серии отказов (password spraying)

### Мониторинг доступа к почтовым ящикам

- Доступ к чужому почтовому ящику делегированным пользователем
- Создание правил пересылки почты на внешние адреса
- Массовое удаление сообщений
- Изменение прав доступа к календарю

### Обнаружение нарушений DLP

- Отправка документов с номерами кредитных карт
- Пересылка файлов с персональными данными на внешние адреса
- Загрузка конфиденциальных документов в SharePoint с открытым доступом
- Обнаружение паттернов конфиденциальных данных в Teams

### Мониторинг административных действий

- Назначение привилегированных ролей (Global Admin, Exchange Admin)
- Изменение политик условного доступа
- Создание или модификация правил транспорта Exchange
- Отключение аудита или многофакторной аутентификации

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

### Модуль не получает события

- Проверьте корректность `tenant_id`, `client_id` и `client_secret`
- Убедитесь, что разрешения `ActivityFeed.Read` и `ActivityFeed.ReadDlp` назначены
- Проверьте, что предоставлено согласие администратора (Admin Consent)
- Подождите до 24 часов после первой активации - API может требовать время на подготовку подписок

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

- Проверьте, что секрет клиента не истек
- Убедитесь, что `api_type` соответствует вашей подписке (commercial, gcc, gcc-high)
- Проверьте, что приложение не заблокировано в Azure AD
- Просмотрите журнал `/var/ossec/logs/ossec.log` на наличие HTTP 401/403

### Пустые ответы API

- Убедитесь, что аудит включен в центре администрирования Microsoft 365
- Проверьте, что подписки на нужные типы контента активны
- При первом запуске установите `only_future_events` в `no` для получения исторических данных
- Проверьте, что в тенанте есть активность за запрошенный период

### Высокий объем событий

- Ограничьте подписки только необходимыми типами контента
- Увеличьте значение `interval` для снижения частоты опроса
- Создайте правила Wazuh для фильтрации шумных событий
- Используйте `curl_max_size` для ограничения объема данных за один запрос

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

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

