🐳 Запуск сервера Wazuh в контейнерах Docker с помощью Docker Compose

Мануал

Сегодня, с ростом числа сложных киберугроз, существует высокая потребность в мониторинге и анализе систем в режиме реального времени для своевременного обнаружения угроз и принятия соответствующих мер.

Wazuh – это бесплатное решение для мониторинга с открытым исходным кодом.

Оно используется для обнаружения угроз, контроля целостности системы и реагирования на инциденты.

Оно обеспечивает легкую безопасность на уровне ОС с помощью многоплатформенных агентов. Используя Wazuh, можно собирать, индексировать, агрегировать и анализировать данные безопасности, что позволяет обнаруживать вторжения в систему и аномалии.

Применение:

  • Облачная безопасность
  • Безопасность контейнеров
  • Анализ журналов
  • Обнаружение уязвимостей
  • Анализ безопасности

Цель данного руководства – продемонстрировать, как запустить сервер Wazuh в контейнерах Docker.

Обычно существует два варианта развертывания Wazuh.

Развертывание “все в одном”:

  • Здесь Wazuh и Open Distro for Elasticsearch установлены на одном хосте.

Распределенное развертывание: Этот метод предполагает установку компонентов на отдельных узлах в виде одноузлового/многоузлового кластера. Этот метод является предпочтительным, поскольку он обеспечивает высокую доступность и масштабируемость продукта и, следовательно, удобен для больших сред.

Во время установки Wazuh можно выбрать один из двух вариантов:

  • Автоматическая установка – Wazuh устанавливается с помощью автоматизированного cкрипта. Он выполняет проверку работоспособности, чтобы убедиться, что доступные системные ресурсы соответствуют минимальным требованиям.
  • Пошаговая установка – предполагает ручную установку с подробным описанием каждого процесса.

Docker – это механизм с открытым исходным кодом, используемый для автоматизации развертывания различных приложений внутри программных контейнеров.

В этом руководстве мы установим Wazuh All-in-one deployment в контейнер docker.

Образ Docker содержит:

  • Wazuh Manager
  • Filebeat
  • Elasticsearch
  • Kibana
  • Nginx и Open Distro for Elasticsearch

Начало работы.

Подготовьте систему к установке, обновив доступные пакеты и установив необходимые пакеты.

## На Debian/Ubuntu
sudo apt update && sudo apt upgrade
sudo apt install curl vim git

## На RHEL/CentOS/RockyLinux 8
sudo yum -y update
sudo yum -y install curl vim git

## На Fedora
sudo dnf update
sudo dnf -y install curl vim git

Шаг 1 – Установка Docker в Linux

В первую очередь необходимо установить docker и docker-compose, если они у вас еще не установлены.

После установки запустите и включите docker.

sudo systemctl start docker && sudo systemctl enable docker

Также добавьте вашего системного пользователя в группу docker.

sudo usermod -aG docker $USER
newgrp docker

Установив docker, установите docker-compose с помощью следующих команд:

curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url  | grep docker-compose-linux-x86_64 | cut -d '"' -f 4 | wget -qi -
chmod +x docker-compose-linux-x86_64
sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

Проверьте правильность установки.

 docker-compose version
Docker Compose version v2.3.0

Шаг 2 – Настройка сервера Wazuh

Прежде чем мы продолжим, вам необходимо выполнить следующие настройки:

Увеличьте max_map_count на вашем хосте

sudo sysctl -w vm.max_map_count=262144

Если этот параметр не установлен, Elasticsearch может не работать.

Настройка SELinux на системах на базе Rhel

Для запуска docker-elk необходимо установить SELinux в разрешительный режим, как показано ниже

sudo chcon -R system_u:object_r:admin_home_t:s0 docker-elk/

Все необходимые компоненты Wazuh доступны в одном файле Open Distro for Elasticsearch, который можно извлечь, как показано ниже:

