kibana에 elastalert-plugin 설치

[root@tmplogsvr bin]# /usr/share/kibana/bin/kibana-plugin install https://github.com/Karql/elastalert-kibana-plugin/releases/download/1.6.1/elastalertKibanaPlugin-1.6.1-8.6.2.zip
[root@tmplogsvr ~]#

 

kibana.yml에 아래 내용 첨부

elastalertKibanaPlugin.serverSsl: false
elastalertKibanaPlugin.serverHost: localhost
elastalertKibanaPlugin.serverPort: 3030

 

'기술 노트 > elastalert' 카테고리의 다른 글

elastalert 실행하기  (0) 2023.03.17
elastalert 설치하기 (간단히)  (0) 2023.03.16
elastalert rule example 2  (0) 2023.03.06
elastalert rules example 1  (0) 2023.03.06
elastalert config.yaml  (0) 2023.03.06

rsyslog.conf 수정할 내용

해당 파일에 아래 내용 수정 및 추가하기

# syslog 수신 포트 설정
module(load="imudp") # 주석 제거하여 활성화
input(type="imudp" port="514") # 주석 제거하여 활성화

# syslog 수신 시 저장할 위치 및 파일 설정 템플릿
$template Remote,"/var/log/rsyslog/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log" 

# syslog 수신 시 fromhost-ip가 127.0.0.1이 아닌 경우 템플릿 Remote 정책을 적용
:fromhost-ip, !isequal, "127.0.0.1" ?Remote

# 템플릿 Remote로 수신한 경우 로그 처리 중지
# 중지하지 않을 경우, OS에서 수집하는 syslog나 message에도 로그가 수집 됨 (중복 수집 됨)
& stop

 

rsyslog.conf 전체 내용 (수정할 로그의 위치 파악용)

[root@localhost ~]# cat /etc/rsyslog.conf
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

#### MODULES ####

module(load="imuxsock"    # provides support for local system logging (e.g. via logger command)
       SysSock.Use="off") # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.
