그라파나 연동 설정

/etc/grafana/grafana.ini

# Metrics available at HTTP URL /metrics and /metrics/plugins/:pluginId
[metrics]
# Disable / Enable internal metrics
enabled           = true

# Disable total stats (stat_totals_*) metrics to be generated
disable_total_stats = false

#################################### Internal Grafana Metrics ############

[metrics.graphite]
# Enable by setting the address setting (ex localhost:2003)
address = 192.168.0.17:3000 <- 해당 부분 수정
prefix = prod.grafana.%(instance_name)s.

 

/etc/prometheus/prometheus.yml

# 추가
  - job_name: 'grafana_metrics'
    scrape_interval: 15s
    scrape_timeout: 5s

    static_configs:
      - targets: ['192.168.0.17:3000']

 

결과 확인

서비스 재시작 후 http://<그라파나 설치 서버>:3000/metrics 접속

 

기본 설정 끝

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

그라파나 그래프 그리기 (ifHCInOctets)  (0) 2023.04.12
그라파나 그래프 그리기  (0) 2023.04.12
그라파나 설정 (snmp)  (0) 2023.04.10
그라파나 설치하기  (0) 2023.04.10

그라파나 설치

[root@tmplogsvr ~]# yum install grafana
마지막 메타자료 만료확인 2:45:38 이전인: 2023년 04월 10일 (월) 오전 10시 03분 46초.
종속성이 해결되었습니다.
====================================================================================================
 꾸러미                  구조               버전                        레포지터리             크기
====================================================================================================
설치 중:
 grafana                 x86_64             7.5.15-4.el8                appstream              39 M
취약한 종속 꾸러미 설치 중:
 grafana-pcp             x86_64             3.2.0-3.el8                 appstream             9.5 M

연결 요약
====================================================================================================
설치  2 꾸러미

총계 내려받기 크기: 49 M
설치된 크기 : 191 M
진행 할 까요? [y/N]: y
꾸러미 내려받기 중:
(1/2): grafana-pcp-3.2.0-3.el8.x86_64.rpm                           9.7 MB/s | 9.5 MB     00:00
(2/2): grafana-7.5.15-4.el8.x86_64.rpm                               13 MB/s |  39 MB     00:02
----------------------------------------------------------------------------------------------------
합계                                                                 14 MB/s |  49 MB     00:03
연결 확인 실행 중
연결 확인에 성공했습니다.
연결 시험 실행 중
연결 시험에 성공했습니다.
연결 실행 중
  준비 중           :                                                                           1/1
  설치 중           : grafana-pcp-3.2.0-3.el8.x86_64                                            1/2
  스크립트릿 실행 중: grafana-7.5.15-4.el8.x86_64                                               2/2
  설치 중           : grafana-7.5.15-4.el8.x86_64                                               2/2
  스크립트릿 실행 중: grafana-7.5.15-4.el8.x86_64                                               2/2
  스크립트릿 실행 중: grafana-pcp-3.2.0-3.el8.x86_64                                            2/2
  스크립트릿 실행 중: grafana-7.5.15-4.el8.x86_64                                               2/2
[/usr/lib/tmpfiles.d/elasticsearch.conf:1] Line references path below legacy directory /var/run/, updating /var/run/elasticsearch → /run/elasticsearch; please update the tmpfiles.d/ drop-in file accordingly.

  확인 중           : grafana-7.5.15-4.el8.x86_64                                               1/2
  확인 중           : grafana-pcp-3.2.0-3.el8.x86_64                                            2/2

설치되었습니다:
  grafana-7.5.15-4.el8.x86_64                     grafana-pcp-3.2.0-3.el8.x86_64

완료되었습니다!
[root@tmplogsvr ~]#
[root@tmplogsvr ~]# systemctl enable grafana-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /usr/lib/systemd/system/grafana-server.service.
[root@tmplogsvr ~]# systemctl daemon-reload

 

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

그라파나 그래프 그리기 (ifHCInOctets)  (0) 2023.04.12
그라파나 그래프 그리기  (0) 2023.04.12
그라파나 설정 (snmp)  (0) 2023.04.10
그라파나 설정 (promethues)  (0) 2023.04.10

최근 대부분 OS는 root로의 직접 로그인을 차단되어 있습니다.

해당 root 로그인 알람은 su 명령어를 통한 root  로그인에 대한 알람 설정입니다.

 

OS 로그인 알람 설정은 유지하며, Elastalert 룰만 추가하면 됩니다.

