Wazuh через Ansible - автоматизация развертывания

Ansible позволяет автоматизировать установку и настройку всех компонентов Wazuh 4.14 на произвольном количестве хостов. Официальный репозиторий wazuh-ansible содержит роли для индексатора, сервера, дашборда и агентов с поддержкой как одноузловой, так и многоузловой архитектуры.

Предварительные требования

Управляющий хост (Ansible controller)

  • Ansible 2.12 или выше
  • Python 3.9+
  • SSH-доступ к целевым хостам
  • Привилегии sudo на целевых хостах

Проверка версии Ansible:

ansible --version

Целевые хосты

Установка коллекции

Установите официальные роли Wazuh через Ansible Galaxy:

ansible-galaxy collection install wazuh.wazuh

Или клонируйте репозиторий:

git clone https://github.com/wazuh/wazuh-ansible.git -b v4.14.3
cd wazuh-ansible

Структура ролей

Коллекция wazuh.wazuh содержит следующие роли:

РольНазначение
wazuh.wazuh.wazuh_indexerУстановка и настройка Wazuh Indexer (OpenSearch)
wazuh.wazuh.wazuh_managerУстановка и настройка Wazuh Manager
wazuh.wazuh.wazuh_dashboardУстановка и настройка Wazuh Dashboard
wazuh.wazuh.wazuh_agentУстановка и настройка Wazuh Agent

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

Inventory

Одноузловая конфигурация

Файл inventory/single-node.yml:

all:
  children:
    wazuh_indexer:
      hosts:
        wazuh-node1:
          ansible_host: 192.168.1.10
          ansible_user: deploy
          ansible_become: true
          indexer_node_name: wazuh-indexer-1

    wazuh_manager:
      hosts:
        wazuh-node1:
          manager_type: master

    wazuh_dashboard:
      hosts:
        wazuh-node1:

    wazuh_agent:
      hosts:
        web-server-1:
          ansible_host: 192.168.1.20
          ansible_user: deploy
          ansible_become: true
        db-server-1:
          ansible_host: 192.168.1.21
          ansible_user: deploy
          ansible_become: true

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

Файл inventory/multi-node.yml:

all:
  children:
    wazuh_indexer:
      hosts:
        indexer-1:
          ansible_host: 192.168.1.10
          indexer_node_name: wazuh-indexer-1
        indexer-2:
          ansible_host: 192.168.1.11
          indexer_node_name: wazuh-indexer-2
        indexer-3:
          ansible_host: 192.168.1.12
          indexer_node_name: wazuh-indexer-3
      vars:
        ansible_user: deploy
        ansible_become: true

    wazuh_manager:
      hosts:
        manager-master:
          ansible_host: 192.168.1.20
          manager_type: master
        manager-worker:
          ansible_host: 192.168.1.21
          manager_type: worker
      vars:
        ansible_user: deploy
        ansible_become: true

    wazuh_dashboard:
      hosts:
        dashboard-1:
          ansible_host: 192.168.1.30
      vars:
        ansible_user: deploy
        ansible_become: true

    wazuh_agent:
      hosts:
        app-server-[1:10]:
          ansible_user: deploy
          ansible_become: true

Playbook для одноузловой установки

Файл playbooks/wazuh-single-node.yml:

- name: Install Wazuh Indexer
  hosts: wazuh_indexer
  roles:
    - role: wazuh.wazuh.wazuh_indexer
      vars:
        indexer_cluster_name: wazuh-cluster
        indexer_node_master: true
        indexer_node_data: true
        indexer_network_host: "0.0.0.0"
        indexer_admin_password: "ChangeMe!SecureP@ss1"

- name: Install Wazuh Manager
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_config:
          cluster:
            disabled: true
          api:
            bind_addr: "0.0.0.0"

- name: Install Wazuh Dashboard
  hosts: wazuh_dashboard
  roles:
    - role: wazuh.wazuh.wazuh_dashboard
      vars:
        dashboard_server_host: "0.0.0.0"
        dashboard_server_port: 443
        indexer_url: "https://{{ hostvars[groups['wazuh_indexer'][0]]['ansible_host'] }}:9200"

Запуск playbook:

ansible-playbook -i inventory/single-node.yml playbooks/wazuh-single-node.yml

Playbook для многоузловой установки

Файл playbooks/wazuh-multi-node.yml:

- name: Install Wazuh Indexer cluster
  hosts: wazuh_indexer
  roles:
    - role: wazuh.wazuh.wazuh_indexer
      vars:
        indexer_cluster_name: wazuh-cluster
        indexer_cluster_initial_master_nodes:
          - wazuh-indexer-1
          - wazuh-indexer-2
          - wazuh-indexer-3
        indexer_discovery_seed_hosts:
          - "{{ hostvars['indexer-1']['ansible_host'] }}"
          - "{{ hostvars['indexer-2']['ansible_host'] }}"
          - "{{ hostvars['indexer-3']['ansible_host'] }}"
        indexer_admin_password: "ChangeMe!SecureP@ss1"

- name: Install Wazuh Manager cluster
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_config:
          cluster:
            disabled: false
            name: wazuh-manager-cluster
            node_name: "{{ inventory_hostname }}"
            node_type: "{{ manager_type }}"
            key: "ChangeThisClusterKey123"
            nodes:
              - "{{ hostvars['manager-master']['ansible_host'] }}"
            port: 1516
            bind_addr: "0.0.0.0"
            hidden: false

