Содержимое частично честно взято из статьи 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