Как использовать Logrotate и S3cmd для архивирования журналов в хранилище объектов в Ubuntu 16.04

Вступление

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

Типичная стратегия ведения журналов в настоящее время заключается в централизации всей этой информации с помощью службы агрегирования журналов, такой как https://www.digitalocean.com/community/tutorial_series/centralized-logging-with-elk-stack-elasticsearch-logstash-and-kibana- on-ubuntu-14-04 [Эластичный стек] или Graylog . Это отлично подходит для анализа в реальном времени и краткосрочных и среднесрочных исторических исследований, но часто невозможно сохранить долгосрочные данные в этих системах из-за ограничений хранилища или других проблем с ресурсами сервера.

Распространенным решением для этих долгосрочных потребностей в хранении является архивирование журналов с помощью службы хранения объектов. Журналы могут оставаться доступными на неопределенный срок для последующего анализа, требований законного хранения или для целей резервного копирования.

В этом руководстве мы будем использовать Logrotate на сервере Ubuntu 16.04 для отправки журналов «+ syslog +» службе хранения объектов. Этот метод может быть применен к любым журналам, обрабатываемым Logrotate.

Предпосылки

Для завершения этого урока вам понадобится следующее:

  • Сервер Ubuntu 16.04 с пользователем без полномочий root, как описано в Initial Server Setup с Ubuntu 16.04. Конфигурации в этом руководстве должны работать более широко на многих дистрибутивах Linux, но могут потребовать некоторой адаптации.

  • Вы должны быть знакомы с Logrotate и настройкой конфигурации по умолчанию в Ubuntu 16.04. Пожалуйста, прочитайте How для управления файлами журналов с помощью Logrotate в Ubuntu 16.04 для получения дополнительной информации.

  • Вам необходимо знать следующие сведения о службе хранения объектов:

  • Ключ доступа

  • Секретный ключ

  • URL сервера (или «конечной точки»)

  • Название ковша + Если вы используете DigitalOcean Spaces, вы можете прочитать How To Создать DigitalOcean Space и API Key для создания нового сегмента и получения вышеуказанной информации.

Когда вы выполнили предварительные условия, SSH на вашем сервере, чтобы начать.

Шаг 1 - Установка S3cmd

Мы будем использовать инструмент под названием * S3cmd * для отправки наших журналов в любую S3-совместимую службу хранения объектов. Перед установкой S3cmd нам нужно установить некоторые инструменты, которые помогут нам установить программы на Python (S3cmd написан на Python):

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

Затем перейдите в каталог, в который вы можете написать, затем загрузите файл S3cmd + .tar.gz +:

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

Когда загрузка завершится, распакуйте и распакуйте файл, используя утилиту + tar +:

tar xf s3cmd-*.tar.gz

Затем перейдите в получившийся каталог и установите программное обеспечение с помощью + sudo +:

cd s3cmd-*
sudo python setup.py install

Проверьте установку, запросив у + s3cmd + информацию о версии:

s3cmd --version
Outputs3cmd version

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

Шаг 2 - Настройка S3cmd

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

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

Начнется интерактивная настройка. При необходимости вы можете принять ответы по умолчанию (в скобках), нажав + ENTER. Мы рассмотрим варианты, приведенные ниже, с предлагаемыми ответами для Space в DigitalOcean, регион NYC3. Замените конечную точку S3 и шаблон сегмента, если это необходимо для других центров обработки данных DigitalOcean или других поставщиков хранилищ объектов:

  • Ключ доступа: ++

  • Секретный ключ: ++

  • Регион по умолчанию [US]: + ENTER +

  • Конечная точка S3 [s3.amazonaws.com]: ++

  • Ведро в стиле DNS + имя хоста: шаблон порта для доступа к корзине [% (bucket) s.s3.amazonaws.com]: ++

  • Пароль шифрования: + ENTER + или укажите пароль для шифрования

  • Путь к программе GPG [/ usr / bin / gpg]: + ENTER +

  • Использовать протокол HTTPS [Да]: + ENTER +

  • Имя прокси-сервера HTTP: + ENTER +, либо введите информацию о прокси

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

OutputTest access with supplied credentials? [Y/n]
Please wait, attempting to list all buckets...

После теста вам будет предложено сохранить настройки. Снова введите + y + затем + ENTER +, чтобы сделать это. Файл конфигурации будет записан в ранее указанное нами место с помощью параметра командной строки + - config +.

На следующем шаге мы настроим Logrotate на использование S3cmd для загрузки наших журналов.

Шаг 3 - Настройка Logrotate для отправки повернутых журналов в хранилище объектов

Logrotate - это мощная и гибкая система для управления ротацией и сжатием файлов журналов. Ubuntu использует его по умолчанию для поддержки всех системных журналов, найденных в + / var / log +.

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

Сначала откройте файл конфигурации Logrotate для + rsyslog +, процессора системного журнала:

sudo nano /etc/logrotate.d/rsyslog

Там будет два блока конфигурации. Нас интересует первое, которое касается + / var / log / syslog +:

/etc/logrotate.d/rsyslog

/var/log/syslog
{
   rotate 7
   daily
   missingok
   notifempty

   compress
   postrotate
       invoke-rc.d rsyslog rotate > /dev/null
   endscript
}
. . .

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

Прежде чем мы добавим наши новые директивы конфигурации, удалите строку + delaycompress +, выделенную выше. Мы хотим, чтобы все наши старые журналы были сжаты непосредственно перед отправкой их в хранилище объектов.

Затем добавьте следующие строки в конец блока конфигурации (за пределами блока + postrotate ++ endcript +, но внутри закрывающей скобки +} +):

/etc/logrotate.d/rsyslog

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

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

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

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

Мы можем заставить это произойти немедленно, чтобы проверить, что это работает должным образом:

sudo logrotate /etc/logrotate.conf --verbose --force
Outputrotating pattern: /var/log/syslog
. . .


. . .

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

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

Затем мы дополнительно настроим службу, которая поможет нам загружать журналы до выключения системы.

Шаг 4 - Отправка журналов при выключении

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

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

Сначала откройте новый файл сервиса в текстовом редакторе:

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

Вставьте следующее определение сервиса:

/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 +) при остановке. Он будет запущен до завершения сетевого подключения из-за строки + After = network.target +.

Сохраните файл и выйдите из текстового редактора, затем + start + и + enable + сервис, используя + systemctl +:

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

Проверьте статус новой услуги:

sudo systemctl status logrotate-shutdown.service
Output● logrotate-shutdown.service - Archive logs before shutdown
  Loaded: loaded (/etc/systemd/system/logrotate-shutdown.service; enabled; vendor preset: enabled)
   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 для загрузки файлов журнала при вращении + / var / log / syslog +. Затем мы настроили службу systemd для запуска + logrotate --force + при завершении работы, чтобы убедиться, что мы не потеряем журналы при уничтожении эфемерных серверов.

Чтобы узнать больше о конфигурациях, доступных для Logrotate, обратитесь к странице его руководства, введя + man logrotate + в командной строке. Более подробную информацию о S3cmd можно найти на сайте their.

Related