🔐 Как парсить логи аутентификации SSH с помощью Logstash |

🔐 Как парсить логи аутентификации SSH с помощью Logstash

Мануал

В современном цифровом мире безопасность имеет первостепенное значение для любой организации или отдельного человека.

Для поддержания безопасной среды очень важно отслеживать и анализировать журналы аутентификации.

Одним из широко используемых протоколов для удаленного управления серверами является SSH (Secure Shell), который генерирует журналы аутентификации, содержащие ценную информацию о попытках входа пользователей в систему, успешных входах, неудачных попытках и т. д.

🔐 Как перечислить все подключенные сессии SSH

Для эффективного управления и анализа этих журналов можно использовать Logstash, мощный инструмент конвейерной обработки данных, который позволяет эффективно разбирать журналы аутентификации SSH.

Прежде чем приступить к разбору журналов аутентификации SSH с помощью Logstash, необходимо понять структуру этих журналов.

Логи аутентификации SSH обычно содержат такие сведения, как временная метка события, имя пользователя, пытавшегося войти в систему, IP-адрес клиента, используемый метод аутентификации (например, пароль, открытый ключ) и результат попытки аутентификации (успех или неудача).

Чтобы начать разбирать журналы аутентификации SSH с помощью Logstash, убедитесь, что Logstash установлен и настроен в вашей системе.

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

Чтобы разобрать журналы аутентификации SSH, нам нужно определить в Logstash пользовательский шаблон grok, соответствующий формату журнала.

Ниже приведен пример, демонстрирующий разбор журналов аутентификации SSH:

grok {
    match => { 
        "message" => "%{SYSLOGTIMESTAMP:timestamp1} %{DATA:hostname1} (\[)?%{DATA:processname}(\])?(\[%{DATA:processpid}\])?: %{GREEDYDATA:message}" 
    }
    overwrite => [ "message" ]
}

if [message] =~ /^pam_/ {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{PAM}" }
        add_field => { "parser_result" => "pam_success" }
    }
    if [pam_kvdata] {
        mutate {
            gsub => [ "pam_kvdata", "= ", '=- ' ]
        }
        kv {
            source => "pam_kvdata"
            prefix => "pam_"
        }
        mutate {
            remove_field => [ "pam_kvdata" ]
        }
    }
    if [pam_rhost]{
        mutate { add_field => { "siem_sourceip" => "%{pam_rhost}" } }
    }
}

if [processname] == "sshd" {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{SSH_AUTHFAIL_WRONGCREDS}" }
        add_field => { "ssh_authresult" => "fail" }
        add_field => { "ssh_failreason" => "wrong_credentials" }
        add_field => { "parser_result" => "sshd_success" }
    }
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{SSH_AUTHFAIL_WRONGUSER}" }
        add_field => { "ssh_authresult" => "fail" }
        add_field => { "ssh_failreason" => "unknown_user" }
        add_field => { "parser_result" => "sshd_success"}
    }
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{SSH_AUTH_SUCCESS}" }
        add_field => { "ssh_authresult" => "success" }
        add_field => { "parser_result" => "sshd_success"}
    }
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{SSH_DISCONNECT}" }
        add_field => { "ssh_authresult" => "ssh_disconnect" }
        add_field => { "parser_result" => "ssh_success" }
    }
}

if [processname] == "sudo" {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{SUDO}" }
        add_field => { "parser_result" => "sudo_success" }
    }
}

if [processname] == "su" {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{SU}" }
        add_field => { "parser_result" => "su_success" }
    }
}

if [processname] == "systemd-logind" {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{SYSTEMD_LOGIND}" }
        add_field => { "parser_result" => "systemd_logind_success" }
    }
}

if [processname] in [ "useradd", "groupadd" ] {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{ACCOUNT_ADD}" }
        add_field => { "account_action" => "create" }
        add_field => { "parser_result" => "new_account_success" }
    }
    if [account_kvdata] {
        mutate {
            gsub => [ "account_kvdata", ", ", '|' ]
        }
        kv {
            source => "account_kvdata"
            prefix => "account_"
            field_split => "|"
        }
        mutate {
            remove_field => [ "account_kvdata" ]
        }
    }
}

if [processname] == "usermod" {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{USERMOD}" }
        add_field => { "parser_result" => "usermod_success" }
    }
}

if [processname] == "userdel" {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{USERDEL}" }
        add_field => { "parser_result" => "userdel_success" }
    }
    mutate {
        gsub => [ "account_action", "remove", "delete" ]
    }
}

if [processname] == "groupdel" {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => { "message" => "%{GROUPDEL}" }
        add_field => { "account_action" => "delete" }
        add_field => { "parser_result" => "groupdel_success" }
    }
}
mutate {
    remove_tag => [ "_grokparsefailure" ]
}
if [parser_result] {
    if [parser_result] == "new_account_success" {
        mutate { add_field => { "linuxeventcode" => "1000" } }
    }
    if [parser_result] == "userdel_success" {
        mutate { add_field => { "linuxeventcode" => "1001" } }
    }
}
if [ssh_authresult] {
    if [ssh_authresult] == "fail" {
        mutate { add_field => { "linuxeventcode" => "1002" } }
    }
    if [ssh_authresult] == "success" {
        mutate { add_field => { "linuxeventcode" => "1003" } }
    }
    if [ssh_authresult] == "ssh_disconnect" {
        mutate { add_field => { "linuxeventcode" => "1004" } }
    }
}
if [account_action] {
    if [account_action] == "lock" {
        mutate { add_field => { "linuxeventcode" => "1005" } }
    }
    if [account_action] == "unlock" {
        mutate { add_field => { "linuxeventcode" => "1006" } }
    }
    if [account_action] == "password changed" {
        mutate { add_field => { "linuxeventcode" => "1007" } }
    }
}
date {
    match => [ "timestamp1", "MMM dd HH:mm:ss" ]
    timezone => "Asia/Kolkata"
    locale => "en"
    target => "@timestamp"
}

