# Wazuh GitHub - мониторинг аудита организаций

> Настройка мониторинга GitHub в Wazuh 4.14 - Audit Log API, персональные токены доступа, конфигурация github wodle и типы событий аудита

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


Wazuh обеспечивает мониторинг безопасности организаций GitHub через модуль `github`, который собирает события аудита через GitHub Audit Log API. Модуль отслеживает действия с репозиториями, управление участниками и командами, изменения настроек организации и git-операции. Интеграция позволяет обнаруживать изменения видимости репозиториев, добавление внешних коллабораторов, события secret scanning и другие критичные действия в рамках организации.

## GitHub Audit Log API

GitHub Audit Log API предоставляет доступ к журналу аудита организации GitHub Enterprise Cloud. API фиксирует все действия, выполненные участниками организации, включая административные операции и git-события.

Для использования API требуется:
- Подписка **GitHub Enterprise Cloud**
- Статус **Owner** в организации GitHub
- Персональный токен доступа с соответствующими scopes

## Персональный токен доступа

### Создание токена

1. Перейдите в **Settings - Developer settings - Personal access tokens - Tokens (classic)**
2. Нажмите **Generate new token (classic)**
3. Укажите описательное имя (например, `Wazuh Audit Log Reader`)
4. Установите срок действия
5. Выберите необходимые scopes

### Необходимые scopes

| Scope | Описание |
|-------|----------|
| `admin:org` | Полный доступ к управлению организацией (включает чтение audit log) |
| `audit_log` | Чтение журнала аудита организации |
| `repo` | Доступ к событиям репозиториев (для частных репозиториев) |

Минимально необходимый scope - `audit_log`. Scope `admin:org` предоставляет расширенный доступ к событиям управления участниками и командами.

6. Нажмите **Generate token**
7. Скопируйте токен (отображается только один раз)

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

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

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

```xml
<github>
  <enabled>yes</enabled>
  <interval>1m</interval>
  <time_delay>1m</time_delay>
  <curl_max_size>1M</curl_max_size>
  <only_future_events>yes</only_future_events>
  <api_auth>
    <org_name>my-organization</org_name>
    <api_token>ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</api_token>
  </api_auth>
  <api_parameters>
    <event_type>all</event_type>
  </api_parameters>
</github>
```

### Мониторинг только web-событий

```xml
<github>
  <enabled>yes</enabled>
  <interval>5m</interval>
  <time_delay>1m</time_delay>
  <curl_max_size>1M</curl_max_size>
  <only_future_events>yes</only_future_events>
  <api_auth>
    <org_name>my-organization</org_name>
    <api_token>ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</api_token>
  </api_auth>
  <api_parameters>
    <event_type>web</event_type>
  </api_parameters>
</github>
```

### Мониторинг нескольких организаций

```xml
<github>
  <enabled>yes</enabled>
  <interval>1m</interval>
  <time_delay>1m</time_delay>
  <curl_max_size>1M</curl_max_size>
  <only_future_events>yes</only_future_events>
  <api_auth>
    <org_name>production-org</org_name>
    <api_token>ghp_production_token_xxxxxxxxxxxxx</api_token>
  </api_auth>
  <api_auth>
    <org_name>development-org</org_name>
    <api_token>ghp_development_token_xxxxxxxxxxxxx</api_token>
  </api_auth>
  <api_parameters>
    <event_type>all</event_type>
  </api_parameters>
</github>
```

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

| Параметр | Значение по умолчанию | Описание |
|----------|-----------------------|----------|
| `enabled` | yes | Включение или отключение модуля |
| `interval` | 10m | Интервал опроса API (s/m/h/d) |
| `time_delay` | 30s | Задержка сканирования для учета лага API |
| `curl_max_size` | 1M | Максимальный размер ответа API |
| `only_future_events` | yes | Сбор только новых событий после первого запуска |
| `org_name` | - | Имя организации GitHub |
| `api_token` | - | Персональный токен доступа |
| `event_type` | all | Тип событий для мониторинга (all, web, git) |

## Типы отслеживаемых событий

### Категория web

Web-события охватывают административные действия в организации:

| Категория | Примеры событий |
|-----------|----------------|
| Репозитории | Создание, удаление, изменение видимости, архивация, fork |
| Организация | Изменение настроек, обновление политик, переименование |
| Команды | Создание, удаление, добавление и удаление участников |
| Участники | Приглашение, удаление, изменение ролей |
| Webhooks | Создание, удаление, изменение конфигурации |
| Приложения | Установка, удаление, изменение разрешений GitHub Apps |
| Secret scanning | Обнаружение секретов в коде, оповещения |
| Dependabot | Оповещения об уязвимостях зависимостей |

