Сегодня, с ростом числа сложных киберугроз, существует высокая потребность в мониторинге и анализе систем в режиме реального времени для своевременного обнаружения угроз и принятия соответствующих мер.
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 настроен для мониторинга и анализа в режиме реального времени.
Это поможет вам вовремя обнаружить угрозы и своевременно принять меры.