У меня стояла задача: настроить сжатие логов DNS сервера Unbound, с возможностью удобного сбора этих бэкапов в коллектор. Также требовалось ограничить права доступа, чтобы с коллектора можно было зайти только в дирректорию, где хранятся бэкапы логов. Указанные действия проводил на CentOS 7 Minimal и CentOS 6.6 Minimal.
1) Сперва создаем группу пользователей, для которой будет ограничен доступ только по SFTP:
2) Далее правим конфигурацию ssh:
Требуется в самом конце закомментировать строку
Перезагружаем ssh:
3) Создаем пользователя dnslog, назначаем ему домашнюю папку и права на эту папку. Владелец должен быть root, никто другой не должен иметь прав на запись в эту папку, иначе ничего не получится:
4) Создаем папку, внутри домашней директории нашего пользователя, для которой у logrotate будут права на запись.
Доступ для коллектора организован, теперь можно подключиться по SFTP и проверить, что все работает. Далее настроим ротацию логов:
5) Создаем в папке /etc/logrotate.d/ файл, в котором будут прописаны настройки ротации наших логов.
Настройки примерно такие:
Далее я установил время ротации через крон.
6) В файле /etc/crontab добавил следующую строку:
И перезагружаем крон:
Ротация будет осуществляться каждый час в 23 минуты.
7) В папке /etc/cron.hourly/ создаем файл с любым именем, где пишем скрипт, который будет выполняться при наступлении времени ротации, с таким содержимым:
Вот и все. Логи будут автоматически складываться в папку /home/dnslog/logs/
Проверить настройки ротации можно командой:
Также, стоит отметить, что в Unbound существует два способа ведения логов: средствами Unbound и через syslog. Через syslog — лучший способ, так как не так тормозит работу Unbound. В указанном примере описана ротация логов средствами Unbound. Чтобы настроить логгирование через syslog, в конфигурации Unbound нужно включить параметр:
А также немного переписать файл /etc/logrotate.d/unbound_logrotate
1) Сперва создаем группу пользователей, для которой будет ограничен доступ только по SFTP:
groupadd sftpd
2) Далее правим конфигурацию ssh:
vi /etc/ssh/sshd_config
Требуется в самом конце закомментировать строку
#Subsystem sftp /usr/libexec/openssh/sftp-server
и ограничить доступ для группы пользователей sftpd только по SFTP и только в домашнюю директорию. Для этого нужно добавить в конце следующие строки:Subsystem sftp internal-sftp
Match group sftpd
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Перезагружаем ssh:
service sshd restart
3) Создаем пользователя dnslog, назначаем ему домашнюю папку и права на эту папку. Владелец должен быть root, никто другой не должен иметь прав на запись в эту папку, иначе ничего не получится:
adduser -d /home/dnslog -s /sbin/nologin dnslog -g sftpd
passwd dnslog
chown root /home/dnslog
chmod 750 /home/dnslog
4) Создаем папку, внутри домашней директории нашего пользователя, для которой у logrotate будут права на запись.
mkdir /home/dnslog/logs
chown dnslog /home/dnslog/logs
chmod 775 /home/dnslog/logs
Доступ для коллектора организован, теперь можно подключиться по SFTP и проверить, что все работает. Далее настроим ротацию логов:
5) Создаем в папке /etc/logrotate.d/ файл, в котором будут прописаны настройки ротации наших логов.
vi /etc/logrotate.d/unbound_logrotate
Настройки примерно такие:
/var/log/unbound/unbound.log {
daily
rotate 48
missingok
notifempty
compress
olddir /home/dnslog/logs
size 1024M
postrotate
service rsyslog restart > /dev/null
unbound-control log_reopen #Переоткрываем файл логов, иначе лог не будет писаться после ротации
endscript
}
Далее я установил время ротации через крон.
6) В файле /etc/crontab добавил следующую строку:
23 * * * * root run-parts /etc/cron.hourly
И перезагружаем крон:
service crond restart
Ротация будет осуществляться каждый час в 23 минуты.
7) В папке /etc/cron.hourly/ создаем файл с любым именем, где пишем скрипт, который будет выполняться при наступлении времени ротации, с таким содержимым:
/usr/sbin/logrotate /etc/logrotate.conf
Вот и все. Логи будут автоматически складываться в папку /home/dnslog/logs/
Проверить настройки ротации можно командой:
logrotate -d /etc/logrotate.conf
Также, стоит отметить, что в Unbound существует два способа ведения логов: средствами Unbound и через syslog. Через syslog — лучший способ, так как не так тормозит работу Unbound. В указанном примере описана ротация логов средствами Unbound. Чтобы настроить логгирование через syslog, в конфигурации Unbound нужно включить параметр:
use-syslog: yes
А также немного переписать файл /etc/logrotate.d/unbound_logrotate
/var/log/messages {
daily
rotate 48
missingok
notifempty
compress
size 1024M
olddir /home/dnslog/logs
create
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
chown dnslog /home/dnslog/logs/messages*
chmod 775 /home/dnslog/logs/messages*
endscript
}