๊ณผ๊ฑฐ์
์ด ์ฃผ์ ์ ๋ํ ๊ธฐ์ฌ๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ELK ์คํ ์ค์น์ ๋ํด์๋ ๋ค๋ฃจ์ง ์์ต๋๋ค. ๊ตฌ์ฑ ๊ตฌ์ฑ ์์๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
Logstash ๊ตฌ์ฑ์ ์ํ ์คํ ๊ณํ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
- Elasticsearch๊ฐ ๋ก๊ทธ๋ฅผ ํ์ฉํ๋์ง ํ์ธํฉ๋๋ค(ํฌํธ์ ๊ธฐ๋ฅ ๋ฐ ๊ฐ๋ฐฉ์ฑ ํ์ธ).
- Logstash์ ์ด๋ฒคํธ๋ฅผ ์ ์กํ๊ณ ๋ฐฉ๋ฒ์ ์ ํํ๊ณ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํฉ๋๋ค.
- Logstash ๊ตฌ์ฑ ํ์ผ์์ ์ ๋ ฅ์ ๊ตฌ์ฑํฉ๋๋ค.
- ๋ก๊ทธ ๋ฉ์์ง์ ๋ชจ์์ ์ดํดํ๊ธฐ ์ํด ๋๋ฒ๊ทธ ๋ชจ๋์์ Logstash ๊ตฌ์ฑ ํ์ผ์ ์ถ๋ ฅ์ ๊ตฌ์ฑํฉ๋๋ค.
- ํํฐ๋ฅผ ์ค์ ์ค์ ๋๋ค.
- ElasticSearch์์ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ์ ์ค์ ํฉ๋๋ค.
- ๋ก๊ทธ์คํ์๊ฐ ์ถ์๋ฉ๋๋ค.
- Kibana์์ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
๊ฐ ์ฌํญ์ ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Elasticsearch๊ฐ ๋ก๊ทธ๋ฅผ ํ์ฉํ๋์ง ํ์ธ
์ด๋ฅผ ์ํด, ์ปฌ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ Logstash๊ฐ ๋ฐฐํฌ๋ ์์คํ ์์ Elasticsearch์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ธ์ฆ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ปฌ์ ํตํด ์ฌ์ฉ์/๋น๋ฐ๋ฒํธ๋ ์ ์กํ๋ฉฐ, ํฌํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ ๊ฒฝ์ฐ ํฌํธ 9200์ ์ง์ ํฉ๋๋ค. ์๋์ ๋น์ทํ ์๋ต์ด ๋ํ๋๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ธ ๊ฒ์ ๋๋ค.
[elastic@elasticsearch ~]$ curl -u <<user_name>> : <<password>> -sS -XGET "<<ip_address_elasticsearch>>:9200"
{
"name" : "elastic-1",
"cluster_name" : "project",
"cluster_uuid" : "sQzjTTuCR8q4ZO6DrEis0A",
"version" : {
"number" : "7.4.1",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "fc0eeb6e2c25915d63d871d344e3d0b45ea0ea1e",
"build_date" : "2019-10-22T17:16:35.176724Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
[elastic@elasticsearch ~]$
์๋ต์ด ์์ ๋์ง ์์ผ๋ฉด ์ฌ๋ฌ ์ ํ์ ์ค๋ฅ๊ฐ ์์ ์ ์์ต๋๋ค. Elasticsearch ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ณ ์์ง ์๊ฑฐ๋, ์๋ชป๋ ํฌํธ๊ฐ ์ง์ ๋์๊ฑฐ๋, Elasticsearch๊ฐ ์ค์น๋ ์๋ฒ์ ๋ฐฉํ๋ฒฝ์ ์ํด ํฌํธ๊ฐ ์ฐจ๋จ๋์์ต๋๋ค.
์ฒดํฌํฌ์ธํธ ๋ฐฉํ๋ฒฝ์์ Logstash๋ก ๋ก๊ทธ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Check Point ๊ด๋ฆฌ ์๋ฒ์์ log_exporter ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ syslog๋ฅผ ํตํด Logstash์ ๋ก๊ทธ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
cp_log_export ์ด๋ฆ ์ถ๊ฐ check_point_syslog ๋์ ์๋ฒ < > ๋์ ํฌํธ 5555 ํ๋กํ ์ฝ tcp ํ์ ์ผ๋ฐ ์ฝ๊ธฐ ๋ชจ๋ ๋ฐํตํฉ
< > - Logstash๊ฐ ์คํ๋๋ ์๋ฒ์ ์ฃผ์, target-port 5555 - ๋ก๊ทธ๋ฅผ ๋ณด๋ผ ํฌํธ, tcp๋ฅผ ํตํด ๋ก๊ทธ๋ฅผ ๋ณด๋ด๋ฉด ์๋ฒ๋ฅผ ๋ก๋ํ ์ ์์ผ๋ฏ๋ก ์ด๋ค ๊ฒฝ์ฐ์๋ udp๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ํํฉ๋๋ค.
Logstash ๊ตฌ์ฑ ํ์ผ์์ INPUT ์ค์
๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ์ฑ ํ์ผ์ /etc/logstash/conf.d/ ๋๋ ํฐ๋ฆฌ์ ์์ต๋๋ค. ๊ตฌ์ฑ ํ์ผ์ INPUT, FILTER, OUTPUT์ ์ธ ๊ฐ์ง ์๋ฏธ ์๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์์ ์
๋ ฅ ์์คํ
์ด ๋ก๊ทธ๋ฅผ ๊ฐ์ ธ์ฌ ์์น๋ฅผ ๋ํ๋
๋๋ค. FILTER ๋ก๊ทธ ๋ถ์ - ๋ฉ์์ง๋ฅผ ํ๋์ ๊ฐ์ผ๋ก ๋๋๋ ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค. ์ถ๋ ฅ ๊ตฌ๋ฌธ ๋ถ์๋ ๋ก๊ทธ๊ฐ ์ ์ก๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ ๊ตฌ์ฑํฉ๋๋ค.
๋จผ์ INPUT์ ๊ตฌ์ฑํ๊ณ ํ์ผ, tcp ๋ฐ exe์ ๊ฐ์ ๋ช ๊ฐ์ง ์ ํ์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
TCP:
input {
tcp {
port => 5555
host => โ10.10.1.205โ
type => "checkpoint"
mode => "server"
}
}
๋ชจ๋ => "์๋ฒ"
Logstash๊ฐ ์ฐ๊ฒฐ์ ์๋ฝํ๊ณ ์์์ ๋ํ๋
๋๋ค.
ํฌํธ => 5555
ํธ์คํธ => โ10.10.1.205โ
IP ์ฃผ์ 10.10.1.205(Logstash), ํฌํธ 5555๋ฅผ ํตํ ์ฐ๊ฒฐ์ ํ์ฉํฉ๋๋ค. ํฌํธ๋ ๋ฐฉํ๋ฒฝ ์ ์ฑ
์ ์ํด ํ์ฉ๋์ด์ผ ํฉ๋๋ค.
์ ํ => "์ฒดํฌํฌ์ธํธ"
๋ค์ด์ค๋ ์ฐ๊ฒฐ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ๋ฌธ์์ ํ์ํฉ๋๋ค. ๊ทธ ํ, ๊ฐ ์ฐ๊ฒฐ์ ๋ํด ๋
ผ๋ฆฌ์ if ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๊ณ ์ ํ ํํฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ผ :
input {
file {
path => "/var/log/openvas_report/*"
type => "openvas"
start_position => "beginning"
}
}
์ค์ ์ค๋ช
:
๊ฒฝ๋ก => "/var/log/openvas_report/*"
ํ์ผ์ ์ฝ์ด์ผ ํ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ํ๋
๋๋ค.
์ ํ => "์คํ๋ฐ์ค"
์ด๋ฒคํธ ์ ํ.
start_position => "์์"
ํ์ผ์ ๋ณ๊ฒฝํ ๋ ์ ์ฒด ํ์ผ์ ์ฝ์ผ๋ฉฐ, โendโ๋ฅผ ์ค์ ํ๋ฉด ์์คํ
์ ํ์ผ ๋์ ์ ๋ ์ฝ๋๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
์์:
input {
exec {
command => "ls -alh"
interval => 30
}
}
์ด ์ ๋ ฅ์ ์ฌ์ฉํ๋ฉด (์ ์ผํ!) ์ ธ ๋ช ๋ น์ด ์คํ๋๊ณ ํด๋น ์ถ๋ ฅ์ด ๋ก๊ทธ ๋ฉ์์ง๋ก ๋ณํ๋ฉ๋๋ค.
๋ช
๋ น => "ls -alh"
์ฐ๋ฆฌ๊ฐ ๊ด์ฌ ์๋ ์ถ๋ ฅ์ ๋ช
๋ น์
๋๋ค.
๊ฐ๊ฒฉ => 30
๋ช
๋ น ํธ์ถ ๊ฐ๊ฒฉ(์ด)์
๋๋ค.
๋ฐฉํ๋ฒฝ์ผ๋ก๋ถํฐ ๋ก๊ทธ๋ฅผ ๋ฐ๊ธฐ ์ํด ํํฐ๋ฅผ ๋ฑ๋กํฉ๋๋ค. TCP ๋๋ udp, ๋ก๊ทธ๊ฐ Logstash๋ก ์ ์ก๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๋ก๊ทธ ๋ฉ์์ง์ ๋ชจ์์ ์ดํดํ๊ธฐ ์ํด ๋๋ฒ๊ทธ ๋ชจ๋์์ Logstash ๊ตฌ์ฑ ํ์ผ์ ์ถ๋ ฅ์ ๊ตฌ์ฑํฉ๋๋ค.
INPUT์ ๊ตฌ์ฑํ ํ์๋ ๋ก๊ทธ ๋ฉ์์ง์ ๋ชจ์๊ณผ ๋ก๊ทธ ํํฐ(ํ์)๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํด์ผ ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด ์๋ณธ ๋ฉ์์ง๋ฅผ ๋ณด๊ธฐ ์ํด ๊ฒฐ๊ณผ๋ฅผ stdout์ผ๋ก ์ถ๋ ฅํ๋ ํํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ฌ ์ ์ฒด ๊ตฌ์ฑ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
input
{
tcp
{
port => 5555
type => "checkpoint"
mode => "server"
host => โ10.10.1.205โ
}
}
output
{
if [type] == "checkpoint"
{
stdout { codec=> json }
}
}
๋ค์ ๋ช
๋ น์ ์คํํ์ฌ ํ์ธํฉ๋๋ค.
sudo /usr/share/logstash/bin//logstash -f /etc/logstash/conf.d/checkpoint.conf
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๊ทธ๋ฆผ์ ํด๋ฆญํ ์ ์์ต๋๋ค.
๋ณต์ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
action="Accept" conn_direction="Internal" contextnum="1" ifdir="outbound" ifname="bond1.101" logid="0" loguid="{0x5dfb8c13,0x5,0xfe0a0a0a,0xc0000000}" origin="10.10.10.254" originsicname="CN=ts-spb-cpgw-01,O=cp-spb-mgmt-01.tssolution.local.kncafb" sequencenum="8" time="1576766483" version="5" context_num="1" dst="10.10.10.10" dst_machine_name="[email protected]" layer_name="TSS-Standard Security" layer_name="TSS-Standard Application" layer_uuid="dae7f01c-4c98-4c3a-a643-bfbb8fcf40f0" layer_uuid="dbee3718-cf2f-4de0-8681-529cb75be9a6" match_id="8" match_id="33554431" parent_rule="0" parent_rule="0" rule_action="Accept" rule_action="Accept" rule_name="Implicit Cleanup" rule_uid="6dc2396f-9644-4546-8f32-95d98a3344e6" product="VPN-1 & FireWall-1" proto="17" s_port="37317" service="53" service_id="domain-udp" src="10.10.1.180" ","type":"qqqqq","host":"10.10.10.250","@version":"1","port":50620}{"@timestamp":"2019-12-19T14:50:12.153Z","message":"time="1576766483" action="Accept" conn_direction="Internal" contextnum="1" ifdir="outbound" ifname="bond1.101" logid="0" loguid="{0x5dfb8c13,
์ด๋ฌํ ๋ฉ์์ง๋ฅผ ๋ณด๋ฉด ๋ก๊ทธ๊ฐ ํ๋ = ๊ฐ ๋๋ ํค = ๊ฐ๊ณผ ์ ์ฌํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ kv๋ผ๋ ํํฐ๊ฐ ์ ํฉํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ฐ ํน์ ์ฌ๋ก์ ์ ํฉํ ํํฐ๋ฅผ ์ ํํ๋ ค๋ฉด ๊ธฐ์ ๋ฌธ์์์ ํด๋น ํํฐ๋ฅผ ์์งํ๊ฑฐ๋ ์น๊ตฌ์๊ฒ ๋ฌธ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํํฐ ์ค์
kv๋ฅผ ์ ํํ ๋ง์ง๋ง ๋จ๊ณ์์ ์ด ํํฐ์ ๊ตฌ์ฑ์ ์๋์ ๊ฐ์ต๋๋ค.
filter {
if [type] == "checkpoint"{
kv {
value_split => "="
allow_duplicate_values => false
}
}
}
ํ๋์ ๊ฐ์ ๋๋ ๊ธฐํธ("=")๋ฅผ ์ ํํฉ๋๋ค. ๋ก๊ทธ์ ๋์ผํ ํญ๋ชฉ์ด ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ๋์ ์ธ์คํด์ค๋ง ์ ์ฅํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์ผํ ๊ฐ์ ๋ฐฐ์ด๋ก ๋๋ฉ๋๋ค. ์ฆ, "foo = some foo=some"์ด๋ผ๋ ๋ฉ์์ง๊ฐ ์์ผ๋ฉด foo๋ง ์๋๋ค. = ์ผ๋ถ.
ElasticSearch์์ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ ์ค์
ํํฐ๊ฐ ๊ตฌ์ฑ๋ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ก๊ทธ๋ฅผ ์ ๋ก๋ํ ์ ์์ต๋๋ค. ํ์ฑ ๊ฒ์:
output
{
if [type] == "checkpoint"
{
elasticsearch
{
hosts => ["10.10.1.200:9200"]
index => "checkpoint-%{+YYYY.MM.dd}"
user => "tssolution"
password => "cool"
}
}
}
๋ฌธ์๊ฐ ์ฒดํฌํฌ์ธํธ ์ ํ์ผ๋ก ์๋ช ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํธ 10.10.1.200์์ 9200์ ์ฐ๊ฒฐ์ ํ์ฉํ๋ Elasticsearch ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฒคํธ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ๋ฌธ์๋ ํน์ ์ธ๋ฑ์ค์ ์ ์ฅ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ "์ฒดํฌํฌ์ธํธ-" + ํ์ฌ ์๊ฐ ๋ ์ง ์ธ๋ฑ์ค์ ์ ์ฅ๋ฉ๋๋ค. ๊ฐ ์ธ๋ฑ์ค๋ ํน์ ํ๋ ์งํฉ์ ๊ฐ์ง ์ ์๊ฑฐ๋ ๋ฉ์์ง์ ์ ํ๋๊ฐ ๋ํ๋ ๋ ์๋์ผ๋ก ์์ฑ๋๋ฉฐ, ํ๋ ์ค์ ๋ฐ ํด๋น ์ ํ์ ๋งคํ์์ ๋ณผ ์ ์์ต๋๋ค.
์ธ์ฆ์ ๊ตฌ์ฑํ ๊ฒฝ์ฐ(๋์ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค) ํน์ ์ธ๋ฑ์ค์ ์ฐ๊ธฐ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด ์์์๋ ๋น๋ฐ๋ฒํธ๊ฐ "cool"์ธ "tssolution"์ ๋๋ค. ํน์ ์ธ๋ฑ์ค์๋ง ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ ์ด์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ์ง ์๋๋ก ์ฌ์ฉ์ ๊ถํ์ ์ฐจ๋ณํํ ์ ์์ต๋๋ค.
๋ก๊ทธ์คํ์๋ฅผ ์คํํ์ธ์.
Logstash ๊ตฌ์ฑ ํ์ผ:
input
{
tcp
{
port => 5555
type => "checkpoint"
mode => "server"
host => โ10.10.1.205โ
}
}
filter {
if [type] == "checkpoint"{
kv {
value_split => "="
allow_duplicate_values => false
}
}
}
output
{
if [type] == "checkpoint"
{
elasticsearch
{
hosts => ["10.10.1.200:9200"]
index => "checkpoint-%{+YYYY.MM.dd}"
user => "tssolution"
password => "cool"
}
}
}
๊ตฌ์ฑ ํ์ผ์ ์ ํ์ฑ์ ํ์ธํฉ๋๋ค.
/usr/share/logstash/bin//logstash -f checkpoint.conf
Logstash ํ๋ก์ธ์ค๋ฅผ ์์ํฉ๋๋ค.
sudo systemctl start logstash
ํ๋ก์ธ์ค๊ฐ ์์๋์๋์ง ํ์ธํฉ๋๋ค.
sudo systemctl ์ํ ๋ก๊ทธ์คํ์
์์ผ์ด ์๋ํ๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
netstat -nat |grep 5555
Kibana์์ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
๋ชจ๋ ๊ฒ์ด ์คํ๋ ํ Kibana - Discover๋ก ์ด๋ํ์ฌ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ธ์. ๊ทธ๋ฆผ์ ํด๋ฆญํ ์ ์์ต๋๋ค!
๋ชจ๋ ๋ก๊ทธ๊ฐ ์ ์๋ฆฌ์ ์์ผ๋ฉฐ ๋ชจ๋ ํ๋์ ํด๋น ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค!
๊ฒฐ๋ก
Logstash ๊ตฌ์ฑ ํ์ผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณธ ๊ฒฐ๊ณผ ๋ชจ๋ ํ๋์ ๊ฐ์ ๋ํ ํ์๋ฅผ ์ป์์ต๋๋ค. ์ด์ ํน์ ํ๋๋ฅผ ๊ฒ์ํ๊ณ ํ๋กํ ํ๋ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๋ค์ ๊ณผ์ ์์๋ Kibana์ ์๊ฐํ๋ฅผ ์ดํด๋ณด๊ณ ๊ฐ๋จํ ๋์๋ณด๋๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ํน์ ์ํฉ(์: ํ๋ ๊ฐ์ ์ซ์์์ ๋จ์ด๋ก ๋ฐ๊พธ๋ ค๋ ๊ฒฝ์ฐ)์์๋ Logstash ๊ตฌ์ฑ ํ์ผ์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํด์ผ ํ๋ค๋ ์ ์ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ํ์ ๊ธฐ์ฌ์์ ์ฐ๋ฆฌ๋ ์ด ์์ ์ ์ง์์ ์ผ๋ก ์ํํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ณ์ ์ง์ผ๋ด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค(
์ถ์ฒ : habr.com