Централизация логов с помощью Rsyslog, Logstash и Elasticsearch в Ubuntu 14.04
Ubuntu | Комментировать запись
Работать с данными логов довольно сложно. Логи предоставляют много полезной информации о безопасности и производительности приложений и сервера. Но, с другой стороны, управление и анализ логов могут занимать очень много времени.
Программное обеспечение с открытым исходным кодом 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.
Читайте также:
- Открытый поиск по логам и визуализация при помощи Elasticsearch, Fluentd и Kibana
- Сбор метрик инфраструктуры с помощью Topbeat и ELK в Ubuntu 14.04