317 lines
15 KiB
Markdown
317 lines
15 KiB
Markdown
---
|
||
title: 'Graylog'
|
||
summary: 'Краткое руководство по установки Graylog'
|
||
date: '11 07 2024'
|
||
draft: false
|
||
tags:
|
||
- Graylog
|
||
- log
|
||
---
|
||
|
||
# Введение
|
||
Graylog — это платформа с открытым исходным кодом, предназначенная для управления логами. Она собирает и извлекает важные данные из логов сервера, которые обычно отправляются с помощью протокола Syslog.
|
||
|
||
## Возможности Graylog:
|
||
|
||
- Поиск и визуализация логов в веб-интерфейсе.
|
||
- Настройка фильтрации и поиска логов.
|
||
- Мониторинг и отправка оповещений.
|
||
- Graylog позволяет отправлять логи и журналы событий с сотен сетевых устройств, включая серверы на Linux, Windows, сетевые устройства и другое оборудование.
|
||
|
||
## Архитектура Graylog
|
||
Стек Graylog включает следующие компоненты:
|
||
|
||
- Сервер Graylog — веб-интерфейс для визуализации и настройки.
|
||
- MongoDB — используется для хранения метаданных.
|
||
- ElasticSearch или его форк OpenSearch — для хранения и полнотекстового поиска в структурированных и неструктурированных логах.
|
||
- Java (OpenJDK) — среда выполнения для OpenSearch (Elasticsearch).
|
||
Мы будем использовать стек OpenSearch для хранения журналов, который является бесплатным аналогом стека ELK (Elasticsearch + Logstash + Kibana).
|
||
|
||
## Причины выбора Graylog
|
||
- Распространенность и проверенность временем.
|
||
- Открытый исходный код.
|
||
- Бесплатная версия включает все необходимое.
|
||
- Минимальный функционал, оптимальный для наших задач.
|
||
- "Из коробки" решение требует минимальных настроек.
|
||
- Низкая ресурсоемкость по сравнению с ELK.
|
||
|
||
# Подготовка сервера
|
||
|
||
| Параметры | Значения |
|
||
|------------------------|-----------------|
|
||
| Кол-во ядер процессора | 4 CPU |
|
||
| Размер ОЗУ | 8 GB |
|
||
| Размер DISK | 90 GB |
|
||
| Сетевой интерфейс |2 eth / 2 подсети|
|
||
|
||
Для стабильной работы используйте следующие версии
|
||
| Дистрибутив| Версия |
|
||
|------------|--------|
|
||
| Debian | 12 |
|
||
| MongoDB | 6.0 |
|
||
| Graylog | 5.2 |
|
||
| OpenSearch | 2.17 |
|
||
|
||
Проверьте архитектуру системы, поскольку MongoDB 6.0 поддерживает только x64 Debian:
|
||
```sh
|
||
uname -m
|
||
# Нужно получить
|
||
# x86_64
|
||
```
|
||
Авторизуемся под рутом
|
||
```sh
|
||
su -
|
||
Password:
|
||
```
|
||
Устанавливаем sudo
|
||
```sh
|
||
apt install sudo
|
||
# Сразу добавим пользователю права на будущее
|
||
nano /etc/sudoers
|
||
```
|
||
Ниже этой строки пользователя root добавляем своего `<username> ALL=(ALL:ALL) ALL`
|
||
```sh
|
||
# User privilege specification
|
||
root ALL=(ALL:ALL) ALL
|
||
<username> ALL=(ALL:ALL) ALL
|
||
```
|
||
### Настройка часового пояса (если не указано при установке ОС)
|
||
```sh
|
||
timedatectl set-timezone Asia/Yakutsk
|
||
```
|
||
## Установка необходимых пакетов
|
||
```sh
|
||
# Обновляем пакеты
|
||
apt update -y && apt upgrade -y && apt dist-upgrade -y
|
||
# Устанавливаем целевые пакеты
|
||
apt install -y net-tools mc htop git wget curl make gcc neofetch lsb-release ca-certificates gnupg gnupg2 tar lbzip2 zip unzip screen pwgen
|
||
```
|
||
Так же рекомендуется воспользоваться настройками для начальной защиты сервера на Linux
|
||
|
||
Если вы настроили firewalld то дополните настройки:
|
||
```sh
|
||
# Если не используем ipv6 - лучше отключить:
|
||
firewall-cmd --remove-service=dhcpv6-client
|
||
# Добавляем порты в файрвол
|
||
firewall-cmd --permanent --add-port=9000/tcp
|
||
firewall-cmd --permanent --add-port=514/tcp
|
||
firewall-cmd --permanent --add-port=514/udp
|
||
firewall-cmd --permanent --zone=itsoft --add-service=https
|
||
firewall-cmd --permanent --zone=itsoft --add-service=http
|
||
# После добавления/удаления перезагрузим сервис:
|
||
firewall-cmd --reload
|
||
```
|
||
Настойка neofetch
|
||
```sh
|
||
# Первый запуск для создания ~/.config/neofetch/config.conf
|
||
neofetch
|
||
# Далее добавляем в .bashrc в самый конец файла
|
||
echo "neofetch" >> ~/.bashrc
|
||
# Далее идем редактировать конфиг
|
||
nano ~/.config/neofetch/config.conf
|
||
```
|
||
Я использую вот такие параметры для вывода минимально необходимого при подключении к серверу.
|
||
```sh
|
||
print_info() {
|
||
info title
|
||
info underline
|
||
|
||
info "OS" distro
|
||
info "Host" model
|
||
info "Kernel" kernel
|
||
info "Uptime" uptime
|
||
#info "Packages" packages
|
||
info "Shell" shell
|
||
#info "Resolution" resolution
|
||
#info "DE" de
|
||
#info "WM" wm
|
||
#info "WM Theme" wm_theme
|
||
#info "Theme" theme
|
||
#info "Icons" icons
|
||
info "Terminal" term
|
||
info "Terminal Font" term_font
|
||
info "CPU" cpu
|
||
#info "GPU" gpu
|
||
info "Memory" memory
|
||
|
||
# info "GPU Driver" gpu_driver # Linux/macOS only
|
||
# info "CPU Usage" cpu_usage
|
||
info "Disk" disk
|
||
# info "Battery" battery
|
||
# info "Font" font
|
||
# info "Song" song
|
||
# [[ "$player" ]] && prin "Music Player" "$player"
|
||
info "Local IP" local_ip
|
||
# info "Public IP" public_ip
|
||
# info "Users" users
|
||
# info "Locale" locale # This only works on glibc systems.
|
||
|
||
#info cols
|
||
}
|
||
```
|
||
### Установка MongoDB 6
|
||
```sh
|
||
# Добавление публичного ключа:
|
||
curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor
|
||
# Добавление репозитория:
|
||
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg] http://repo.mongodb.org/apt/debian bullseye/mongodb-org/6.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
|
||
# Обновление локальной базы пакетов:
|
||
sudo apt-get update
|
||
# Установка MongoDB:
|
||
sudo apt-get install -y mongodb-org
|
||
```
|
||
Если при установке вы получили сообщение об unmet dependencies
|
||
```sh
|
||
The following packages have unmet dependencies:
|
||
mongodb-org-mongos : Depends: libssl1.1 (>= 1.1.1) but it is not installable
|
||
mongodb-org-server : Depends: libssl1.1 (>= 1.1.1) but it is not installable
|
||
```
|
||
выполните следующие команды:
|
||
```sh
|
||
sudo wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
|
||
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
|
||
```
|
||
И повторяем установку `mongodb-org`
|
||
```sh
|
||
sudo apt-get install -y mongodb-org
|
||
```
|
||
Запуск сервиса MongoDB:
|
||
```sh
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable mongod.service
|
||
sudo systemctl restart mongod.service
|
||
# Посмотреть статус сервиса
|
||
sudo systemctl --type=service --state=active | grep mongod
|
||
```
|
||
### Переходим к развёртыванию OpenSearch
|
||
```sh
|
||
# Добавление публичного ключа для OpenSearch:
|
||
curl -o- https://artifacts.opensearch.org/publickeys/opensearch.pgp | sudo gpg --dearmor --batch --yes -o /usr/share/keyrings/opensearch-keyring
|
||
# Добавление репозитория OpenSearch:
|
||
echo "deb [signed-by=/usr/share/keyrings/opensearch-keyring] https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/apt stable main" | sudo tee /etc/apt/sources.list.d/opensearch-2.x.list
|
||
# Обновление локальной базы пакетов:
|
||
sudo apt-get update
|
||
```
|
||
Установка OpenSearch с генерацией пароля администратора:
|
||
```sh
|
||
sudo OPENSEARCH_INITIAL_ADMIN_PASSWORD=$(tr -dc A-Z-a-z-0-9_@#%^-_=+ < /dev/urandom | head -c${1:-32}) apt-get install opensearch
|
||
```
|
||
### Настройка OpenSearch
|
||
```sh
|
||
# Редактирование конфигурации OpenSearch:
|
||
sudo nano /etc/opensearch/opensearch.yml
|
||
```
|
||
|
||
```sh
|
||
cluster.name: graylog
|
||
node.name: ${HOSTNAME}
|
||
path.data: /var/lib/opensearch
|
||
path.logs: /var/log/opensearch
|
||
network.host: 0.0.0.0
|
||
# Добавляем в параметров перед plugins
|
||
discovery.type: single-node
|
||
action.auto_create_index: false
|
||
plugins.security.disabled: true
|
||
indices.query.bool.max_clause_count: 32768
|
||
```
|
||
Настройка параметров Java:
|
||
```sh
|
||
sudo nano /etc/opensearch/jvm.options
|
||
```
|
||
В параметрах `Xms` и `Xmx` установите половину объема ОЗУ сервера. Например, для сервера с 8 ГБ укажите:
|
||
```sh
|
||
-Xms4g
|
||
-Xmx4g
|
||
```
|
||
Изменение параметров виртуальной памяти:
|
||
```sh
|
||
sudo sysctl -w vm.max_map_count=262144
|
||
sudo echo 'vm.max_map_count=262144' >> /etc/sysctl.conf
|
||
```
|
||
Запуск OpenSearch:
|
||
```sh
|
||
sudo systemctl enable --now opensearch
|
||
```
|
||
### Установка Graylog
|
||
Есть две версии Graylog: бесплатная Graylog Open и enterprise версия Graylog Operations, доступная по подписке.
|
||
```sh
|
||
wget https://packages.graylog2.org/repo/packages/graylog-5.2-repository_latest.deb
|
||
sudo dpkg -i graylog-5.2-repository_latest.deb
|
||
sudo apt-get update && sudo apt-get install graylog-server
|
||
```
|
||
Сгенерируйте пароли для двух переменных password_secret и root_password_sha2, без которых Graylog не запустится.
|
||
|
||
Пароль password_secret должен содержать минимум 64 символа:
|
||
```sh
|
||
pwgen -N 1 -s 96
|
||
# Получаем сгенерированный пароль
|
||
XzN25fRfHv7NGbVODAGDcRWhzd6QAQQa11RXLIVgSXCgaDZexaxE4VlLA1abmEQjN25BlRVyEp3LNhN6HcJL8GYjV3RQgwkA
|
||
# Отправляем пароль для получения HEX ключа
|
||
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
|
||
```
|
||
Скопируйте полученные значения password_secret и root_password_sha2 в файл `/etc/graylog/server/server.conf`.
|
||
```sh
|
||
password_secret = <сгенерированный_пароль>
|
||
root_password_sha2 = <HEX_ключа>
|
||
http_bind_address = <IP_адрес_сервера>:9000
|
||
```
|
||
Запустите сервер graylog:
|
||
```sh
|
||
sudo systemctl enable --now graylog-server
|
||
sudo systemctl status graylog-server
|
||
```
|
||
### настройка Graylog
|
||
Теперь нужно посмотреть логи сервера GrayLog, там вы обнаружите интересное сообщение:
|
||
```sh
|
||
cat /var/log/graylog-server/server.log
|
||
# Получаем лог
|
||
It seems you are starting Graylog for the first time. To set up a fresh install, a setup interface has been started. You must log in to it to perform the initial configuration and continue.
|
||
Initial configuration is accessible at 0.0.0.0:9000, with username 'admin' and password 'eDluAYfeaX'.
|
||
Try clicking on http://admin:eDluAYfeaX@0.0.0.0:9000
|
||
```
|
||
Видна ссылка для первого входа по временному паролю `http://admin:eDluAYfeaX@0.0.0.0:9000`
|
||
В первый раз нужно зайти под временным паролем, который указан в лог файле. Воспользуйтесь простым мастером начальной конфигурации. Режим Graylog data node используется для настройки OpenSearch кластера из нескольких нод. Для простой конфигурации из одного сервера логов, этот этап можно пропустить.
|
||
После первой настройки рекомендуется создать отдельного пользователя в `System -> Users and Teams`, назначив ему роль admin. Некоторые настройки встроенного администратора нельзя кастомизировать, поэтому лучше работать под отдельным пользователя. Назначьте пользователю роль `admin` и задайте email адрес.
|
||
|
||
Создайте сборщики данных в виде Input для разных устройств, например, `Syslog UDP` для Linux. Для каждого класса устройств лучше делать отдельный `input` (Linux сервера, сетевое оборудование, Windows хосты и т.д.).
|
||
|
||
Нужно указать его название, и порт, на котором сервер будет принимать данные. Остальные настройки оставить по-умолчанию.
|
||
|
||
|
||
|
||
Создайте индекс для класса Linux в `System -> Indices`, указав имя и настройки хранения логов.
|
||
|
||
Нужно указать имя, описание и префикс (например `linux_indx` ). Здесь можно также настроить сколько дней нужно хранить старые логи, и когда можно удалять старые индекс, а также максимальный размер индекса.
|
||
|
||
|
||
|
||
Для каждого `input` лучше создать отдельный `Stream`. Так разные сообщений от разных классов устройства будут находится в разных индексах. Перейдите в `Stream -> Create Stream ->` укажите название потока и выберите индекс, который нужно использовать.
|
||
|
||
В настройках `Stream` добавьте новое правило. Правило определят какие логи нужно отнести к этому потоку. В нашем случае выбираем `match input ->` выберите ваш `Linux Input`.
|
||
|
||
|
||
После этого запустите `stream`.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|