OS 로그인 알람 설정은 아래 페이지를 참고해 주세요.

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

 

elastalert 룰

name: server_root_login

type: any

index: logstash-tmpsyslogsvr*

filter:
- query:
    query_string:
      query: "USER:root AND COMMAND:/bin/su"

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: TMPLOGSVR_ROOT_LOGIN
# 슬랙 메시지 색
slack_msg_color: "good"


alert_text: "TMPLOGSVR_ROOT_LOGIN: 접속시간: {0} / 접속계정: {1}"
alert_text_type: "alert_text_only"

 

알람 확인

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

OS 로그인 알람  (0) 2023.04.10
elastalert 웹 관리 방식 사용 시  (0) 2023.03.17
kibana에서 elastalert 룰 설정하기  (0) 2023.03.17
kibana에서 elastalert 사용하기  (0) 2023.03.17
elastalert 실행하기  (0) 2023.03.17

해당 설정은 CentOS 8 기준으로 작성하였습니다.

각 OS 에서 보안 로그 파일을 대상으로 알람을 설정하면 OS 로그인 모니터링이 가능합니다.

 

알람 설정 환경

  • ELK 운영 환경
  • 대상 로그 파일: /var/log/secure

 

logstash.conf 파일 설정

input {
  file {
    path => "/var/log/secure"
    start_position => "beginning"
    tags => ["os_tmpsyslogsvr"]
  }
}

filter {
  if "os_tmpsyslogsvr" in [tags] {
    grok {
      patterns_dir => ["/etc/logstash/pattern.d"]
        match => {
          "message" => [
            "%{SYSLOGBASE}\s%{GREEDYDATA:auth_module}\(%{GREEDYDATA:auth_module_used}\)\:\s%{GREEDYDATA:cause} for user %{USER:user}",
            "%{SYSLOGBASE}\s%{GREEDYDATA:cause} for %{USER:user} from %{IP:ip} port %{NUMBER:port} %{GREEDYDATA:protocol}",
            "%{SYSLOGBASE}\s%{GREEDYDATA:auth_module}\(%{GREEDYDATA:auth_module_used}\)\:\s%{GREEDYDATA:cause} by %{USER:user}\(uid=%{NUMBER:uid}\)",
            "%{SYSLOGBASE}\s%{GREEDYDATA:auth_module}\(%{GREEDYDATA:auth_module_used}\)\:\s%{GREEDYDATA:cause}\:\s%{GREEDYDATA:result}",
            "%{SYSLOGBASE}\s%{USER:user}\s\:\s%{GREEDYDATA:sub_message}",
            "%{SYSLOGBASE}\s%{GREEDYDATA:sub_message}"
          ]
        }
    }
    kv {
      source => "sub_message"
      field_split => " ; "
      value_split => "="
    }
    mutate { remove_field => [ "message", "sub_message" ] }

  }
}

output {
  if "os_tmpsyslogsvr" in [tags] {
    elasticsearch {
      hosts => "http://192.168.0.17:9200"
      index => "logstash-tmpsyslogsvr-index-%{+YYYY.MM.dd}"
    }
  }
}

 

elastalert 룰

name: server_login_success

type: any

index: logstash-tmpsyslogsvr*

filter:
- query:
    query_string:
      query: protocol:"ssh2" AND cause:"Accepted password"

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: SERVER_LOGIN_SUCCESS
# 슬랙 메시지 색
slack_msg_color: "good"


alert_text: "TMPLOGSVR_SSH_LOGIN: 접속시간: {0} / 접속계정: {1} / 접속자IP: {2}"
alert_text_type: "alert_text_only"

 

알람 확인

logstash의 conf 설정 중 kv의 field_split 사용할 경우 공백 부분을 조심하셔야 합니다.

위 COMMAND 필드는 공백이 없지만, 아래의 COMMAND 필드는 공백이 있어서, 2~3시간 고생했네요.

elasticsearch에 로그는 확인이 되는데, elastealert에서는 왜 안되는지....

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

root 로그인 알람 설정  (0) 2023.04.10
elastalert 웹 관리 방식 사용 시  (0) 2023.03.17
kibana에서 elastalert 룰 설정하기  (0) 2023.03.17
kibana에서 elastalert 사용하기  (0) 2023.03.17
elastalert 실행하기  (0) 2023.03.17

elastalert을 설치하는 방법은 아래 글 참조

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

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

 

elastalert을 이용하여 알람 설정하는 방법은 아래 게시글 참조

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

 

