вторник, 15 августа 2023 г.

Обновление триггеров ZABBIX через импорт шаблонов

В Zabbix есть удобный инструмент обновления шаблонов через "Импорт", когда сначала подготавливается XML файл, а потом XML файл с данными загружается на сервер.

Импорт выполняется через меню «Настройки» —> «Шаблоны», кнопка «Импорт».

При загрузке XML файла, если изменились данные триггера, то будет создан новый триггер рядом со старым. Что бы этого этого избежать, после выбора загружаемого файла выставить галочку «Удалить отсутствующие - триггер»:


После нажатия кнопки «Импорт» будет предупреждение, где нужно нажать «Да»


После этого в Zabbix произойдет добавление новых триггеров и удаление старых.

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

понедельник, 8 мая 2023 г.

Graylog4 + Elasticsearsh7 + MongoDB. Установка в RockyLinux 9.

Graylog - программное обеспечение для сбора, агрегации и последующего анализа логов с оборудования и серверов.
Graylog работает, опираясь на Elasticsearch и MongoDB
Обобщенная схема взаимодействия компонентов представлена на рисунке:



Различные версии Graylog опираются на разные версии Elasticsearch.
Установим graylog4, который работает с версией elasticsearch 7.x

Для начала обновляемся и устанавливаем JAVA
# yum update
# dnf upgrade --refresh
# yum install java-17-openjdk java-17-openjdk-devel
# yum install pwgen


Создаем пользователя, под которым будет работать демон elasticsearch:
# useradd -M -r -s /bin/false elasticsearch

Для корректной работы Elasticsearch в Linux необходимо снять ограничения при открытии файлов для пользователя elasticsearch. Для этого вносим настройки в файл /etc/security/limits.conf.
# nano /etc/security/limits.conf
В конце файла прописываем:
* soft nofile 65536
* hard nofile 131072
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096

Так как Elasticsearch очень требователен к ресурсам рекомендуется отключить использование файла подкачки:
# swapoff -a
Для увеличения быстродействия Elasticsearch так же рекомендуется увеличить количество адресов виртуальной памяти:
# nano /etc/sysctl.conf
vm.max_map_count = 262144
Проверка изменений:
# sysctl -p

Установим 7ую версию elasticsearch в директорию /usr/local/elasticsearch7.
# mkdir /usr/local/elasticsearch7
Установить через репозитарий сервис elasticsearch в России не получиться, так ка российские IP адреса заблокированы. См https://www.elastic.co/blog/elastic-stands-with-ukraine.
Легче всего через VPN скачать архив tar.gz исходных кодов стабильного релиза 7.17 и поместить архив в директорию /usr/local/elasticsearch7
# cd /usr/local/elasticsearch7
Распаковываем и назначаем права доступа:
# tar -xvf elasticsearch-7.17.9-linux-x86_64.tar.gz
# cd elasticsearch-7.17.9/
# chown -R elasticsearch:elasticsearch /usr/local/elasticsearch7

Создаем директории, которые Elasticsearch будет использовать в работе. Опция -p нужна что бы создать сразу несколько вложенных каталогов, а не создавать отдельно каталог /data, потом вложенный в него каталог /data/elasticsearch и т.д.
# mkdir -p /data/elasticsearch7/data
# mkdir -p /data/elasticsearch7/logs
# mkdir -p /data/elasticsearch7/pid
# chown -R elasticsearch:elasticsearch /data/elasticsearch7

Теперь следует внести правки в файл конфигурации Elasticsearch
# nano /usr/local/elasticsearch7/elasticsearch-7.17.9/config/elasticsearch.yml
cluster.name: graylog (в секции Cluster)
node.name: node-1 (в секции Node)
path.data: /data/elasticsearch7/data (в секции Paths)
path.logs: /data/elasticsearch7/logs (в секции Paths)
bootstrap.memory_lock: true (в секции Memory)
network.host: 0.0.0.0 (в секции Network)
discovery.seed_hosts: ["127.0.0.1"] (в секции Discovery)
cluster.initial_master_nodes: ["node-1"] (в секции Discovery)
action.auto_create_index: false (В секции Various добавить этот параметр)

Пробуем первый запуск в режиме демона:
# sudo -u elasticsearch /usr/local/elasticsearch7/elasticsearch-7.17.9/bin/elasticsearch -d -p /data/elasticsearch7/pid/elasticsearch.pid
После запуска ошибок быть не должно.
Проверка работы сервиса:
# ps ax | grep elastic
Мы должны увидеть два запущенных процесса - основной процесс и процесс координатора.
Проверяем открытые порты:
# ss -ntlp | grep java
Должны увидеть два открытых порта - 9200 и 9300
Собственно демон elasticsearch, отвечающий за поиск и индексацию работает на порту 9200. Дополнительный демон-координатор для обмена данными между несколькими экземплярами elasticsearch в кластере работает на порту 9300.
Для остановки сервиса, который запустили вручную нужно убить основной процесс.
# kill <НОМЕР_ПРОЦЕССА>

