Данная статья описывает настройку 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