admin
October 3, 2024

Устанавливаем и настраиваем систему мониторинга с нуля. Все в одном гайде. Prometheus + Node-exporter + Grafana

Если что-то в тексте поехало или некорректно отображается, можете воспользоваться первоисточником - тут я изначально публиковал статью.

!ПРОЧИТ МЕНЯ!

Перед тем как бездумно начать копировать и вставлять, прочтите статью. Выберите варианты установки. Оба варианты должны быть рабочими. Последнее тестирование выполнялось на варианте с использованием скриптов. Рекомендация: ПЕРЕД ТЕМ КАК УСТАНАВЛИВАТЬ НА БОЕВОЙ СЕРВЕР: арендуйте 2 vps и выполните тестирование.


ВНИМАНИЕ ВВОДНЫЕ ДАННЫЕ ДЛЯ ПРОСТОТЫ ПОНИМАНИЯ
Для простоты понимания, представим у нас есть внешние адреса устройств:
1.1.1.1 - наш домашний ip addres.
2.2.2.2 - ip addres на котором установлены Prometheus + Grafana.
3.3.3.3 - ip addres сревера который мы будем мониторить, на нем установлен Node-exporter

Порты которые используются в настройке:
Port SSH - 2222 (порт по умолчанию 22)
Port prometheus - 9898 (порт по умолчанию 9090)
Port node exporter - 9100 (порт по умолчанию 9100)
Port grafana - 3000 (порт по умолчанию 3000)

Операционная система: Ubuntu 22.04 server

Краткое описание

Связка Prometheus + Node-exporter + Grafana отлично подходит для мониторинга системных метрик и может быть адаптирована для мониторинга пользовательских метрик.

Как это работает:

  1. Node Exporter собирает системные метрики с сервера, такие как загрузка процессора, использование памяти, диск и сеть. Он экспортирует эти метрики в формате, который понимает Prometheus.
  2. Prometheus собирает метрики от Node Exporter и других экспортеров, и сохраняет их в своей базе данных временных рядов.
  3. Grafana используется для создания дэшбордов и визуализации данных, которые собирает Prometheus.
Перед продолжением, для общего развития, рекомендую ознакомиться с более расширенным описание в статье “DevOps: С чем его едят: Prometheus, Node Exporter, Grafana

РЕГИСТРАЦИЯ \ АРЕНДА И СОЗДАНИЕ СЕРВЕРОВ или VPS. Думаю с этой задачей справитесь. На написание статей с подобным материалом уходит много времени и средств. Если будет высокую заинтересованность и запрос от аудитории, то в будущем сделаю отдельную статью.


Подключение и настройка доступа к серверам.

ВНИМАНИЕ: данную настройку рекомендуется выполнить на сервере с мониторингом и сервере за которым мы будем наблюдать.

Можно сделать сразу все правильно или делайте неправильно с учетной записи root. Делать как правильно, с отдельной учетной записи с правами sudo =).

Пользователи, безопасный доступа к серверу по SSH

Безопасное подключение и настройка сервера по SSH — важный шаг в защите вашего сервера от несанкционированного доступа.

Все шаги в которых указано “Опционально” я выполняю. Шаги: 1) Опционально: создание пользователя для авторизации (без прав sudo); 2) Создание пользователя с правом sudo; 3) Опционально: смена стандартного порта SSH; 4) Отключить авторизацию из вне для пользователя root.

Подключение к серверу (этот процесс описано номинально). Если Вы задумались об установке мониторинга, то с этим точно справитесь. Используйте учетные данные, предоставленные вашим хостинг-провайдером, для подключения к серверу через SSH. Подключение происходит под учетной записью root или другим временным пользователем.

ВНИМАНИЕ в данном примере создание и настройка пользователей производится из под пользователя root. Если существует кастомный пользователь с правами sudo - можете использовать его. Для авторизации от имени другого пользователя используется команда su имя_пользователя.monitoring и admin - это имена пользователей которые я использую в примере, можете задавать любые другие имена.

(1) Создание пользователя только для авторизации на сервер.

sudo adduser monitoring

Вам будет предложено задать пароль для нового пользователя. После этого система запросит ввод дополнительных данных (они не обязательны). Прожимаем [ENTER], подтверждаем правильность данных и нажимаем Y

(2) Создание пользователя с правами sudo

Создайте пользователя, который будет обладать правами администратора. admin - это имя пользователя, можете задать любое другое имя.

sudo adduser admin

Добавьте пользователя в группу sudo (или соответствующую группу для вашей системы).

sudo usermod -aG sudo admin

Подключитесь к серверу под новым пользователем и убедитесь, что он может выполнять команды с правами суперпользователя. Если команда вернула root, значит права sudo работают корректно.

sudo whoami

(3) Смена SSH порта

Выбор нового порта: Для увеличения безопасности, вы можете изменить стандартный порт SSH (22) на нестандартный, например, 2222, 9283, 1143… Я выбираю порты из пула “Registered Ports”.

Порты в Linux используются для управления сетевыми соединениями и распределяются по трем основным диапазонам:Well-Known Ports (Известные порты): Диапазон от 0 до 1023. Эти порты зарезервированы для системных или широко используемых сервисов, таких как HTTP (порт 80) и SSH (порт 22). Для их использования требуются права суперпользователя.Registered Ports (Регистрационные порты): Диапазон от 1024 до 49151. Эти порты могут быть зарегистрированы для использования конкретными приложениями. Они не требуют прав суперпользователя и часто используются для различных сервисов и программ.Dynamic/Private Ports (Динамические/Приватные порты): Диапазон от 49152 до 65535. Эти порты обычно используются для временных соединений и не требуют регистрации. Они часто назначаются операционной системой для исходящих соединений.

Отредактируйте файл конфигурации SSH-сервера:

sudo nano /etc/ssh/sshd_config

Найдите строку #Port 22 и измените её на Port 2222. Сохраните изменения и закройте редактор.

Перезапуск SSH-сервера:

sudo systemctl restart sshd

Проверка доступа: Подключитесь к серверу на новом порту, чтобы убедиться в корректности настроек. Можно использовать любой удобный ssh client ( PuTTY, MobaXterm, Termius ):

ssh -p 2222 admin@your-server-ip
#Например ssh -p 2222 admin@2.2.2.2

(4) Отключение возможности подключения через SSH для Root и пользователя управления системой

Запрет SSH-доступа для root, отредактируйте файл конфигурации sshd_config:

sudo nano /etc/ssh/sshd_config

Найдите параметр PermitRootLogin и измените его на PermitRootLogin no. Добавьте следующую строку DenyUsers admin в конец файла для запрета доступа определённому пользователю (в моем случае это admin). Если параметр DenyUsers есть, убрать комментирование # и внесите изменения:

DenyUsers admin

Сохраните изменения и закройте редактор.

Перезапуск SSH-сервера:

sudo systemctl restart sshd

Проверка настроек: Попробуйте подключиться к серверу под учетной записью root и adminпо SSH, чтобы убедиться, что доступ запрещен:

ssh -p 2222 root@2.2.2.2
ssh -p 2222 admin@2.2.2.2
###############ПРОВЕРКА###############

#Вывод на экране

#Зпрет подключения из под roor
login as: root
root@2.2.2.2's password:
Access denied
#Зпрет подключения из под admin
login as: admin
admin@2.2.2.2's password:
Access denied

#Пользователь monitoring не добавлен в группу sudo
sudo ping 8.8.8.8
[sudo] password for monitoring: 
monitoring is not in the sudoers file.  This incident will be reported.

Если доступ запрещен, значит настройки применены корректно. Убедитесь, что доступ по SSH возможен только через созданного пользователя без прав sudo.

Для базового сценария - этого будет достаточно. Эти шаги помогут вам настроить безопасный доступ к вашему серверу и минимизировать риски несанкционированного доступа.


Настройка сервера мониторинга, на котором будут установлены Prometheus и Grafana.

§ Подготовка сервер перед установкой Prometheus

Варианты установки:Установка с использованием готового скрипта.Ручная установка.
ВНИМАНИЕ!!!!!После выполнения инструкции “Подключение и настройка доступа к серверам”. Приступаем к следующим шагам описанным ниже!!!!!
ВНИМАНИЕ создание и настройка пользователей производится из под пользователя admin.

Установка Prometheus с использованием готового скрипта.