$ cd ~
$ git clone https://github.com/wazuh/wazuh-docker.git -b v4.2.5 --depth=1

Теперь перейдите в директорию.

cd wazuh-docker

Шаг 3 – Запуск контейнера Wazuh

В директории находится docker-compose.yml, используемый для демонстрационного развертывания.

Запустите контейнеры в фоновом режиме, как показано ниже.

docker-compose up -d

Проверьте, запущены ли контейнеры:

$ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                           NAMES
d64698a06cc4   wazuh/wazuh-kibana-odfe:4.2.5                "/bin/sh -c ./entryp…"   38 seconds ago   Up 36 seconds   0.0.0.0:443->5601/tcp, :::443->5601/tcp                                                                                                                         wazuh-docker-kibana-1
2bb0d8088b0f   amazon/opendistro-for-elasticsearch:1.13.2   "/usr/local/bin/dock…"   48 seconds ago   Up 37 seconds   9300/tcp, 9600/tcp, 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9650/tcp                                                                                         wazuh-docker-elasticsearch-1
7eed74a2a2ae   wazuh/wazuh-odfe:4.2.5                       "/init"                  48 seconds ago   Up 36 seconds   0.0.0.0:1514-1515->1514-1515/tcp, :::1514-1515->1514-1515/tcp, 0.0.0.0:514->514/udp, :::514->514/udp, 0.0.0.0:55000->55000/tcp, :::55000->55000/tcp, 1516/tcp   wazuh-docker-wazuh-1

На данном этапе доступ к Wazuh возможен через порт 443.

Это используется для демонстрационного развертывания, для производственного развертывания нам нужно сделать несколько настроек для этих контейнеров.

Продакшен развертывание

Для производственного развертывания основой является файл production-cluster.yml.

Но прежде чем запускать контейнеры, нам нужно сделать несколько конфигураций.

Data Persistent.

Создайте постоянные тома для контейнеров:

sudo mkdir /wazuh_logs
cd /wazuh_logs
sudo mkdir ossec-api-configuration
sudo mkdir ossec-etc
sudo mkdir ossec-logs
sudo mkdir ossec-queue
sudo mkdir ossec-var-multigroups
sudo mkdir ossec-integrations
sudo mkdir ossec-active-response
sudo mkdir ossec-agentless
sudo mkdir ossec-wodles
sudo mkdir filebeat-etc
sudo mkdir filebeat-var
sudo mkdir worker-ossec-api-configuration
sudo mkdir worker-ossec-etc
sudo mkdir worker-ossec-logs
sudo mkdir worker-ossec-queue
sudo mkdir worker-ossec-var-multigroups
sudo mkdir worker-ossec-integrations
sudo mkdir worker-ossec-active-response
sudo mkdir worker-ossec-agentless
sudo mkdir worker-ossec-wodles
sudo mkdir worker-filebeat-etc
sudo mkdir worker-filebeat-var
sudo mkdir elastic-data-1
sudo mkdir elastic-data-2
sudo mkdir elastic-data-3

Чтобы иметь возможность сохранять данные на локальной машине, необходимо отредактировать тома в production-cluster.yml в соответствии с созданными выше путями.

cd ~/wazuh-docker/
sudo vim production-cluster.yml

Например, для контейнера Wazuh задайте пути следующим образом:

    volumes:
...
      - /wazuh_logs/ossec-api-configuration:/var/ossec/api/configuration
      - /wazuh_logs/ossec-etc:/var/ossec/etc
      - /wazuh_logs/ossec-logs:/var/ossec/logs
      - /wazuh_logs/ossec-queue:/var/ossec/queue
      - /wazuh_logs/ossec-var-multigroups:/var/ossec/var/multigroups
      - /wazuh_logs/ossec-integrations:/var/ossec/integrations
      - /wazuh_logs/ossec-active-response:/var/ossec/active-response/bin
      - /wazuh_logs/ossec-agentless:/var/ossec/agentless
      - /wazuh_logs/ossec-wodles:/var/ossec/wodles
      - /wazuh_logs/filebeat-etc:/etc/filebeat
      - /wazuh_logs/filebeat-var:/var/lib/filebeat
....

Сделайте это для всех остальных контейнеров, подставив правильное имя тома.

Безопасный трафик.

Необходимо заменить имеющиеся демонстрационные сертификаты для каждой ноды в кластере.

Используйте приведенную ниже команду для получения сертификатов с помощью generate-opendistro-certs.yml

docker-compose -f generate-opendistro-certs.yml run --rm generator

Пример вывода:

[+] Running 15/15
 ⠿ generator Pulled                                                       16.8s
   ⠿ d6ff36c9ec48 Pull complete                                            4.7s
   ⠿ c958d65b3090 Pull complete                                            5.2s
   ⠿ edaf0a6b092f Pull complete                                            5.6s
   ⠿ 80931cf68816 Pull complete                                            8.3s
   ⠿ bf04b6bbed0c Pull complete                                            9.3s
   ⠿ 8bf847804f9e Pull complete                                            9.5s
   ⠿ 6bf89641a7f2 Pull complete                                           13.2s
   ⠿ 040f240573da Pull complete                                           13.4s
   ⠿ ac14183eb55b Pull complete                                           13.8s
   ⠿ debf0fc68082 Pull complete                                           14.1s
   ⠿ 62fb2ae4a19e Pull complete                                           14.3s
   ⠿ d3aeb8473c73 Pull complete                                           14.4s
   ⠿ 939b8ae6540a Pull complete                                           14.6s
   ⠿ f8b27a6da615 Pull complete                                           14.8s
Root certificate and signing certificate have been sucessfully created.

Created 4 node certificates.
Created 1 client certificates.
Success! Exiting.

На этом этапе сертификаты будут сохранены в production_cluster/ssl_certs.

$ ls -al production_cluster/ssl_certs
total 88
drwxr-xr-x 2 thor thor 4096 Mar  5 04:26 .
drwxr-xr-x 7 thor thor 4096 Mar  5 02:56 ..
-rw-r--r-- 1 root root 1704 Mar  5 04:26 admin.key
-rw-r--r-- 1 root root 3022 Mar  5 04:26 admin.pem
-rw-r--r-- 1 thor thor  888 Mar  5 04:26 certs.yml
-rw-r--r-- 1 root root  294 Mar  5 04:26 client-certificates.readme
-rw-r--r-- 1 root root 1158 Mar  5 04:26 filebeat_elasticsearch_config_snippet.yml
-rw-r--r-- 1 root root 1704 Mar  5 04:26 filebeat.key
-rw-r--r-- 1 root root 3067 Mar  5 04:26 filebeat.pem
-rw-r--r-- 1 root root 1801 Mar  5 04:26 intermediate-ca.key
-rw-r--r-- 1 root root 1497 Mar  5 04:26 intermediate-ca.pem
-rw-r--r-- 1 root root 1149 Mar  5 04:26 node1_elasticsearch_config_snippet.yml
-rw-r--r-- 1 root root 1704 Mar  5 04:26 node1.key
-rw-r--r-- 1 root root 3075 Mar  5 04:26 node1.pem
-rw-r--r-- 1 root root 1149 Mar  5 04:26 node2_elasticsearch_config_snippet.yml
-rw-r--r-- 1 root root 1704 Mar  5 04:26 node2.key
-rw-r--r-- 1 root root 3075 Mar  5 04:26 node2.pem
-rw-r--r-- 1 root root 1149 Mar  5 04:26 node3_elasticsearch_config_snippet.yml
-rw-r--r-- 1 root root 1704 Mar  5 04:26 node3.key
-rw-r--r-- 1 root root 3075 Mar  5 04:26 node3.pem
-rw-r--r-- 1 root root 1700 Mar  5 04:26 root-ca.key
-rw-r--r-- 1 root root 1330 Mar  5 04:26 root-ca.pem