Создаем юнит systemd для запуска и остановки демона Elasticsearch:
# nano /etc/systemd/system/elasticsearch.service
Содержимое файла
[Unit]
Description=Elasticsearch
Wants=network-online.target
After=network-online.target
[Service]
Type=forking
PIDFile=/data/elasticsearch7/pid/elasticsearch.pid
PrivateTmp=true
User=elasticsearch
Group=elasticsearch
ExecStart=/usr/local/elasticsearch7/elasticsearch-7.17.9/bin/elasticsearch -d -p /data/elasticsearch7/pid/elasticsearch.pid
StandardOutput=journal
StandardError=inherit
LimitNOFILE=65535
LimitNPROC=4096
LimitAS=infinity
LimitFSIZE=infinity
TimeoutStopSec=0
KillSignal=SIGTERM
KillMode=process
SendSIGKILL=no
SuccessExitStatus=143
TimeoutStartSec=900
LimitMEMLOCK=infinity
[Install]
WantedBy=multi-user.target

Затем стартуем сервис:
# systemctl daemon-reload
# systemctl start elasticsearch.service
# systemctl enable elasticsearch.service

Проверка работы:
# systemctl status elasticsearch.service
Теперь проверяем работу интерфейса пользователя:
# curl http://localhost:9200
{
  "name" : "node-1",
  "cluster_name" : "graylog",
  "cluster_uuid" : "2GW5T0y_TFe_2FxV2rM2dA",
  "version" : {
    "number" : "7.17.9",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "ef48222227ee6b9e70e502f0f0daa52435ee634d",
    "build_date" : "2023-01-31T05:34:43.305517834Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}


Для работы Graylog кроме Elasticsearch необходима база данных MongoDB.
Добавляем репозитарий MongoDB
# nano /etc/yum.repos.d/mongodb-org-6.0.repo
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc

Устанавливаем:
# dnf install mongodb-org
# systemctl start mongod
# systemctl enable mongod

Файл конфигурации сервера MongoDB расположен тут:  /etc/mongod.conf

Наконец-то устанавливаем Graylog. Но тут ждет сюрприз несовместимости Graylog и Rocky Linux 9. Дело в том, что программное обеспечение Graylog подписывается с помощью ключа типа SHA-1.
Это неприемлемо в Rocky Linux 9.
Для решения проблемы временно изменяем политики безопасности для возможности принимать ключ SHA-1 в системе.
# update-crypto-policies --set LEGACY
Требуется перезагрузка:
# shutdown -r now
После перезагрузки устанавливаем Graylog4:
# rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-4.2-repository_latest.rpm
# yum install graylog-server

И если процесс прошел без ошибок, радуемся и возвращаем политики по умолчанию:
# update-crypto-policies --set DEFAULT
Снова перезагружаемся:
# shutdown -r now

Далее Graylog необходимо сгенерировать сложные пароли для прописывания их в переменные password_secret и root_password_sha2 конфигурационного файла /etc/graylog/server/server.conf.
Сгенерируем и сохраним пароль из 96 символов:
# pwgen -N 1 -s 96
G0xgdQkMmtubJTNDd6rk8Mk74sbIoFiUxqYQzgyqidVKmx62IhkrMT5vl7Sh6hr0kyZNmWQ3nuY3cixIbGOniQjyBQJQqo14

Этот пароль должен быть одинаковый для всех кластеров Graylog. С помощью этого ключа буду защищаться все зашифрованные данные пользователей системы Graylog.
Сгенерим и сохраним хеш пароля для суперпользователя системы Graylog.
Имя суперпользователя Graylog по умолчанию - admin.
Этот пароль для суперпользователя admin жестко прописывается в конфигурации, изменить его через web-интерфейс нельзя.
# echo -n <МОЙ ПАРОЛЬ> | sha256sum
103a5db5fea66183590df6fc7965d7a9dc2c141e4426d44298867a2d7feb015c  -

Прописываем пароли в конфигурационный файл и определяем интерфейсы, на которых будет работать Graylog
# nano /etc/graylog/server/server.conf
password_secret = G0xgdQkMmtubJT......niQjyBQJQqo14
root_password_sha2 = 103a5db5fea6......7feb019c
root_timezone = Europe/Moscow
http_bind_address = 0.0.0.0:9000
elasticsearch_hosts = http://localhost:9200

elasticsearch_shards=1

Запускам сервис
# systemctl daemon-reload
# systemctl start graylog-server.service
# systemctl enable graylog-server.service

Проверка работы сервиса:
# systemctl status graylog-server.service
Проверка прослушивания порта 9000, на котором работает интерфейс Graylog4:
# ss -tunelp | grep 9000

В Firewalld необходимо открыть порт 9000 для доступа к этому порту извне.
# firewall-cmd --permanent --add-port=9000/tcp
# firewall-cmd --reload


Доступ к web-интерфейсу Graylog4: http://<IPадрес>:9000/ (например, http://10.10.49.166:9000/)



Пользователь по умолчанию - admin
Пароль - <МОЙ ПАРОЛЬ>, тот что зашифровывали ранее.
Мы должны увидеть web-интерфейс сервиса graylog4. В моем случае он выглядел так:


На этом установка завершена.
Обратившись к обзорной страницы System ->Overview мы попадаем на страницу описывающую состояние сервиса Graylog. Первое уведомление сообщает нам, что в системе не настроены источники приема данных. Это действительно так. Их нужно настраивать, но это уже совсем другая история.



воскресенье, 7 мая 2023 г.

Установка свежей версии Elasticsearch в Rocky Linux 9.

Обновляемся и устанавливаем JAVA
# yum update
# dnf upgrade --refresh
# yum install java-17-openjdk java-17-openjdk-devel


Скачиваем архив со свежей версией Elasticsearch со страницы https://github.com/elastic/elasticsearch/ (Code-->Download ZIP). На текущий момент – это 8.8.0.
# cd /usr/src/
# wget https://github.com/elastic/elasticsearch/archive/refs/heads/main.zip

Распаковываем скаченный архив
# unzip main.zip
В текущей директории должен появиться каталог elasticsearch-main.
Перемещаем скаченные исходные коды на постоянное место, характерное для нового ПО:
# mkdir /usr/local/elasticsearch
# cp -r elasticsearch-main/* /usr/local/elasticsearch

Удаляем исходные коды:
# rm -f main.zip
# rm -fR elasticsearch-main

Переходим в директорию с нашими кодами:
# cd /usr/local/elasticsearch
Производим сборку проекта для нашего дистрибутива. Это может занять до 15 минут.
# ./gradlew localDistro
Собранный дистрибутив Elasticsearch будет в директории /usr/local/elasticsearch/build/distribution/local/elasticsearch-8.8.0-SNAPSHOT
Запускаемый файл будет тут: bin/elasticsearch
Файл конфигурации будет тут: config/elasticsearch.yml
Для удобства оперирования путями создаем символьную ссылку:
# ln -s /usr/local/elasticsearch/build/distribution/local/elasticsearch-8.8.0-SNAPSHOT /usr/local/elasticsearch/distr

Создаем пользователя, под которым будет работать демон elasticsearch:
# useradd -M -r -s /bin/false elasticsearch
# chown -R elasticsearch:elasticsearch /usr/local/elasticsearch

Создаем директории, которые Elasticsearch будет использовать в работе. Опция -p нужна что бы создать сразу несколько вложенных каталогов, а не создавать отдельно каталог /data, потом вложенный в него каталог /data/elasticsearch и т.д.
# mkdir -p /data/elasticsearch/data
# mkdir -p /data/elasticsearch/logs
# mkdir -p /data/elasticsearch/pid
# chown -R elasticsearch:elasticsearch /data/elasticsearch

Теперь необходимо выполнить первый запуск Elasticsearch от имени пользователя elasticsearch:
# sudo -u elasticsearch /usr/local/elasticsearch/distr/bin/elasticsearch
В процессе первого запуска будет создан пользователь демона elasticsearch - "elastic" и сгенерирован пароль для него. Важно записать этот пароль. Он потребуется в дальнейшем.
Так же будет сгенерирован токен для оболочки Kibana.
Пример вывода после первого запуска:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Elasticsearch security features have been automatically configured!
✅ Authentication is enabled and cluster connections are encrypted.

ℹ️  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  tEd53lbLTzRCqWsPPNzY

ℹ️  HTTP CA certificate SHA-256 fingerprint:
  ce440c1f33438167ed39db49bcca511eec7b6c2ddcca9ba5dc30163705a09a54

ℹ️  Configure Kibana to use this cluster:
• Run Kibana and click the configuration link in the terminal when Kibana starts.
• Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
  eyJ2ZXIiOiI4LjguMCIsImFkciI9WyIxMC4xMC40OS4xNjY6OTIwMCJdLCJmZ3IiOiJjZTQ0MGMxZjMzNDM4MTY3ZWQzMmRiNDliY2NhNTExZWVjN2I2YzJkZGNjYTliYTVkYzMwMTYzNzA1YTA5YTU0Iiwia2V5Ijoia2lOU25vY0JXSjVjeC1rWlRiWEY6eE9iRW1QNmhUS0tKM3JTbjhtdVVvQSJ9

ℹ️  Configure other nodes to join this cluster:
• On this node:
  ⁃ Create an enrollment token with `bin/elasticsearch-create-enrollment-token -s node`.
  ⁃ Uncomment the transport.host setting at the end of config/elasticsearch.yml.
  ⁃ Restart Elasticsearch.
• On other nodes:
  ⁃ Start Elasticsearch with `bin/elasticsearch --enrollment-token <token>`, using the enrollment token that you generated.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Если мы увидели эту надпись – значит все идет хорошо. Записываем пароль - tEd53lbLTzRCqWsPPNzY и выполняем остановку, сервиса нажав CTRL+C.

Теперь следует внести правки в файл конфигурации Elasticsearch
# nano /usr/local/elasticsearch/distr/config/elasticsearch.yml
cluster.name: cluster-1 (в секции Cluster)
node.name: node-1 (в секции Node)
path.data: /data/elasticsearch/data (в секции Paths)
path.logs: /data/elasticsearch/logs (в секции Paths)
bootstrap.memory_lock: true (в секции Memory)
network.host: <IP адрес сервера> (в секции Network)
action.auto_create_index: false (В секции Various)

На следующем этапе установки в Linux необходимо для Elasticsearch установить максимальные ограничения (то есть фактически снять ограничения) при открытии файлов для пользователя elasticsearch.
# nano /etc/security/limits.conf
В конце файла вписываем:

* soft nofile 65536
* hard nofile 131072
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096

Так как Elasticsearch очень требователен к ресурсам рекомендуется отключить использование файла подкачки:
# swapoff -a
Для увеличения быстродействия Elasticsearch так же рекомендуется увеличить количество адресов виртуальной памяти:
# nano /etc/sysctl.conf
vm.max_map_count = 262144

Проверка изменений:
# sysctl -p

Создаем юнит systemd для запуска и остановки демона Elasticsearch:
# nano /etc/systemd/system/elasticsearch.service
Содержимое файла
[Unit]
Description=Elasticsearch
Wants=network-online.target
After=network-online.target

[Service]
Type=forking
PIDFile=/data/elasticsearch/pid/elasticsearch.pid
RuntimeDirectory=elasticsearch
PrivateTmp=true
User=elasticsearch
Group=elasticsearch
ExecStart=/usr/local/elasticsearch/distr/bin/elasticsearch -d -p /data/elasticsearch/pid/elasticsearch.pid
StandardOutput=journal
StandardError=inherit
LimitNOFILE=65535
LimitNPROC=4096
LimitAS=infinity
LimitFSIZE=infinity
TimeoutStopSec=0
KillSignal=SIGTERM
KillMode=process
SendSIGKILL=no
SuccessExitStatus=143
TimeoutStartSec=900
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target

 

Запускаем сервис:
# systemctl daemon-reload
# systemctl start elasticsearch.service
# systemctl enable elasticsearch.service

Проверка работы сервиса:
# ps ax | grep elastic
# systemctl status elasticsearch.service
# ss -ntlp | grep java

В результате данных проверок мы должны увидеть, что запустилось два демона.
Собственно демон elasticsearch, отвечающий за поиск и индексацию работает на порту 9200. Дополнительный демон-координатор для обмена данными между несколькими экземплярами elasticsearch в кластере работает на порту 9300.
Проверяем работу Elasticsearch в части работы API.
# curl --cacert /usr/local/elasticsearch/distr/config/certs/http_ca.crt -u elastic https://localhost:9200
Enter host password for user 'elastic': <ВВОДИМ ПАРОЛЬ СГЕНЕРИРОВАННЫЙ ПРИ ПЕРВОМ ЗАПУСКЕ>
Получаем ответ:
{
  "name" : "node-1",
  "cluster_name" : "cluster-1",
  "cluster_uuid" : "vs47ZhepTv6NRDCK0SIpeA",
  "version" : {
    "number" : "8.8.0-SNAPSHOT",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "unknown",
    "build_date" : "2023-04-20T10:24:17.593292842Z",
    "build_snapshot" : true,
    "lucene_version" : "9.6.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Все работает. Отлично.
Если нет необходимости вести работу с Elasticsearch с авторизацией https и с паролем, можно отключить эти протоколы. Для этого необходимо в файле конфигурации nano /usr/local/elasticsearch/distr/config/elasticsearch.yml установить параметр:
xpack.security.enabled: false
и перезагрузить сервис:
# systemctl restart elasticsearch.service
Теперь делать запросы к Elasticsearsh проще:
# curl http://localhost:9200
{
  "name" : "node-1",
  "cluster_name" : "cluaster-1",
  "cluster_uuid" : "vs47ZhepTv6NRDCK0SIpeA",
  "version" : {
    "number" : "8.8.0-SNAPSHOT",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "unknown",
    "build_date" : "2023-04-20T10:24:17.593292842Z",
    "build_snapshot" : true,
    "lucene_version" : "9.6.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}