Работать с данными логов довольно сложно. Логи предоставляют много полезной информации о безопасности и производительности приложений и сервера. Но, с другой стороны, управление и анализ логов могут занимать очень много времени.
Программное обеспечение с открытым исходным кодом 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 может это позволить.
Определение внутренних 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-адреса.
Настройка адреса 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).
Настройка сервера для централизованного хранения логов
Примечание: Данный раздел нужно выполнить на сервере 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
Настройка 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
Преобразование логов в 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 можно найти больше переменных для форматирования данных логов.
Шаблон для форматирования готов, теперь нужно настроить сервер для его использования.
Настройка отправки данных в 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 для получения сообщений.
Настройка 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}
Тестирование 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.