Теперь в файле production-cluster.yml установите SSL-сертификаты для:

Контейнера Wazuh

Для контейнера Wazuh-master установите SSL-сертификаты, как показано ниже.

......
    environment:
.....
      - FILEBEAT_SSL_VERIFICATION_MODE=full
      - SSL_CERTIFICATE_AUTHORITIES=/etc/ssl/root-ca.pem
      - SSL_CERTIFICATE=/etc/ssl/filebeat.pem
      - SSL_KEY=/etc/ssl/filebeat.key

    volumes:
      - ./production_cluster/ssl_certs/root-ca.pem:/etc/ssl/root-ca.pem
      - ./production_cluster/ssl_certs/filebeat.pem:/etc/ssl/filebeat.pem
      - ./production_cluster/ssl_certs/filebeat.key:/etc/ssl/filebeat.key
......

Контейнер Elasticsearch

У Elasticsearch 3 ноды, мы настроим каждый из них следующим образом:

  elasticsearch:
....
    volumes:
...
      - ./production_cluster/ssl_certs/root-ca.pem:/usr/share/elasticsearch/config/root-ca.pem
      - ./production_cluster/ssl_certs/node1.key:/usr/share/elasticsearch/config/node1.key
      - ./production_cluster/ssl_certs/node1.pem:/usr/share/elasticsearch/config/node1.pem
      - ./production_cluster/ssl_certs/admin.pem:/usr/share/elasticsearch/config/admin.pem
      - ./production_cluster/ssl_certs/admin.key:/usr/share/elasticsearch/config/admin.key
      - ./production_cluster/elastic_opendistro/elasticsearch-node1.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./production_cluster/elastic_opendistro/internal_users.yml:/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml

Для elasticsearch-2 конфигурация почти аналогична описанной выше.

  elasticsearch-2:
...
    volumes:
      - ./production_cluster/ssl_certs/root-ca.pem:/usr/share/elasticsearch/config/root-ca.pem
      - ./production_cluster/ssl_certs/node2.key:/usr/share/elasticsearch/config/node2.key
      - ./production_cluster/ssl_certs/node2.pem:/usr/share/elasticsearch/config/node2.pem
      - ./production_cluster/elastic_opendistro/elasticsearch-node2.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./production_cluster/elastic_opendistro/internal_users.yml:/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml

В случае elasticsearch-3:

  elasticsearch-3:
...
    volumes:
      - ./production_cluster/ssl_certs/root-ca.pem:/usr/share/elasticsearch/config/root-ca.pem
      - ./production_cluster/ssl_certs/node3.key:/usr/share/elasticsearch/config/node3.key
      - ./production_cluster/ssl_certs/node3.pem:/usr/share/elasticsearch/config/node3.pem
      - ./production_cluster/elastic_opendistro/elasticsearch-node3.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./production_cluster/elastic_opendistro/internal_users.yml:/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml

Контейнер Kibana

Сгенерируйте самоподписанные сертификаты для Kibana с помощью команды:

bash ./production_cluster/kibana_ssl/generate-self-signed-cert.sh

Пример вывода:

Generating a RSA private key
...............................................+++++
.........................................................................................................................................+++++
writing new private key to 'key.pem'
-----

Теперь у вас будут сертификаты для Kibana.

Установите SSL на true и укажите путь к сертификатам.

    environment:
      - SERVER_SSL_ENABLED=true
      - SERVER_SSL_CERTIFICATE=/usr/share/kibana/config/cert.pem
      - SERVER_SSL_KEY=/usr/share/kibana/config/key.pem
...
    volumes:
      - ./production_cluster/kibana_ssl/cert.pem:/usr/share/kibana/config/cert.pem
      - ./production_cluster/kibana_ssl/key.pem:/usr/share/kibana/config/key.pem

Контейнер Nginx

