Архивирование логов в удаленном хранилище объектов с помощью Logrotate и S3cmd в Ubuntu 16.04

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

В настоящее время типичной стратегией ведения логов является централизация этой информации с помощью службы агрегации логов (типа Elastic stack или Graylog). Это подходит для анализа данных в реальном времени, краткосрочных и среднесрочных исследований, но долгосрочные данные в такой системе обычно сохранить невозможно из-за ограниченных ресурсов сервера.

Общим решением для подобных задач хранения является архивирование логов с помощью сервиса хранения объектов. В течение неограниченного времени логи могут оставаться доступными для последующего анализа или резервного копирования.

Данный мануал поможет настроить утилиту Logrotate на сервере Ubuntu 16.04 для отправки логов syslog в хранилище объектов. Эту технику можно применить к любым логам, которые обрабатывает Logrotate.

Требования

Для работы вам понадобится:

1: Установка S3cmd

Для отправки логов в хранилище будет использоваться инструмент S3cmd. Прежде чем установить его, нужно установить вспомогательные инструменты для работы с программами Python (S3cmd написан на Python).

sudo apt-get update
sudo apt-get install python-setuptools

Перейдите в каталог, в котором у вас есть право на запись, и загрузите архив .tar.gz S3cmd:

cd /tmp
curl -LO https://github.com/s3tools/s3cmd/releases/download/v2.0.1/s3cmd-2.0.1.tar.gz

Примечание: Более актуальные версии S3cmd можно поискать на этой странице Github. Если вы найдете там новую версию, замените URL в команде ссылкой на новый пакет.

После завершения загрузки распакуйте архив:

tar xf s3cmd-*.tar.gz

Перейдите в полученный каталог и установите программу:

cd s3cmd-*
sudo python setup.py install

Протестируйте установку s3cmd, запросив версию инструмента:

s3cmd --version
s3cmd version 2.0.1

Если вы видите аналогичный вывод, инструмент S3cmd успешно установлен. Затем настройте S3cmd для подключения к сервису хранения объектов.

2: Настройка S3cmd

Интерактивный процесс настройки S3cmd может создать конфигурационный файл, который нужно подключить к серверу хранения объектов. Пользователю root потребуется доступ к этому файлу, поэтому процесс настройки нужно начать с помощью sudo и поместить файл в домашний каталог пользователя root:

sudo s3cmd --configure --config=/root/logrotate-s3cmd.config

Начнется интерактивная настройка. При необходимости вы можете принять опции по умолчанию (в скобках), нажав Enter. Замените условную конечную точку S3 и имя корзины вашими данными.

  • Access Key: ваш access key
  • Secret Key: ваш secret key
  • Default Region [US]: нажмитеEnter
  • S3 Endpoint [s3.amazonaws.com]: nyc3.example-endpoint.com
  • DNS-style bucket+hostname: port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: %(корзина)s.nyc3.example-endpoint.com
  • Encryption password: нажмите Enter или укажите пароль шифрования.
  • Path to GPG program [/usr/bin/gpg]: нажмите Enter
  • Use HTTPS protocol [Yes]: нажмите Enter
  • HTTP Proxy server name:нажмите Enter или укажите данные о прокси-сервере.

На этом этапе s3cmd обработает ответы, а затем попросит вас проверить соединение. Нажмите y, затем Enter, чтобы начать тест:

Test access with supplied credentials? [Y/n] y
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

После теста будет предложено сохранить настройки. Снова введите y, затем Enter, чтобы сделать это. Конфигурационный файл будет записан в указанное ранее местоположение (с помощью параметра командной строки —config).

3: Настройка Logrotate

Теперь нужно настроить передачу логов после ротации в хранилище.

Logrotate – производительная и гибкая система ротации и сжатия логов. Ubuntu использует эту утилиту по умолчанию для поддержки логов /var/log.

Теперь нужно обновить параметры Logrotate и настроить передачу системных логов после ротации в удаленное хранилище объектов.

Откройте конфигурационный файл Logrotate для rsyslog:

sudo nano /etc/logrotate.d/rsyslog

Внутри будет два блока. Обратите внимание на первый блок, /var/log/syslog:

/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
}
. . .

Эта конфигурация указывает, что /var/log/syslog будет ротироваться ежедневно (daily), при этом сохраняя семь старых логов (rotate 7). Это не приведет к ошибке, если лог не существует (missingok), пустые логи из ротации исключаются (notempty). После ротации все логи будут сжаты (compress), кроме последних (delaycompress). Сценарий postrotate переключит rsyslog на новый лог после ротации старого.

Прежде чем начать, удалите строку delaycompress. Все логи должны сжиматься перед отправкой в хранилище объектов.

Добавьте следующие строки в конец конфигурации (вне блока postrotate . . . endscript, но внутри фигурных скобок).

