Как централизовать журналы с помощью Rsyslog, Logstash и Elasticsearch в Ubuntu 14.04

Статья отElastic

Вступление

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

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

В этом руководстве вы узнаете, как создать централизованный сервер rsyslog для хранения файлов журналов из нескольких систем, а затем использовать Logstash для отправки их на сервер Elasticsearch. Оттуда вы можете решить, как лучше всего проанализировать данные.

цели

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

С централизованного или агрегирующего сервера rsyslog вы можете затем переслать данные в Logstash, который может дополнительно проанализировать и обогатить ваши данные журнала перед отправкой в ​​Elasticsearch.

Конечные цели этого урока:

  1. Настройте один клиентский (или пересылающий) сервер rsyslog

  2. Настройте один сервер (или собирающий) сервер rsyslog для получения журналов от клиента rsyslog

  3. Настройте экземпляр Logstash для получения сообщений от сервера сбора rsyslog

  4. Настройте сервер Elasticsearch для получения данных из Logstash

Предпосылки

Вsame DigitalOcean data center создайте следующие капли сprivate networking enabled:

  • Капля Ubuntu 14.04 с именемrsyslog-client

  • Ubuntu 14.04 Droplet (1 GB или выше) с именемrsyslog-server, где будут храниться централизованные журналы и будет установлен Logstash

  • Ubuntu 14.04 Droplet с Elasticsearch, установленным изHow To Install and Configure Elasticsearch on Ubuntu 14.04

Вам также понадобится пользователь без полномочий root с правами sudo для каждого из этих серверов. Initial Server Setup with Ubuntu 14.04 объясняет, как это настроить.

[.note] #Note: Чтобы максимизировать производительность, Logstash попытается выделить 1 гигабайт памяти по умолчанию, поэтому убедитесь, что размер экземпляра централизованного сервера задан соответствующим образом.
#

Обратитесь кHow To Set Up And Use DigitalOcean Private Networking за помощью по включению частной сети при создании дроплетов.

Если вы создали капли без частной сети, обратитесь кHow To Enable DigitalOcean Private Networking on Existing Droplets.

[[шаг-1 -—- определение-частных-IP-адресов]] == Шаг 1. Определение частных IP-адресов

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

Для каждой капли найдите ее IP-адреса с помощью командыifconfig:

sudo ifconfig -a

Параметр-a используется для отображения всех интерфейсов. Первичный интерфейс Ethernet обычно называетсяeth0. Однако в этом случае нам нужен IP-адресeth1, IP-адресprivate. Эти частные IP-адреса не маршрутизируются через Интернет и используются для связи в частных локальных сетях - в этом случае между серверами в одном центре обработки данных через вторичные интерфейсы.

Вывод будет выглядеть примерно так:

Вывод из ifconfig -a

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)

Здесь следует отметить разделeth1 и внутри этогоinet addr. В этом случае адрес частной сети10.128.2.25. Этот адрес доступен только с других серверов в том же регионе, для которых включена частная сеть.

Обязательно повторите этот шаг для всех 3 капель. Сохраните эти частные IP-адреса где-нибудь в безопасности. Они будут использоваться в этом уроке.

[[step-2 -—- setting-the-bind-address-for-elasticsearch]] == Шаг 2 - Установка адреса привязки для Elasticsearch

Как часть предварительных условий, вы настраиваете Elasticsearch на свой собственный Droplet. В руководствеHow To Install and Configure Elasticsearch on Ubuntu 14.04 показано, как установить адрес привязки наlocalhost, чтобы другие серверы не могли получить доступ к службе. Однако нам нужно изменить это, чтобы Logstash мог отправлять ему данные по частному сетевому адресу.

Мы свяжем Elasticsearch с его частным IP-адресом. Elasticsearch will only listen to requests to this IP address.с

На сервере Elasticsearch отредактируйте файл конфигурации:

sudo nano /etc/elasticsearch/elasticsearch.yml

Найдите строку, содержащуюnetwork.bind_host. Если он закомментирован, раскомментируйте его, удалив символ# в начале строки. Измените значение на частный IP-адрес для сервера Elasticsearch, чтобы оно выглядело так:

/etc/elasticsearch/elasticsearch.yml

network.bind_host: private_ip_address

Наконец, перезапустите Elasticsearch, чтобы активировать изменение.

sudo service elasticsearch restart

[.warning] #Warning: Очень важно разрешить подключаться к Elasticsearch только серверам, которым вы доверяете. Настоятельно рекомендуется использоватьiptables. В этом руководстве вы хотите доверять только частному IP-адресу каплиrsyslog-server, на которой запущен Logstash.
#

[[шаг-3 -—- configuring-the-central -ized-server-to-receive-data]] == Шаг 3 - Настройка централизованного сервера для приема данных

В этом разделе мы настроим каплюrsyslog-server как серверcentralized, способный получать данные от других серверов системного журнала через порт 514.

Чтобы настроитьrsyslog-server на получение данных от других серверов системного журнала, отредактируйте/etc/rsyslog.conf в каплеrsyslog-server:

sudo nano /etc/rsyslog.conf

Найдите эти строки, уже закомментированные в вашемrsyslog.conf:

/etc/rsyslog.conf

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

Первые строки каждого раздела ($ModLoad imudp и$ModLoad imtcp) загружают модулиimudp иimtcp соответственно. imudp означаетinputmoduleudp, аimtcp означаетinputmoduletcp. Эти модули прослушивают входящие данные с других серверов системного журнала.

Вторые строки каждого раздела ($UDPSerververRun 514 и$TCPServerRun 514) указывают, что rsyslog должен запустить соответствующие серверы UDP и TCP для этих протоколов, прослушивающих порт 514 (который является портом syslog по умолчанию).

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

/etc/rsyslog.conf

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Сохраните и закройте файл конфигурации rsyslog.

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

sudo service rsyslog restart

Теперь ваш централизованный сервер rsyslog настроен на прослушивание сообщений от удаленных экземпляров системного журнала (включая rsyslog).

[.tip] #Tip: Чтобы проверить файл конфигурации rsyslog, вы можете запустить командуsudo rsyslogd -N1.
#

[[step-4 -—- configuring-rsyslog-to-send-data-remotely]] == Шаг 4. Настройка rsyslog для удаленной отправки данных

В этом разделе мы настроимrsyslog-client для отправки данных журнала в каплю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 на IPprivate вашего сервераcentralized:

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

*.*                         @private_ip_of_ryslog_server:514

Сохраните и выйдите из файла.

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

Перезапустите rsyslog, чтобы включить изменения:

sudo service rsyslog restart

Поздравляем! Теперь вы отправляете свои сообщения системного журнала на централизованный сервер!

[.tip] #Tip: Чтобы проверить файл конфигурации rsyslog, вы можете запустить командуsudo rsyslogd -N1.
#

[[step-5 -—- formatting-the-log-data-to-json]] == Шаг 5. Форматирование данных журнала в JSON

Elasticsearch требует, чтобы все полученные документы были в формате JSON, и rsyslog предоставляет способ сделать это с помощью шаблона.

На этом шаге мы настроим наш централизованный сервер rsyslog на использование шаблона JSON для форматирования данных журнала перед отправкой в ​​Logstash, который затем отправит их в Elasticsearch на другом сервере.

Вернувшись на серверrsyslog-server, создайте новый файл конфигурации для форматирования сообщений в формате JSON перед отправкой в ​​Logstash:

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

Скопируйте следующее содержимое в файл точно так, как показано:

/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")
}

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

Пример JSON-сообщения

{
  "@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"
}

[.tip] #Tip:rsyslog.com docs показывает переменные, доступные из rsyslog, если вы хотите настроить данные журнала. Однако вы должны отправить его в формате JSON в Logstash, а затем в Elasticsearch.
#

Отправляемые данные еще не используют этот формат. Следующий шаг показывает, как настроить сервер для использования этого файла шаблона.

[[step-6 -—- configuring-the-centralized-server-to-send-to-logstash]] == Шаг 6 - Настройка централизованного сервера для отправки в Logstash

