Для примера буду использовать и настраивать rsyslog
в качестве клиентского приложения и elasticsearch, logstah
в качестве сервера syslog
. В качестве ОС выступает CentOS7.
Настройка logstah
Добавим новый input
sudo vim /etc/logstash/conf.d/02-beats-input.conf
input {
#если нужно через UDP, то меняем tcp на udp
tcp {
#пор на который отправлять данные
port => 5066
type => syslog
}
}
Добавим новый output
sudo vim /etc/logstash/conf.d/30-elasticsearch-output.conf
output {
if [type] == "syslog" {
elasticsearch {
hosts => [ "elasticsearch_host:port" ]
manage_template => false
index => "syslog-%{+YYYY.MM}"
}
}
}
Добавим новый filter
sudo vim /etc/logstash/conf.d/10-syslog-filter.conf
filter {
if [fileset][module] == "system" {
if [fileset][name] == "auth" {
grok {
match => { "message" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][dropped_ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] }
pattern_definitions => {
"GREEDYMULTILINE"=> "(.|\n)*"
}
remove_field => "message"
}
date {
match => [ "[system][auth][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
geoip {
source => "[system][auth][ssh][ip]"
target => "[system][auth][ssh][geoip]"
}
}
else if [fileset][name] == "syslog" {
grok {
match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] }
pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" }
remove_field => "message"
}
date {
match => [ "[system][syslog][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
}
Перезапускаем logstash
и настраиваем файрволл
sudo systemctl restart logstash
sudo firewall-cmd --add-port=5066/tcp --permanent
sudo firewall-cmd --reload
Настройка rsyslog
Добавляем syslog
сервер elasticsearch, logstash
sudo vim /etc/rsyslog.conf
*.* action(type="omfwd" target="ip" port="5066" protocol="tcp"
action.resumeRetryCount="100"
queue.type="linkedList" queue.size="10000")
sudo systemctl restart rsyslog
sudo systemctl status rsyslog
Ошибка rsyslogd: action ‘action 3’ suspended, next retry is
Бывает что status отвечает с ошибкой rsyslogd: action ‘action ‘ suspended, next retry is и логи не шлются на syslog
сервер.
Самое первое что можно попробовать это отключить selinux
и перезапустить сервис rsyslog
.
sudo setenforce 0
sudo systemctl restart rsyslog
Если после проделанного логи появились на syslog
сервере предлагаю не тупо отключать selinux
а настроить его. Происходит это из-за того что в selinux
для syslog
прописан только стандартный порт syslog
. Да rsyslog
только шлёт, а не принимает. Но всё же.
sudo setenforce 1
sudo yum install -y policycoreutils-python
sudo semanage port -a -t syslogd_port_t -p tcp 5045
sudo systemctl restart rsyslog
Rsyslog отключаем логирование journald
По умолчанию все сервисы journald
пишут лони также и в syslog
.
Чтобы исключить сервис создаём дополнительный конфиг файл для rsyslog
.
sudo vim /etc/rsyslog.d/journald-disable.conf
if $programname == 'journalbeat' then stop
if $programname == 'service-1.service' then stop
sudo systemctl restart rsyslog
Комментарии