fortigate login 시 알람 설정 룰

name: firewall_console_login
 
type: any
 
index: logstash-fortigate-event*
 
filter:
- query:
    query_string:
      query: logdesc:"Admin login successful" AND action:"login"

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/rules/firewall_login_success.yaml
slack_title: FIREWALL_LOGIN_SUCCESS

# 슬랙 메시지 색
slack_msg_color: "good"

 
alert_text: "FIREWALL_CONSOLE_LOGIN: 접속시간: {0} / 접속계정: {1} / 접속자IP: {2}"
alert_text_type: "alert_text_only"
alert_text_args: ["TIMESTAMP", "user", "srcip"] # 해당 field 명은 kibana에서 로그 확인

 

알람 수신 내역

여기까지 잘 따라하셨다면 아래와 같은 화면을 보실 수 있을 것입니다.

왼쪽을 보면 로그 파싱된 필드들이 엄청나게 보입니다.

t로 보이는 것은 text

#으로 보이는 것은 숫자 입니다.

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

map에서 ip로 지역 표시하기  (0) 2023.08.23
kibana 설정  (0) 2023.02.17
kibana 설치  (0) 2023.02.16

fortigate log 파싱 부분이 추가되었습니다.

fortigate 로그 파싱할때에는 logstash-filter-bytes를 사용하였습니다.

이유는 logstash에서 로그를 파싱하면 모든 자료는 기본적으로 type이 text입니다.

마찬가지로 숫자도 text로 인식합니다.

그래서 데이터 전송량도 type에 맞게 bytes라는 필터를 추가로 설치하였습니다.

logstash-filter-bytes의 설치는 아래의 작성 글을 참고하시기 바랍니다.

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

 

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"]
        }
        file {
                path => "/var/log/rsyslog/192.168.0.14/*.log"
                start_position => "beginning"
                tags => ["fortigate"]
        }
}

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" ] }
        }
        else if "fortigate" in [tags] {
                grok {
                        patterns_dir => ["/etc/logstash/pattern.d"]
                        match => { "message" => [ "%{FORTILOG} %{GREEDYDATA:sub_message}" ] }
                }
                kv {
                        source => "sub_message"
                        value_split => "="
                }
                mutate { remove_field => [ "message" ] }
                mutate { remove_field => [ "sub_message" ] }
                if "wan" in [srcintfrole] {
                        geoip {
                                source => "srcip"
                                target => "geoip_src"
                        }
                }
                if [sentbyte] != "" and [rcvdbyte] != "" {
                        bytes {
                                source => "rcvdbyte"
                                target => "receivedbyte"
                        }
                        bytes {
                                source => "sentbyte"
                                target => "sentedbyte"
                        }
                }
                mutate {
                        convert => {
                                "rcvdpkt" => "integer"
                                "sentpkt" => "integer"
                                "proto" => "integer"
                                "srcserver" => "integer"
                                "sessionid" => "integer"
                                "duration" => "integer"
                                "policyid" => "integer"
                                "HOUR" => "integer"
                                "MINUTE" => "integer"
                                "SECOND" => "integer"
                        }
                }
        }
}

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}"
                }
        }
        else if "fortigate" in [tags] {
                if "traffic" in [LOG_TYPE] {
                        elasticsearch {
                                hosts => "http://192.168.0.17:9200"
                                index => "logstash-fortigate-traffic-index-%{+YYYY.MM.dd}"
                        }
                }
                else if "event" in [LOG_TYPE] {
                        elasticsearch {
                                hosts => "http://192.168.0.17:9200"
                                index => "logstash-fortigate-event-index-%{+YYYY.MM.dd}"
                        }
                }
                else if "utm" in [LOG_TYPE] {
                        elasticsearch {
                                hosts => "http://192.168.0.17:9200"
                                index => "logstash-fortigate-utm-index-%{+YYYY.MM.dd}"
                        }
                }
        }
}

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

logstash.conf_230306  (0) 2023.03.06
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

logstash plugin을 이용하여 logstash-filter-bytes 설치

[root@tmplogsvr bin]# /usr/share/logstash/bin/logstash-plugin install logstash-filter-bytes
Using bundled JDK: /usr/share/logstash/jdk
Validating logstash-filter-bytes
Resolving mixin dependencies
Installing logstash-filter-bytes
Installation successful
[root@tmplogsvr bin]#

 

fortigate를 위한 logstash 패턴

####################################
###Fortinet Syslog Pattern Types:###
####################################