Теперь, когда у нас есть файл шаблона, который определяет правильный формат JSON, давайте настроим централизованный сервер rsyslog для отправки данных в Logstash, который находится в той же Droplet для этого урока.

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

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

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

Скопируйте следующие строки в этот файл:

/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

*.* в начале означает обработку оставшейся части строки для всех сообщений журнала. Символы@ означают использование UDP (вместо TCP используйте@@). IP-адрес или имя хоста после@ - это место для пересылки сообщений. В нашем случае мы используем частный IP-адрес дляrsyslog-server, поскольку централизованный сервер rsyslog и сервер Logstash установлены в одной и той же капле. This must match the private IP address you configure Logstash to listen on in the next step.с

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

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

[[step-7 -—- configure-logstash-to-receive-json-messages]] == Шаг 7. Настройте Logstash для получения сообщений JSON

На этом шаге вы установите Logstash, сконфигурируете его для получения сообщений JSON из rsyslog и сконфигурируете его для отправки сообщений JSON в Elasticsearch.

Logstash требует Java 7 или более поздней версии. Используйте инструкцииStep 1 изElasticsearch tutorial, чтобы установить Java 7 или 8 в каплюrsyslog-server.

Затем установите ключ безопасности для хранилища 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

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

Обновите ваши списки пакетов, чтобы включить репозиторий Logstash:

sudo apt-get update

Наконец, установите Logstash:

sudo apt-get install logstash

Теперь, когда Logstash установлен, давайте настроим его на прослушивание сообщений из rsyslog.

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

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

Затем добавьте эти строки в/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" ]
    }
  }
}

Протокол системного журнала по определению является UDP, поэтому эта конфигурация отражает этот стандарт.

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

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

Обязательно заменитеelasticsearchprivateip наprivate IP address вашей капли Elasticsearch. Блок вывода показывает простую конфигурациюconditional. Его цель - разрешить только совпадающие события. В данном случае это только события с типом «rsyslog».

Проверьте свои изменения конфигурации Logstash:

sudo service logstash configtest

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

Когда все эти шаги завершены, вы можете запустить свой экземпляр Logstash, выполнив:

sudo service logstash start

Также перезапустите rsyslog на том же сервере, так как у него есть экземпляр Logstash для пересылки сейчас:

sudo service rsyslog restart

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

netstat -na | grep 10514

Вы должны увидеть что-то вроде этого:

Вывод netstat

udp6       0      0 10.128.33.68:10514     :::*

Вы увидите частный IP-адресrsyslog-server и номер порта 10514, который мы используем для прослушивания данных rsyslog.

[.Подсказка]##

Tip: Для устранения проблем с 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}

[[step-8 -—- verifying-elasticsearch-input]] == Шаг 8 - Проверка ввода Elasticsearch

Ранее мы настраивали Elasticsearch для прослушивания его частного IP-адреса. Теперь он должен получать сообщения от Logstash. На этом этапе мы проверим, что Elasticsearch получает данные журнала.

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

Наrsyslog-client выполните следующую команду:

sudo tail /var/log/auth.log

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

Вывод хвоста /var/log/auth.log

May  2 16:43:15 rsyslog-client sudo:    sammy : 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 sammy(uid=0)

С помощью простого запроса вы можете проверить Elasticsearch:

Запустите следующую команду на сервере Elasticsearch или в любой системе, которой разрешен доступ к нему. Заменитеelasticsearch_ip частным IP-адресом сервера Elasticsearch. Этот 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":"    sammy : TTY=pts/0 ; PWD=/home/sammy ; 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).

С этим простым шагом проверки ваша централизованная настройка rsyslog завершена и полностью работоспособна!

Заключение

Ваши журналы в Elasticsearch сейчас. Что дальше? Прочтите, что может делатьKibana для визуализации данных, которые у вас есть в Elasticsearch, включая линейные и гистограммы, круговые диаграммы, карты и многое другое. How To Use Logstash and Kibana To Centralize Logs On Ubuntu 14.04 объясняет, как использовать веб-интерфейс Kibana для поиска и визуализации журналов.

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

Related