bash <(curl -s https://raw.githubusercontent.com/odanoder/scripts/main/monitoring/prometheus.sh)

После выполнения скрипта, может появится вот такая информация на экране, нажимаем клавишу [q] или [esc] и переходим к разделу “Настройка Prometheus”

● prometheusd.service - Prometheus
     Loaded: loaded (/etc/systemd/system/prometheusd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-09-08 17:47:18 UTC; 10s ago
   Main PID: 14612 (prometheus)
      Tasks: 7 (limit: 4532)
     Memory: 15.5M
        CPU: 102ms
     CGroup: /system.slice/prometheusd.service
             └─14612 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml

Ручная установка Prometheus**.**

Обновление системы:

sudo apt update && sudo apt upgrade -y

Минимально необходимые пакеты для базовой работы Prometheus:

sudo apt install -y curl tar wget nano
### Описание:
# curl: Используется для загрузки файлов из интернета, например, скачивания Prometheus.
# tar: Необходим для распаковки архивов, таких как prometheus-*.tar.gz.
# wget: Альтернатива curl для загрузки файлов.
# nano: Текстовый редактор для редактирования конфигурационных файлов.

Установить дополнительные полезные пакеты:

sudo apt install -y tmux htop iptables git python3-pip jq ncdu nvme-cli build-essential gcc make clang pkg-config libssl-dev libleveldb-dev unzip
### Описание:
# tmux: Для работы с сессиями терминала, полезно при длительных задачах.
# htop: Мониторинг системных ресурсов в реальном времени.
# iptables: Настройка правил брандмауэра для повышения безопасности.
# git: Для клонирования репозиториев и работы с версиями программ.
# python3-pip: Установка Python-библиотек.
# jq: Работа с JSON данными.
# ncdu: Анализ использования дискового пространства.
# nvme-cli: Управление и мониторинг NVMe-устройств.
# build-essential, gcc, make, clang: Инструменты для компиляции и сборки программ.
# pkg-config, libssl-dev, libleveldb-dev: Библиотеки и утилиты для разработки и сборки программ.
# unzip: Для распаковки zip-архивов.

Создание пользователя для Prometheus:

Создайте пользователя prometheus без прав sudo для запуска Prometheus. Команды ниже применяются для безопасности, чтобы этот пользователь не мог войти на сервер:

sudo useradd --no-create-home --shell /bin/false prometheus

Создание директорий для Prometheus:

Создайте необходимые директории для хранения конфигурации и данных Prometheus:

sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus

Устанавливаем права пользователя и группы для новых каталогов, для пользователя prometheus:

sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

Чтобы проверить успешное выполнение команд и правильность назначения прав, выполните следующие шаги. Эти шаги помогут убедиться, что директории были созданы и права доступа настроены правильно:

### 1 Проверка существования директорий:
# Убедитесь, что директории /etc/prometheus и /var/lib/prometheus были успешно созданы:

ls -ld /etc/prometheus /var/lib/prometheus

# Вывод должен содержать строки, указывающие на существование директорий, например:

drwxr-xr-x 2 prometheus prometheus 4096 Aug 31 12:34 /etc/prometheus
drwxr-xr-x 2 prometheus prometheus 4096 Aug 31 12:34 /var/lib/prometheus

### 2 Проверка прав доступа:
# Убедитесь, что права собственности на директории были корректно назначены пользователю и группе prometheus:

stat /etc/prometheus /var/lib/prometheus

# Обратите внимание на строки Uid и Gid, они должны выглядеть следующим образом:

Uid: ( 1001/prometheus)   Gid: ( 1001/prometheus)

### 3 Проверка текущих прав пользователя:
# Убедитесь, что текущий пользователь действительно обладает правами на запись и чтение в указанные директории:

sudo -u prometheus touch /etc/prometheus/testfile && echo "Access granted" || echo "Access denied"
sudo -u prometheus touch /var/lib/prometheus/testfile && echo "Access granted" || echo "Access denied"

Если команды завершатся с выводом Access granted, это означает, что права назначены корректно. В противном случае, права доступа были назначены неверно.

### 4 Очистка тестовых файлов (если они создавались):
# Если в предыдущем шаге были созданы тестовые файлы, их можно удалить:

sudo -u prometheus rm /etc/prometheus/testfile /var/lib/prometheus/testfile

Загрузка и установка Prometheus:

Скачайте последнюю версию Prometheus с официального сайта:

cd ~
wget https://github.com/prometheus/prometheus/releases/download/v2.53.2/prometheus-2.53.2.linux-amd64.tar.gz

Распакуйте архив:

tar -xvf prometheus-2.53.2.linux-amd64.tar.gz

Переходим в каталог prometheus

cd prometheus-2.53.2.linux-amd64

Копируем исполняемые файлы в /usr/local/bin:

sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/

Устанавливаем права собственности пользователя и группы на исполняемые (бинарные) файлы:

sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

Копируем конфигурационные файлы и директории:

sudo  cp -r consoles /etc/prometheus
sudo  cp -r console_libraries /etc/prometheus
sudo cp prometheus.yml /etc/prometheus/prometheus.yml

Присваиваем владельца директорий и файлов пользователю prometheus:

sudo chown -R prometheus:prometheus /etc/prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus

Выполняем проверку, должно показать версию prometheus:

prometheus --version
promtool --version

Пример полного сценария проверки:

# 1. Проверка копирования и прав на исполняемые файлы
ls -l /usr/local/bin/prometheus /usr/local/bin/promtool
stat /usr/local/bin/prometheus /usr/local/bin/promtool

# 2. Проверка копирования конфигурационных файлов и директорий
ls -ld /etc/prometheus/consoles /etc/prometheus/console_libraries /etc/prometheus/prometheus.yml
stat /etc/prometheus/consoles /etc/prometheus/console_libraries /etc/prometheus/prometheus.yml

# 3. Проверка назначения владельцев директорий и файлов
sudo find /etc/prometheus -type f -exec stat {} \; | grep -e "prometheus/prometheus"
sudo find /var/lib/prometheus -type f -exec stat {} \; | grep -e "prometheus/prometheus"

# 4. Проверка версий
prometheus --version
promtool --version
###Пример полного сценария проверки с раширеным описанием###

### 1) Проверка копирования исполняемых файлов в /usr/local/bin и их прав:
# Проверка наличия файлов
ls -l /usr/local/bin/prometheus /usr/local/bin/promtool

# Проверка прав доступа и владельцев
stat /usr/local/bin/prometheus /usr/local/bin/promtool

# Вывод должен содержать информацию о том, что файлы существуют, а также что их владельцем является prometheus. Например:

-rwxr-xr-x 1 prometheus prometheus 123456 Aug 31 12:34 /usr/local/bin/prometheus
-rwxr-xr-x 1 prometheus prometheus 123456 Aug 31 12:34 /usr/local/bin/promtool

### 2) Проверка копирования конфигурационных файлов и директорий:
# Проверка наличия директорий и файлов в /etc/prometheus
ls -ld /etc/prometheus/consoles /etc/prometheus/console_libraries /etc/prometheus/prometheus.yml

# Проверка прав доступа и владельцев для /etc/prometheus
stat /etc/prometheus/consoles /etc/prometheus/console_libraries /etc/prometheus/prometheus.yml

# Результат должен показать, что все файлы и директории существуют, и что владельцем является prometheus.

### 3) Проверка назначения владельцев директорий и файлов:
# Проверка прав доступа и владельцев для всех файлов и директорий в /etc/prometheus
sudo find /etc/prometheus -type f -exec stat {} \; | grep -e "prometheus/prometheus"

# Вывод должен подтвердить, что все файлы и директории имеют правильные права доступа и владельца (prometheus:prometheus).

### 4) Проверка версий prometheus и promtool:
prometheus --version
promtool --version

### Эти команды должны вывести версии установленных программ, что подтвердит их правильную установку.###

Если все проверки пройдут успешно, то это подтвердит, что все действия были выполнены правильно.

Создание systemd-сервиса для Prometheus:

ВНИМАНИЕ - мы заменили стандартный порт prometheus (9090) на порт (9898)

Создайте файл службы systemd для Prometheus:

Скопировать и ввести в командной строке.

sudo tee /etc/systemd/system/prometheusd.service > /dev/null <<EOF
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries \
    --web.listen-address=:9898

[Install]
WantedBy=multi-user.target
EOF

Запуск и включение Prometheus:

sudo systemctl daemon-reload
sudo systemctl enable prometheusd
sudo systemctl start prometheusd

Проверка работы Prometheus:

sudo systemctl status prometheusd
#Вывод на экране ( Active: active (running) - корректное состояние демона)
● prometheusd.service - Prometheus
     Loaded: loaded (/etc/systemd/system/prometheusd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-08-31 12:45:50 UTC; 11s ago
   Main PID: 9613 (prometheus)
      Tasks: 8 (limit: 4532)
     Memory: 15.9M
        CPU: 92ms
     CGroup: /system.slice/prometheusd.service
             └─9613 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml 

Проверяем, что бы метрики отдавались

curl 'localhost:9898/metrics'

§ Настройка Prometheus

Редактирование конфигурационного файла Prometheus

Внимание: конфигурационный файл Prometheus использует формат YAML

Откройте файл конфигурации Prometheus для редактирования:

sudo nano /etc/prometheus/prometheus.yml

Внесите следующие изменения в конфигурационный файл prometheus.yml, если в конфиге используются двойные кавычки, значит используйте их. В примере ниже приведены одинарные кавычки. Находим строчку static_configs: , в разделе - targets: указываем ["localhost:9898"]. Если нас будет больше одной цели, они указываются через запятую: ["localhost:9898", "localhost:9090"] :

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 15s
    static_configs:
      - targets: ['localhost:9898']

Объяснение изменений:

  • global:
    • scrape_interval: 15s: Устанавливает интервал сбора метрик для всех целей на 5 секунд.
    • evaluation_interval: 15s: Устанавливает интервал оценки правил на 5 секунд.
  • scrape_configs:
    • job_name: 'prometheus': Имя задачи для сбора метрик от самого Prometheus и других целей.
    • scrape_interval: 15s: Перезаписывает глобальный интервал для этого задания.
    • static_configs:
      • targets: ['localhost:8080', 'localhost:9898']: Определяет цели для сбора метрик. В этом случае Prometheus будет собирать метрики с localhost на портах 8080 и 9898.

Примечание: Убедитесь, что Prometheus настроен на прослушивание этого порта, если вы изменили его стандартный порт с 9090 на 9898.

Вот так выглядит мой конфигурационный фаил prometheus.yml:

  GNU nano 6.2                                                         /etc/prometheus/prometheus.yml *                                                                
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"
    scrape_interval: 15s

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9898"]

Проверка корректности конфигурации

Перед перезапуском Prometheus убедитесь, что конфигурация корректна. Эта команда запустит Prometheus с вашей конфигурацией и покажет любые ошибки в конфигурации:

prometheus --config.file=/etc/prometheus/prometheus.yml --log.level=debug

После проверки конфигурации, перезапустите Prometheus для применения изменений:

sudo systemctl restart prometheusd

Убедитесь, что Prometheus работает корректно, и находится в статусе Active: active (running):

sudo systemctl status prometheusd.service
### Пример полного процесса проверки
# Проверка конфигурации
prometheus --config.file=/etc/prometheus/prometheus.yml --log.level=debug

# Перезапуск Prometheus
sudo systemctl restart prometheus

# Проверка статуса сервиса
sudo systemctl status prometheus

# Открытие веб-интерфейса
# http://2.2.2.2:9898 
# http://2.2.2.2:9090 если используете порт по умолчанию

Следуя этим шагам, вы сможете корректно настроить и протестировать Prometheus для сбора метрик с заданных целей.

Переходим в графический интерфейс (ip_adreess_server:9898) и проверяем правильно ли все настроено.

Данная команда отобразит ссылку для перехода в браузер (графическая оболочка)

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9898/\033[0m"
http://2.2.2.2:9898

Проверьте, что интерфейс Prometheus доступен и данные о целевых системах отображаются правильно. Откройте веб-браузер и перейдите по адресу вашего Prometheus сервера. Если вы оставили стандартный порт 9090: http://2.2.2.2:9090. Если вы изменили порт на 9898: http://2.2.2.2:9898

В интерфейсе Prometheus перейдите на вкладку "Targets" (Цели), чтобы убедиться, что ваши цели (например, localhost:9898 и localhost:9100) отображаются как доступные и успешно собираются.

Выбираем пункты меню Status → Tragets, в разделе Endpoint под Statte должно быть UP - это означает что все работает корректно.

Далее перейдем к grafana


§ Установка Grafana

ВНИМАНИЕ Grafana устанавливается на тот же сервер что и Prometheus.Варианты установки: РУЧНАЯ УСТАНОВКА, УСТАНОВКА СКРИПТОМ

УСТАНОВКА СКРИПТОМ

После выполнения скрипта перейдите к разделу “Подключаемся к графическому интерфейсу grafana”.

bash <(curl -s https://raw.githubusercontent.com/odanoder/scripts/main/monitoring/grafana.sh)

РУЧНАЯ УСТАНОВКА

Скачайте последнюю версию Grafana с официального сайта в разделе Edition: вместо “Enterprise” выбрать “OSS”:

# Установка необходимых пакетов
cd
sudo apt-get update
sudo apt-get install -y apt-transport-https software-properties-common wget
# Импорт ключа GPG
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
# Добавление репозиториев
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com beta main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

Установка пакета:

# Установка дополнительных пакетов
sudo apt-get update
sudo apt-get install -y adduser libfontconfig1 musl
# Скачивание и установка Grafana
wget https://dl.grafana.com/oss/release/grafana_11.2.0_amd64.deb
sudo dpkg -i grafana_11.2.0_amd64.deb

Управление службами:

sudo systemctl daemon-reload && sudo systemctl enable grafana-server && sudo systemctl restart grafana-server

Пояснение:

  • systemctl daemon-reload — перезагружает конфигурацию systemd.
  • systemctl enable grafana-server — включает автоматический запуск Grafana при старте системы.
  • systemctl restart grafana-server — перезапускает службу Grafana.
  • systemctl status grafana-server — проверяет статус службы Grafana.
sudo systemctl status grafana-server

Посмотреть логи Grafana

sudo journalctl -u grafana-server -f -n 100

Подключаемся к графическому интерфейсу grafana.

Получить ссылку на веб интерфейс

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m"
#Пример
#http://2.2.2.2:3000

По умолчанию Login admin и Password admin.

Система предложить сразу сменить пароль - меняем на новый пароль.

Переходим в Home -> Connections -> Data sources -> нажимаем на Add data source

В строке поиска пишем (или выбираем из списка) prometheus, затем нажимаем на найденный Prometheus.

Добавляем ссылку на наш server prometheus , в нашем случае это http://localhost:9898

#Connection
Prometheus server URL * http://localhost:9898

Листаем вниз и сохраняем изменения.

На этом мы заканчиваем базовую настройку. Переходим к настройке dashboard.

Настройка dashboard для grafana

Вручную создавать и настраивать dashboard не нужно, это вообще отдельная и долгая тема. За нас уже все давно сделали. Скачать готовые dashboard можно с официального сайта.

Для примера я буду использовать шаблон Node Exporter Full. Нам нужно знать id этого шаблона. Переходим на него и нажимаем на Copy ID to clipboard. При желании можете выбрать другой шаблон, с левой стороны есть фильтры по который можно подобрать подходящий.

Возвращаемся в нашу grafana и переходим в раздел Home -> Dashboards -> нажимаем на Create dashboard.

Выбираем Import dashboard

Вставляем скопированный ID в поле Find and import dashboards… и нажимаем Load

В поле Prometheus выбираем Prometheus, далее нажимаем Import.

На этом этапе мы закончили базовую настройку сервера для мониторинга.


§ Настройка Node Exporter на сервере который нужно мониторить.

Притупим к настройке мониторинга на сервере с нодой.

ОПЦИОНАЛЬНО: Не забываем о безопасности и делаем дополнительные настройки описанные в разделе “Подключение и настройка доступа к серверам”.

Установка Node Exporter

Если на сервере который мы будем мониторить не создан отдельный пользователь, то мы его создаем. Если же есть пользователь с правами sudo или вы решили использовать пользователя root, то пропускаем этот шаг “Создание пользователя с правами Sudo” и переходим к “Создание пользователя для Node Exporter”

sudo apt update && sudo apt upgrade -y

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

sudo adduser admin

Добавьте пользователя в группу sudo (или соответствующую группу для вашей системы).

sudo usermod -aG sudo admin

Установка скриптом, после выполнения скрипта переходим к разделу ниже “Возвращаемся к нашему серверу с Prometheus и Grafana (ip 2.2.2.2)

bash <(curl -s https://raw.githubusercontent.com/odanoder/scripts/main/monitoring/node_exporter.sh)

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

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m"
#Пример
#http://3.3.3.3:9100

Переходим в браузер и проверяем что метрики работают.

Ручная установка

Создание пользователя для Node Exporter

sudo useradd --no-create-home --shell /bin/false node_exporter

Загрузка последней версии Node Exporter

Перейдите на страницу релизов Node Exporter на GitHub и выберите последнюю версию. Скопируйте ссылку на архив и выполните команду для загрузки:

cd
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz

Распакуйте скачанный архив:

tar xvf node_exporter-1.8.2.linux-amd64.tar.gz

Перейдите в распакованную директорию:

cd node_exporter-1.8.2.linux-amd64

Переместите бинарный файл node_exporter в системный каталог /usr/local/bin:

sudo cp node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

Проверяем версию:

node_exporter --version

Создаем сервисный файл:

sudo tee /etc/systemd/system/node_exporterd.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=default.target
EOF

Перезапуск systemd и активация службы:

sudo systemctl daemon-reload
sudo systemctl enable node_exporterd
sudo systemctl restart node_exporterd

Проверяем, что метрики отдаются:

curl 'localhost:9100/metrics'

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

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m"
#Пример
#http://3.3.3.3:9100

Возвращаемся к нашему серверу с Prometheus и Grafana (ip 2.2.2.2)

Добавляем новый targets в Prometheus.

Т.е. добавляем в Prometheus адрес сервера, который мы собираемся мониторить.

sudo nano /etc/prometheus/prometheus.yml

Находим строчку static_configs и добавляем в нее ip адрес сервера (на котором установлена нода или который мы хотим мониторить). 3.3.3.3 - меняем на свой ip. Сохраняем изменения.

    static_configs:
      - targets: ["3.3.3.3:9100","localhost:9898"]

Эта команда запустит Prometheus с вашей конфигурацией и покажет любые ошибки в конфигурации.

prometheus --config.file=/etc/prometheus/prometheus.yml --log.level=debug

Перезапускаем службу:

sudo systemctl restart prometheusd

На странице Prometheus теперь у нас отображается два активных Endpoint

Идем в grafana и наслаждаемся проделанной работой.

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


§ Настройка безопасности

По желания можно настроить Fail2Ban на наших серверах, настройка которого описана в отдельной статье “Настройка Fail2Ban”.

Fail2Ban — это инструмент для повышения безопасности серверов и сетевых систем. Его основная функция заключается в предотвращении атак типа brute force и других видов несанкционированного доступа путем автоматической блокировки IP-адресов, которые демонстрируют подозрительное поведение.

UFW (Uncomplicated Firewall) - Используется для базовой настройки межсетевого экрана, контроля доступа к сервисам, управляемым сервером, и защиты от несанкционированного доступа.

В Node exporter и Prometheus ,по умолчанию, не предусмотрена настройка защиты доступа к данным, любой желающий может посмотреть данные зная ip адрес и port нашего сервера. По этому мы будем ограничивать доступ по ip адресам и port.

Ниже будут рассмотрены 2 варианта настройки: простой и сложный.

ВНИМАНИЕПростой - будем использовать ufw. Разрешаем доступ только с конкретных ip адресов ( 1.1.1.1 , 2.2.2.2, 3.3.3.3 ).Сложный - будем использовать iptables. Более сложная и тонка настройка.Для новичка лучше использовать простой вариант. Напоминаю на всякий случай: ip адреса: 1.1.1.1 , 2.2.2.2, 3.3.3.3 - это адреса для примера, их нужно заменить своими адресами.

ПРОСТОЙ ВАРИАНТ: Настройка безопасности для node exporter (ip: 3.3.3.3)

Настройка UFW

sudo apt update
sudo apt install ufw -y

Если ваш ssh настроен на порт 2222 ( sshпорт по умолчания 22):

sudo ufw allow 2222/tcp
sudo systemctl enable ufw

Доступ к Prometheus будет возможен только с вашего домашнего IP-адреса (1.1.1.1) и IP-адреса сервера который мониторится (2.2.2.2), что предотвратит несанкционированный доступ к данным этих систем. Сервисов который дают возможность узнать свой домашний адрес достаточно много, например 2ip.io

Разрешить доступ к node exporter только с вашего домашнего IP(1.1.1.1) и сервера мониторинга (2.2.2.2):

sudo ufw allow from <ВАШ_ДОМАШНИЙ_IP> to any port 9100
sudo ufw allow from <ВАШ_СЕРВЕР_МОНИТОРИНГА_IP> to any port 9100
# 1.1.1.1 - заменить на свой домашний адрес:
# sudo ufw allow from 1.1.1.1 to any port 9100
# sudo ufw allow from 2.2.2.2 to any port 9100

Теперь проверяем статус ufw и правила который внесены в него.

sudo ufw status

Включаем ufw. Если Status: inactive выполняем команду и нажимаем клавишу [y].

sudo ufw enable

Вывести правила которые применяются в ufw

sudo ufw show added
#Пример вывода
#ufw allow from 1.1.1.1 to any port 9100
#ufw allow from 2.2.2.2 to any port 9100
#ufw allow 2222/tcp

Дополнительные команды, если вносили изменения

sudo ufw reload      # для применения изменений
sudo ufw enable      # если UFW еще не включен
sudo ufw reset       # очистить все правила UFW

ПРОСТОЙ ВАРИАНТ: Настройка безопасности для сервера мониторинга, на котором установлены Prometheus и Grafana. (ip: 2.2.2.2)

Настройка UFW

sudo apt update
sudo apt install ufw -y
sudo systemctl enable ufw.service

Если ваш ssh настроен на порт 2222 ( sshпорт по умолчания 22):

sudo ufw allow 2222/tcp

Разрешить доступ к Prometheus только с вашего домашнего IP:

# Разрешить получать данные от Node Exporter только для сервера с Prometheus + Grafan (2.2.2.2)
sudo ufw allow from <ВАШ_СЕРВЕР_Который_МОНИТОРИТСЯ_IP> to any port 9100

# Разрешить получать данные от Prometheus только с домашнего IP адреса (1.1.1.1)
sudo ufw allow from <ВАШ_ДОМАШНИЙ_IP> to any port 9898

# Разрешить подключение к Grafana только с домашнего IP (1.1.1.1)
sudo ufw allow from <ВАШ_ДОМАШНИЙ_IP> to any port 3000

Теперь проверяем статус ufw и правила который внесены в него.

sudo ufw status

Включаем ufw. Если Status: inactive выполняем команду и нажимаем клавишу [y].

sudo ufw enable

Вывести список правил

sudo ufw show added

Дополнительные команды, если вносили изменения

sudo ufw reload      # для применения изменений
sudo ufw enable      # если UFW еще не включен
sudo ufw reset       # очистить все правила UFW

ВЫ МОЛОДЕЦ!!! НА ЭТОМ ЭТАПЕ У ВАС ДОЛЖНО ВСЕ РАБОТАТЬ!ЕСЛИ ВЫ ВЫБРАЛИ СЛОЖНЫЙ ВАРИАНТ НАСТРОЙКИ БЕЗОПАСТНОСТИ, ТО ПОЛУЧАЕТЕ +1 к скилам.

Сложные варианты настройки безопасности

ВНИМАНИЕ материал приведенный ниже, связанный с более сложной настройкой безопасности обязателен к прочтению!!!

Тестирование правил перед применением

Для избежания случайных блокировок доступа к серверу (например, SSH), следует всегда тестировать правила перед их применением. Один из способов — использовать временные правила. Например, добавив правило, можно установить таймер его удаления через определенное время. Это позволит вам восстановить доступ в случае ошибки.

Для закрытия порта с помощью iptables, вместо -j ACCEPT используется действие -j DROP, которое блокирует трафик на указанный порт. Ниже приведены команды для закрытия порта 22 (SSH) как для TCP, так и для UDP, с автоматическим удалением правила через 60 секунд. Изучите пример ниже и протестируйте его для того что бы понять как это фунциклирует !

Команды для закрытия порта 22 (TCP и UDP):

# Закрыть порт 22 для входящего TCP трафика и удалить правило через 60 секунд
sudo iptables -I INPUT 1 -p tcp --dport 22 -j DROP; (sleep 60 && sudo iptables -D INPUT 1) &

# Закрыть порт 22 для входящего UDP трафика и удалить правило через 60 секунд
sudo iptables -I INPUT 1 -p udp --dport 22 -j DROP; (sleep 60 && sudo iptables -D INPUT 1) &

Описание:

  1. Закрытие TCP трафика на порт 22:
    • sudo iptables -I INPUT 1 -p tcp --dport 22 -j DROP: Эта команда добавляет правило для блокировки входящих TCP-соединений на порт 22 (используется для SSH).
    • (sleep 60 && sudo iptables -D INPUT 1) &: Через 60 секунд правило будет автоматически удалено, и порт снова станет доступен.
  2. Закрытие UDP трафика на порт 22:
    • sudo iptables -I INPUT 1 -p udp --dport 22 -j DROP: Это правило блокирует входящие UDP-соединения на порт 22.
    • Аналогично, через 60 секунд правило будет автоматически удалено.

Итог: Команды закрывают порт 22 как для TCP, так и для UDP трафика на 60 секунд, после чего правила автоматически удаляются, возвращая систему в исходное состояние.

Отлично, можем переходить к настройке

СЛОЖНЫЙ ВАРИАНТ: Настройка безопасности для node exporter (ip: 3.3.3.3)

Настройка правил iptables

Выполняем тестирование с задержкой на 180 секунд (заменить на свой данные 2.2.2.2 9100 ).

# Запрещаем входящий TCP-трафик на порт 9100 от всех других внешних адресов, кроме сервера мониторинга
sudo iptables -I INPUT 2 -p tcp --dport 9100 -j DROP;
(sleep 180 && sudo iptables -D INPUT -p tcp --dport 9100 -j DROP) &

# Запрещаем входящий UDP-трафик на порт 9100 от всех других внешних адресов, кроме сервера мониторинга
sudo iptables -I INPUT 2 -p udp --dport 9100 -j DROP;
(sleep 180 && sudo iptables -D INPUT -p udp --dport 9100 -j DROP) &

# Разрешаем входящий TCP-трафик от сервера мониторинга на Node Exporter
sudo iptables -I INPUT 1 -p tcp -s 2.2.2.2 --dport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D INPUT -p tcp -s 2.2.2.2 --dport 9100 -j ACCEPT) &

# Разрешаем исходящий TCP-трафик от Node Exporter к серверу мониторинга
sudo iptables -I OUTPUT 1 -p tcp -d 2.2.2.2 --sport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D OUTPUT -p tcp -d 2.2.2.2 --sport 9100 -j ACCEPT) &

# Разрешаем входящий UDP-трафик от сервера мониторинга на Node Exporter
sudo iptables -I INPUT 1 -p udp -s 2.2.2.2 --dport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D INPUT -p udp -s 2.2.2.2 --dport 9100 -j ACCEPT) &

# Разрешаем исходящий UDP-трафик от Node Exporter к серверу мониторинга
sudo iptables -I OUTPUT 1 -p udp -d 2.2.2.2 --sport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D OUTPUT -p udp -d 2.2.2.2 --sport 9100 -j ACCEPT) &

Если тестирование прошло успешно выполняем команду (заменить на свой данные 2.2.2.2 9100 ):

sudo iptables -I INPUT 2 -p tcp --dport 9100 -j DROP
sudo iptables -I INPUT 2 -p udp --dport 9100 -j DROP
sudo iptables -I INPUT 1 -p tcp -s 2.2.2.2 --dport 9100 -j ACCEPT
sudo iptables -I OUTPUT 1 -p tcp -d 2.2.2.2 --sport 9100 -j ACCEPT
sudo iptables -I INPUT 1 -p udp -s 2.2.2.2 --dport 9100 -j ACCEPT
sudo iptables -I OUTPUT 1 -p udp -d 2.2.2.2 --sport 9100 -j ACCEPT

Если первый вариант не сработал, попробуйте такой вариант:

# Разрешаем входящий TCP-трафик от сервера мониторинга на Node Exporter
sudo iptables -A INPUT -p tcp -s 2.2.2.2 --dport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D INPUT -p tcp -s 2.2.2.2 --dport 9100 -j ACCEPT) &

# Разрешаем исходящий TCP-трафик от Node Exporter к серверу мониторинга
sudo iptables -A OUTPUT -p tcp -d 2.2.2.2 --sport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D OUTPUT -p tcp -d 2.2.2.2 --sport 9100 -j ACCEPT) &