Вот упомянутые файлы .grok, которые нужно загрузить в каталог /etc/logstash/patterns.d/:

systemd.grok

SYSTEMD_LOGIND_NEW New session %{INT:systemd_login_sessionid} of user %{USER:systemd_login_user}\.
SYSTEMD_LOGIND_REMOVED Removed session %{INT:systemd_login_sessionid}\.
SYSTEMD_LOGIND_OTHERS %{GREEDYDATA}
SYSTEMD_LOGIND %{SYSTEMD_LOGIND_NEW}|%{SYSTEMD_LOGIND_REMOVED}|%{SYSTEMD_LOGIND_OTHERS}

sudo.grok

SUDO \s*%{USERNAME:sudo_user}\s*:\s*TTY=%{DATA:sudo_tty}\s*;\s*PWD=%{DATA:sudo_pwd}\s*;\s*USER=%{DATA:sudo_targetuser}\s*;\s*COMMAND=%{GREEDYDATA:sudo_command}
SU \+\s+%{DATA:su_tty}\s+%{USER:su_user}:%{USER:su_targetuser}

 

user-management.grok

USERMOD_CHANGE (?<account_action>change) user '%{USER:account_name}' %{WORD:account_attribute}( from '%{DATA:account_from}' to '%{DATA:account_to}')?
USERMOD_GROUP_MEMBERSHIP (?<account_action>add|delete) '%{USER:account_name}' (?:to|from) %{DATA:account_grouptype} '%{DATA:account_groupname}'
USERMOD_LOCKUNLOCK (?<account_action>lock|unlock) user '%{USER:account_name}' %{GREEDYDATA:greedydetails}
USERMOD %{USERMOD_CHANGE}|%{USERMOD_GROUP_MEMBERSHIP}|%{USERMOD_LOCKUNLOCK}
NEW_ACCOUNT new %{DATA:account_type}:\s+%{GREEDYDATA:account_kvdata}
ACCOUNT_ADD %{NEW_ACCOUNT}|%{USERMOD_GROUP_MEMBERSHIP}
USERDEL_USER (?<account_action>delete) user '%{USER:account_name}'
USERDEL_GROUP (?<account_action>remove)d %{DATA:account_grouptype} '%{DATA:account_groupname}' owned by '%{DATA:account_groupowner}'
USERDEL_GROUP_DELUSER (?<account_action>delete) '%{USER:account_name}' from %{DATA:account_grouptype} '%{DATA:account_groupname}'
USERDEL %{USERDEL_USER}|%{USERDEL_GROUP}|%{USERDEL_GROUP_DELUSER}
GROUPDEL %{DATA:account_type} '%{USER:account_name}' removed( from %{GREEDYDATA:account_repository})?

 

sshd.grok

SSH_AUTHFAIL_WRONGUSER Failed %{WORD:ssh_authmethod} for invalid user %{USERNAME:siem_sshuser} from %{IP:siem_sourceip} port %{NUMBER:siem_sshport} (?<ssh_protocol>\w+\d+)
SSH_AUTHFAIL_WRONGCREDS Failed %{WORD:ssh_authmethod} for %{USERNAME:siem_sshuser} from %{IP:siem_sourceip} port %{NUMBER:siem_sshport} (?<ssh_protocol>\w+\d+)
SSH_AUTH_SUCCESS Accepted %{WORD:ssh_authmethod} for %{USERNAME:siem_sshuser} from %{IP:siem_sourceip} port %{NUMBER:siem_sshport} (?<ssh_protocol>\w+\d+)(?:: %{WORD:ssh_pubkey_type} %{GREEDYDATA:ssh_pubkey_fingerprint})?
SSH_DISCONNECT Received disconnect from %{IP:siem_sourceip} port %{INT:siem_sshport}.*?:\s+%{GREEDYDATA:ssh_disconnect_reason}

 

В Logstash шаблоны, хранящиеся в этой директории, используются для определения пользовательских регулярных выражений (известных как шаблоны grok) для разбора файлов журналов.

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

Размещение пользовательских шаблонов grok в этой директории позволяет Logstash получать к ним доступ и использовать их при обработке данных журнала.

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

No. Название события Код события
1 New Account Created 1000
2 User Deleted 1001
3 Failed Login Attempt 1002
4 Successful Login Attempt 1003
5 SSH Disconnect 1004
6 User Locked 1005
7 User Unlocked 1006
8 Password Changed 1007

Используя Logstash для разбора журналов аутентификации SSH, организации могут эффективно отслеживать и анализировать действия по входу в систему, выявлять подозрительное поведение и укреплять свою безопасность.

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

Благодаря мощным возможностям Logstash управление журналами аутентификации SSH становится неотъемлемой частью эффективной стратегии мониторинга безопасности.

см. также:

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий