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

0vubaw21cjil2jjwqfuwjwnms78.png

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

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

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

7nj9pcgb50njstw_jhtctdaixdi.png

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


Для использования 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 — Users — Admin установим новый пароль для учетной записи администратора сервера.
Что бы обезопасить себя от возможных инцидентов связанных с 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!

Для владельцев бизнеса: предложите свой софт


Если вы — разработчик софта, который разворачивают и используют на VPS, то мы можем включить вас в маркетплейс. Так мы можем помочь вам привести новых клиентов, трафик и узнаваемость. Пишите нам

Просто предложить нам образ в комментариях


Напишите, какой с каким софтом вы хотели бы иметь возможность разворачивать виртуалки в один клик?

Чего вам не хватает в маркетплейсе RUVDS?

Что каждый уважающий себя хостинг должен обязательно включить в свой маркетплейс?

oug5kh6sjydt9llengsiebnp40w.png

3piw1j3wd_cgmzq9sefgferaumu.png

© Habrahabr.ru