Создание шаблона VDS с Zabbix 5 на CentOS 8

Kate

Administrator
Команда форума
Zabbix — комплексное решение для мониторинга серверов, сетевых устройств и сервисов, позволяющее обрабатывать огромное количество метрик.

С 5-ой версией в Zabbix пришло множество улучшений, среди которых множество новых шаблонов и плагинов для различных сервисов, новые интеграции с системами оповещений и уведомлений, улучшена визуализация, а так же улучшена безопасность, за счет добавления пользовательских секретных макросов для хранения такой чувствительной информации как пароли и API-ключи и возможности включить шифрование между компонентами Zabbix с использованием TLS.
При всей противоречивости программного комплекса Zabbix, на сегодняшний день сложно представить какую либо систему мониторинга без его использования. Часто бывает, что стоит задача быстро развернуть такую систему мониторинга, а настройка Zabbix из коробки занимает много времени, поэтому специально для вас мы подготовитли образ Zabbix в нашем Маркетплейс.




Как мы создавали этот образ: требования к серверу​


Для использования Zabbix 5 рекомендуется использовать 2 Гб RAM и 2 ядра CPU.

Основные файлы Zabbix занимают около 20 Мб, дополнительно вам понадобится место для хранения базы данных, резервных копий, которое будет зависить от количества узлов которые вы планируете мониторить и количества хранимых метрик.

Веб-интерфейс Zabbix может использовать Apache или Nginx с PHP 7.2+, а в качестве базы данных MySQL, PostgreSQL, Oracle или SQLite.

Мы будем создавать образ с использованием Nginx и MySQL.

Подготовка образа​


Обновим установленные пакеты до последней версии:

sudo dnf update -y

Добавим постоянное разрешение для входящего трафика на http/80, https/443, tcp/10051 (zabbix trapper) порты и перезагрузим правила файрвола:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=10051/tcp

Применим новые правила файрвола:

sudo systemctl reload firewalld

Установим nginx:

dnf install nginx -y

Запустим и включим сервер Nginx:

sudo systemctl start nginx
sudo systemctl enable nginx

Установим PHP, PHP-FPM, и требуемые модули PHP:

dnf install php-fpm php-cli php-mysqlnd php-json php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip -y

Установим MySQL Server:

dnf install mysql-server -y

Включим и запустим сервер MySQL:

systemctl start mysqld
systemctl enable mysqld

Так как мы делаем шаблон для VDS, а они могут быть медленными, добавим задержку старта mysqld 30 секунд, иначе могут быть проблемы со стартом сервера при первоначальной загрузке системы:

sudo sed -i '/Group=mysql/a \
ExecStartPre=/bin/sleep 30
' /usr/lib/systemd/system/mysqld.service

Изменим группу и пользователя из под которого будет работать nginx внеся изменения в /etc/php-fpm.d/www.conf:

sudo sed -i --follow-symlinks 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf
sudo sed -i --follow-symlinks 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf

Изменим владельца каталога сессий PHP так же соответственно на nginx:

sudo chown -R nginx. /var/lib/php/session

Удалим строки с коментариями из файла конфигурации /etc/nginx/nginx.conf (что бы не было двойных срабатываний для sed):

sudo sed -i -e '/^[ \t]*#/d' /etc/nginx/nginx.conf

Добавим в /etc/nginx/nginx.conf настройки компрессии gzip

sudo sed -i '/types_hash_max_size 2048;/a \
\
gzip on;\
gzip_static on;\
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;\
gzip_comp_level 9;\
gzip_proxied any;\
gzip_min_length 1000;\
gzip_disable "msie6";\
gzip_vary on; \
' /etc/nginx/nginx.conf

Добавим в /etc/nginx/nginx.conf настройки индексного файла index.php:

sudo sed -i '/ root \/usr\/share\/nginx\/html;/a \
index index.php index.html index.htm;\
' /etc/nginx/nginx.conf

Добавим настройки для дефолтного сервера обработку php через сокет php-fpm, отключим лог для статических файлов, увеличим время expire, отключим лог доступа и ошибок для favicon.ico и robots.txt и запретим доступ к файлам .ht для всех:

