Пошаговая установка сервера сбора логов Graylog на CentOS

Содержимое частично честно взято из статьи ITsoft на хабре: Как мы работаем с логами (сбор, хранение, анализ при помощи Graylog все движения повторены и внесены небольшие пометки на основе собственного опыта.

В статье используется урл graylog.youriteam.ru для примера. Обязательно проверьте, что нигде его не использовали, а писали свой адрес

Установка и базовые настройки Graylog

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

Установка — обычный процесс, описанный почти везде. Нам потребуется виртуальный сервер с CentOS и компонентами ElasticSearch, ModgoDB, Graylog4, но тем не менее, засады нас там ждут.

В примере используем CentOS 8.

Prerequisites

Хорошая привычка — проверить правильность настройки таймзоны и имени.

# timedatectl 
# hostnamectl

Если что-то не так — устанавливаем так как нужно, например:

# timedatectl set-timezone Europe/Moscow
# hostnamectl set-hostname graylog.youriteam.ru

Обновления обязательны, также установим пакеты для удобства работы, top-ы, etc.

# dnf upgrade --refresh 
# dnf install epel-release 
# dnf update epel-release 
# dnf -y install nc mc vim atop iftop htop mytop iotop pciutils dos2unix tar lbzip2 zip unzip bash-completion python36 tmux screen telnet wget fail2ban cockpit pwgen

Cockpit — веб-интерфейс управления сервером

(опционально)

# systemctl enable --now cockpit.socket 
# systemctl start cockpit проверяем 
# systemctl status cockpit
  cockpit.service - Cockpit Web Service Loaded: loaded (/usr/lib/systemd/system/cockpit.service; static; vendor preset: disabled) Active: active (running) since Tue 2021-04-27 12:18:42 MSK; 4s ago

Установим SSL-сертификат

смотрим где лежат сертификаты (пока самоподписанные)

# remotectl certificate 

  certificate: /etc/cockpit/ws-certs.d/0-self-signed.cert

кладём crt и key файлы в /etc/cockpit/ws-certs.d/

кокпит сам найдёт файлы с сертификатами (2 файла — серт + ключ, или в одном)

# systemctl restart cockpit 
# remotectl certificate 

  certificate: /etc/cockpit/ws-certs.d/itsoft.crt

Firewall

(настройки будут индивидуальными для вашей сети, все команды даны для примера)

Если не используем ipv6 — лучше отключить:

# firewall-cmd --remove-service=dhcpv6-client

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

# firewall-cmd --permanent --new-zone=itsoft 
# firewall-cmd --permanent --zone=itsoft --add-source=100.200.200.0/24

в параметре —add-source= указываем свою подсеть!

Порты (9000 — временно, для веб-интерфейса graylog, 10514 и 5044 для данных):

# firewall-cmd --permanent --zone=itsoft --add-port=9000/tcp 
# firewall-cmd --permanent --zone=itsoft --add-port=10514/tcp 
# firewall-cmd --permanent --zone=itsoft --add-port=10514/udp 
# firewall-cmd --permanent --zone=itsoft --add-port=5044/tcp

Необходимые сервисы:

# firewall-cmd --permanent --zone=itsoft --add-service=https 
# firewall-cmd --permanent --zone=itsoft --add-service=http 
# firewall-cmd --permanent --zone=itsoft --add-service=cockpit

После добавления/удаления перезагрузим сервис:

# firewall-cmd --reload

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

# firewall-cmd --list-all --zone=public 
# firewall-cmd --list-all --zone=itsoft

Проверяем — идём браузером на https://graylog.youriteam.ru:9090

SELinux

(настраиваем, а не отключаем его!!!)

Устанавливаем пакеты, если ещё не установлены, разрешаем апачу подключения:

# dnf -y install policycoreutils policycoreutils-python-utils policycoreutils-python-utils 
# setsebool -P httpd_can_network_connect 1

Проверяем порты 9000, 9200, 27017:

# semanage port -l | egrep '\s(9000|9200|27017)' 

  http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 
  mongod_port_t tcp 27017-27019, 28017-28019 
  wap_wsp_port_t tcp 9200 
  wap_wsp_port_t udp 9200

Небольшая проблема, если попытаемся добавить тип для порта 9200, получим ошибку — порт уже определён:

# semanage port -a -t http_port_t -p tcp 9200 
  ValueError: Port tcp/9200 already defined

Модифицируем запись — добавится локальная и у неё приоритет будет выше, чем у глобальной, но отображаться будут обе:

# semanage port -m -t http_port_t -p tcp 9200 # semanage port -l | egrep '\s(9000|9200|27017)' 
  http_port_t tcp 9200, 80, 81, 443, 488, 8008, 8009, 8443, 9000 
  mongod_port_t tcp 27017-27019, 28017-28019 
  wap_wsp_port_t tcp 9200 
  wap_wsp_port_t udp 9200

Java

# dnf -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

Тест:

# java -version openjdk version "1.8.0_292" 

  OpenJDK Runtime Environment (build 1.8.0_292-b10) 
  OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

Elastic Search

Импортируем ключ репозитория, добавляем конфигурационный файл репозитория, устанавливаем (вместо vim можно использовать nano, mcedit или любой другой редактор по вашему выбору):

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 
# vim /etc/yum.repos.d/elasticsearch.repo 

  [elasticsearch-6.x] 
  name=Elasticsearch repository for 6.x packages
  baseurl=https://artifacts.elastic.co/packages/oss-6.x/yum
  gpgcheck=1
  gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
  enabled=1
  autorefresh=1
  type=rpm-md 

# dnf clean all 
# dnf makecache 
# dnf -y install elasticsearch-oss 

  . . . 
  Installed: elasticsearch-oss-6.8.15-1.noarch

Чтобы Elasticsearch работал с Graylog, необходимо установим имя кластера “graylog”:

# vim /etc/elasticsearch/elasticsearch.yml

В секции — Cluster — меняем параметр:

cluster.name: graylog

В секции — Various — добавляем последней строкой:

action.auto_create_index: false

Запускаем:

# systemctl daemon-reload 
# systemctl enable --now elasticsearch 

  Synchronizing state of elasticsearch.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
  Executing: /usr/lib/systemd/systemd-sysv-install enable elasticsearch
  Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.

Проверяем:

# systemctl status elasticsearch 

  elasticsearch.service - Elasticsearch 
  Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
  Active: active (running) since Tue 2021-04-27 12:51:50 MSK; 17s ago

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

# ss -ntlp | grep java

  LISTEN 0 128 [::ffff:127.0.0.1]:9200 *:* users:(("java",pid=61586,fd=166))
  LISTEN 0 128 [::1]:9200 [::]:* users:(("java",pid=61586,fd=165))
  LISTEN 0 128 [::ffff:127.0.0.1]:9300 *:* users:(("java",pid=61586,fd=139))
  LISTEN 0 128 [::1]:9300 [::]:* users:(("java",pid=61586,fd=137))

Файлы Elasticsearch расположены здесь:

Configuration: /etc/elasticsearch 
JVM settings: /etc/default/elasticsearch 
Data files: /var/lib/elasticsearch/data 
Log files: /var/log/elasticsearch/

Проверяем:

# curl -X GET http://localhost:9200 

  {
   "name" : "M_ysIuG",
   "cluster_name" : "graylog",
   "cluster_uuid" : "CzqgacNrQ5SfByXz85v0wg",
   ... 

# curl -XGET 'http://localhost:9200/_cluster/health?pretty=true' 
  { 
   "cluster_name" : "graylog", 
   "status" : "green", 
   ...

MongoDB

Добавляем конфигурационный файл репозитория:

# vim /etc/yum.repos.d/mongodb-org-4.4.repo 

  [mongodb-org-4.4] 
  name=MongoDB Repository 
  baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ 
  gpgcheck=1 
  enabled=1 
  gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc 

# dnf -y install mongodb-org 
# systemctl enable --now mongod

Проверяем:

# systemctl status mongod.service 

  mongod.service - MongoDB Database Server 
  Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled) 
  Active: active (running) since Tue 2021-04-27 12:59:36 MSK; 5s ago
Файлы MongoDB расположены здесь:
Configuration /etc/mongod.conf 
Data files /var/lib/mongodb/ 
Log files /var/log/mongodb/

Graylog

Ссылки на оригинальную документацию:

RPM / YUM / DNF

CentOS installation

# dnf -y install https://packages.graylog2.org/repo/packages/graylog-4.0-repository_latest.rpm 
# dnf -y install graylog-server graylog-enterprise-plugins graylog-integrations-plugins graylog-enterprise-integrations-plugins

Graylog не запускается самостоятельно (об этом есть сообщение в процессе установки).

Сначала настраиваем, потом пробуем запускать.

Генерируем хеш пароля:

# pwgen -N 1 -s 96 

  XzN25fRfHv7NGbVODAGDcRWhzd6QAQQa11RXLIVgSXCgaDZexaxE4VlLA1abmEQjN25BlRVyEp3LNhN6HcJL8GYjV3RQgwkA 

# echo -n MyPassword123 | sha256sum 

  bc7b8851671f2fda237a53f5057a0376037b6d062e65f965c62aa1d047498759 - 

# pwgen -N 1 -s 96 

  g3SpB…...5x7U 

# echo -n YourPassword | sha256sum

  7b2f50…..b28d0 - 

# vim /etc/graylog/server/server.conf 

  is_master = true password_secret = XzN25fRfHv7NEQ...8GYjV3RQgwkA 
  root_username = admin 
  root_password_sha2 = bc7b88516...1d047498759 
  root_email = “admin@youiteam.ru” 
  root_timezone = Europe/Moscow

не забываем заменить: YourPassword, admin@youiteam.ru, ну и подставить сгенерированные секрет и хэш пароля

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

rotation_strategy = count 
elasticsearch_max_docs_per_index = 20000000 
elasticsearch_max_number_of_indices = 20 
elasticsearch_shards = 1 
elasticsearch_replicas = 0 
http_bind_address = 0.0.0.0:9000 
http_publish_uri = https://graylog.youriteam.ru:9000/

Также полезно будет настроить Email transport:

transport_email_enabled = true 
transport_email_protocol = smtp 
transport_email_hostname = mail.youriteam.ru 
transport_email_port = 25 
transport_email_use_auth = true 
transport_email_use_tls = false 
transport_email_use_ssl = false 
transport_email_auth_username = graylog@youriteam.ru 
transport_email_auth_password = YourMailPassword 
transport_email_subject_prefix = [graylog4] 
transport_email_from_email = graylog@youriteam.ru 
transport_email_from_name = Graylog4

не забываем заменить: mail.youriteam.ru, YourMailPassword, graylog@youiteam.ru

Регистрируемся и заходим в панель:

https://www.maxmind.com/en/account/login

Download files → В секции GeoLite2 City → Get Permalinks (1, 2)

# Database URL

https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=YOUR_LICENSE_KEY&suffix=tar.gz

# SHA256 URL

https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=YOUR_LICENSE_KEY&suffix=tar.gz.sha256

В Services → Manage License Keys (3)

Нажимаем «Generate new license key» создастся новый License Key. На email придёт уведомление о создании ключа.

Лицензия активируется в течение 5 минут.

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

# wget --content-disposition 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=xxxxxxxxxx&suffix=tar.gz' 
# wget --content-disposition 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=xxxxxxxxxx&suffix=tar.gz.sha256'

Проверяем целостность архива:

# sha256sum -c GeoLite2-City_20210427.tar.gz.sha256 

  GeoLite2-City_20210427.tar.gz: OK

Устанавливаем:

# tar zxfv GeoLite2-City_20210427.tar.gz 
# mv GeoLite2-City_20210427/GeoLite2-City.mmdb /etc/graylog/server/

Установка GeoLite2 Database выполнена.

Запускаем Graylog:

# systemctl daemon-reload 
# systemctl enable --now graylog-server.service

Немного ждём, затем смотрим логи запуска:

# tail /var/log/graylog-server/server.log 

  ...
  2021-04-27T15:44:36.005+03:00 INFO [ServerBootstrap] Graylog server up and running.

Если видим ошибки:

ERROR [AuditLogger] Unable to write audit log entry because there is no valid license.

это нормально.

Возникают из-за того что установлена версия Enterprise, но нет соответствующей лицензии.

Заходим браузером, проверяем что веб-интерфейс доступен, можем залогиниться в веб-интерфейс:

https://graylog.youriteam.ru:9000

user: admin

pass: MyPassword123

Нас встречает мини-учебник по настройке:

NGINX

# vim /etc/yum.repos.d/nginx.repo 

  [nginx-stable] 
  name=nginx stable repo 
  baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ 
  gpgcheck=1
  enabled=1
  gpgkey=https://nginx.org/keys/nginx_signing.key
  module_hotfixes=true 

  [nginx-mainline]
  name=nginx mainline repo 
  baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
  gpgcheck=1
  enabled=0
  gpgkey=https://nginx.org/keys/nginx_signing.key
  module_hotfixes=true 

# dnf config-manager --enable nginx-mainline 
# dnf -y install nginx 

  Installed: nginx-1:1.20.0-1.el8.ngx.x86_64

Создаём конфиг nginx, размещаем файлы сертификатов в /etc/nginx/ssl (у нас будут в одном файле сертификат + ключ):

# vim /etc/nginx/conf.d/graylog.conf 

  server 
  {
  listen 80 default_server;
  server_name graylog.youriteam.ru;
  return 301 https://$host$request_uri; 
  }

  server
  {
  listen 443 ssl http2;
  server_name graylog.youriteam.ru;
  access_log /var/log/nginx/graylog_access.log;
  error_log /var/log/nginx/graylog_error.log;
  ssl_certificate /etc/nginx/ssl/star_itsft.crt;
  ssl_certificate_key /etc/nginx/ssl/star_itsft.crt;
  ssl_session_timeout 1d;
  ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
  ssl_session_tickets off;

  # Supports Firefox 27, Android 4.4.2, Chrome 31, Edge, IE 11 on Windows 7,
  # Java 8u31, OpenSSL 1.0.1, Opera 20, and Safari 9 and above
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers off;

  # HSTS (ngx_http_headers_module is required) (63072000 seconds)
  add_header Strict-Transport-Security "max-age=63072000" always;
 
  # OCSP stapling
  ssl_stapling on;
  ssl_stapling_verify on;
 
  location / 
  {
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Graylog-Server-URL https://$server_name/;
  proxy_pass http://127.0.0.1:9000;
  }
  }
 
  # systemctl enable nginx
  # systemctl start nginx
  # systemctl status nginx 
 
  nginx.service - nginx - high performance web server
  Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
  Active: active (running) since Tue 2021-04-27 17:12:52 MSK; 6s ago

Немного реконфигурируем Graylog:

# vim /etc/graylog/server/server.conf

  http_bind_address = 127.0.0.1:9000
  http_publish_uri = https://graylog.youriteam.ru/

# systemctl restart graylog-server.service

Теперь Graylog слушает только на локалхосте, если открывали порт 9000, то необходимости в нём больше нет:

# firewall-cmd --permanent --zone=itsoft --remove-port=9000/tcp
# firewall-cmd --reload

Размер БД

Установим размер индекса, так как виртуальный сервер имеет ограниченный объём диска.

System → Indices → Default index set → Edit

В Index Rotation Configuration:

Select rotation strategy - Index Size

Max size per index - 4294965097 (4GiB)

В Index Retention Configuration:

Select retention strategy - Delete Index

Max number of indices - 8

Итого общий размер индексов будет не более 32GiB