FORTILOG (?<TIMESTAMP>^\w+\s+\d+\s+\d+\:\d+\:\d+)\s(?<Client>\d+.\d+.\d+.\d+)\sdate=(?<DAY>\w+\-\w+\-\w+)\stime=(?<HOUR>\d+)\:(?<MINUTE>\d+)\:(?<SECOND>\d+)\sdevname="(?<Device_Name>.*)"\sdevid="(?<DEV_ID>\w+)"\slogid="(?<LOG_ID>\d+)"\stype="(?<LOG_TYPE>\w+)"\ssubtype="(?<SUB_LOG_TYPE>\w+)"

※ 기본 grok.pattern의 설정과 연계되어 있어 grok.pattern도 함께 작성 필요

 

fortigate를 위한 logstash 설정

[root@tmplogsvr bin]# cat /etc/logstash/conf.d/logstash.conf
input {
        file {
                path => "/var/log/rsyslog/192.168.10.14/*.log"
                start_position => "beginning"
                tags => ["fortigate"]
        }
}

filter {
        if "fortigate" in [tags] {
                grok {
                        patterns_dir => ["/etc/logstash/pattern.d"]
                        match => { "message" => [ "%{FORTILOG} %{GREEDYDATA:sub_message}" ] }
                }
                kv {
                        source => "sub_message"
                        value_split => "="
                }
                mutate { remove_field => [ "sub_message" ] }
                if "wan" in [srcintfrole] {
                        geoip {
                                source => "srcip"
                                target => "geoip_src"
                        }
                }
                if [sentbyte] != "" and [rcvdbyte] != "" {
                        bytes {
                                source => "rcvdbyte"
                                target => "receivedbyte"
                        }
                        bytes {
                                source => "sentbyte"
                                target => "sentedbyte"
                        }
                }
                mutate {
                        convert => {
                                "rcvdpkt" => "integer"
                                "sentpkt" => "integer"
                                "proto" => "integer"
                                "srcserver" => "integer"
                                "sessionid" => "integer"
                                "duration" => "integer"
                                "policyid" => "integer"
                                "HOUR" => "integer"
                                "MINUTE" => "integer"
                                "SECOND" => "integer"
                        }
                }
        }
}

output {
        if "fortigate" in [tags] {
                if "traffic" in [LOG_TYPE] {
                        elasticsearch {
                                hosts => ["http://192.168.0.17:9200"]
                                index => "logstash-fortigate-traffic-index-%{+YYYY.MM.dd}"
                        }
                }
                else if "event" in [LOG_TYPE] {
                        elasticsearch {
                                hosts => ["http://192.168.0.17:9200"]
                                index => "logstash-fortigate-event-index-%{+YYYY.MM.dd}"
                        }
                }
                else if "utm" in [LOG_TYPE] {
                        elasticsearch {
                                hosts => ["http://192.168.0.17:9200"]
                                index => "logstash-fortigate-utm-index-%{+YYYY.MM.dd}"
                        }
                }
        }
}

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

웹 페이지 접근 보호  (0) 2023.05.23
로그인 알람 설정  (0) 2023.04.06
interface https http ssh 접속 허용 cli  (0) 2023.03.24
interface status cli  (0) 2023.03.24
system shutdown cli  (0) 2023.03.24

http://{IP}:9090 접속 시

 

설정한 장비(Agent)의 연결 확인

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

prometheus 설정  (0) 2023.04.04
Prometheus 설치 및 실행  (0) 2023.03.21

기본 설정에 필요한 부분만 수정하였습니다.

각자 설치 시 재 설정 파일과 비교하시면 좋을 것아요.

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    scrape_interval: 5m
    scrape_timeout: 1m

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: 'snmp'
    static_configs:
      - targets: ['192.168.10.2']  # SNMP device.
      - targets: ['192.168.10.3']  # SNMP device.
      - targets: ['192.168.10.4']  # SNMP device.
      - targets: ['192.168.10.5']  # SNMP device.
    metrics_path: /snmp
    params:
      module: [if_mib]
      community: [<각자 설정한 commuity  값>]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.17:9116  # The SNMP exporter's real hostname:port.
  - job_name: 'grafana_metrics'
    scrape_interval: 15s
    scrape_timeout: 5s

    static_configs:
      - targets: ['192.168.0.17:3000']

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

prometheus와 snmp_exporter 설치 결과  (0) 2023.04.04
Prometheus 설치 및 실행  (0) 2023.03.21

+ Recent posts