Wazuh GCP - мониторинг Google Cloud Platform

Wazuh обеспечивает мониторинг безопасности Google Cloud Platform через модуль gcp-pubsub, который получает события Cloud Audit Logs через подписки Google Cloud Pub/Sub. Модуль обрабатывает четыре типа журналов аудита: доступ к данным, привилегированные действия администраторов, системные события и DNS-запросы. Интеграция позволяет централизовать анализ облачных угроз GCP в платформе Wazuh.

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

Cloud Audit Logs

Google Cloud Audit Logs фиксируют все действия в проектах GCP. Wazuh обрабатывает следующие типы журналов:

Тип журналаОписаниеПримеры событий
Admin ActivityПривилегированные операции администраторовСоздание VM, изменение IAM-политик, настройка сети
Data AccessДоступ к данным пользователейЧтение объектов Cloud Storage, запросы BigQuery
System EventСистемные события GCPАвтоматическое масштабирование, миграция VM
Policy DeniedОтклоненные запросы политикамиНарушения организационных политик

Pub/Sub

Google Cloud Pub/Sub - это управляемый сервис обмена сообщениями, который выступает транспортным механизмом между Cloud Audit Logs и модулем Wazuh. Pub/Sub обеспечивает надежную доставку событий с автоматической буферизацией.

Cloud Storage

Модуль также поддерживает мониторинг бакетов Cloud Storage для сбора журналов, экспортированных через Cloud Logging Sinks.

Настройка сервисного аккаунта

Для работы модуля необходимо создать сервисный аккаунт GCP с соответствующими ролями и сгенерировать JSON-ключ.

Создание сервисного аккаунта

  1. Перейдите в IAM & Admin - Service Accounts в Google Cloud Console
  2. Нажмите + CREATE SERVICE ACCOUNT
  3. Укажите имя (например, wazuh-pubsub-reader) и описание
  4. Назначьте роли:
РольНазначение
Pub/Sub SubscriberПолучение сообщений из подписки
Pub/Sub PublisherПубликация подтверждений обработки
Storage Object UserДоступ к бакетам Cloud Storage (при необходимости)

Генерация JSON-ключа

  1. Выберите созданный сервисный аккаунт
  2. Перейдите на вкладку Keys
  3. Нажмите ADD KEY - Create new key - JSON
  4. Сохраните скачанный файл

Размещение ключа на сервере Wazuh

sudo cp credentials.json /var/ossec/wodles/gcloud/gcp-credentials.json
sudo chown root:wazuh /var/ossec/wodles/gcloud/gcp-credentials.json
sudo chmod 640 /var/ossec/wodles/gcloud/gcp-credentials.json

Структура JSON-ключа

{
  "type": "service_account",
  "project_id": "my-gcp-project",
  "private_key_id": "key-id-example",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "wazuh-pubsub-reader@my-gcp-project.iam.gserviceaccount.com",
  "client_id": "123456789012345678901",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/wazuh-pubsub-reader%40my-gcp-project.iam.gserviceaccount.com"
}

Настройка Pub/Sub

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

Создайте Pub/Sub-топик для получения событий Cloud Audit Logs:

gcloud pubsub topics create wazuh-audit-logs \
  --project=my-gcp-project

Создание подписки

Создайте подписку для топика:

gcloud pubsub subscriptions create wazuh-audit-subscription \
  --topic=wazuh-audit-logs \
  --ack-deadline=60 \
  --message-retention-duration=7d \
  --project=my-gcp-project

Настройка Cloud Logging Sink

Создайте sink для экспорта Cloud Audit Logs в Pub/Sub-топик:

gcloud logging sinks create wazuh-audit-sink \
  pubsub.googleapis.com/projects/my-gcp-project/topics/wazuh-audit-logs \
  --log-filter='logName:"cloudaudit.googleapis.com"' \
  --project=my-gcp-project

После создания sink, предоставьте сервисному аккаунту sink права на публикацию в топике:

gcloud pubsub topics add-iam-policy-binding wazuh-audit-logs \
  --member="serviceAccount:SINK_SERVICE_ACCOUNT" \
  --role="roles/pubsub.publisher" \
  --project=my-gcp-project

Конфигурация модуля gcp-pubsub

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

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

<wodle name="gcp-pubsub">
  <enabled>yes</enabled>
  <project_id>my-gcp-project</project_id>
  <subscription_name>wazuh-audit-subscription</subscription_name>
  <credentials_file>/var/ossec/wodles/gcloud/gcp-credentials.json</credentials_file>
  <interval>1m</interval>
  <max_messages>100</max_messages>
  <pull_on_start>yes</pull_on_start>
</wodle>

Конфигурация с фильтрацией

