**Elasticsearch**는 Apache Lucene(아파치 루씬) 기반의 Java 오픈소스 분산 검색엔진이다. Elastisearch를 통해 루씬 라이브러리를 단독으로 사용할 수 있으며, 방대한 양의 데이터를 신속하고 거의 실시간(NRT, Near Real Time)으로 저장, 검색, 분석할 수 있다.
# www.hongsnet.net LOG Management
![elk_stack](./images/elk-stack.png)
# 구성 요소
* Virtual Machine (CentOS 7, Clustered Env)
* ELK Stack (VM, Dockerized)
-**E**lasticsearch
-**L**ogstash
- Filebeat
-**K**ibana
## ELK Stack Installing
-**ElasticSearch**
> Logstach로부터 받은 데이터를 검색 및 집계하여, 원하는 정보를 획득할 수 있다.
match =>{"message"=>"%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}"}
add_field =>["received_at", "%{@timestamp}"]
add_field =>["received_from", "%{host}"]
}
syslog_pri {}
date{
match =>["syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss"]
}
}else if[type]=="syslog"{
if"Received disconnect"in[message] {
drop {}
}else if"Disconnected from"in[message] {
drop {}
}else if"Removed slice User Slice of"in[message] {
match =>{"message"=>"Failed %{WORD:sshd_auth_type} for %{USERNAME:sshd_invalid_user} from %{IPORHOST:sshd_client_ip} port %{NUMBER:sshd_port} %{GREEDYDATA:sshd_protocol}"}
}
grok {
add_tag =>["sshd_fail2"]
match =>{"message"=>"Failed %{WORD:sshd_auth_type} for invalid user %{USERNAME:sshd_invalid_user} from %{IPORHOST:sshd_client_ip} port %{NUMBER:sshd_port} %{GREEDYDATA:sshd_protocol}"}
}
grok {
add_tag =>["sshd_accept"]
match =>{"message"=>"%{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: Accepted password for %{USERNAME:sshd_invalid_user} from %{IPORHOST:sshd_client_ip} port %{NUMBER:sshd_port} %{GREEDYDATA:sshd_protocol}"}
}
mutate {
convert =>{"geoip.city_name"=>"string"}
}
geoip {
source=>"sshd_client_ip"
}
}else if[type]=="filebeats"{
if"ZABBIXDB"in[message] {
drop {}
}else if"ZABBIX_DEMO"in[message] {
drop {}
}else if"zabbix"in[message] {
drop {}
}
grok {
add_tag =>["db_conn"]
match =>{"message"=>"%{YEAR:year}%{MONTHNUM:month}%{MONTHDAY:day} %{TIME:time},%{GREEDYDATA:host},%{GREEDYDATA:username},%{GREEDYDATA:client_hostname},%{INT:connection_id},%{INT:query_id},%{GREEDYDATA:operation},%{GREEDYDATA:schema},%{GREEDYDATA:object},%{INT:return_code}"}
}
grok {
match =>["message", "^# User@Host: %{USER:query_user}(?:\[[^\]]+\])?\s+@\s+%{HOSTNAME:query_host}?\s+\[%{IP:query_ip}?\]"]
}
grok {
match =>["message", "^# Thread_id: %{NUMBER:thread_id:int}\s+Schema: %{USER:schema}\s+Last_errno: %{NUMBER:last_errno:int}\s+Killed: %{NUMBER:killed:int}"]
**Elasticsearch**는 Apache Lucene(아파치 루씬) 기반의 Java 오픈소스 분산 검색엔진이다. Elastisearch를 통해 루씬 라이브러리를 단독으로 사용할 수 있으며, 방대한 양의 데이터를 신속하고 거의 실시간(NRT, Near Real Time)으로 저장, 검색, 분석할 수 있다.
# www.hongsnet.net LOG Management
![elk_stack](./images/elk-stack.png)
# 구성 요소
* Virtual Machine (CentOS 7, Clustered Env)
* ELK Stack (VM, Dockerized)
-**E**lasticsearch
-**L**ogstash
- Filebeat
-**K**ibana
## ELK Stack Installing
-**ElasticSearch**
> Logstach로부터 받은 데이터를 검색 및 집계하여, 원하는 정보를 획득할 수 있다.
match =>{"message"=>"%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}"}
add_field =>["received_at", "%{@timestamp}"]
add_field =>["received_from", "%{host}"]
}
syslog_pri {}
date{
match =>["syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss"]
}
}else if[type]=="syslog"{
if"Received disconnect"in[message] {
drop {}
}else if"Disconnected from"in[message] {
drop {}
}else if"Removed slice User Slice of"in[message] {
match =>{"message"=>"Failed %{WORD:sshd_auth_type} for %{USERNAME:sshd_invalid_user} from %{IPORHOST:sshd_client_ip} port %{NUMBER:sshd_port} %{GREEDYDATA:sshd_protocol}"}
}
grok {
add_tag =>["sshd_fail2"]
match =>{"message"=>"Failed %{WORD:sshd_auth_type} for invalid user %{USERNAME:sshd_invalid_user} from %{IPORHOST:sshd_client_ip} port %{NUMBER:sshd_port} %{GREEDYDATA:sshd_protocol}"}
}
grok {
add_tag =>["sshd_accept"]
match =>{"message"=>"%{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: Accepted password for %{USERNAME:sshd_invalid_user} from %{IPORHOST:sshd_client_ip} port %{NUMBER:sshd_port} %{GREEDYDATA:sshd_protocol}"}
}
mutate {
convert =>{"geoip.city_name"=>"string"}
}
geoip {
source=>"sshd_client_ip"
}
}else if[type]=="filebeats"{
if"ZABBIXDB"in[message] {
drop {}
}else if"ZABBIX_DEMO"in[message] {
drop {}
}else if"zabbix"in[message] {
drop {}
}
grok {
add_tag =>["db_conn"]
match =>{"message"=>"%{YEAR:year}%{MONTHNUM:month}%{MONTHDAY:day} %{TIME:time},%{GREEDYDATA:host},%{GREEDYDATA:username},%{GREEDYDATA:client_hostname},%{INT:connection_id},%{INT:query_id},%{GREEDYDATA:operation},%{GREEDYDATA:schema},%{GREEDYDATA:object},%{INT:return_code}"}
}
grok {
match =>["message", "^# User@Host: %{USER:query_user}(?:\[[^\]]+\])?\s+@\s+%{HOSTNAME:query_host}?\s+\[%{IP:query_ip}?\]"]
}
grok {
match =>["message", "^# Thread_id: %{NUMBER:thread_id:int}\s+Schema: %{USER:schema}\s+Last_errno: %{NUMBER:last_errno:int}\s+Killed: %{NUMBER:killed:int}"]