iRWX.RU

Personal IT notes.

Linux: Syslog сервер «под ключ». Пошаговая настройка.

Данная статья описывает настройку Syslog сервера уровня крупного предприятия, но если у Вас собираются гигабайты логов в сутки, то стоит искать информацию по Logstash, Elasticsearch, Graylog и т.д.

Конфигурация сервера:
CPU — Xeon E5335
ОЗУ — 6Gb
HDD — 100Gb
ОС — Ubuntu Server
IP сервера — 10.1.1.52

Поехали!

Настройка синхронизации времени

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

sudo apt-get install ntp

— Настраиваем ntpd:

Добавляем локальные NTP сервера в /etc/ntp.conf

sudo nano /etc/ntp.conf
pool 10.1.1.11 iburst
pool 10.1.1.19

— Применяем настройки:

sudo service ntp restart

Установка и настройка MySQL

— Устанавливаем Percona Server по инструкции разработчика:

https://www.percona.com/doc/percona-server/5.7/installation/apt_repo.html

— Перезагружаем сервер:

sudo reboot

— Настраиваем Percona Server:

sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf_old
sudo cp /etc/mysql/percona-server.conf.d/mysqld.cnf /etc/mysql/my.cnf
sudo nano /etc/mysql/my.cnf

— Содержание /etc/mysql/my.cnf для сервера с 6Gb ОЗУ:

[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock

# PATHS
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /dev/shm
lc-messages-dir = /usr/share/mysql
explicit_defaults_for_timestamp

local-infile = 0

# NETWORK
bind-address = 127.0.0.1
port = 3306
connect_timeout = 60
wait_timeout = 28800
max_connections = 2048
max_allowed_packet = 64M
max_connect_errors = 1000

# LOGS
log_error = /var/log/mysql/error.log
slow_query_log_file = /var/log/mysql/slow.log
slow_query_log = 1
long_query_time = 20

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_ALL_TABLES

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# limits
tmp_table_size = 256M
max_heap_table_size = 128M

# innodb
innodb_data_home_dir = /var/lib/mysql
innodb_file_per_table = 1
innodb_status_file = 1
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 8
innodb_flush_method = O_DIRECT
innodb_io_capacity = 800
innodb_flush_log_at_trx_commit = 0
innodb_support_xa = ON
innodb_log_file_size = 128M
innodb_log_buffer_size = 64M

# other stuff
sync_binlog = 0
event_scheduler = 1
query_cache_type = 0
query_cache_size = 0

— Применяем настройки:

sudo service mysql restart

Настройка rsyslog

— Добавляем поддержку записи в MySQL для сервиса rsyslog:

sudo apt-get install rsyslog-mysql

Отвечаем на вопросы инсталлятора:
Задаем пароль пользователя rsyslog в MySQL.
Вводим пароль администратора MySQL.

В итоге получаем настроенную БД для rsyslog:
Имя БД — Syslog
Пользователь БД Syslog — rsyslog
Пароль пользователя rsyslog — тот что указали при установке rsyslog-mysql

Хранятся настройки доступа rsyslog к MySQL в /etc/rsyslog.d/mysql.conf

На данном этапе сервис rsyslog загружается раньше сервиса MySQL. В логах после перезагрузки сервера можно увидеть следующие ошибки:

Mar 2 15:53:34 s00-syslog rsyslogd: db error (2002): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) [v8.16.0]
Mar 2 15:53:34 s00-syslog rsyslogd-2007: action 'action 7' suspended, next retry is Thu Mar 2 15:54:04 2017 [v8.16.0 try http://www.rsyslog.com/e/2007 ]

— Изменение порядка загрузки сервисов rsyslog и MySQL:

sudo nano /etc/systemd/system/syslog.service

Добавим в настройки сервиса строку After=mysql.service

[Unit]
Description=System Logging Service
Requires=syslog.socket
# =====================
After=mysql.service
# =====================
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/

[Service]
Type=notify
ExecStart=/usr/sbin/rsyslogd -n
StandardOutput=null
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=syslog.service

— Разрешаем прием логов по UDP и TCP протоколам.

Раскоментируем следующие строки в /etc/rsyslog.conf

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

— Применим настройки rsyslog:

sudo service rsyslog restart

— Проверяем состояние сетевых портов:

sudo netstat -tulpan | grep 514

tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 13113/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 13113/rsyslogd
udp 0 0 0.0.0.0:514 0.0.0.0:* 13113/rsyslogd
udp6 0 0 :::514 :::* 13113/rsyslogd

— Настройка фильтрации сообщений rsyslog:

По умолчанию абсолютно все логи пишутся в /var/log/syslog и в MySQL. Запись в локальный файл сообщений, например, от сетевого оборудования меня не устраивает, поэтому отфильтруем входящие сообщения.

Закомментируем в /etc/rsyslog.d/50-default.conf строку для всех сообщений — «*.*» и отфильтруем по источнику (Facility):

#*.* /var/log/syslog
cron,daemon,lpr,mail,mark,news,syslog,user,uucp.* /var/log/syslog

— Применим сделанные настройки rsyslog:

sudo service rsyslog restart

Теперь в /var/log/syslog пишутся все сообщения, кроме local0…local7.

Настройка Loganalyzer

— Устанавливаем Apache2 и PHP:

sudo apt-get install apache2 apache2-utils php php-mysql
sudo apt-get install libapache2-mod-php7.0

— Настраиваем временную зону в PHP:

sudo nano /etc/php/7.0/cli/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Samara

— Применяем настройки:

sudo service apache2 restart

— Создадим в MySQL пользователя loganalyzer с правами чтения базы Syslog:

mysql -u root -p
CREATE USER 'loganalyzer'@'localhost' IDENTIFIED BY 'p@$$w0rD';
GRANT SELECT ON Syslog.* TO 'loganalyzer'@'localhost';
FLUSH PRIVILEGES;

Можно пропустить этот пункт и использовать пользователя rsyslog для доступа loganalyzer к MySQL. Это позволит использовать многопользовательский режим в loganalyzer, но в тоже время дает слишком большие права к базе, что не безопасно.

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

cd ~
wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.5.tar.gz
tar -xzf loganalyzer-4.1.5.tar.gz
sudo cp -r ~/loganalyzer-4.1.5/src/ /var/www/html/
sudo mv /var/www/html/src/ /var/www/html/loganalyzer

— Создаем файл конфигурации loganalyzer и даем ему права:

sudo touch /var/www/html/loganalyzer/config.php
sudo chown www-data /var/www/html/loganalyzer/config.php
sudo chmod 600 /var/www/html/loganalyzer/config.php

— Открываем в браузере адрес Loganalyzer:

http://10.1.1.52/loganalyzer

Проверка разрешений на файл конфигурации Loganalyzer:

Указываем БД Syslog, пользователя loganalyzer. Обратите внимание на Database Tablename — регистр важен.

Настройка завершена.

Доработка напильником:

Включение SSL

— Создадим сертификаты:

sudo mkdir /etc/apache2/certs
cd /etc/apache2/certs

sudo openssl req -new -x509 -days 3650 -sha1 -newkey rsa:2048 -nodes -keyout server.key -out server.crt
sudo chmod 0600 server.key

— Включаем поддержку SSL в Apache2:

sudo a2enmod ssl
sudo a2enmod alias
sudo service apache2 restart

— Добавим в конфигурацию /etc/apache2/sites-available/default-ssl.conf пути к сертификатам:

SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/apache2/certs/server.crt
SSLCertificateKeyFile /etc/apache2/certs/server.key

— Включаем сайт:

sudo a2ensite default-ssl
sudo service apache2 restart

— Настроим редирект с http на https:

Добавим в конфигурацию /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
  Redirect / https://10.1.1.52/loganalyzer/
</VirtualHost>

— Применяем настройки:

sudo service apache2 restart

Закроем доступ к сайту Loganalyzer паролем

— Создадим файл htaccess

sudo nano /var/www/html/loganalyzer/.htaccess

и добавим следующее содержание:

AuthName "Need password"
AuthType Basic
AuthUserFile /etc/apache2/.htpasswd.loganalyzer
require valid-user

— Добавим пользователя в указанный файл /etc/apache2/.htpasswd.loganalyzer

sudo htpasswd -c /etc/apache2/.htpasswd.loganalyzer user
New password:
Re-type new password:
Adding password for user user

— Добавим поддержку htaccess для сайта:

В файл etc/apache2/sites-available/default-ssl.conf добавим следующие строки:

<Directory /var/www/html/loganalyzer>
  AllowOverride ALL
</Directory>

— Применяем настройки:

sudo service apache2 restart

Очистка БД Syslog от устаревших записей

Для примера, настроим хранение истории в БД Syslog 14 дней, выполнять очистку БД — каждые 7 дней. Время выполнения задания не принципиально.

— Создадим задание планировщика для БД Syslog с названием syslog_housekeeper:

mysql -u root -p
mysql> use Syslog;
mysql>
CREATE EVENT `syslog_housekeeper`
ON SCHEDULE EVERY 7 DAY STARTS CURRENT_TIMESTAMP
ON COMPLETION NOT PRESERVE
ENABLE
DO
DELETE FROM Syslog.SystemEvents WHERE ReceivedAt < DATE_SUB(NOW(), INTERVAL 14 DAY);

PS

Для борьбы с ошибками в логах:

Could not open output pipe '/dev/xconsole':: No such file or directory [v8.16.0 try http://www.rsyslog.com/e/2039 ]

Закомментировать в /etc/rsyslog.d/50-default.conf строки:

#daemon.*;mail.*;\
# news.err;\
# *.=debug;*.=info;\
# *.=notice;*.=warn |/dev/xconsole

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *