Централизация логов с помощью Rsyslog, Logstash и Elasticsearch в Ubuntu 14.04

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

Программное обеспечение с открытым исходным кодом rsyslog, Elasticsearch и Logstash – удобное средство для передачи, преобразования и хранения данных логов.

Это руководство поможет создать централизованное хранилище логов нескольких систем и настроить передачу данных в Elasticsearch с помощью Logstash.

Централизованное логирование позволяет быстро выявить и устранить проблемы сервера или приложений.

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

Rsyslog собирает важную информацию из ядра и программ, необходимых для работы UNIX-подобных серверов. Поскольку syslog – это стандарт, многие программные проекты поддерживают отправку данных в syslog. Централизуя данные логов, вы можете быстро проводить аудит безопасности, отслеживать поведение приложений и другую важную информацию о сервере.

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

Требования

Для выполнения руководства нужна инфраструктура из трёх серверов, находящихся в одном ЦОД, с включенной частной сетью.

  • Сервер 1: Ubuntu 14.04, который будет называться rsyslog-client.
  • Сервер 2: Ubuntu 14.04 (1 Гб минимум), который будет называться rsyslog-server. На нём будут храниться логи и Logstash.
  • Сервер 3: Ubuntu 14.04 с предварительно установленной платформой Elasticsearch (инструкции по установке здесь).
  • Пользователь с доступом к sudo на каждом сервере (больше об этом – здесь).
  • Частная сеть.

Примечание: Чтобы увеличить производительность, Logstash попытается выделить 1 гигабайт памяти по умолчанию, поэтому убедитесь, что размер сервера 2 может это позволить.

1: Определение внутренних IP-адресов

Для начала нужно узнать внутренний IP-адрес каждого сервера.

Для этого можно использовать команду:

sudo ifconfig -a

Флаг –a выбирает все интерфейсы. Это позволяет найти внутренний IP-адрес сервера (он не доступен в сети Интернет, только в локальной сети), привязанный к интерфейсу eth1.

Команда вернёт примерно такой вывод:

eth0      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:01
inet addr:123.456.78.90  Bcast:123.456.78.255  Mask:255.255.255.0
inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:168 errors:0 dropped:0 overruns:0 frame:0
TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:18903 (18.9 KB)  TX bytes:15024 (15.0 KB)
eth1      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:02
inet addr:10.128.2.25  Bcast:10.128.255.255  Mask:255.255.0.0
inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:468 (468.0 B)  TX bytes:398 (398.0 B)
lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:16436  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Обратите внимание на строку inet addr в разделе eth1. В данном случае внутренним IP-адресом является 10.128.2.25.

Запустите команду на каждом из трех серверов. Скопируйте или запишите внутренние IP-адреса.

2: Настройка адреса Elasticsearch

Если вы следовали руководству Установка и настройка Elasticsearch в Ubuntu 14.04, вы умеете привязывать Elasticsearch к локальному хосту. Но в таком случае другие серверы не смогут взаимодействовать с этим инструментом.

Вместо локального хоста укажите в настройках Elasticsearch внутренний IP-адрес сервера, на котором установлен этот инструмент.

Перейдите на этот сервер (в данном случае это сервер 3) и откройте файл:

sudo nano /etc/elasticsearch/elasticsearch.yml

Найдите в нём строку network.bind_host. Если она закомментирована, раскомментируйте её и укажите внутренний IP-адрес текущего сервера:

network.bind_host: private_ip_address

Перезапустите Elasticsearch:

sudo service elasticsearch restart

Примечание: Возможность подключаться к Elasticsearch должны иметь только заведомо безопасные серверы. Ограничьте доступ к серверу с помощью брандмауэра (например, iptables).

3: Настройка сервера для централизованного хранения логов

Примечание: Данный раздел нужно выполнить на сервере rsyslog-server (согласно списку требований, это сервер 2).

Сервер rsyslog-server должен получать данные других серверов на порт 514.

Для этого откройте файл /etc/rsyslog.conf:

sudo nano /etc/rsyslog.conf

Найдите в файле следующие закомментированные строки:

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

Строки $ModLoad imudp и $ModLoad imtcp загружают модули imudp (input module udp) и imtcp (input module tcp). Эти модули прослушивают входящие данные, поступающие от других серверов.

Строки $UDPSerververRun 514 и $TCPServerRun 514 указывают, что rsyslog должен запустить серверы UDP и TCP на порт 514 (стандартный порт syslog).

Чтобы включить эти модули и серверы, раскомментируйте строки:

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Перезапустите rsyslog:

sudo service rsyslog restart

Теперь сервер для централизованного хранения данных будет прослушивать сообщения удалённых серверов syslog.

Примечание: Чтобы проверить конфигурационный файл rsyslog, запустите:

sudo rsyslogd -N1

4: Настройка rsyslog для удаленной отправки данных

Теперь нужно настроить сервер rsyslog-client (сервер 1) для отправки данных логов на ryslog-server.

В стандартной установке rsyslog в Ubuntu каталог /etc/rsyslog.d содержит два файла:

  • 20-ufw.conf
  • 50-default.conf

Перейдите на сервер rsyslog-client и откройте конфигурационный файл:

sudo nano /etc/rsyslog.d/50-default.conf

Добавьте следующую строку перед строкой log by facility (вместо private_ip_of_ryslog_server укажите внутренний IP-адрес сервера ryslog_server).

*.*                         @private_ip_of_ryslog_server:514

Сохраните и закройте файл.

Точка в начале означает, что нужно отправлять все сообщения. Инструмент rsyslog может отправлять сообщения избирательно, но эта тема не рассматривается в данном руководстве. Символ @ перед IP-адресом значит, что сообщения нужно передавать по UDP. Чтобы использовать вместо этого TCP, введите @@.

Чтобы обновить настройки, перезапустите rsyslog:

sudo service rsyslog restart

Примечание: Чтобы проверить конфигурационный файл rsyslog, запустите:

sudo rsyslogd -N1

5: Преобразование логов в JSON

Elasticsearch требует, чтобы передаваемые данные были в формате JSON. Инструмент  rsyslog предоставляет шаблон преобразования данных.

На данном этапе нужно настроить сервер 2 (rsyslog-server) для использования шаблона JSON. Это позволит отформатировать данные, прежде чем передать их в Logstash и Elasticsearch.

Вернитесь на сервер rsyslog-server и создайте новый конфигурационный файл, который будет форматировать логи в JSON.

sudo nano /etc/rsyslog.d/01-json-template.conf

Скопируйте следующие параметры и вставьте их в файл:

template(name="json-template"
type="list") {
constant(value="{")
constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
constant(value="\",\"@version\":\"1")
constant(value="\",\"message\":\"")     property(name="msg" format="json")
constant(value="\",\"sysloghost\":\"")  property(name="hostname")
constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
constant(value="\",\"programname\":\"") property(name="programname")
constant(value="\",\"procid\":\"")      property(name="procid")
constant(value="\"}\n")
}

Обратите внимание: все строки (кроме первой и последней) содержат запятую в начале. Это должно поддержать структуру JSON и выровнять все отступы. Этот шаблон форматирует сообщения так, как этого требуют Elasticsearch и Logstash. Вот как они будут выглядеть:

{
"@timestamp" : "2015-11-18T18:45:00Z",
"@version" : "1",
"message" : "Your syslog message here",
"sysloghost" : "hostname.example.com",
"severity" : "info",
"facility" : "daemon",
"programname" : "my_program",
"procid" : "1234"
}

Примечание: На сайте rsyslog можно найти больше переменных для форматирования данных логов.

Шаблон для форматирования готов, теперь нужно настроить сервер для его использования.

6: Настройка отправки данных в Logstash

Теперь нужно настроить сервер rsyslog server для передачи данных в Logstash.

При запуске rsyslog будет читать файлы /etc/rsyslog.d и создавать конфигурации на их основе.

На сервере rsyslog-server создайте файл /etc/rsyslog.d/60-output.conf:

sudo nano /etc/rsyslog.d/60-output.conf

Вставьте в файл следующие строки:

# This line sends all lines to defined IP address at port 10514,
# using the "json-template" format template
*.*                         @private_ip_logstash:10514;json-template

Строка, которая начинается с *.*, будет применена ко всем сообщениям. Символ @ перед IP-адресом значит, что сообщения нужно передавать по UDP. Чтобы использовать вместо этого TCP, введите @@. Сообщения будут передаваться на адрес или хост, указанный после символа @. В данном случае используется внутренний IP-адрес сервера rsyslog-server (поскольку Logstash установлен на этом же сервере).

Примечание: Этот адрес должен совпадать с IP-адресом, указанным в настройках Logstash (в следующем разделе).

В руководстве используется порт 10514. Logstash должен прослушивать этот же порт и протокол. Последняя часть строки определяет файл шаблона, который указывает, как форматировать данные перед их отправкой.

Не перезапускайте rsyslog. Сначала нужно настроить Logstash для получения сообщений.

7: Настройка Logstash для получения сообщений JSON

Теперь нужно настроить Logstash для получения сообщений rsyslog и передачи полученных данных в Elasticsearch.

Для работы Logstash нужно установить Java 7+. Инструкции по установке можно найти в руководстве Установка и настройка Elasticsearch в Ubuntu 14.04.

Установите ключ репозитория Logstash:

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Добавьте определение репозитория в /etc/apt/sources.list:

echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list

Примечание: Используйте метод echo, описанный выше, чтобы добавить репозиторий Logstash. Не используйте add-apt-repository; эта команда добавит запись deb-src, но Elastic не предоставляет исходный пакет. Это приведет к ошибке при попытке запустить apt-get update.

Обновите индекс пакетов:

sudo apt-get update

Установите Logstash:

sudo apt-get install logstash

По умолчанию конфигурационные файлы Logstash находятся в /etc/logstash/conf.d. Отредактируйте конфигурационный файл:

sudo nano /etc/logstash/conf.d/logstash.conf

Добавьте следующие строки в /etc/logstash/conf.d/logstash.conf:

# This input block will listen on port 10514 for logs to come in.
# host should be an IP on the Logstash server.
# codec => "json" indicates that we expect the lines we're receiving to be in JSON format
# type => "rsyslog" is an optional identifier to help identify messaging streams in the pipeline.
input {
udp {
host => "logstash_private_ip"
port => 10514
codec => "json"
type => "rsyslog"
}
}
# This is an empty filter block.  You can later add other filters here to further process
# your log lines
filter { }
# This output block will send all events of type "rsyslog" to Elasticsearch at the configured
# host and port into daily indices of the pattern, "rsyslog-YYYY.MM.DD"
output {
if [type] == "rsyslog" {
elasticsearch {
hosts => [ "elasticsearch_private_ip:9200" ] }
}
}

Согласно определению протоколом syslog является UDP.

В блоке input укажите IP-адрес сервера rsyslog-server, на котором установлен инструмент Logstash.

Блок input запускает прослушивание Logstash порта 10514. Для прослушивания портов меньше 1024 необходимо запускать Logstash как root, а это может быть опасно для сервера.

Обязательно замените elasticsearchprivateip внутренним IP-адресом сервера Elasticsearch. Блок output настраивает поиск событий rsyslog.

Протестируйте изменения настроек Logstash:

sudo service logstash configtest

Команда должна вернуть:

Configuration OK

Если команда сообщила об ошибках, исправьте их.

После этого можно запустить Logstash:

sudo service logstash start

Перезапустите rsyslog:

sudo service rsyslog restart

Убедитесь, что Logstash прослушивает порт 10514:

netstat -na | grep 10514

Команда должна вернуть:

udp6       0      0 10.128.33.68:10514     :::*

Вы увидите внутренний IP-адрес сервера rsyslog-server и порт, который он прослушивает (10514).

Примечание: Чтобы устранить неисправности Logstash, остановите службу с помощью команды sudo service logstash stop и запустите:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --verbose

Эта команда предоставит подробный вывод, в том числе и IP-адрес и UDP-порт Logstash.

Starting UDP listener {:address=>"10.128.33.68:10514", :level=>:info}

8: Тестирование Elasticsearch

Платформа Elasticsearch прослушивает внутренний IP-адрес сервера, на котором она установлена. Теперь она получает сообщения Logstash. Убедитесь, что Elasticsearch может получать данные.

Серверы rsyslog-client и rsyslog-server должны отправлять все данные логов в Logstash, а оттуда данные будут передаваться в Elasticsearch. Сгенерируйте сообщение безопасности, чтобы убедиться, что Elasticsearch получает сообщения.

Перейдите на rsyslog-client и введите:

sudo tail /var/log/auth.log

В конце вывода вы увидите сообщение лога локальной системы:

May  2 16:43:15 rsyslog-client sudo:    8host : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
May  2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by 8host(uid=0)

Создайте простой запрос, чтобы проверить работу Elasticsearch.

Запустите следующую команду на сервере Elasticsearch или в любой системе, у которой есть доступ к этой платформе.

Вместо elasticsearch_ip укажите внутренний IP-адрес сервера Elasticsearch.

curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'

Команда выведет:

{
"_index" : "logstash-2016.05.04",
"_type" : "rsyslog",
"_id" : "AVR8fpR-e6FP4Elp89Ww",
"_score" : 1.0,
"_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":"    8host : TTY=pts/0 ; PWD=/home/8host ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}
},

Обратите внимание: в логе указано имя сервера, который сгенерировал сообщение rsyslog (rsyslog-client).

Теперь установка полностью готова к работе.

Заключение

Вы настроили централизацию логов с помощью Elasticsearch и Logstash.

Читайте также:

Tags: , , , ,

Добавить комментарий