У меня стояла задача: настроить сжатие логов DNS сервера Unbound, с возможностью удобного сбора этих бэкапов в коллектор. Также требовалось ограничить права доступа, чтобы с коллектора можно было зайти только в дирректорию, где хранятся бэкапы логов. Указанные действия проводил на CentOS 7 Minimal и CentOS 6.6 Minimal.

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
}

Комментарии (10)


  1. grossws
    05.01.2016 16:24
    +2

    /etc/unbound/log/unbound.log
    странненько смотрятся логи в /etc


    1. imperituroard
      05.01.2016 16:42
      -1

      У меня было настроено логгирование сюда. Можно и /var/log указать в unbound.conf.


  1. J_o_k_e_R
    05.01.2016 23:20
    +2

    Скажите, пожалуйста, это больно таким экстравагантным способом «удалять гланды»?
    Вы уже знаете, что логи лучше писать через syslog. Если есть задача удалённых логов — лучше использовать родные средства демона syslog, который у Вас используется.


    1. imperituroard
      06.01.2016 03:52
      -1

      А чем Вам не нравится такой способ? Все отлично работает, существенного влияния на систему не оказывает. И, нет, нужно было временно хранить логи именно локально.


      1. J_o_k_e_R
        06.01.2016 15:50
        +2

        Никто не мешает хранить логи в нескольких местах, грамотно настроив syslog.

        Чем мне не нравится удаление гланд через задницу, если и гланды удалили, и задница вроде цела? Ну я даже и не знаю…


    1. ValdikSS
      06.01.2016 15:47
      +3

      Да ладно вам, человек скоро про journald узнает, где сжатие и ротация настраивается буквально двумя строками в конфиге.


      1. J_o_k_e_R
        06.01.2016 15:51

        journald — это же подсистема systemd? Нафиг, нафиг. Спасибо, что дебиан8 форвардит логи в «человеческий» rsyslog.


        1. ValdikSS
          06.01.2016 15:54
          +3

          Ну, я придерживаюсь другого мнения: systemd — лучшее, что случилось с линуксом за последние 10 лет.
          Но, если он вам не нравится, или если конкретно journald не нравится, то вы можете с лёгкостью настроить syslog-прокси ещё одной строчкой в конфиге.


          1. grossws
            08.01.2016 16:51
            -1

            Как, собственно, сделано по умолчанию в centos 7 и, подозреваю, в debian 8.


  1. foxmuldercp
    07.01.2016 20:55

    app/log -> rsyslog -> sql -> webinterface,
    app/log -> logstash -> обработка и реакция на выбор.

    Я, конечно за 10 лет много видел вычурных решений, но там, хотя бы было понятно, описано и задокументировано, почему так, а не как у всех.
    Но такой эксклюзив вижу впервые.

    А вообще, у меня логи днс ведутся исключительно для обработки fail2ban, для отправки особо ретивых пользователей в известном направлении с помощью iptables. Не вижу смысла их хранить долго — пару гигов логов с одного рекурсора в час набегает. А смотреть кто куда ходил для офиса — более другими средствами.