# Разрешаем входящий UDP-трафик от сервера мониторинга на Node Exporter
sudo iptables -A INPUT -p udp -s 2.2.2.2 --dport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D INPUT -p udp -s 2.2.2.2 --dport 9100 -j ACCEPT) &

# Разрешаем исходящий UDP-трафик от Node Exporter к серверу мониторинга
sudo iptables -A OUTPUT -p udp -d 2.2.2.2 --sport 9100 -j ACCEPT;
(sleep 180 && sudo iptables -D OUTPUT -p udp -d 2.2.2.2 --sport 9100 -j ACCEPT) &

# Запрещаем входящий TCP-трафик на порт 9100 от всех других внешних адресов, кроме сервера мониторинга
sudo iptables -A INPUT -p tcp --dport 9100 -j DROP;
(sleep 180 && sudo iptables -D INPUT -p tcp --dport 9100 -j DROP) &

# Запрещаем входящий UDP-трафик на порт 9100 от всех других внешних адресов, кроме сервера мониторинга
sudo iptables -A INPUT -p udp --dport 9100 -j DROP;
(sleep 180 && sudo iptables -D INPUT -p udp --dport 9100 -j DROP) &

Выполняем применение правил без отмены

# Разрешаем входящий TCP-трафик от сервера мониторинга на Node Exporter
sudo iptables -A INPUT -p tcp -s 2.2.2.2 --dport 9100 -j ACCEPT

