Настройка rsyslog для лабы. Сбор логов в отдельный файл.


Настройка rsyslog для лабы. Сбор логов в отдельный файл.

В этом выпуске:

– как настроить сбор логов от внешних устройств на ubuntu;
– как насроить сбор логов в отдельный файл, не в /var/log/syslog
– как настроить ротирование логов от внешних устройств;
– как настроить логирование на cisco роутере;

Подробнее внутри поста.

Стандартно логи собранные rsyslog каждый день переносятся в новый файл, а логирование продолжается в новый файл.
По крону запускается задача, которая создаёт новый файл, архивирует старые файлы и тп. Всего будут храниться файлы за 7 предыдущих дней в стандартных настойках. После нескольких дней всё это выглядит примерно так:
-rw-r--r-- 1 syslog adm 3.3K Jul 27 09:17 syslog
-rw-r--r-- 1 syslog adm 28K Jul 27 06:25 syslog.1
-rw-r--r-- 1 syslog adm 1.9K Jul 26 06:25 syslog.2.gz
-rw-r--r-- 1 syslog adm 607 Jul 25 11:48 syslog.3.gz

Посмотреть подробнее как и почему это работает можно в директории в которой лежат скрипты для Cron которые выполняются ежедневно.
Лежат они в /etc/cron.daily/
alex@srv-vlab-01:/var/log$ ls -la /etc/cron.daily/
total 56
drwxr-xr-x 2 root root 4096 Jul 20 12:47 .
drwxr-xr-x 90 root root 4096 Jul 20 14:45 ..
-rwxr-xr-x 1 root root 376 Mar 31 2016 apport
-rwxr-xr-x 1 root root 1474 Jan 17 2017 apt-compat
-rwxr-xr-x 1 root root 355 May 22 2012 bsdmainutils
-rwxr-xr-x 1 root root 1597 Nov 27 2015 dpkg
-rwxr-xr-x 1 root root 372 May 6 2015 logrotate
-rwxr-xr-x 1 root root 1293 Nov 6 2015 man-db
-rwxr-xr-x 1 root root 539 Jul 16 2014 mdadm
-rwxr-xr-x 1 root root 435 Nov 18 2014 mlocate
-rwxr-xr-x 1 root root 249 Nov 12 2015 passwd
-rw-r--r-- 1 root root 102 Apr 5 2016 .placeholder
-rwxr-xr-x 1 root root 3449 Feb 26 2016 popularity-contest
-rwxr-xr-x 1 root root 214 May 24 2016 update-notifier-common

Там есть файл для работы с логами logrotate:
alex@srv-vlab-01:/var/log$ ls -la /etc/cron.daily/logrotate
-rwxr-xr-x 1 root root 372 May 6 2015 /etc/cron.daily/logrotate

В нём нас интересует последняя строчка запускается сам logrorate и ему передаётся файл с кофигом (/usr/sbin/logrotate /etc/logrotate.conf)
alex@srv-vlab-01:/var/log$ cat /etc/cron.daily/logrotate
#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

Уже в этом файле указано, что должны быть включены инструкции из директории /etc/logrotate.d
alex@srv-vlab-01:/var/log$ cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}

/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}

# system-specific logs may be configured here
И наконец в этой директории есть файлы в которых описано, что нужно делать с каждым конкретным логом.
Стандртный файл для ротирования логов складируемых в /var/log/syslog это файл: /etc/logrotate.d/rsyslog
alex@srv-vlab-01:/var/log$ ls -l /etc/logrotate.d
total 32
-rw-r--r-- 1 root root 126 Jan 10 2017 apport
-rw-r--r-- 1 root root 173 Apr 5 2016 apt
-rw-r--r-- 1 root root 232 Jun 10 2015 dpkg
-rw-r--r-- 1 root root 146 Jan 31 03:47 lxd
-rw-r--r-- 1 root root 173 Jul 20 15:09 mylabdevices_log_rotation
-rw-r--r-- 1 root root 594 Jul 25 11:47 rsyslog
-rw-r--r-- 1 root root 178 Aug 7 2014 ufw
-rw-r--r-- 1 root root 235 Feb 18 2016 unattended-upgrades

Можете подродно его изучить. Я же создал по его аналогии файл для ротирования логов от своих стендов.
Я складываю логи от своих устройст не в общий файл /var/log/syslog куда поумолчанию складываются логи от самого сервера и те логи которые получены от других устройств.