module(load="imjournal"             # provides access to the systemd journal
       StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability

# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once 주석제거하여 활성화
input(type="imudp" port="514") # 주석제거하여 활성화

# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")

#### Template ###
$template Remote,"/var/log/rsyslog/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log"

#### RULES ####

# 로그가 Remote template을 거친 경우 여기서 로그 수집 중단
# 로그 수집이 중단되지 않을 경우 해당 경로 이후의 syslog 프로세스를 거침
# 일반적으로 syslog나 message 파일에 등록 되어 Remote template에도 등록이 되었기 때문에 중복 메시지가 됨.
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
& stop

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log


# ### sample forwarding rule ###
#action(type="omfwd"
# # An on-disk queue is created for this action. If the remote host is
# # down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1"       # unique name prefix for spool files
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on"       # save messages to disk on shutdown
#queue.type="LinkedList"         # run asynchronously
#action.resumeRetryCount="-1"    # infinite retries if host is down
# # Remote Logging (we use TCP for reliable delivery)
# # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")

'기술 노트 > rsyslog' 카테고리의 다른 글

rsyslog 서비스로 syslog 수신하기  (0) 2023.02.15

[root@tmplogsvr ~]# which python3

/usr/bin/python3

[root@tmplogsvr ~]# cd /usr/bin

[root@tmplogsvr bin]# ls -al | grep python

lrwxrwxrwx.  1 root root         25  3월 15 14:17 python3 -> /etc/alternatives/python3

lrwxrwxrwx.  1 root root         31  8월 26  2021 python3.6 -> /usr/libexec/platform-python3.6

lrwxrwxrwx.  1 root root         32  8월 26  2021 python3.6m -> /usr/libexec/platform-python3.6m

lrwxrwxrwx.  1 root root         24  3월 15 14:16 unversioned-python -> /etc/alternatives/python

[root@tmplogsvr bin]# ln -s ./python3 ./python

[root@tmplogsvr bin]# ls -al | grep python

lrwxrwxrwx.  1 root root          9  3월 16 09:26 python -> ./python3

lrwxrwxrwx.  1 root root         25  3월 15 14:17 python3 -> /etc/alternatives/python3

lrwxrwxrwx.  1 root root         31  8월 26  2021 python3.6 -> /usr/libexec/platform-python3.6

lrwxrwxrwx.  1 root root         32  8월 26  2021 python3.6m -> /usr/libexec/platform-python3.6m

lrwxrwxrwx.  1 root root         24  3월 15 14:16 unversioned-python -> /etc/alternatives/python

[root@tmplogsvr bin]#

'기술 노트 > OS' 카테고리의 다른 글

원격데스크탑 접속 오류  (0) 2023.04.27
시간 동기화  (0) 2023.04.04
NetworkManager의 IPv6 오류 메시지  (0) 2023.04.04
firewall 서비스 중지  (0) 2023.02.17
GPG키 오류 날 경우  (0) 2023.02.16

처음 블로그를 운영합니다.

그러다보니 글이 늘어나니, 찾아가기 힘드네요.

 

페이지별 게시글이 제한되어 있고, 페이지를 넘기려면 맨 하단으로 옮겨야....

왜 이렇게 만들었는지는 모르겠으나 고쳐서 사용하겠습니다.

 

변경 전

 

변경 후

 

 

변경 방법입니다.

 

 

Ctrl + F를 눌러 찾기을 활성화 하여 아래 그림처럼 "paging"를 검색

 

코드 위치 확인하여 아래와 같이 붙여 넣기

 

유입되는 ap 로그 중 grok 패턴을 기존보다 상세히 하여 ap에 로그인한 것과 로그인 실패한 것을 구분

elastalert rule example 참조

- https://dirt-spoon.tistory.com/24

 

elastalert rules example 1

아래 룰은 AP의 콘솔 접속 시 발송하는 메시지 룰입니다. # elasticsearch host es_host: 192.168.0.00 # elasticsearch port es_port: 9200 # 로그는 탐지하는 타입 type: any # 얼마나 자주 탐지 run_every: seconds: 10 # 메시지

dirt-spoon.tistory.com

- https://dirt-spoon.tistory.com/25

 

elastalert rule example 2

아래 룰은 AP의 콘솔 접속 시 발송하는 메시지 룰입니다. es_host: 192.168.0.17 es_port: 9200 type: any run_every: seconds: 10 buffer_time: minutes: 1 index: "logstash-ap*" filter: - query_string: query: reason:"logon failed for invalid us

dirt-spoon.tistory.com

 

 

grok의 pattern_dir에 있는 pattern은 제가 작성했던 pattern을 그대로 사용하시면 됩니다.

 

 

grok 패턴 설명 1

원문 Mar 11 01:48:26 PnP [2357]: pnp_platform.discovery.lease_parser INFO Retrieving lease option strings for vendor-specific-information ipv4
쿼리 %{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} %{IPORHOST:process}\[%{BASE10NUM:process_id}\]\: %{GREEDYDATA:sub_message}

 

grok 패턴 설명 2

원문 Mar 10 17:53:10 192.168.10.2 hostapd[2358]: trying to update accounting statistics, station 5e:70:cb:61:b7:a5 not found
쿼리 %{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} \[%{BASE10NUM:process_id}\]\: %{GREEDYDATA:sub_message}

 

grok 패턴 설명 3

원문 Mar  6 16:15:20 192.168.10.2 syslog: User: admin last logged successfully in 2023-Mar-6#012, to 192.168.10.2, from 192.168.0.54 using HTTPS
쿼리 %{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} %{WORD:process}\: User\: %{GREEDYDATA:user} last logged %{GREEDYDATA:access_result} in %{GREEDYDATA:access_day}\#%{NUMBER:deauthentication_reason_code}, to %{IP:destination_ip}, from %{IP:source_ip} using %{WORD:access_method}

 

grok 패턴 설명 4

원문 Mar  6 16:14:35 192.168.10.2 syslog: User: logon failed for invalid username in 2023-Mar-6#012, to 192.168.10.2, from 192.168.0.54 using HTTPS
쿼리 %{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} %{WORD:process}\: User\: %{GREEDYDATA:reason} in %{GREEDYDATA:access_day}\#%{NUMBER:deauthentication_reason_code}, to %{IP:destination_ip}, from %{IP:source_ip} using %{WORD:access_method}

 

input {
        file {
                path => "/var/log/rsyslog/192.168.10.2/*.log"
                start_position => "beginning"
                tags => ["ap1"]
        }
        file {
                path => "/var/log/rsyslog/192.168.10.3/*.log"
                start_position => "beginning"
                tags => ["ap2"]
        }
        file {
                path => "/var/log/rsyslog/192.168.10.4/*.log"
                start_position => "beginning"
                tags => ["ap3"]
        }
        file {
                path => "/var/log/rsyslog/192.168.10.5/*.log"
                start_position => "beginning"
                tags => ["ap4"]
        }
}

filter {
        if "ap1" in [tags] or "ap2" in [tags] or "ap3" in [tags] or "ap4" in [tags]  {
                grok {
                        patterns_dir => ["/etc/logstash/pattern.d"]
                                match => {
                                        "message" => [
                                                "%{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} %{IPORHOST:process}\[%{BASE10NUM:process_id}\]\: %{GREEDYDATA:sub_message}",
                                                "%{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} \[%{BASE10NUM:process_id}\]\: %{GREEDYDATA:sub_message}",
                                                "%{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} %{WORD:process}\: User\: %{GREEDYDATA:user} last logged %{GREEDYDATA:access_result} in %{GREEDYDATA:access_day}\#%{NUMBER:deauthentication_reason_code}, to %{IP:destination_ip}, from %{IP:source_ip} using %{WORD:access_method}",
                                                "%{SYSLOGTIMESTAMP:access_time} %{IPORHOST:ip_or_host} %{WORD:process}\: User\: %{GREEDYDATA:reason} in %{GREEDYDATA:access_day}\#%{NUMBER:deauthentication_reason_code}, to %{IP:destination_ip}, from %{IP:source_ip} using %{WORD:access_method}"
                                        ]
                                }
                }
                mutate { remove_field => [ "message" ] }
        }
}

output {
        if "ap1" in [tags] {
                elasticsearch {
                        hosts => ["http://192.168.0.17:9200"]
                        index => "logstash-ap1-index-%{+YYYY.MM.dd}"
                }
        }
        else if "ap2" in [tags] {
                elasticsearch {
                        hosts => ["http://192.168.0.17:9200"]
                        index => "logstash-ap2-index-%{+YYYY.MM.dd}"
                }
        }
        else if "ap3" in [tags] {
                elasticsearch {
                        hosts => ["http://192.168.0.17:9200"]
                        index => "logstash-ap3-index-%{+YYYY.MM.dd}"
                }
        }
        else if "ap4" in [tags] {
                elasticsearch {
                        hosts => ["http://192.168.0.17:9200"]
                        index => "logstash-ap4-index-%{+YYYY.MM.dd}"
                }
        }
}

 

'기술 노트 > logstash' 카테고리의 다른 글

logstash.conf_230405  (0) 2023.04.05
logstash.conf_23.02.20  (0) 2023.02.20
logstash 파일 파싱하기  (0) 2023.02.20
logstash 설정  (0) 2023.02.20
grok pattern  (0) 2023.02.17

아래 룰은 AP의 콘솔 접속 시 발송하는 메시지 룰입니다.

name: ap_login_fail

type: any

index: "logstash-ap*"

filter:
- query_string:
    query: reason:"logon failed for invalid username"

doc_type: _doc

alert:
- "slack"

slack:
slack_webhook_url: "https://hooks.slack.com/services/------------------------"
slack_username_override: "ElastAlert-Bot"
slack_channel_override: "#security_alert"
slack_title: AP_LOGIN_FAIL
slack_msg_color: "warning"

alert_text: "AP_LOGIN_FAIL: {0} / 접속자IP: {1}"
alert_text_type: "alert_text_only"
alert_text_args: ["ip_or_host", "source_ip"]

'기술 노트 > elastalert' 카테고리의 다른 글

elastalert 설치하기 (간단히)  (0) 2023.03.16
elastalert plugin 설치하기  (0) 2023.03.16
elastalert rules example 1  (0) 2023.03.06
elastalert config.yaml  (0) 2023.03.06
elastalert 실행하기 1  (0) 2023.03.06

아래 룰은 AP의 콘솔 접속 시 발송하는 메시지 룰입니다.

#name
name: ap_login_success

# 로그는 탐지하는 타입
type: any

# logstash에서 설정한 log의 index 값
index: "logstash-ap*"


# 필터 grok 패턴 지정한 필드의 값에 같은 값이 들어올 경우
filter:
- query_string:
    query: access_result:"successfully"

# 메시지 타입
doc_type: _doc

# 알람 전송 매체 지정
alert:
- "slack"

# 알람 전송 옵션
slack:
# 슬랙 웹훅 주소
slack_webhook_url: "https://hooks.slack.com/services/--------------------------------------"
# 슬랙 채널에 메시지 전달할 이름
slack_username_override: "ElastAlert-Bot"
# 슬랙 메시지를 보낼 채널
slack_channel_override: "#security_alert"
# 슬랙 메시지에 타이틀 지정
# 지정하지 않을 경우 rule의 절대 경로 명이 찍힘: /opt/elastalert/ruls/ap_login_fail.yaml
slack_title: AP_LOGIN_SUCCESS
# 슬랙 메시지 색
slack_msg_color: "good"

# 슬랙에 전송할 메시지
# 슬랙에 전송할 메시지 중 배열 입력시 맨 아랫줄의 순서에 따라 숫자 입력
# 숫자 위치는 바뀌어도 됨
alert_text: "AP_LOGIN_SUCESS: {0} / 접속자:{1} / 접속자IP: {2}"
# 슬랙에 전송할 메시지 타입
alert_text_type: "alert_text_only"
# 슬랙에 전송할 메시지 중 탐지된 메시지에 대한 배열 입력
alert_text_args: ["ip_or_host", "user", "source_ip"]

 

'기술 노트 > elastalert' 카테고리의 다른 글

elastalert plugin 설치하기  (0) 2023.03.16
elastalert rule example 2  (0) 2023.03.06
elastalert config.yaml  (0) 2023.03.06
elastalert 실행하기 1  (0) 2023.03.06
elastalert 설치 (상세히)  (4) 2023.02.21
# 폴더 명
# 폴더 경로를 설정할 경우, elastalert을 실행할 때 rule 옵션을 별도로 주지 않아도 됨
# 예: elastalert --config /opt/elastalert/config.yaml
rules_folder: /opt/elastalert/rules

# elasticsearch를 쿼리하는 빈도
run_every:
  minutes: 1

# 쿼리가 실행되는 시간부터 뒤로 늘어나는 쿼리 창의 크기
buffer_time:
  minutes: 15

# elasticsearch host
es_host: 192.168.0.17 

# elasticsearch 사용 port
es_port: 9200 

# elastalert2가 데이터를 저장할 index
writeback_index: elastalert_status 

# 실패한 경고에 대한 재시도 기간
alert_time_limit: 
  days: 2

'기술 노트 > elastalert' 카테고리의 다른 글

elastalert plugin 설치하기  (0) 2023.03.16
elastalert rule example 2  (0) 2023.03.06
elastalert rules example 1  (0) 2023.03.06
elastalert 실행하기 1  (0) 2023.03.06
elastalert 설치 (상세히)  (4) 2023.02.21

elastalert을 실행하기 위해서 기본적으로 매뉴얼에서는 아래와 같은 방법으로 알려줍니다.

python -m elastalert.elastalert --config ...

 

하지만, 저는 아래의 방법으로 명령어를 실행시킵니다.

단, config.yaml에 rules_folder가 절대 경로로 지정이 되어 있어야 합니다.

elastalert --config /opt/elastalert/config.yaml &

'기술 노트 > elastalert' 카테고리의 다른 글

elastalert plugin 설치하기  (0) 2023.03.16
elastalert rule example 2  (0) 2023.03.06
elastalert rules example 1  (0) 2023.03.06
elastalert config.yaml  (0) 2023.03.06
elastalert 설치 (상세히)  (4) 2023.02.21

+ Recent posts