- name: Install Wazuh Dashboard
  hosts: wazuh_dashboard
  roles:
    - role: wazuh.wazuh.wazuh_dashboard
      vars:
        dashboard_server_host: "0.0.0.0"
        indexer_url: "https://{{ hostvars[groups['wazuh_indexer'][0]]['ansible_host'] }}:9200"

- name: Install Wazuh Agents
  hosts: wazuh_agent
  roles:
    - role: wazuh.wazuh.wazuh_agent
      vars:
        wazuh_manager_address: "{{ hostvars['manager-master']['ansible_host'] }}"
        wazuh_agent_group: "default"

Запуск:

ansible-playbook -i inventory/multi-node.yml playbooks/wazuh-multi-node.yml

Справочник переменных

Переменные индексатора

ПеременнаяОписаниеЗначение по умолчанию
indexer_cluster_nameИмя кластераwazuh-cluster
indexer_node_nameИмя узлаwazuh-indexer-1
indexer_node_masterРоль mastertrue
indexer_node_dataРоль datatrue
indexer_network_hostАдрес привязки0.0.0.0
indexer_http_portHTTP-порт9200
indexer_transport_portTransport-порт9300
indexer_admin_passwordПароль adminSecretPassword
indexer_jvm_xmsJVM Heap min1g
indexer_jvm_xmxJVM Heap max1g

Переменные менеджера

ПеременнаяОписаниеЗначение по умолчанию
wazuh_manager_config.cluster.disabledОтключить кластерtrue
wazuh_manager_config.cluster.nameИмя кластераwazuh
wazuh_manager_config.cluster.node_typeТип узла (master/worker)master
wazuh_manager_config.cluster.keyКлюч кластера-
wazuh_manager_config.api.bind_addrАдрес привязки API0.0.0.0
wazuh_manager_config.api.portПорт API55000
wazuh_manager_authd.enabledВключить authdtrue
wazuh_manager_authd.use_passwordПароль регистрацииfalse

Переменные агента

ПеременнаяОписаниеЗначение по умолчанию
wazuh_manager_addressIP/DNS менеджера-
wazuh_agent_groupГруппа агентаdefault
wazuh_agent_nameИмя агента{{ inventory_hostname }}
wazuh_agent_enrollment.enabledАвторегистрацияtrue
wazuh_agent_enrollment.auth_passПароль регистрации-

Регистрация агентов через Ansible

Массовое развертывание агентов

Для развертывания агентов на группу хостов создайте отдельный playbook:

- name: Deploy Wazuh agents
  hosts: wazuh_agent
  roles:
    - role: wazuh.wazuh.wazuh_agent
      vars:
        wazuh_manager_address: 192.168.1.20
        wazuh_agent_group: "{{ group_names | join(',') }}"
        wazuh_agent_enrollment:
          enabled: true
          auth_pass: "AgentEnrollmentPassword"

Регистрация с авторизацией по паролю

На менеджере активируйте авторизацию агентов по паролю:

- name: Configure manager for password-based enrollment
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_authd:
          enabled: true
          use_password: true
          password: "AgentEnrollmentPassword"

Проверка регистрации

ansible wazuh_manager -i inventory/multi-node.yml -m shell \
  -a "/var/ossec/bin/agent_control -l"

Пользовательская конфигурация

Добавление пользовательских правил

- name: Deploy custom rules
  hosts: wazuh_manager
  tasks:
    - name: Copy custom rules
      copy:
        src: files/local_rules.xml
        dest: /var/ossec/etc/rules/local_rules.xml
        owner: wazuh
        group: wazuh
        mode: "0640"
      notify: restart wazuh-manager

  handlers:
    - name: restart wazuh-manager
      service:
        name: wazuh-manager
        state: restarted

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

- name: Configure Slack integration
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_config:
          integration:
            - name: slack
              hook_url: "https://hooks.slack.com/services/xxx/yyy/zzz"
              level: 10
              alert_format: json

Решение проблем

Ошибка подключения SSH

Симптомы: Ansible не может подключиться к целевому хосту.

Решение:

  1. Проверьте SSH-доступ вручную:
ssh deploy@192.168.1.10
  1. Убедитесь, что SSH-ключ добавлен в authorized_keys на целевом хосте

  2. Проверьте конфигурацию в ansible.cfg:

[defaults]
host_key_checking = False
timeout = 30

Ошибка установки пакетов

Симптомы: роль завершается с ошибкой при установке пакетов Wazuh.

Решение:

  1. Проверьте доступность репозитория Wazuh с целевого хоста:
curl -s https://packages.wazuh.com/4.x/apt/ | head -5
  1. Убедитесь, что GPG-ключ репозитория установлен

  2. Для изолированных сетей настройте офлайн-репозиторий

Кластер индексатора не формируется

Симптомы: узлы индексатора запускаются, но не объединяются в кластер.

Решение:

  1. Проверьте корректность indexer_discovery_seed_hosts - должны быть указаны IP-адреса всех узлов

  2. Убедитесь, что порт 9300 открыт между узлами

  3. Проверьте, что indexer_cluster_initial_master_nodes содержит имена всех узлов

Агент не регистрируется

Симптомы: агент установлен, но не отображается в списке.

Решение:

  1. Проверьте доступность менеджера с хоста агента:
telnet 192.168.1.20 1515
  1. Если используется авторизация по паролю, убедитесь, что пароли совпадают на менеджере и агенте

  2. Проверьте логи агента:

tail -50 /var/ossec/logs/ossec.log

Дополнительные материалы

Last updated on