Но для начала немного вводной информации.
В компании не было никакой системы мониторинга и сбора логов. Из-за этого о проблемах узнавали по факту, когда всё сломалось и нужно искать, где и что именно. Чтобы этого избежать, приходилось каждый день ходить в серверную и узловые точки и мониторить состояние оборудования здесь и сейчас. Это было крайне неудобно и требовало много времени.
Поэтому я решил внедрить удобные сервисы контроля оборудования. Мне нужно было создать единую точку контроля за всей инфраструктурой сети, отслеживать ошибки на оборудовании, попытки хакерских атак, понимать, кто и когда создал или удалил файлы
Я решил строить систему на базе Zabbix и Grafana Loki. На самом деле есть очень много аналогичных программ, которые позволяют мониторить оборудование, но сравнительным анализом в этой статье я заниматься не буду.
Zabbix — это программное обеспечение для мониторинга многочисленных параметров сети, жизнеспособности и целостности серверов, виртуальных машин, приложений, сервисов, баз данных, веб-сайтов, облачных сред и многого другого.
Grafana — это платформа для мониторинга, анализа и визуализации данных. Grafana не собирает и не хранит данные, а представляет сухие цифры в виде красивых диаграмм и графиков. Источник информации для Grafana — системы мониторинга и хранилища систематических данных. Платформу можно подключить к Graphite, OpenTSDB, Prometheus, InfluxDB, MySQL, PostgreSQL и многим другим движкам.
Loki — это решение для хранения и просмотра логов, также этот стек предоставляет гибкую систему для их анализа и отправки данных в Prometheus.
Подготовьте оборудование
Для того чтобы всё работало как часы, нужно правильно выбрать серверы. Их параметры зависят от нагруженности системы. Примерная схема выбора железа под сервер Zabbix:
- до 1000 метрик, потребуется 2 ядра CPU и 8 ГБ оперативной памяти;
- до 10 000 метрик, потребуется 4 ядра CPU и 16 ГБ оперативной памяти;
- до 100 000 метрик, потребуется 16 ядер CPU и 64 ГБ оперативной памяти;
- от 1 000 000 метрик, потребуется 32 ядра CPU и 96 ГБ оперативной памяти.
Все требования можно реализовать как на физическом сервере, так и на виртуальном. Базу данных можно использовать MySQL, MariaDB, PostgreSQL, Percona, Oracle.
Обязательно иметь достаточный объем дискового пространства для хранения истории и обработки данных.
Требования к железу для Grafana Loki: объем памяти от 512 МБ и минимум один процессор.
Если у вас будет производиться рендеринг изображений или оповещения, то ресурсов потребуется больше.
Установите Zabbix
Мой выбор операционной системы пал на CentOS 8.5.2111.
Подготовка к установке Zabbix
Внесите репозитории в каталог yum.repos.d:
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Linux-*
Установите обновления и пакеты баз данных MySQL:
yum update
yum install mysql-server
Запустите службу MySQL:
systemctl start mysqld.service
Установите репозитории Zabbix:
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
dnf clean all
Установите основные зависимые сервисы:
dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent
Настройка базы в MySQL
Авторизуйтесь в MySQL с помощью root-пароля, который установили ранее:
mysql -u root -p
Создайте базу данных с именем zabbix_name для Zabbix:
create database zabbix_name character set utf8 collate utf8_bin;
Проверьте список баз данных:
SHOW DATABASES;
Создайте пользователя базы данных с именем zabbix_user и root-паролем zabbix_password:
create user 'zabbix_user'@'localhost' identified BY 'zabbix_password';
Проверьте список пользователей:
SELECT User, Host FROM mysql.user;
Добавьте привилегии пользователю:
grant all privileges on zabbix_name.* to zabbix_user@localhost;
SET GLOBAL log_bin_trust_function_creators = 1;
Параметр all privileges предоставляет полные права на использование данных. Закройте консоль базы данных:
quit;
Распаковка и настройка серверной части Zabbix
Разверните файлы сервера. Это не быстрый процесс, придется подождать:
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -u zabbix_user -p zabbix_name
Отредактируйте конфигурацию сервера:
nano /etc/zabbix/zabbix_server.conf
DBName=zabbix_name
DBUser=zabbix_user
DBPassword=zabbix_password
Перезагрузите все сервисы и активируйте автозапуск:
systemctl restart zabbix-server zabbix-agent httpd php-fpm
systemctl enable zabbix-server zabbix-agent httpd php-fpm
Настройка iptables
Сохраните в файл настройки:
sudo iptables-save > /tmp/iptables-export
Откройте редактором файл:
nano /tmp/iptables-export
Пропишите в этот файл разрешения и запреты по портам и сохраните его. Можно и вручную прописать всё, но проще скопировать готовый текст ниже с правильными портами и доступами:
*raw
:PREROUTING ACCEPT [4093:273187]
:OUTPUT ACCEPT [995:75596]
-A PREROUTING -p udp -m udp --sport 53 -j NOTRACK
-A OUTPUT -p udp -m udp --dport 53 -j NOTRACK
COMMIT
*filter
:INPUT ACCEPT [2894:173422]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [995:75596]
:ICMP - [0:0]
:NTP - [0:0]
:SSH - [0:0]
:ZBX - [0:0]
:WEB - [0:0]
:SNMPTRAP - [0:0]
:SQL - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 8.8.8.8/32 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -s 8.8.4.4/32 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p icmp -j ICMP
-A INPUT -p udp -m udp --dport 123 -j NTP
-A INPUT -p tcp -m tcp --dport 22 -j SSH
-A INPUT -p tcp -m multiport --dports 10050,10051 -j ZBX
-A INPUT -p tcp -m multiport --dports 80,443 -j WEB
-A INPUT -p udp -m udp --dport 162 -j SNMPTRAP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A ICMP -p icmp -m limit --limit 5/sec -j ACCEPT
-A SSH -p tcp -m tcp --dport 22 -j ACCEPT
-A ZBX -p tcp -m tcp --dport 10050 -j ACCEPT
-A ZBX -p tcp -m tcp --dport 10051 -j ACCEPT
-A WEB -p tcp -m multiport --dports 80,443 -j ACCEPT
-A WEB -p udp -m udp --dport 162 -j ACCEPT
COMMIT
Загрузите файл:
sudo iptables-restore < /tmp/iptables-export
Проверьте правила:
sudo iptables -S
Настройка и оптимизация Zabbix
Добавьте русский язык в Zabbix:
dnf install glibc-langpack-ru
reboot
Зайдите в веб-интерфейс Zabbix по адресу http://ВашIP/zabbix/.
В файле /etc/zabbix/zabbix_server.conf пропишите размер кеша и количество предварительно разветвленных экземпляров Discoverers:
CacheSize=2048M
StartDiscoverers=5
После этого перезапустите сервис:
Systemctl restart zabbix-server.service
Устанавливаем Grafana Loki
Для Grafana Loki я буду использовать такую же версию ОС, как для Zabbix. Если у вас в системе отсутствует пакет, позволяющий скачивать файлы, то выполните команду:
yum install git wget
Для компиляции исходника необходимо установить Golang. Можно перейти на их сайт и скопировать ссылку на актуальную версию. Затем выполнить команду:
wget https://go.dev/dl/go1.19.3.linux-amd64.tar.gz
Распакуйте архив:
tar -v -C /usr/local -xzf go*.tar.gz
Далее отредактируйте файл:
nano /etc/profile
В конец файла добавьте строку:
export PATH=$PATH:/usr/local/go/bin
Выполните команду:
export PATH=$PATH:/usr/local/go/bin
Проверьте, что go установлен:
go version
Настройка фаервола
Откройте порт для запуска Loki:
firewall-cmd --permanent --add-port=3100/tcp
firewall-cmd --reload
Отключите SELinux т. к. он в нашем случае не понадобится:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
Причина отключения в том, что он может стать проблемой при отладке.
Начинаем процесс установки Loki. Перейдите в каталог:
cd /usr/src/
Загрузите исходники:
git clone https://github.com/grafana/loki
Перейдите в скачанный каталог и запустите компиляцию:
cd loki/
go build ./cmd/loki
Появится файл Loki — перенесите его в другой каталог:
mv loki /usr/local/bin/
Создайте каталог и перенесите в него конфиг:
mkdir /etc/loki
mv cmd/loki/loki-local-config.yaml /etc/loki/
Скорректируйте /tmp командами:
sed -i 's//tmp/wal//opt/loki/wal/g' /etc/loki/loki-local-config.yaml
sed -i 's//tmp/loki//opt/loki/g' /etc/loki/loki-local-config.yaml
Создайте каталог:
mkdir /opt/loki
Протестируйте запуск:
/usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml
В браузере перейдите по адресу http://ВашIP:3100/metrics, где ВашIP — IP-адрес сервера Grafana Loki.
Настройте автозапуск сервиса. Для этого создайте пользователя и дайте ему нужные права на запуск:
useradd --no-create-home --shell /bin/false loki
chown loki:loki /usr/local/bin/loki
chown -R loki:loki /etc/loki
chown -R loki:loki /opt/loki
Добавьте отдельный юнит для автозапуска:
nano /etc/systemd/system/loki.service
Содержимое файла должно быть таким:
[Unit]
Description=Grafana Loki Service
After=network.target
[Service]
User=loki
Group=loki
Type=simple
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Перезапустите конфигурацию и разрешите автозапуск:
systemctl daemon-reload
systemctl enable loki --now
Проверьте статус:
systemctl status loki
Настройка визуальной части и сбор логов
Установите недостающие компоненты:
yum install unzip wget
Установите и настройте Promtail, он позволяет читать и отправлять логи на сервер. Для этого скачайте архив с программой:
wget https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip
Распакуйте и перенесите его в другой каталог:
unzip promtail-linux-amd64.zip
mv promtail-linux-amd64 /usr/local/bin/promtail
Создайте каталог для конфигов:
mkdir /etc/promtail
Теперь создайте сам конфиг и наполните его:
nano /etc/promtail/promtail.yaml
В файле конфигурации пропишите данные:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://ВашIP:3100/loki/api/v1/push
где ВашIP — адрес вашего сервера Loki
Теперь создайте юнит для автозапуска:
nano /etc/systemd/system/promtail.service
Содержимое файла должно быть таким:
[Unit]
Description=Promtail Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Перезапустите конфигурацию и включите автозагрузку:
systemctl daemon-reload
systemctl enable promtail --now
Проверьте статус:
systemctl status promtail
Откройте нужный порт для запуска Promtail:
firewall-cmd --permanent --add-port=9080/tcp
firewall-cmd --reload
Проверьте в браузере работу Promtail: http://ВашIP:9080/targets.
Важное упоминание: Promtail нужно установить на все линуксовые машины, с которых вы планируете собирать логи.
Для сбора логов нужно внести в конфиг информацию о том, что и как собирать. Откройте конфиг:
nano /etc/promtail/promtail.yaml
В конфиге пропишите строки для сбора логов с сервера Loki:
# Чтение логов с сервера Loki
# Имя задания чтения лога
- job_name: loki_srv
static_configs:
# ПК, с которого читается лог
- targets:
- localhost
labels:
# Метка для имени задания
job: loki_srv
# Путь к файлу с логами
__path__: /var/log/rsyslog/Loki/*log
По такому же принципу добавьте в конфигурационный файл все серверы и сетевое оборудование, откуда вы планируете собирать логи. После каждого изменения файла выполняйте перезагрузку:
systemctl restart promtail
Затем проверьте в браузере отображение: http://ВашIP:9080/targets.
Переходим к установке самой Grafana. Нужно создать репозиторий, откуда и будет производиться установка:
nano /etc/yum.repos.d/grafana.repo
Содержимое файла:
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
Установите Grafana:
yum install grafana
Откройте порт для запуска Grafana и включите автозагрузку:
firewall-cmd --permanent --add-port=3000/tcp
firewall-cmd --reload
systemctl enable grafana-server
Запустите сервер:
systemctl start grafana-server
Сейчас есть проблемы с доступом на сайт Grafana. Можно обойти их с помощью VPN, скачать RPM-пакет напрямую и установить его:
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.3.0-1.x86_64.rpm
yum install /home/grafana-9.3.0-1.x86_64.rpm
Где /home/ — путь к скачанному RPM-пакету.
Переходим к финальной стадии — настройке веб-интерфейса. В браузере перейдите по ссылке http://ВашIP:3000/, где ВашIP — сервер, где установлена Grafana.
Введите логин и пароль admin. Система потребует сменить пароль по умолчанию, но если не потребует, то изменить его можно в настройках внутри веб-интерфейса.
Примеры логов из реальных сервисов
Для вывода логов на экран нужно перейти в Explore, выбрать в фильтре ваш сервер и далее можно делать парсинг страницы с помощью конкретных запросов по типу error, reject и так далее.
В примере ниже видно, как происходит закрытие соединения с почтовыми адресами. Также есть предупреждения о том, что есть проблемы с плагином для восстановления паролей.
На дашбордах можно выводить практически любую информацию, собранную Zabbix. На примерах показана общая карта сети, список проблем, которые возникают на оборудовании, и сколько уже длится конкретная проблема. Также есть количество отклоненных писем, место на жестких дисках.
В заключение хочу посоветовать: никогда не бойтесь осваивать новые сервисы и прокачивать свои скилы. Таким образом вы расширяете свои возможности и никогда не заскучаете.
Лучшее время для развития — когда у вас в компании нет проблем с сервисами и всё работает как часы.
Всем удачи в освоении новых навыков!