Полный гайд: OCS Inventory + GLPI + Wazuh/OpenSearch + Git+Ansible
Важно:
- С версии 4.3 Wazuh официально перешёл с Elasticsearch на OpenSearch. В гайде используется поддерживаемый стек Wazuh 4.8+ (Indexer = OpenSearch 2.x). Если вы обязаны использовать Elastic 7/8, потребуется кастомная интеграция через Logstash/Beats, которая не поддерживается Wazuh официально.
Архитектура и потоки данных
[Git] ←→ [Ansible] → развертывает и конфигурирует:
├─ OCS Inventory Server ←(агенты)→ endpoints
├─ GLPI (CMDB/Helpdesk) ←(плагин OCSNG)→ синхронизация активов
└─ Wazuh Manager + OpenSearch + Dashboard ←(агенты/логи)→ аудит/SIEM
└─ (через API/скрипты) → GLPI: авто-тикеты на критические события
Рекомендуемая минимальная инфраструктура (prod):
| Роль | CPU | RAM | Disk | OS |
|---|---|---|---|---|
| DB (MariaDB) | 2 | 4 GB | 50 GB SSD | Ubuntu 22.04/24.04 |
| App (OCS+GLPI+PHP) | 2 | 4 GB | 40 GB | Ubuntu 22.04/24.04 |
| SIEM (Wazuh+OpenSearch) | 4 | 8–16 GB | 200 GB NVMe | Ubuntu 22.04/24.04 |
| CI/Git/Ansible | 1 | 2 GB | 20 GB | Ubuntu 22.04/24.04 |
0. Подготовка: Git + Ansible (фундамент автоматизации)
0.1. Структура репозитория
mkdir -p it-infra-stack/{roles,playbooks,group_vars,host_vars,templates,secrets}
cd it-infra-stack
git init
echo -e "*.pyc\n*.swp\nsecrets/*\n!secrets/.gitkeep\nroles/.DS_Store" > .gitignore
0.2. Установка Ansible и базовые настройки
sudo apt update && sudo apt install -y ansible git python3-pip
pip3 install --user ansible-lint yamllint molecule
ansible-galaxy collection install community.general community.mysql community.docker
0.3. Базовый ansible.cfg
[defaults]
inventory = ./inventory
roles_path = ./roles
vault_password_file = ~/.ansible-vault-pass
remote_user = deploy
host_key_checking = False
pipelining = True
[privilege_escalation]
become = True
become_method = sudo
become_user = root
0.4. Инвентарь (inventory/hosts.ini)
[db]
db1 ansible_host=10.0.1.10
[app]
app1 ansible_host=10.0.1.20
[siem]
siem1 ansible_host=10.0.1.30
[all:vars]
ansible_python_interpreter=/usr/bin/python3
ntp_servers=pool.ntp.org
Секреты:
- Храните пароли БД, API-токены, SSL-ключи в
ansible-vault. Никогда не коммитьте открытые секреты.
1. OCS Inventory NG (инвентаризация железа/ПО)
1.1. Установка (Ubuntu/Debian)
# roles/ocs_inventory/tasks/main.yml
- name: Установить зависимости
apt:
name:
- apache2
- mariadb-server
- libapache2-mod-php
- php8.1 php8.1-mysql php8.1-xml php8.1-mbstring php8.1-curl php8.1-zip php8.1-gd php8.1-intl
- make
- perl
state: present
- name: Включить модули Apache
apache2_module:
name: "{{ item }}"
state: present
loop: [rewrite, ssl]
- name: Скачать и распаковать OCS Server
unarchive:
src: https://github.com/OCSInventory-NG/OCSInventory-ocsreports/releases/download/2.12.1/OCSNG_UNIX_SERVER-2.12.1.tar.gz
dest: /opt/
remote_src: yes
- name: Запустить установщик OCS
shell: >
./setup.sh --noweb --noworker --nowizard --dbhost=127.0.0.1 --dbport=3306 --dbname=ocsweb --dbuser=ocs --dbpass={{ ocs_db_pass }} --adminpass={{ ocs_admin_pass }}
args:
chdir: /opt/OCSNG_UNIX_SERVER-2.12.1
register: ocs_setup
changed_when: ocs_setup.rc == 0
1.2. Настройка Apache и HTTPS
# /etc/apache2/sites-available/ocs-inventory.conf
<VirtualHost *:443>
ServerName ocs.yourdomain.local
DocumentRoot /usr/share/ocsinventory-reports/ocsreports
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ocs.crt
SSLCertificateKeyFile /etc/ssl/private/ocs.key
<Directory /usr/share/ocsinventory-reports/ocsreports>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/ocs-error.log
CustomLog ${APACHE_LOG_DIR}/ocs-access.log combined
</VirtualHost>
a2ensite ocs-inventory && systemctl restart apache2
1.3. Развёртывание агентов
- Windows:
OCS-NG-Windows-Agent-Setup.exe /S /SERVER=https://ocs.yourdomain.local/ocsinventory /INSTALL_DIR="C:\Program Files\OCS Inventory Agent"
- Linux:
`apt install ocsinventory-agent` + `/etc/ocsinventory/ocsinventory-agent.cfg` → `server = https://ocs.yourdomain.local/ocsinventory`
- macOS:
`.pkg` из официального сайта или Homebrew tap
Проверка:
curl -k https://ocs.yourdomain.local/ocsinventory→ HTTP 200 + XML-ответ.
2. GLPI (CMDB + тикетирование)
2.1. Установка GLPI 10.1+
# roles/glpi/tasks/main.yml
- name: Установить GLPI
unarchive:
src: https://github.com/glpi-project/glpi/releases/download/10.1.5/glpi-10.1.5.tgz
dest: /var/www/
remote_src: yes
- name: Настроить права
file:
path: /var/www/glpi
owner: www-data
group: www-data
recurse: yes
mode: '0755'
- name: Конфиг Apache для GLPI
template:
src: glpi.conf.j2
dest: /etc/apache2/sites-available/glpi.conf
notify: restart apache2
2.2. Плагин OCS Inventory NG для GLPI
- В GLPI:
Настройка → Общие → Режим разработчика → Включить. Marketplace→ поискOCS Inventory NG→ Install.Настройка → Плагины → OCSNG→ указать URL OCS API, логин/пароль БД OCS.Синхронизация→ выбрать правила маппинга (Computer → Asset, Software → Licenses и т.д.).
Автосинхронизация:
`crontab -u www-data -e` → `*/30 * * * * /usr/bin/php /var/www/glpi/front/cron.php --force ocsng`
2.3. Интеграция с AD/LDAP (опционально)
Настройка → Аутентификация → LDAP каталоги→ настроить base DN, bind DN, фильтр(&(objectClass=user)(sAMAccountName=*)).
3. Wazuh + OpenSearch (логи, аудит, SIEM)
Важно:
- Wazuh 4.8+ не поддерживает Elasticsearch. Используется OpenSearch 2.x из официального репозитория Wazuh.
3.1. Установка через официальный скрипт (рекомендуется)
curl -sO https://packages.wazuh.com/4.8/wazuh-install.sh
chmod +x wazuh-install.sh
./wazuh-install.sh -a siem1.yourdomain.local --generate-config-files
Скрипт развернёт:
wazuh-indexer(OpenSearch)wazuh-server(Manager)wazuh-dashboard(Kibana-аналог)
3.2. Ручная настройка через Ansible (для prod)
# roles/wazuh/tasks/main.yml
- name: Добавить репозиторий Wazuh
apt_key:
url: https://packages.wazuh.com/key/GPG-KEY-WAZUH
state: present
- name: Установить компоненты
apt:
name: [wazuh-indexer, wazuh-server, wazuh-dashboard]
state: present
- name: Запустить и включить службы
systemd:
name: "{{ item }}"
state: started
enabled: yes
loop: [wazuh-indexer, wazuh-server, wazuh-dashboard]
3.3. Регистрация агентов
# На сервере
/var/ossec/bin/manage_agents -a 10.0.2.50 -n workstation-01 -i 192.168.1.0/24
/var/ossec/bin/manage_agents -e <agent_id> # получить ключ
<!-- /var/ossec/etc/ossec.conf на агенте -->
<client>
<server-address>siem1.yourdomain.local</server-address>
<server-port>1514</server-port>
<config-profile>debian, ubuntu, ubuntu22</config-profile>
<auto_restart>true</auto_restart>
<crypto_method>aes</crypto_method>
</client>
3.4. Базовые правила и аудит
- Включить модули:
ossec.conf→<localfile>для/var/log/auth.log,/var/log/syslog, Windows Security/EventLog. - FIM (File Integrity Monitoring):
<syscheck>→ мониторинг/etc,/bin, реестра Windows. - Compliance: PCI-DSS, CIS, GDPR включаются в
wazuh-rules.xml.
4. Интеграции и автоматизация
4.1. Wazuh → GLPI: авто-тикеты на критические события
Создайте active-response скрипт /var/ossec/active-response/bin/glpi_ticket.sh:
#!/bin/bash
LOG_ENTRY=$(cat /dev/stdin)
ALERT_LEVEL=$(echo "$LOG_ENTRY" | jq -r '.alert.level')
RULE_DESC=$(echo "$LOG_ENTRY" | jq -r '.rule.description')
if [ "$ALERT_LEVEL" -ge 10 ]; then
GLPI_URL="https://glpi.yourdomain.local/apirest.php/Ticket/"
APP_TOKEN="ваш_app_token"
USER_TOKEN="ваш_user_token"
curl -s -X POST "$GLPI_URL" \
-H "Content-Type: application/json" \
-H "App-Token: $APP_TOKEN" \
-H "Authorization: user_token $USER_TOKEN" \
-d "{\"input\": {\"name\": \"[WAZUH] $RULE_DESC\", \"content\": \"$LOG_ENTRY\", \"status\": 1, \"urgency\": 3}}"
fi
Настройте в ossec.conf:
<command>
<name>glpi-ticket</name>
<executable>glpi_ticket.sh</executable>
<expect>alert</expect>
</command>
<active-response>
<command>glpi-ticket</command>
<level>10</level>
</active-response>
4.2. OCS → GLPI: маппинг активов
- В плагине OCSNG настройте
Automatic inventory→Import→Computer,Monitor,Software. - Настройте
Entityв GLPI для разделения по филиалам/отделам. - Используйте
Business Rulesдля авто-присвоения ответственных, SLA, категорий.
4.3. Ansible: идемпотентность и тестирование
# Проверка синтаксиса
ansible-lint playbooks/deploy.yml
# Dry-run
ansible-playbook playbooks/deploy.yml --check --diff
# Тест роли через Molecule
cd roles/ocs_inventory && molecule test
5. Безопасность, бэкапы, эксплуатация
5.1. Харденинг
- Firewall:
ufw allow 443/tcp && ufw allow 1514/udp,1515/tcp && ufw enable - PHP:
php.ini→memory_limit = 512M,upload_max_filesize = 100M,max_execution_time = 300 - БД:
mysql_secure_installation, отдельный пользователь на каждую БД,bind-address = 127.0.0.1 - TLS: Let's Encrypt (
certbot), HSTS, отключение TLS 1.0/1.1 - SELinux/AppArmor:
setsebool -P httpd_can_network_connect on(RHEL),aa-complain /etc/apparmor.d/*(Ubuntu)
5.2. Бэкапы
- name: Бэкап MariaDB
community.mysql.mysql_db:
name: ["glpi", "ocsweb"]
state: dump
target: "/backup/db_{{ ansible_date_time.date }}.sql.gz"
login_user: root
login_password: "{{ db_root_pass }}"
- name: Бэкап конфигов и Git
archive:
path: ["/etc/apache2", "/var/www/glpi/config", "/etc/ocsinventory", "/etc/wazuh"]
dest: "/backup/configs_{{ ansible_date_time.date }}.tar.gz"
- OpenSearch:
snapshot→ S3/NFS. Настроитьwazuh-indexer.yml→path.repo: ["/mnt/snapshots"] - Git:
git push --all origin+git tag v$(date +%Y%m%d)
5.3. Мониторинг здоровья
- OCS:
/usr/share/ocsinventory-reports/ocsreports/cron/cronall.sh - GLPI:
php /var/www/glpi/front/cron.php --force all - Wazuh:
systemctl status wazuh-manager,cluster_control -l, логи в/var/ossec/logs/ - OpenSearch:
_cluster/health?pretty,_cat/indices?v
Чек-лист запуска в production
| Этап | Проверка |
|---|---|
| SSL/TLS | Валидные сертификаты, HSTS, отключены слабые cipher'ы |
| Доступность | OCS, GLPI, Dashboard доступны по HTTPS, порты закрыты снаружи |
| Инвентарь | 10+ агентов зарегистрированы, данные синхронизированы в GLPI |
| Тикеты | Тестовое правило Wazuh → авто-тикет в GLPI создан |
| Бэкапы | Автоматические дампы БД, снапшоты OpenSearch, push в Git |
| Ansible | --check проходит без ошибок, роли идемпотентны |
| Ресурсы | CPU < 70%, RAM < 80%, диск > 30% свободно, ротация логов включена |
Совет:
- Разворачивайте сначала в staging, прогоните
molecule-тесты, настройте мониторинг ресурсов, и только затем мигрируйте в prod. Все конфиги должны храниться в Git, секреты — в Vault, развёртывание — только через Ansible.
Удачной автоматизации!