. . .
dateext
dateformat -%Y-%m-%d-%s
lastaction
HOSTNAME=`hostname`
/usr/local/bin/s3cmd sync --config=/root/logrotate-s3cmd.config /var/log/syslog*.gz "s3://your-bucket-name/$HOSTNAME/"
endscript
. . .

Обязательно укажите правильное имя корзины. Эти параметры будут включать расширения имен файлов на основе даты (dateext), чтобы вы могли своевременно записывать логи. Затем dateformat устанавливает формат этих расширений. Файлы будут содержать имена типа syslog-2017-11-07-1510091490.gz: год, месяц, дату, а затем временную метку. Временная метка позволяет отправить два лога в тот же день без конфликтов имен. Это необходимо в случае, если вы по каким-либо причинам захотите запустить дополнительную ротацию.

Сценарий lastaction запускается после сжатия всех логов. Он устанавливает переменную с именем хоста сервера, затем использует s3cmd для синхронизации всех файлов syslog в хранилище объектов, помещая их в папку с именем хоста. Обратите внимание, что конечный слеш в «s3://your-bucket-name/$HOSTNAME/» очень важен. Без него s3cmd будет воспринимать /$HOSTNAME как один файл, а не как каталог с логами.

Сохраните и закройте файл. При следующем запуске Logrotate каталог /var/log/syslog получит имя с датой, затем будет сжат и перемещен в хранилище.

Этот процесс можно запустить вручную, чтобы не ждать следующей ротации и проверить настройку.

sudo logrotate /etc/logrotate.conf --verbose --force
rotating pattern: /var/log/syslog
. . .
considering log /var/log/syslog
log needs rotating
. . .
running last action script
switching euid to 0 and egid to 0
upload: '/var/log/syslog-2017-11-08-1510175806.gz' -> 's3://example-bucket/example-hostname/syslog-2017-11-08-1510175806.gz'  [1 of 1]
36236 of 36236   100% in    0s   361.16 kB/s  done
Done. Uploaded 36236 bytes in 1.0 seconds, 35.39 kB/s.

В выводе будет много информации о разных логах. Данные, относящиеся к syslog и загрузке, находятся выше. Ваш результат должен быть похожим и сообщать об успешной загрузке. На старом сервере может быть больше загружаемых файлов.

4: Отправка логов перед завершением работы (опционально)

Это необходимо, только если вы настраиваете эфемерные серверы, которые часто отключаются и уничтожаются. Если это так, вы можете потерять логи за целый день при уничтожении одного сервера.

Чтобы исправить это, нужно заставить Logrotate запускаться в последний раз перед отключением системы. Для этого нужно создать сервис systemd, который запускает команду logrotate, когда она остановлена.

Откройте новый файл:

sudo nano /etc/systemd/system/logrotate-shutdown.service

Вставьте в него определение сервера:

[Unit]
Description=Archive logs before shutdown
After=network.target
[Service]
RemainAfterExit=yes
ExecStop=/usr/sbin/logrotate /etc/logrotate.conf --force
[Install]
WantedBy=multi-user.target

Этот файл определяет сервис, который ничего не делает при запуске системы (для этого не хватает опции ExecStart) и запускает logrotate (с параметром —force) при остановке команды. Этот файл будет запущен до того, как сетевое подключение будет прервано.

Сохраните и закройте файл. Затем запустите и включите сервис:

sudo systemctl start logrotate-shutdown.service
sudo systemctl enable logrotate-shutdown.service

Проверьте состояние нового сервиса:

sudo systemctl status logrotate-shutdown.service
logrotate-shutdown.service - Archive logs before shutdown
Loaded: loaded (/etc/systemd/system/logrotate-shutdown.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2017-11-08 20:00:05 UTC; 8s ago
Nov 08 20:00:05 example-host systemd[1]: Started Archive logs before shutdown.

В выводе должен быть статус active; exited в данном случае – нормальное поведение сервиса, так как у него нет команды ExecStart.

Протестировать новый сервис можно путем его остановки:

sudo systemctl stop logrotate-shutdown.service

Также можно перезапустить систему:

sudo reboot

Любое из этих действий вызовет команду Logrotate и загрузит новый лог. Теперь вы не потеряете логи при уничтожении сервера.

Примечание: многие облачные платформы не выполняют корректное завершение работы при уничтожении или остановке сервера. Вам нужно будет протестировать эту функциональность в вашей конкретной настройке и добавить поддержку корректного отключения или найти другое решение для запуска ротации логов.

Заключение

Теперь вы умеете устанавливать и настраивать S3cmd и Logrotate и настраивать ротацию логов в удаленном хранилище объектов.

Чтобы узнать больше о доступных конфигурациях Logrotate, обратитесь мануалу:

man logrotate

Более подробную информацию о S3cmd можно найти на сайте проекта.

Tags: , ,