# Wazuh AWS - мониторинг сервисов Amazon Web Services

> Настройка мониторинга AWS в Wazuh 4.14 - CloudTrail, GuardDuty, VPC Flow Logs, WAF, Config, SQS-интеграция и методы аутентификации через IAM

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


Wazuh обеспечивает мониторинг безопасности Amazon Web Services через модуль `aws-s3`, который собирает журналы из S3-бакетов и обрабатывает события облачных сервисов AWS. Модуль поддерживает более 15 сервисов AWS, включая CloudTrail, GuardDuty, VPC Flow Logs, WAF и другие. Интеграция позволяет централизовать анализ облачных событий в Wazuh для обнаружения несанкционированного доступа, изменений конфигурации и сетевых аномалий.

## Поддерживаемые сервисы AWS

Модуль `aws-s3` обрабатывает журналы следующих сервисов:

| Сервис | Тип бакета | Назначение |
|--------|-----------|------------|
| AWS CloudTrail | `cloudtrail` | Журнал вызовов AWS API и действий пользователей |
| Amazon VPC Flow Logs | `vpcflow` | Сетевой трафик в виртуальных частных облаках |
| Amazon GuardDuty | `guardduty` | Обнаружение угроз и аномалий |
| AWS WAF | `waf` | Журналы веб-фаервола |
| Amazon Macie | `custom` | Обнаружение конфиденциальных данных в S3 |
| AWS Config | `config` | Отслеживание изменений конфигурации ресурсов |
| AWS Trusted Advisor | `custom` | Рекомендации по безопасности и оптимизации |
| AWS KMS | `custom` | Операции с ключами шифрования |
| Amazon Inspector | `custom` | Оценка уязвимостей EC2-инстансов |
| Amazon CloudWatch Logs | `cloudwatch` | Журналы приложений и системные логи |
| Amazon S3 Server Access | `server_access` | Журналы доступа к S3-бакетам |
| Amazon ECR Image Scanning | `custom` | Сканирование образов контейнеров |
| Elastic Load Balancer (ALB/CLB/NLB) | `alb` / `clb` / `nlb` | Журналы балансировщиков нагрузки |
| Amazon Security Lake | `security_lake` | Централизованное хранилище событий безопасности |
| AWS Security Hub | `custom` | Агрегация результатов безопасности |

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

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

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

```xml
<wodle name="aws-s3">
  <disabled>no</disabled>
  <interval>10m</interval>
  <run_on_start>yes</run_on_start>
  <skip_on_error>yes</skip_on_error>
  <bucket type="cloudtrail">
    <name>my-cloudtrail-bucket</name>
    <aws_profile>default</aws_profile>
  </bucket>
</wodle>
```

### Конфигурация для нескольких сервисов

```xml
<wodle name="aws-s3">
  <disabled>no</disabled>
  <interval>10m</interval>
  <run_on_start>yes</run_on_start>
  <skip_on_error>yes</skip_on_error>

  <bucket type="cloudtrail">
    <name>my-cloudtrail-bucket</name>
    <aws_profile>production</aws_profile>
  </bucket>

  <bucket type="vpcflow">
    <name>my-vpcflow-bucket</name>
    <aws_profile>production</aws_profile>
  </bucket>

  <bucket type="guardduty">
    <name>my-guardduty-bucket</name>
    <aws_profile>production</aws_profile>
  </bucket>

  <bucket type="waf">
    <name>my-waf-bucket</name>
    <aws_profile>production</aws_profile>
  </bucket>

  <bucket type="config">
    <name>my-config-bucket</name>
    <aws_profile>production</aws_profile>
  </bucket>
</wodle>
```

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

| Параметр | Значение по умолчанию | Описание |
|----------|-----------------------|----------|
| `disabled` | no | Включение или отключение модуля |
| `interval` | 10m | Интервал опроса S3-бакетов (s/m/h/d) |
| `run_on_start` | yes | Выполнение при старте сервиса |
| `skip_on_error` | yes | Продолжение работы при ошибке обработки |
| `only_logs_after` | - | Сбор логов начиная с указанной даты (YYYY-MMM-DD) |
| `regions` | все | Ограничение по регионам AWS |
| `aws_account_id` | - | Фильтрация по идентификатору аккаунта |
| `path` | - | Префикс каталога в S3-бакете |