Для складирования логов от других устройтв я создал отдельный файл в директории /var/log. Создал его по аналогии с /var/log/syslog и назвал mylabdevices_log_rotation.
Вот они у меня складываются….
alex@srv-vlab-01:/var/log$ ls -la | grep mylabdevices
-rw-r--r-- 1 syslog adm 3724 Jul 27 11:43 mylabdevices.log
-rw-r--r-- 1 syslog adm 13948 Jul 27 06:25 mylabdevices.log.1
-rw-r--r-- 1 syslog adm 3037 Jul 26 06:25 mylabdevices.log.2.gz
-rw-r--r-- 1 syslog adm 3249 Jul 25 06:25 mylabdevices.log.3.gz
-rw-r--r-- 1 syslog adm 3366 Jul 24 06:25 mylabdevices.log.4.gz
-rw-r--r-- 1 syslog adm 3240 Jul 23 06:25 mylabdevices.log.5.gz
-rw-r--r-- 1 syslog adm 19206 Jul 22 06:25 mylabdevices.log.6.gz
-rw-r--r-- 1 syslog adm 1566 Jul 21 06:25 mylabdevices.log.7.gz

Для их ротирования я скопировал и модифицировал файл для ротирования стандартного syslog. /etc/logrotate.d/rsyslog >>>> mylabdevices_log_rotation
alex@srv-vlab-01:/var/log$ ls -l /etc/logrotate.d/ | grep rsyslog
-rw-r--r-- 1 root root 594 Jul 25 11:47 rsyslog

alex@srv-vlab-01:/var/log$ ls -l /etc/logrotate.d/mylabdevices_log_rotation
-rw-r--r-- 1 root root 173 Jul 20 15:09 /etc/logrotate.d/mylabdevices_log_rotation

Тут как раз начинается история с багами. Можете подробнее почитать по сслыке.

Если кратко – то этот механизм logrotate не всегда работает правильно как для моего созданого файла, так и для стандартного /var/log/syslog. Особенно явно это проблема возникает когда создаётся из файла syslog файл syslog.1, а старый файл удаляется.
По идее система должны создать новый файл syslog для записи новых логов. Но иногда получается так что логи продолжают писаться в старый файл (он по сути переименован в syslog.1, но пишутся они в него, а не в новый syslog).
Либо файл syslog не создаётся и логи вообще теряются…
Для решения проблемы есть несколько трюков. Я добавил следующую команду в скрип для ротирования логов от моих лабораторных девайсов и для файла syslog.
copytruncate
Эта инструкция позволяет оставлять оригинальный файл после его бекапа. Сам оригинальный файл просто обнуляется.
Это позволяет избежать проблем с записью логов в новый syslog.1 или просто потери логов из-за отсутствия нового файла.
alex@srv-vlab-01:/var/log$ cat /etc/logrotate.d/mylabdevices_log_rotation
/var/log/mylabdevices.log
{
rotate 7
copytruncate #<<<<<<<<<<<<<<<<<<<<<<<<<< daily missingok notifempty delaycompress compress postrotate reload rsyslog >/dev/null 2>&1 || true
endscript
}

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

Начнём с сервера.
Я создал файл mylabdevices.log с такими же правами как и файла syslog.
alex@srv-vlab-01:/var/log$ ls -l mylabdevices.log
-rw-r--r-- 1 syslog adm 5496 Jul 27 15:50 mylabdevices.log

Я расскоментировал строки отвечающие за запуск rsyslog на указанных мной портах. Я выбрал стандартный порт 514 для TCP и UDP.
Вообще можно использовать только один из протоколов, я решил попробовать оба. Плюс мой роутер не правильно работает с TCP, это известый баг или фича – не во всех cisco устройствах syslog ведёт себя одинаково.
На catalyst 3750 tcp работает без проблем.
Дополнительно к запуска службы на спец. портах я создал специальное правило для того чтобы сообщения получаемые от внешних устройств падали не в общий файл /var/log/syslog, а в специально созданный мной файл.
Данное правило я подсмотрел на сайте rsyslog. Так что проблем с ним быть не должно.
Дополнительно можно создать правила для более детальной фильтрации сообщений, но мне достаточно простейшего.
alex@srv-vlab-01:/var/log$ cat /etc/rsyslog.conf
# /etc/rsyslog.conf Configuration file for rsyslog.
#
# For more information see
# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf

#################
#### MODULES ####
#################

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
#$ModLoad immark # provides --MARK-- message capability