# Разрешаем исходящий TCP-трафик от Node Exporter к серверу мониторинга
sudo iptables -A OUTPUT -p tcp -d 2.2.2.2 --sport 9100 -j ACCEPT

# Разрешаем входящий UDP-трафик от сервера мониторинга на Node Exporter
sudo iptables -A INPUT -p udp -s 2.2.2.2 --dport 9100 -j ACCEPT

# Разрешаем исходящий UDP-трафик от Node Exporter к серверу мониторинга
sudo iptables -A OUTPUT -p udp -d 2.2.2.2 --sport 9100 -j ACCEPT

# Запрещаем входящий TCP-трафик на порт 9100 от всех других внешних адресов, кроме сервера мониторинга
sudo iptables -A INPUT -p tcp --dport 9100 -j DROP

# Запрещаем входящий UDP-трафик на порт 9100 от всех других внешних адресов, кроме сервера мониторинга
sudo iptables -A INPUT -p udp --dport 9100 -j DROP

Внимание: все мы можем совершать ошибку, если что-то пошло не так и вы потеряли доступ к серверу, выполните перезагрузку. Если Вы применили шаги ниже, перезагрузка сервера не поможет.

Шаги для сохранения правил iptables , использование iptables-persistent (для Debian/Ubuntu)

sudo apt install iptables-persistent -y

