# 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.
[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
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"
각 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에서는 왜 안되는지....
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에서 로그 확인
# 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']