### Категория git

Git-события фиксируют операции с кодом:

| Событие | Описание |
|---------|----------|
| `git.clone` | Клонирование репозитория |
| `git.fetch` | Получение изменений из удаленного репозитория |
| `git.push` | Отправка изменений в удаленный репозиторий |

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

### Изменение видимости репозитория

```json
{
  "rule": {
    "id": "91400",
    "level": 9,
    "description": "GitHub: Repository visibility changed to public"
  },
  "data": {
    "github": {
      "action": "repo.access",
      "actor": "admin-user",
      "org": "my-organization",
      "repo": "my-organization/internal-tools",
      "visibility": "public",
      "created_at": "2025-01-15T10:30:00Z"
    }
  }
}
```

### Добавление внешнего коллаборатора

```json
{
  "rule": {
    "id": "91410",
    "level": 6,
    "description": "GitHub: External collaborator added to repository"
  },
  "data": {
    "github": {
      "action": "repo.add_member",
      "actor": "repo-admin",
      "org": "my-organization",
      "repo": "my-organization/production-app",
      "user": "external-developer",
      "created_at": "2025-01-15T11:00:00Z"
    }
  }
}
```

### Оповещение secret scanning

```json
{
  "rule": {
    "id": "91420",
    "level": 12,
    "description": "GitHub: Secret detected in repository code"
  },
  "data": {
    "github": {
      "action": "secret_scanning_alert.created",
      "actor": "github-bot",
      "org": "my-organization",
      "repo": "my-organization/api-service",
      "data": {
        "alert_number": 42,
        "secret_type": "aws_access_key_id",
        "resolution": null
      }
    }
  }
}
```

### Удаление команды

```json
{
  "rule": {
    "id": "91430",
    "level": 7,
    "description": "GitHub: Team deleted from organization"
  },
  "data": {
    "github": {
      "action": "team.destroy",
      "actor": "org-owner",
      "org": "my-organization",
      "team": "security-team",
      "created_at": "2025-01-15T14:00:00Z"
    }
  }
}
```

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

### Обнаружение изменений видимости репозиториев

- Изменение приватного репозитория на публичный
- Изменение настроек fork для приватных репозиториев
- Архивация активных репозиториев
- Удаление репозиториев с production-кодом

### Мониторинг новых коллабораторов

- Добавление внешних коллабораторов к репозиториям с критическим кодом
- Приглашение пользователей в организацию с ролью Owner
- Добавление участников в команды с доступом к production-репозиториям
- Изменение разрешений существующих участников

### Мониторинг secret scanning

- Обнаружение API-ключей AWS, GCP, Azure в коде
- Обнаружение токенов баз данных и сервисных аккаунтов
- Обнаружение приватных ключей SSH и TLS-сертификатов
- Отслеживание статуса разрешения обнаруженных секретов

### Контроль административных действий

- Изменение политик организации (требование 2FA, ограничение fork)
- Установка и удаление GitHub Apps с расширенными разрешениями
- Создание и изменение webhook-конфигураций
- Изменение настроек защиты веток (branch protection rules)

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

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

- Проверьте, что организация имеет подписку GitHub Enterprise Cloud
- Убедитесь, что токен создан владельцем организации (Owner)
- Проверьте, что токен содержит scope `audit_log` или `admin:org`
- Убедитесь, что имя организации указано корректно в `org_name`
- Просмотрите журнал: `/var/ossec/logs/ossec.log`

### Ошибка 401 Unauthorized

- Проверьте, что токен не отозван и не истек
- Убедитесь, что токен является классическим (Personal access tokens classic), а не fine-grained
- Проверьте, что SSO авторизован для токена (если организация использует SAML SSO)

### Неполные данные аудита

- Git-события доступны только с подпиской GitHub Enterprise Cloud
- Некоторые события могут задерживаться до 30 минут
- Увеличьте `time_delay` для учета задержки API
- При первом запуске установите `only_future_events` в `no`

### Ошибка Rate Limit

- GitHub API ограничивает количество запросов до 1750 в час для Enterprise
- Увеличьте значение `interval` (например, до 5m или 10m)
- Для организаций с высокой активностью рассмотрите фильтрацию по `event_type`

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

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