sudo sed -i '/ location \/ {/a \
try_files $uri $uri/ /index.php?q=$uri&$args;\
}\
\
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {\
access_log off;\
expires max;\
}\
\
location ~ \.php$ {\
try_files $uri =404;\
fastcgi_pass unix:/run/php-fpm/www.sock;\
fastcgi_index index.php;\
include fastcgi_params;\
fastcgi_intercept_errors on;\
fastcgi_ignore_client_abort off;\
fastcgi_connect_timeout 60;\
fastcgi_send_timeout 180;\
fastcgi_read_timeout 180;\
fastcgi_buffer_size 128k;\
fastcgi_buffers 4 256k;\
fastcgi_busy_buffers_size 256k;\
fastcgi_temp_file_write_size 256k;\
}\
\
location = /favicon.ico {\
log_not_found off;\
access_log off;\
}\
\
location = /robots.txt {\
allow all;\
log_not_found off;\
access_log off;\
}\
\
location ~ /\.ht {\
deny all;' /etc/nginx/nginx.conf

Установим wget требуемый для установки certbot:

sudo dnf install wget -y

Скачаем исполняемый файл certbot с оффсайта:

cd ~
wget https://dl.eff.org/certbot-auto

Переместим certbot в /usr/local/bin/:

mv certbot-auto /usr/local/bin/certbot-auto

И назначим права и владельцем root:

chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto

Установим зависимости certbot: (ответ Y в конвеер на вопрос установки зависимостей, и --install-only, что бы не инициировать установку сертификатов на данном этапе):

yes | certbot-auto --install-only

Установим репозиторий Zabbix, что бы дать пользователю возможность его без проблем обновлять:

dnf install https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm -y

Установим сервер, агент и утилиты Zabbix:

dnf install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get -y

На данном этапе мы создадим пользователя с пустым паролем и базу данных для Zabbix и загрузим схему, что бы минимализировать действия пользователя при запуске VDS из шаблона.
Пароли будут сгенерированы по запросу пользователя после развертывания сервера из образа, так как, очевидно сохранять какие либо пароли в шаблоне небезопасно.

Создадим базу данных Zabbix (так же можно запустить клиент mysql и вводить команды заключенные в двойные кавычки в интерактивном режиме):

mysql -uroot -e "CREATE DATABASE zabbix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin;"

Создадим пользователя mysql zabbix с пустым паролем:

mysql -uroot -e "CREATE USER 'zabbix'@'localhost' IDENTIFIED BY '';"

Предоставим все привелегии пользователю zabbix на базу zabbix

mysql -uroot -e "GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';"

Загрузим схему zabbix в базу данных:

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix zabbix

Установим шаблон конфигурации Zabbix для Nginx:

dnf install zabbix-nginx-conf -y

Удалим подстроку из дефолтного конфига nginx, т.к. default_server будет определен в zabbix.conf:

sed -i --follow-symlinks 's/default_server//g' /etc/nginx/nginx.conf

Добавим строку default_server в конфигурацию сервера zabbix для Nginx:

sed -i '/# server_name example.com;/a \
listen 80 default_server;\
server_name _;\
' /etc/nginx/conf.d/zabbix.conf

Изменим пользователя PHP-FPM с apache на nginx для Zabbix:

sed -i --follow-symlinks 's/user = apache/user = nginx/g' /etc/php-fpm.d/zabbix.conf
sed -i --follow-symlinks 's/group = apache/group = nginx/g' /etc/php-fpm.d/zabbix.conf

Установим временную зону в php.ini (Zabbix проверяет наличие этой настройки при установке):

sed -i --follow-symlinks 's/;date.timezone =/date.timezone = Europe\/Moscow/g' /etc/php.ini


Назначим владельцем каталога /etc/zabbix nginx (для корректной записи конфигурации веб-сервером):

chown -R nginx. /etc/zabbix

Назначим группу каталога zabbix для /etc/zabbix/zabbix_* (Для чтения файлов конфигурации Zabbix сервером и агентом):

chown :zabbix /etc/zabbix/zabbix_*

Перезапустим и активируем сервисы Zabbix server и Zabbix agent:

systemctl restart zabbix-server zabbix-agent nginx php-fpm
systemctl enable zabbix-server zabbix-agent php-fpm

Далее создадим скрипт в домашнем каталоге root который по запросу пользователя сгенерирует и установит пароли для root и zabbix и скорректирует их в конфигурации сервера Zabbix и веб-интерфейса Zabbix. Воспользуемся перенаправлением heredoc с делимитером POSTINSTALL, что бы записать скрипт «как есть», без раскрытия специальных символов:

cat <<"POSTINSTALL" > /usr/local/bin/secure_mysql
#!/bin/bash
# Сгенерируем пароль для пользователей MySQL root и zabbix, используя openssl с вырезанием символов =+/ и сохраним их в переменных:
ZABBIXPASS="$(openssl rand -base64 29 | tr -d "=+/" | cut -c1-25)"
ROOTPASS="$(openssl rand -base64 29 | tr -d "=+/" | cut -c1-25)"
# Установим новые пароли пользователям:
mysql -uroot -e "ALTER USER 'zabbix'@'localhost' IDENTIFIED BY '$ZABBIXPASS';"
mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$ROOTPASS';"
# И выведем их в консоль
echo "New password for zabbix@localhost: $ZABBIXPASS"
echo "New password for root@localhost: $ROOTPASS"
# Запишем новый пароль zabbix в /etc/zabbix/zabbix_server.conf:
sed -i --follow-symlinks "s/# DBPassword=/DBPassword=${ZABBIXPASS}/g" /etc/zabbix/zabbix_server.conf
# Запишем новый пароль zabbix в /etc/zabbix/web/zabbix.conf.php:
sed -i --follow-symlinks "s/\['PASSWORD'\]\s*=\s''/\['PASSWORD'\] = '${ZABBIXPASS}'/g" /etc/zabbix/web/zabbix.conf.php
# Перезапустим затронутые сервисы:
systemctl restart zabbix-server zabbix-agent nginx php-fpm
# Обнулим переменные
ZABBIXPASS=
ROOTPASS=
# Удалим файл, так как после того как пароли установлены, он более не нужен:
rm -f /usr/local/bin/secure_mysql
POSTINSTALL

Сделаем скрипт исполняемым:

chmod +x /usr/local/bin/secure_mysql

На данном этапе все настройки выполнены, остается выключить сервер и сделать снапшот:

shutdown -h now

После этого, развернув новый сервер из образа, мы, в роли пользователя, можем перейти по ссылке с адресом сервера, например: http://vps_ip_address/
На странице DB connection оставить настройки по умолчанию, так как на данном этапе у пользователя MySQL zabbix пустой пароль. На странице Zabbix server details, можно указать название экземпляра сервера в поле Name, или оставить пустым.
После этого войдем в панель управления с логином Admin и паролем zabbix (логин и пароль по умолчанию для новых установок сервера Zabbix), и в разделе Administration — UsersAdmin установим новый пароль для учетной записи администратора сервера.
Что бы обезопасить себя от возможных инцидентов связанных с SQL-иньекциями, мы сгенерируем пароли для пользователей MySQL root и zabbix подключившись к серверу через ssh и выполнив скрипт:

secure_mysql

При выполнении скрипта, мы получим пароли в консоль в таком виде:

New password for zabbix@localhost: sdfiUB34xudgsRMiwKdd90spW
New password for root@localhost: Z1b0HjjyDJYQEtXqNWPaSySnH

Скрипт установит пароли в конфигурационных файлах сервера Zabbix, поэтому на этом этапе установку можно считать завершенной.

Настройка HTTPS​


Опционально можно настроить использование сертификатов Let's Encrypt с помощью ранее установленного certbot'a, для этого необходимо указать действующее доменное имя сервера в файле /etc/nginx/conf.d/zabbix.conf исправив параметр server, например:

server_name zabbix.mydomainname.ru;

Перезапустим веб-сервер:

service nginx restart

Запустим certbot:

/usr/local/bin/certbot-auto --nginx

Введем свой e-mail, cогласимся с условиями сервиса (A), Подписка на рассылку (опционально) (N), выберем доменные имена для которых нужно издать сертификат (Enter для всех).

В случае если все прошло без ошибок, мы увидим сообщение об успешной выдаче сертификатов и настройке сервера:

Congratulations! You have successfully enabled ...

После этого подключения на 80 порт будут перенаправляться на 443 (https).
Добавим в /etc/crontab для автоматического обновления сертификатов:

# Cert Renewal
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"

Готово, теперь у нас есть готовый сервер Zabbix с настроенными сертификатами Let's Encrypt!

Источник статьи: https://habr.com/ru/company/ruvds/blog/526598/
 
Сверху