Elastic Stack์ SIEM ์์คํ
์์ฅ(์ค์ ๋ก๋ SIEM ์์คํ
์์ฅ๋ฟ๋ง ์๋๋ผ)์์ ์ ์๋ ค์ง ๋๊ตฌ์
๋๋ค. ๋ฏผ๊ฐํ๊ฑฐ๋ ๋ณ๋ก ๋ฏผ๊ฐํ์ง ์์ ๋ค์ํ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์์ต๋๋ค. Elastic Stack ์์ ์์ฒด์ ๋ํ ์ก์ธ์ค๊ฐ ๋ณดํธ๋์ง ์๋๋ค๋ฉด ์ด๋ ์์ ํ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ธฐ๋ณธ ์ ๊ณต Elastic ์์(Elasticsearch, Logstash, Kibana ๋ฐ Beats ์์ง๊ธฐ)๋ ๊ฐ๋ฐฉํ ํ๋กํ ์ฝ์์ ์คํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Kibana ์์ฒด์์๋ ์ธ์ฆ์ด ๋นํ์ฑํ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์ํธ ์์ฉ์ ๋ณดํธ๋ ์ ์์ผ๋ฉฐ ์ด ๋ฌธ์์์๋ ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค. ํธ์์ ๋ด๋ฌํฐ๋ธ๋ฅผ 3๊ฐ์ ์๋ฏธ ๋ธ๋ก์ผ๋ก ๋๋์์ต๋๋ค.
- ์ญํ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ก์ธ์ค ๋ชจ๋ธ
- Elasticsearch ํด๋ฌ์คํฐ ๋ด์ ๋ฐ์ดํฐ ๋ณด์
- Elasticsearch ํด๋ฌ์คํฐ ์ธ๋ถ์ ๋ฐ์ดํฐ ๋ณดํธ
์ญํ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ก์ธ์ค ๋ชจ๋ธ
Elasticsearch๋ฅผ ์ค์นํ๊ณ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์กฐ์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ ์ฌ๋์ด ๋ชจ๋ ์ธ๋ฑ์ค์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ธ์, ๋๋ ์ปฌ์ ์ฌ์ฉํ ์ ์๋ ์ฌ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Elasticsearch์๋ ๊ธฐ๋ณธ ๊ตฌ๋ (๋ฌด๋ฃ)๋ถํฐ ์ฌ์ฉํ ์ ์๋ ์ญํ ๋ชจ๋ธ์ด ์์ต๋๋ค. ๊ฐ๋ต์ ์ผ๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์ง์๋ โโ๋ฌด์์ด ์๋์?
- ์ฌ์ฉ์๋ ์์ ์ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ ์ ์๋ ๋ชจ๋ ์ฌ๋์ ๋๋ค.
- ์ญํ ์ ๊ถํ์ ์งํฉ์ ๋๋ค.
- ๊ถ๋ฆฌ๋ ํน๊ถ์ ์งํฉ์ ๋๋ค.
- ๊ถํ์ ์ฐ๊ธฐ, ์ฝ๊ธฐ, ์ญ์ ๋ฑ์ ๊ถํ์
๋๋ค. (
์ ์ฒด ๊ถํ ๋ชฉ๋ก ) - ๋ฆฌ์์ค๋ ์ธ๋ฑ์ค, ๋ฌธ์, ํ๋, ์ฌ์ฉ์ ๋ฐ ๊ธฐํ ์ ์ฅ์ ์ํฐํฐ์ ๋๋ค(์ผ๋ถ ๋ฆฌ์์ค์ ์ญํ ๋ชจ๋ธ์ ์ ๋ฃ ๊ตฌ๋ ์์๋ง ์ฌ์ฉํ ์ ์์).
๊ธฐ๋ณธ์ ์ผ๋ก Elasticsearch์๋
Elasticsearch ์ค์ ์์ ๋ณด์์ ํ์ฑํํ๋ ค๋ฉด ์ด๋ฅผ ๊ตฌ์ฑ ํ์ผ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ํ๋ ฅ์ ๊ฒ์/config/elasticsearch.yml) ์ ์ค:
xpack.security.enabled: true
๊ตฌ์ฑ ํ์ผ์ ๋ณ๊ฒฝํ ํ Elasticsearch๋ฅผ ์์ํ๊ฑฐ๋ ๋ค์ ์์ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ธ์. ๋ค์ ๋จ๊ณ๋ Box ์ฌ์ฉ์์๊ฒ ๋น๋ฐ๋ฒํธ๋ฅผ ํ ๋นํ๋ ๊ฒ์ ๋๋ค. ์๋ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ํํ์ผ๋ก ์ด ์์ ์ ์ํํด ๋ณด๊ฒ ์ต๋๋ค.
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
์ฐ๋ฆฌ๋ ๋ค์์ ํ์ธํฉ๋๋ค.
[elastic@node1 ~]$ curl -u elastic 'node1:9200/_cat/nodes?pretty'
Enter host password for user 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1
์์ฌํ์ ๋ ๋ฉ๋๋ค. Elasticsearch ์ธก์ ์ค์ ์ด ์๋ฃ๋์์ต๋๋ค. ์ด์ Kibana๋ฅผ ๊ตฌ์ฑํ ์ฐจ๋ก์ ๋๋ค. ์ง๊ธ ์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ํค์คํ ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ ๋ ๊ฐ์ง ๋ช ๋ น์ผ๋ก ์ํ๋ฉ๋๋ค(์ฌ์ฉ์ ํค๋ฐ๋ Elasticsearch์ ๋น๋ฐ๋ฒํธ ์์ฑ ๋จ๊ณ์์ ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ):
[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.password
๋ชจ๋ ๊ฒ์ด ์ ํํ๋ฉด Kibana๋ ๋ก๊ทธ์ธ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฌป๊ธฐ ์์ํฉ๋๋ค. ๊ธฐ๋ณธ ๊ตฌ๋ ์๋ ๋ด๋ถ ์ฌ์ฉ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ญํ ๋ชจ๋ธ์ด ํฌํจ๋์ด ์์ต๋๋ค. Gold๋ถํฐ๋ LDAP, PKI, Active Directory ๋ฐ Single Sign-On ์์คํ ๊ณผ ๊ฐ์ ์ธ๋ถ ์ธ์ฆ ์์คํ ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
Elasticsearch ๋ด๋ถ ๊ฐ์ฒด์ ๋ํ ์ก์ธ์ค ๊ถํ๋ ์ ํ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์๋ ํ๋์ ๋ํด ๋์ผํ ์์
์ ์ํํ๋ ค๋ฉด ์ ๋ฃ ๊ตฌ๋
์ด ํ์ํฉ๋๋ค(์ด ๋ญ์
๋ฆฌ๋ Platinum ๋ ๋ฒจ๋ถํฐ ์์๋ฉ๋๋ค). ์ด๋ฌํ ์ค์ ์ Kibana ์ธํฐํ์ด์ค๋ ๋ค์์ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ญํ ๋ง๋ค๊ธฐ
PUT /_security/role/ruslan_i_ludmila_role
{
"cluster": [],
"indices": [
{
"names": [ "ruslan_i_ludmila" ],
"privileges": ["read", "view_index_metadata"]
}
]
}
์ฌ์ฉ์ ์์ฑ
POST /_security/user/pushkin
{
"password" : "nataliaonelove",
"roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
"full_name" : "Alexander Pushkin",
"email" : "[email protected]",
"metadata" : {
"hometown" : "Saint-Petersburg"
}
}
Elasticsearch ํด๋ฌ์คํฐ ๋ด์ ๋ฐ์ดํฐ ๋ณด์
Elasticsearch๊ฐ ํด๋ฌ์คํฐ์์ ์คํ๋๋ฉด(์ผ๋ฐ์ ์ผ๋ก) ํด๋ฌ์คํฐ ๋ด์ ๋ณด์ ์ค์ ์ด ์ค์ํด์ง๋๋ค. ๋ ธ๋ ๊ฐ ๋ณด์ ํต์ ์ ์ํด Elasticsearch๋ TLS ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ค ๊ฐ์ ๋ณด์ ์ํธ ์์ฉ์ ์ค์ ํ๋ ค๋ฉด ์ธ์ฆ์๊ฐ ํ์ํฉ๋๋ค. PEM ํ์์ผ๋ก ์ธ์ฆ์์ ๊ฐ์ธ ํค๋ฅผ ์์ฑํฉ๋๋ค.
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil ca --pem
์ ๋ช ๋ น์ด๋ฅผ ์คํํ ํ ํด๋น ๋๋ ํ ๋ฆฌ์์ /../ํ์ฑ๊ฒ์ ์์นด์ด๋ธ๊ฐ ๋ํ๋ฉ๋๋ค ํ๋ ฅ์ ์คํ-ca.zip. ๊ทธ ์์๋ ํ์ฅ๋ช ์ด ํฌํจ๋ ์ธ์ฆ์์ ๊ฐ์ธ ํค๊ฐ ์์ต๋๋ค. crt ะธ ํค ๊ฐ๊ธฐ. ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋์์ ์ก์ธ์คํ ์ ์๋ ๊ณต์ ๋ฆฌ์์ค์ ๋ฐฐ์นํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด์ ๊ฐ ๋ ธ๋์๋ ๊ณต์ ๋๋ ํฐ๋ฆฌ์ ์๋ ์ธ์ฆ์์ ๊ฐ์ธ ํค๊ฐ ํ์ํฉ๋๋ค. ๋ช ๋ น์ ์คํํ๋ฉด ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ํธ ์์ฉํ๋ ๋ ธ๋๋ฅผ ์๋ฒฝํ๊ฒ ํ์ธํ๊ธฐ ์ํด ์ถ๊ฐ ์ต์ -ip ๋ฐ -dns๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key
๋ช ๋ น์ ์คํํ๋ฉด ๋น๋ฐ๋ฒํธ๋ก ๋ณดํธ๋๋ PKCS#12 ํ์์ ์ธ์ฆ์์ ๊ฐ์ธ ํค๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด์ ๋จ์ ๊ฒ์ ์์ฑ๋ ํ์ผ์ ์ฎ๊ธฐ๋ ๊ฒ๋ฟ์ด๋ค. p12 ๊ตฌ์ฑ ๋๋ ํฐ๋ฆฌ๋ก:
[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/config
ํ์์ผ๋ก ์ธ์ฆ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ๊ฐํ์ญ์์ค. p12 ๊ฐ ๋ ธ๋์ ํค ์ ์ฅ์ ๋ฐ ์ ๋ขฐ ์ ์ฅ์:
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
์ด๋ฏธ ์๋ ค์ง ํ๋ ฅ์ ๊ฒ์.yml ๋จ์ ๊ฒ์ ์ธ์ฆ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
๋ชจ๋ Elasticsearch ๋ ธ๋๋ฅผ ์์ํ๊ณ ์คํํฉ๋๋ค. ์ปฌ. ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ฃ๋๋ฉด ์ฌ๋ฌ ๋ ธ๋๊ฐ ํฌํจ๋ ์๋ต์ด ๋ฐํ๋ฉ๋๋ค.
[elastic@node1 ~]$ curl node1:9200/_cat/nodes -u elastic:password
172.18.0.3 43 75 4 0.00 0.05 0.05 dim * node2
172.18.0.4 21 75 3 0.00 0.05 0.05 dim - node3
172.18.0.2 39 75 4 0.00 0.05 0.05 dim - node1
๋ ๋ค๋ฅธ ๋ณด์ ์ต์ ์ธ IP ์ฃผ์ ํํฐ๋ง(๊ณจ๋ ๋ ๋ฒจ ๊ตฌ๋ ์ ์ฌ์ฉ ๊ฐ๋ฅ)์ด ์์ต๋๋ค. ๋ ธ๋์ ์ก์ธ์คํ ์ ์๋ IP ์ฃผ์์ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Elasticsearch ํด๋ฌ์คํฐ ์ธ๋ถ์ ๋ฐ์ดํฐ ๋ณดํธ
ํด๋ฌ์คํฐ ์ธ๋ถ๋ Kibana, Logstash, Beats ๋๋ ๊ธฐํ ์ธ๋ถ ํด๋ผ์ด์ธํธ์ ๊ฐ์ ์ธ๋ถ ๋๊ตฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
http ๋์ https์ ๋ํ ์ง์์ ๊ตฌ์ฑํ๋ ค๋ฉด elasticsearch.yml์ ์ ์ค์ ์ถ๊ฐํ์ธ์.
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.path: elastic-certificates.p12
์๋ํ๋ฉด ์ธ์ฆ์๋ ๋น๋ฐ๋ฒํธ๋ก ๋ณดํธ๋์ด ์์ผ๋ฏ๋ก ๊ฐ ๋ ธ๋์ ํค ์ ์ฅ์์ ์ ๋ขฐ ์ ์ฅ์์ ์ถ๊ฐํ์ธ์.
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
ํค๋ฅผ ์ถ๊ฐํ๋ฉด Elasticsearch ๋ ธ๋๊ฐ https๋ฅผ ํตํด ์ฐ๊ฒฐํ ์ค๋น๊ฐ ๋ฉ๋๋ค. ์ด์ ์์ํ ์ ์์ต๋๋ค.
๋ค์ ๋จ๊ณ๋ Kibana๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ํค๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ๊ตฌ์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๊ณต์ ๋๋ ํฐ๋ฆฌ์ ์ด๋ฏธ ์๋ ์ธ์ฆ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก PEM ํ์์ ์ธ์ฆ์๋ฅผ ์์ฑํฉ๋๋ค(PKCS#12 Kibana, Logstash ๋ฐ Beats๋ ์์ง ์ง์ํ์ง ์์).
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key --pem
๋จ์ ๊ฒ์ ์์ฑ๋ ํค๋ฅผ Kibana ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ํด๋์ ์์ถ์ ํธ๋ ๊ฒ์ ๋๋ค.
[elastic@node1 ~]$ unzip elasticsearch/certificate-bundle.zip -d kibana/config
ํค๋ ๊ฑฐ๊ธฐ์ ์์ผ๋ฏ๋ก ๋จ์ ๊ฒ์ ํค๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ๋๋ก Kibana ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ๋ฟ์ ๋๋ค. kibana.yml ๊ตฌ์ฑ ํ์ผ์์ http๋ฅผ https๋ก ๋ณ๊ฒฝํ๊ณ SSL ์ฐ๊ฒฐ ์ค์ ์ด ์๋ ์ค์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง ์ธ ์ค์ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ Kibana ๊ฐ์ ๋ณด์ ํต์ ์ ๊ตฌ์ฑํฉ๋๋ค.
elasticsearch.hosts: ["https://${HOSTNAME}:9200"]
elasticsearch.ssl.certificateAuthorities: /shared_folder/ca/ca.crt
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: /../kibana/config/instance/instance.key
server.ssl.certificate: /../kibana/config/instance/instance.crt
์ด๋ก์จ ์ค์ ์ด ์๋ฃ๋๊ณ Elasticsearch ํด๋ฌ์คํฐ์ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๊ฐ ์ํธํ๋ฉ๋๋ค.
๋ฌด๋ฃ ๋๋ ์ ๋ฃ ๊ตฌ๋
, ์์
๋ชจ๋ํฐ๋ง ๋๋ SIEM ์์คํ
์์ฑ์ ๋ํ Elastic Stack์ ๊ธฐ๋ฅ์ ๋ํด ์ง๋ฌธ์ด ์๋ ๊ฒฝ์ฐ ๋ค์์ผ๋ก ์์ฒญ์ ๋จ๊ฒจ์ฃผ์ธ์.
Habrรฉ์ Elastic Stack์ ๊ดํ ์ถ๊ฐ ๊ธฐ์ฌ:
์ถ์ฒ : habr.com