<wodle name="gcp-pubsub">
  <enabled>yes</enabled>
  <project_id>my-gcp-project</project_id>
  <subscription_name>wazuh-audit-subscription</subscription_name>
  <credentials_file>/var/ossec/wodles/gcloud/gcp-credentials.json</credentials_file>
  <interval>5m</interval>
  <max_messages>200</max_messages>
  <pull_on_start>yes</pull_on_start>
  <logging>info</logging>
</wodle>

Мониторинг нескольких проектов

<wodle name="gcp-pubsub">
  <enabled>yes</enabled>
  <project_id>production-project</project_id>
  <subscription_name>wazuh-prod-subscription</subscription_name>
  <credentials_file>/var/ossec/wodles/gcloud/prod-credentials.json</credentials_file>
  <interval>1m</interval>
  <max_messages>100</max_messages>
  <pull_on_start>yes</pull_on_start>
</wodle>

<wodle name="gcp-pubsub">
  <enabled>yes</enabled>
  <project_id>staging-project</project_id>
  <subscription_name>wazuh-staging-subscription</subscription_name>
  <credentials_file>/var/ossec/wodles/gcloud/staging-credentials.json</credentials_file>
  <interval>5m</interval>
  <max_messages>50</max_messages>
  <pull_on_start>yes</pull_on_start>
</wodle>

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

ПараметрЗначение по умолчаниюОписание
enabledyesВключение или отключение модуля
project_id-Идентификатор проекта GCP
subscription_name-Имя Pub/Sub-подписки
credentials_file-Путь к JSON-файлу ключа сервисного аккаунта
interval1mИнтервал опроса подписки (s/m/h/d)
max_messages100Максимальное количество сообщений за один цикл
pull_on_startyesПолучить сообщения при старте модуля
logginginfoУровень журналирования (debug, info, warning, error)

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

Изменение IAM-политики

{
  "rule": {
    "id": "65032",
    "level": 7,
    "description": "GCP: IAM policy modified"
  },
  "data": {
    "gcp": {
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
      "protoPayload": {
        "methodName": "google.iam.admin.v1.SetIamPolicy",
        "authenticationInfo": {
          "principalEmail": "admin@company.com"
        },
        "resourceName": "projects/my-project",
        "serviceName": "iam.googleapis.com"
      }
    }
  }
}

Изменение правил фаервола

{
  "rule": {
    "id": "65040",
    "level": 8,
    "description": "GCP: Firewall rule modified"
  },
  "data": {
    "gcp": {
      "protoPayload": {
        "methodName": "v1.compute.firewalls.insert",
        "authenticationInfo": {
          "principalEmail": "devops@company.com"
        },
        "request": {
          "name": "allow-all-ingress",
          "direction": "INGRESS",
          "allowed": [{"IPProtocol": "tcp", "ports": ["0-65535"]}],
          "sourceRanges": ["0.0.0.0/0"]
        }
      }
    }
  }
}

Доступ к Cloud Storage

{
  "rule": {
    "id": "65050",
    "level": 5,
    "description": "GCP: Cloud Storage object accessed"
  },
  "data": {
    "gcp": {
      "protoPayload": {
        "methodName": "storage.objects.get",
        "authenticationInfo": {
          "principalEmail": "user@company.com"
        },
        "resourceName": "projects/_/buckets/sensitive-data/objects/credentials.csv",
        "serviceName": "storage.googleapis.com"
      }
    }
  }
}

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

Обнаружение изменений IAM

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

Мониторинг изменений фаервола

  • Создание правил, разрешающих входящий трафик с 0.0.0.0/0
  • Удаление ограничивающих правил фаервола
  • Изменение правил для критических подсетей
  • Открытие портов управления (SSH, RDP) для публичного доступа

Контроль доступа к хранилищу

  • Доступ к бакетам с конфиденциальными данными
  • Изменение ACL или IAM-политик бакетов
  • Массовое скачивание объектов
  • Изменение настроек шифрования бакетов

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

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

  • Проверьте правильность project_id и subscription_name
  • Убедитесь, что JSON-ключ сервисного аккаунта валиден
  • Проверьте, что подписка активна: gcloud pubsub subscriptions describe wazuh-audit-subscription
  • Убедитесь, что Cloud Logging Sink создан и направляет логи в топик
  • Проверьте журнал: /var/ossec/logs/ossec.log

Ошибка Permission Denied

  • Проверьте, что сервисному аккаунту назначены роли Pub/Sub Subscriber и Publisher
  • Убедитесь, что сервисный аккаунт sink имеет доступ к топику
  • Проверьте, что ключ не отозван в Google Cloud Console

Задержки в доставке событий

  • Уменьшите значение interval (например, до 30s)
  • Увеличьте max_messages для обработки большего числа событий за цикл
  • Проверьте, что подписка не накапливает непрочитанные сообщения
  • Рассмотрите создание отдельных подписок для разных типов логов

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

Модуль требует Python 3 и библиотеки Google Cloud:

/var/ossec/framework/python/bin/pip3 install google-cloud-pubsub google-cloud-storage

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

Last updated on