0711
This commit is contained in:
316
src/content/blog/09-graylog.md
Normal file
316
src/content/blog/09-graylog.md
Normal file
@@ -0,0 +1,316 @@
|
||||
---
|
||||
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`.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user