# ------------------
# My rule to log messages from Lab to separate file.
$Ruleset mylabdevices
*.* /var/log/mylabdevices.log
# switch back to defaylt ruleset
$Ruleset RSYSLOG_DefaultRuleset
# ------------------

# provides UDP syslog reception
$ModLoad imudp
$InputUDPServerBindRuleset mylabdevices
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerBindRuleset mylabdevices
$InputTCPServerRun 514

После того как изменения внесены. Нужно перезапустить службу syslog и проверить, что сервер слушает настроенные порты:
alex@srv-vlab-01:/var/log$ sudo service rsyslog restart

alex@srv-vlab-01:/var/log$ netstat -tulpn | grep 514
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN -
tcp6 0 0 :::514 :::* LISTEN -
udp 0 0 0.0.0.0:514 0.0.0.0:* -
udp6 0 0 :::514 :::* -

Далее нужно настроить ваши устройства на отправку логов на сервер.
На cisco устройствах это делает очень просто. Нужно просто убедиться, что везде открыты правила в Acl
Для дополнительного логирования вводимых пользователями комманд нужно настроить это в разделе archive:
logging source-interface Loopback0
logging 172.30.3.3

archive
log config
logging enable
notify syslog contenttype plaintext
hidekeys
!

Большую часть моих логов занимают сообщения о том, что кто-то пытался подключиться к моему роутеру по ssh.
Если отфильтровать, то можно посмотреть на что-то более интересное.
alex@srv-vlab-01:/var/log$ tail -n 1000 mylabdevices.log
2017-07-27T06:29:22.867403+02:00 cs2811-lab-01 6737: Jul 27 04:29:21.866: %SEC-6-IPACCESSLOGP: list acl_fa0/0_in denied tcp 94.177.215.185(51709) -> x.x.x.x(22), 1 packet
2017-07-27T07:21:51.989575+02:00 cs2811-lab-01 6738: Jul 27 05:21:50.983: %SEC-6-IPACCESSLOGP: list acl_fa0/0_in denied tcp 113.195.145.13(9090) -> x.x.x.x(22), 1 packet
2017-07-27T07:25:01.394587+02:00 cs2811-lab-01 6739: Jul 27 05:25:00.393: %SEC-6-IPACCESSLOGP: list acl_fa0/0_in denied tcp 116.31.116.4(9090) -> x.x.x.x(22), 1 packet
2017-07-27T07:30:47.889189+02:00 cs2811-lab-01 6740: Jul 27 05:30:46.887: %SEC-6-IPACCESSLOGP: list acl_fa0/0_in denied tcp 136.62.165.156(48018) -> x.x.x.x(22), 1 packet
2017-07-27T07:31:47.491086+02:00 cs2811-lab-01 6741: Jul 27 05:31:46.485: %SEC-6-IPACCESSLOGP: list acl_fa0/0_in denied tcp 190.176.85.205(15243) -> x.x.x.x(22), 1 packet
2017-07-27T07:42:34.870861+02:00 cs2811-lab-01 6742: Jul 27 05:42:33.869: %SEC-6-IPACCESSLOGP: list acl_fa0/0_in denied tcp 179.235.91.177(48180) -> x.x.x.x(22), 1 packet
2017-07-27T07:54:20.408888+02:00 cs2811-lab-01 6743: Jul 27 05:54:19.403: %SEC-6-IPACCESSLOGP: list acl_fa0/0_in denied tcp 222.65.48.93(52211) -> x.x.x.x(22), 1 packet

alex@srv-vlab-01:/var/log$ tail -n 1000 mylabdevices.log.1 | grep -v x.x.x.x
2017-07-26T16:46:36.668043+02:00 cs2811-lab-01 6686: Jul 26 14:46:35.665: %PARSER-5-CFGLOG_LOGGEDCMD: User:alex logged command:!exec: enable
2017-07-26T16:54:29.814596+02:00 cs2811-lab-01 6688: Jul 26 14:54:28.812: %PARSER-5-CFGLOG_LOGGEDCMD: User:alex logged command:ip access-list extended acl_fa0/0_in
2017-07-26T16:55:00.015557+02:00 cs2811-lab-01 6691: Jul 26 14:54:59.013: %PARSER-5-CFGLOG_LOGGEDCMD: User:alex logged command:exit
2017-07-26T16:55:20.220054+02:00 cs2811-lab-01 6693: Jul 26 14:55:19.217: %SYS-5-CONFIG_I: Configured from console by alex on vty0 (10.33.52.149)

На этом всё. Подписывайтесь на мой канал. Через Youtube можно задавать вопросы и общаться =)