Во время установки вам предложат сохранить текущие правила для IPv4 и IPv6. Выберите "Yes" для сохранения.

Чтобы вручную сохранить правила в будущем, выполните:

sudo netfilter-persistent save

Теперь ваши правила будут автоматически применяться после перезагрузки.

Опционально: Перезагружаем сервер и проверяем, что работает автоматическая установка правил.

СЛОЖНЫЙ ВАРИАНТ: Настройка безопасности для сервера мониторинга, на котором установлены Prometheus и Grafana. (ip: 2.2.2.2)

Настройка iptables

В предыдущем разделе я приводил пример как тестировать правила перед их применение. Тут сразу будем выполнять правильные правила.

# Разрешите соединения только с IP-адреса (сервера мониторинга 2.2.2.2) для порта 9898
sudo iptables -I INPUT 1 -p tcp -s 2.2.2.2 --dport 9898 -j ACCEPT
sudo iptables -I INPUT 1 -p udp -s 2.2.2.2 --dport 9898 -j ACCEPT

# Заблокируйте соединения для порта 9898 (порт Promiteus) от всех остальных IP-адресов:
sudo iptables -I INPUT 2 -p tcp --dport 9898 -j DROP
sudo iptables -I INPUT 2 -p udp --dport 9898 -j DROP

Внимание: все мы можем совершать ошибку, если что-то пошло не так и вы потеряли доступ к серверу, выполните перезагрузку. Если Вы применили шаги ниже, перезагрузка сервера не поможет.

Шаги для сохранения правил iptables , использование iptables-persistent (для Debian/Ubuntu)

sudo apt install iptables-persistent -y

Во время установки вам предложат сохранить текущие правила для IPv4 и IPv6. Выберите "Yes" для сохранения.

Чтобы вручную сохранить правила в будущем, выполните:

sudo netfilter-persistent save

Теперь ваши правила будут автоматически применяться после перезагрузки.

Перезагружаем сервер и проверяем, что работает автоматическая установка правил.


Спасибо за внимание к материалу! Надеюсь, информация оказалась полезной для вас! Поздравляю с новым достижением!


Если материал оказался полезным и вы хотите поддержать мою работу, буду рад вашему донату. Любая помощь вдохновляет на создание нового контента! Спасибо за вашу поддержку!


ПОЛЕЗНЫЕ ССЫЛКИ

В этом ОГЛАВЛЕНИИ собраны и структурированы все материалы.

About & Contact || Услуги || Donate || Отказ от ответственности | ©