### Структура каталогов CloudTrail в S3

Логи CloudTrail сохраняются в S3 по следующей структуре:

```
<BUCKET>/<PREFIX>/AWSLogs/<ACCOUNT_ID>/CloudTrail/<REGION>/<YEAR>/<MONTH>/<DAY>/
```

## Методы аутентификации

Модуль `aws-s3` поддерживает три метода аутентификации в AWS.

### Профили с ключами доступа

Учетные данные хранятся в файле `/root/.aws/credentials`:

```ini
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[production]
aws_access_key_id = AKIAI44QH8DHBEXAMPLE
aws_secret_access_key = je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
```

Конфигурация региона в `/root/.aws/config`:

```ini
[default]
region = us-east-1

[profile production]
region = eu-west-1
```

Ссылка на профиль в `ossec.conf`:

```xml
<bucket type="cloudtrail">
  <name>my-cloudtrail-bucket</name>
  <aws_profile>production</aws_profile>
</bucket>
```

### IAM-роль для EC2

Рекомендуемый метод при работе Wazuh на EC2-инстансе. Временные учетные данные получаются автоматически через Instance Metadata Service. Конфигурация не требует указания профиля или ключей:

```xml
<bucket type="cloudtrail">
  <name>my-cloudtrail-bucket</name>
</bucket>
```

Для использования этого метода назначьте EC2-инстансу IAM-роль с необходимыми разрешениями через Instance Profile.

### Принятие роли (Assume Role)

Позволяет получить временные учетные данные для доступа к ресурсам другого аккаунта AWS. Требует настройки доверительных отношений между аккаунтами:

```xml
<bucket type="cloudtrail">
  <name>my-cloudtrail-bucket</name>
  <aws_profile>default</aws_profile>
  <iam_role_arn>arn:aws:iam::123456789012:role/WazuhCloudTrailRole</iam_role_arn>
</bucket>
```

Параметр `iam_role_arn` содержит ARN IAM-роли, которую модуль примет через STS AssumeRole.

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

Для масштабируемой доставки логов из S3 в Wazuh используется Amazon SQS (Simple Queue Service). При большом объеме логов SQS устраняет задержки, связанные с перебором объектов в бакете.

### Принцип работы

1. S3-бакет настроен на отправку уведомлений о новых объектах в SQS-очередь
2. Модуль Wazuh опрашивает SQS-очередь вместо прямого перебора S3
3. Каждое сообщение SQS содержит ключ нового объекта в S3
4. Модуль скачивает и обрабатывает только указанные объекты

### Настройка S3-уведомлений

Создайте Event Notification в настройках S3-бакета:
- **Events**: `s3:ObjectCreated:*`
- **Destination**: SQS Queue
- **Queue ARN**: `arn:aws:sqs:<REGION>:<ACCOUNT_ID>:<QUEUE_NAME>`

### Конфигурация SQS в ossec.conf

```xml
<wodle name="aws-s3">
  <disabled>no</disabled>
  <interval>5m</interval>
  <run_on_start>yes</run_on_start>
  <skip_on_error>yes</skip_on_error>
  <bucket type="cloudtrail">
    <name>my-cloudtrail-bucket</name>
    <aws_profile>default</aws_profile>
    <sqs_name>my-cloudtrail-sqs-queue</sqs_name>
  </bucket>
</wodle>
```

### Преимущества SQS-интеграции

- Более быстрая обработка новых логов (push вместо pull)
- Снижение нагрузки на S3 API (меньше вызовов ListObjects)
- Поддержка мультиаккаунтных развертываний
- Автоматическая обработка ошибок через Dead Letter Queue

## Необходимые IAM-разрешения

Для корректной работы модуля `aws-s3` IAM-политика должна включать следующие разрешения:

### Базовые разрешения для S3

| Действие | Ресурс | Назначение |
|----------|--------|------------|
| `s3:GetObject` | `arn:aws:s3:::<BUCKET>/*` | Чтение объектов из бакета |
| `s3:ListBucket` | `arn:aws:s3:::<BUCKET>` | Перечисление объектов в бакете |

### Разрешения для SQS (при использовании очереди)

| Действие | Ресурс | Назначение |
|----------|--------|------------|
| `sqs:ReceiveMessage` | `arn:aws:sqs:<REGION>:<ACCOUNT>:<QUEUE>` | Получение сообщений из очереди |
| `sqs:DeleteMessage` | `arn:aws:sqs:<REGION>:<ACCOUNT>:<QUEUE>` | Удаление обработанных сообщений |
| `sqs:GetQueueUrl` | `arn:aws:sqs:<REGION>:<ACCOUNT>:<QUEUE>` | Получение URL очереди |

### Разрешения для Assume Role

| Действие | Ресурс | Назначение |
|----------|--------|------------|
| `sts:AssumeRole` | `arn:aws:iam::<ACCOUNT>:role/<ROLE>` | Принятие IAM-роли в целевом аккаунте |

### Пример IAM-политики

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-cloudtrail-bucket",
        "arn:aws:s3:::my-cloudtrail-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "sqs:ReceiveMessage",
        "sqs:DeleteMessage",
        "sqs:GetQueueUrl"
      ],
      "Resource": "arn:aws:sqs:us-east-1:123456789012:my-cloudtrail-sqs-queue"
    }
  ]
}
```

## Анализ CloudTrail

CloudTrail фиксирует все вызовы AWS API, предоставляя полную картину действий пользователей и сервисов в аккаунте.

### Обнаружение несанкционированных вызовов API

Wazuh анализирует события CloudTrail с кодом ошибки `AccessDenied` или `UnauthorizedAccess` и генерирует алерты. Пример события:

```json
{
  "rule": {
    "id": "80253",
    "level": 3,
    "description": "AWS CloudTrail: unauthorized API call"
  },
  "data": {
    "aws": {
      "eventName": "DescribeInstances",
      "errorCode": "AccessDenied",
      "userIdentity": {
        "type": "IAMUser",
        "userName": "suspicious-user"
      },
      "sourceIPAddress": "198.51.100.42",
      "awsRegion": "us-east-1"
    }
  }
}
```

### Обнаружение входа под root-аккаунтом

Вход под root-аккаунтом AWS генерирует алерт высокого уровня:

```json
{
  "rule": {
    "id": "80302",
    "level": 8,
    "description": "AWS CloudTrail: Root account login detected"
  },
  "data": {
    "aws": {
      "eventName": "ConsoleLogin",
      "userIdentity": {
        "type": "Root",
        "arn": "arn:aws:iam::123456789012:root"
      },
      "responseElements": {
        "ConsoleLogin": "Success"
      },
      "sourceIPAddress": "203.0.113.15"
    }
  }
}
```

### Изменения Security Groups

Wazuh обнаруживает добавление разрешающих правил в группы безопасности:

```json
{
  "rule": {
    "id": "80447",
    "level": 5,
    "description": "AWS CloudTrail: Security group ingress rule added"
  },
  "data": {
    "aws": {
      "eventName": "AuthorizeSecurityGroupIngress",
      "requestParameters": {
        "groupId": "sg-0a1b2c3d4e5f67890",
        "ipPermissions": {
          "items": [{
            "fromPort": 22,
            "toPort": 22,
            "ipRanges": {"items": [{"cidrIp": "0.0.0.0/0"}]}
          }]
        }
      }
    }
  }
}
```

### Создание и удаление IAM-пользователей

```json
{
  "rule": {
    "id": "80258",
    "level": 5,
    "description": "AWS CloudTrail: IAM user created"
  },
  "data": {
    "aws": {
      "eventName": "CreateUser",
      "requestParameters": {
        "userName": "new-admin-user"
      },
      "userIdentity": {
        "userName": "admin"
      }
    }
  }
}
```

## Интеграция GuardDuty

Amazon GuardDuty - это управляемый сервис обнаружения угроз, который анализирует потоки данных из CloudTrail, VPC Flow Logs и DNS-логов. Wazuh импортирует находки GuardDuty и обрабатывает их как алерты.

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

```xml
<bucket type="guardduty">
  <name>my-guardduty-bucket</name>
  <aws_profile>default</aws_profile>
</bucket>
```

### Пример алерта GuardDuty

```json
{
  "rule": {
    "id": "80301",
    "level": 8,
    "description": "AWS GuardDuty: Unusual API call from known malicious IP"
  },
  "data": {
    "aws": {
      "service": {
        "serviceName": "guardduty",
        "action": {
          "actionType": "AWS_API_CALL",
          "awsApiCallAction": {
            "api": "DescribeInstances",
            "callerType": "Remote IP"
          }
        }
      },
      "severity": 8,
      "title": "API DescribeInstances was invoked from a known malicious IP address",
      "type": "Recon:EC2/MaliciousIPCaller.Custom"
    }
  }
}
```

### Типы угроз GuardDuty

GuardDuty классифицирует находки по категориям:

- **Recon** - разведка (сканирование портов, перечисление ресурсов)
- **UnauthorizedAccess** - несанкционированный доступ
- **Trojan** - обнаружение троянского ПО
- **CryptoCurrency** - майнинг криптовалют
- **Backdoor** - бэкдоры
- **Exfiltration** - эксфильтрация данных

## Мониторинг VPC Flow Logs

VPC Flow Logs фиксируют сетевой трафик на уровне сетевых интерфейсов, подсетей и VPC.

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

```xml
<bucket type="vpcflow">
  <name>my-vpcflow-bucket</name>
  <aws_profile>default</aws_profile>
</bucket>
```

### Пример алерта VPC Flow Logs

```json
{
  "rule": {
    "id": "80401",
    "level": 4,
    "description": "AWS VPC Flow: Rejected connection attempt"
  },
  "data": {
    "aws": {
      "vpcflow": {
        "srcaddr": "198.51.100.55",
        "dstaddr": "10.0.1.25",
        "srcport": 44820,
        "dstport": 3389,
        "protocol": 6,
        "action": "REJECT"
      }
    }
  }
}
```

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

### Обнаружение компрометации ключей доступа

Комбинация алертов CloudTrail позволяет выявить использование скомпрометированных ключей:

1. Множественные вызовы API с ошибкой `AccessDenied` с нового IP-адреса
2. Успешный вызов API после серии отказов
3. Создание новых IAM-пользователей или ключей доступа

### Мониторинг соответствия требованиям

- Отслеживание изменений в политиках IAM (PCI DSS 7.1, 7.2)
- Мониторинг шифрования данных через KMS (PCI DSS 3.4)
- Контроль доступа к S3-бакетам с конфиденциальными данными (GDPR Art. 32)

### Обнаружение латерального перемещения

- Аномальные паттерны API-вызовов из скомпрометированного EC2
- Доступ к ресурсам в нехарактерных регионах
- Использование ранее неактивных IAM-ролей

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

### Модуль не собирает логи

- Проверьте права доступа IAM-политики: `s3:GetObject` и `s3:ListBucket`
- Убедитесь, что бакет содержит логи в ожидаемой структуре каталогов
- Проверьте файл учетных данных `/root/.aws/credentials`
- Просмотрите журнал модуля: `/var/ossec/logs/ossec.log`

### Ошибка AccessDenied при чтении бакета

- Убедитесь, что IAM-политика назначена корректному пользователю или роли
- Проверьте политику бакета (Bucket Policy) на отсутствие явных запретов
- При использовании Assume Role проверьте доверительные отношения роли
- Проверьте, что регион в конфигурации совпадает с регионом бакета

### Дублирование алертов

- Используйте `only_logs_after` для ограничения начальной даты сбора
- Не используйте `--reparse` в production без необходимости
- Проверьте, что один бакет не указан в нескольких блоках конфигурации

### Задержки в обработке логов

- Уменьшите значение `interval` (например, до 5m)
- Настройте SQS-интеграцию для push-доставки уведомлений
- Используйте фильтрацию по регионам (`regions`) для уменьшения объема данных
- Настройте Dead Letter Queue для SQS для обработки ошибочных сообщений

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

Модуль требует Python 3 и библиотеку boto3. Установка на сервере Wazuh:

```bash
/var/ossec/framework/python/bin/pip3 install boto3
```

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

- [Мониторинг облачной безопасности](/docs/wazuh/cloud-security/) - обзор всех облачных интеграций
- [Возможности Wazuh](/docs/wazuh/capabilities/) - модули безопасности платформы
- [Архитектура Wazuh](/docs/wazuh/getting-started/wazuh-architecture/) - компоненты и потоки данных