Балансировщик нагрузки Nginx также требует сертификаты по адресу ./production_cluster/nginx/ssl/.

Вы можете сгенерировать самоподписанные сертификаты с помощью команды:

bash ./production_cluster/nginx/ssl/generate-self-signed-cert.sh

Добавьте путь к сертификатам для контейнера:

 

  nginx:
....
    volumes:
      - ./production_cluster/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./production_cluster/nginx/ssl:/etc/nginx/ssl:ro

./production_cluster/nginx/nginx.conf – это файл, содержащий переменные о контейнере Nginx.

Теперь у вас должен быть production-cluster.yml, настроенный с SSL сертификатами, как указано выше.

Остановите и удалите ранее запущенные демонстрационные контейнеры и запустите развертывание Production, как показано ниже:

docker-compose -f production-cluster.yml up -d

Проверьте, запущены ли контейнеры:

$ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED         STATUS              PORTS                                                                                                                                                 NAMES
42d2b8882740   nginx:stable                                 "/docker-entrypoint.…"   2 minutes ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:1514->1514/tcp, :::1514->1514/tcp                                   wazuh-docker-nginx-1
9395abddd27c   wazuh/wazuh-kibana-odfe:4.2.5                "/bin/sh -c ./entryp…"   2 minutes ago   Up 2 minutes        0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                                                             wazuh-docker-kibana-1
53aaa86606b6   amazon/opendistro-for-elasticsearch:1.13.2   "/usr/local/bin/dock…"   2 minutes ago   Up 2 minutes        9300/tcp, 9600/tcp, 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9650/tcp                                                                               wazuh-docker-elasticsearch-1
771a5d5d6aaf   wazuh/wazuh-odfe:4.2.5                       "/init"                  2 minutes ago   Up 2 minutes        1514-1516/tcp, 514/udp, 55000/tcp                                                                                                                     wazuh-docker-wazuh-worker-1
327e32da3e61   wazuh/wazuh-odfe:4.2.5                       "/init"                  2 minutes ago   Up About a minute   1514/tcp, 0.0.0.0:1515->1515/tcp, :::1515->1515/tcp, 0.0.0.0:514->514/udp, :::514->514/udp, 1516/tcp, 0.0.0.0:55000->55000/tcp, :::55000->55000/tcp   wazuh-docker-wazuh-master-1
67da0a98a5a6   amazon/opendistro-for-elasticsearch:1.13.2   "/usr/local/bin/dock…"   2 minutes ago   Up 2 minutes        9200/tcp, 9300/tcp, 9600/tcp, 9650/tcp                                                                                                                wazuh-docker-elasticsearch-3-1
8874fa896370   amazon/opendistro-for-elasticsearch:1.13.2   "/usr/local/bin/dock…"   2 minutes ago   Up 2 minutes        9200/tcp, 9300/tcp, 9600/tcp, 9650/tcp                                                                                                                wazuh-docker-elasticsearch-2-1

Теперь у нас запущены все 7 контейнеров, а веб-сервис открыт с помощью контейнера Nginx.

Шаг 4 – Доступ к интерфейсу Wazuh Kibana

Доступ к интерфейсу Kibana можно получить через порт 443, открытый Nginx.

Если у вас включен брандмауэр, пропустите этот порт через него.

##В случае Firewalld
sudo firewall-cmd --add-port=443/tcp --permanent
sudo firewall-cmd --reload

##В случае UFW
sudo ufw allow 443/tcp

Теперь зайдите в веб-интерфейс Kibana, используя URL браузер.

Войдите в систему, используя установленные учетные данные для Elasticseach

ELASTICSEARCH_USERNAME=admin
ELASTICSEARCH_PASSWORD=SecretPassword

Теперь сервер Wazuh настроен для мониторинга и анализа в режиме реального времени.

Это поможет вам вовремя обнаружить угрозы и своевременно принять меры.

Добавить комментарий