๊ตฌ์ถํ๊ฒฝ : ubuntu 24.04.5
๐ ๏ธ ๊ฐํธํ ELK Stack ๊ตฌ์ถ ๋จ๊ณ (Ubuntu 24.04 LTS ๊ธฐ์ค)
ELK Stack์ Java ๊ธฐ๋ฐ์ด๋ฏ๋ก, ์ค์น ์ Java(JDK)๊ฐ ํ์์ ์ผ๋ก ํ์ํ๋ฉฐ, ์ดํ Elasticsearch, Logstash, Kibana ์์๋ก ์ค์น ๋ฐ ์ค์ ํฉ๋๋ค.
1. โ Java (JDK) ์ค์น
Elasticsearch์ Logstash๋ Java ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ต์ ELK ๋ฒ์ ์ ๋ง์ถฐ OpenJDK 17์ ์ค์นํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
# 1. ํจํค์ง ๋ชฉ๋ก ์
๋ฐ์ดํธ
sudo apt update
# 2. OpenJDK 17 ์ค์น
sudo apt install openjdk-17-jdk -y
# 3. Java ๋ฒ์ ํ์ธ (์ ํ ์ฌํญ)
java -version
2. ๐ Elastic Repository ํค ๋ฐ ์ ์ฅ์ ๋ฑ๋ก
Elastic Stack ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๋๋ก Elastic์ฌ์ ๊ณต์ ์ ์ฅ์๋ฅผ ์์คํ ์ ๋ฑ๋กํฉ๋๋ค.
# 1. GPG ํค ๋ค์ด๋ก๋ ๋ฐ ์ถ๊ฐ
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# 2. apt ์ ์ฅ์ ๋ฑ๋ก (24.04 ๊ธฐ์ค)
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# 3. ํจํค์ง ๋ชฉ๋ก ์
๋ฐ์ดํธ
sudo apt update
3. ๐ Elasticsearch ์ค์น ๋ฐ ์ค์
ELK Stack์ ๋ฐ์ดํฐ ์ ์ฅ์ ์ญํ ์ ํ๋ ํต์ฌ ๊ตฌ์ฑ ์์์ ๋๋ค.
# 1. Elasticsearch ์ค์น
sudo apt install elasticsearch -y
# 2. ์๋น์ค ์์ ๋ฐ ๋ถํ
์ ์๋ ์์ ์ค์
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
# 3. ์๋น์ค ์ํ ํ์ธ (์ ํ ์ฌํญ)
sudo systemctl status elasticsearch
# 4. ํฌํธ 9200์ผ๋ก ์ ์ํ์ฌ ์ ์ ์๋ ํ์ธ
curl -k -u elastic:jcMilQp_3fR2EkA5ro9y https://localhost:9200
elasticsearch ์ค์น๊ฐ ์๋ฃ๋๋ ์๊ฐ user์ ๋น๋ฐ๋ฒํธ๊ฐ ํ์๋๋ค. (jcMilQp_3fR2EkA5ro9y)
๐ก SE ํฌํธํด๋ฆฌ์ค ํ: sudo nano /etc/elasticsearch/jvm.options ํ์ผ์ ์์ ํ์ฌ ์ด์ ์ ์ค์ ํ 8GB ๋ฉ๋ชจ๋ฆฌ ์ค 4GB๋ฅผ JVM ํ ๋ฉ๋ชจ๋ฆฌ(-Xms4g, -Xmx4g)๋ก ํ ๋นํ๋ ์์ ์ ๋ฐ๋์ ๋ฌธ์ํํด์ผ ํฉ๋๋ค.



New value: jcMilQp_3fR2EkA5ro9y
4. Logstash ์ค์น ๋ฐ ์ค์
Suricata ๋ก๊ทธ๋ฅผ ์์ ํ๊ณ Elasticsearch๋ก ๋ณด๋ด๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์ญํ ์ ํฉ๋๋ค.
# 1. Logstash ์ค์น
sudo apt install logstash -y
# 2. Logstash ์ค์ ํ์ผ ์์ฑ (Suricata ๋ก๊ทธ๋ฅผ ์์ ํ ํฌํธ ์ค์ )
# ์์: /etc/logstash/conf.d/suricata.conf ํ์ผ ์์ฑ (๋์ค์ ์์ธ ์ค์ ํ์)
# sudo nano /etc/logstash/conf.d/suricata.conf
# 3. ์๋น์ค ์์ ๋ฐ ๋ถํ
์ ์๋ ์์ ์ค์
sudo systemctl enable logstash
sudo systemctl start logstash
์ฐ์ ์ค์นํ๊ณ ๋์ค์ suricata๋ ์ฐ๊ฒฐํ๋ ์์ ์ด ํ์ํ๋ค. (suricata.conf)
5. ๐ Kibana ์ค์น ๋ฐ ์ค์
์น ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ณ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ๋ ์ญํ ์ ํฉ๋๋ค.
# 1. Kibana ์ค์น
sudo apt install kibana -y
# 2. Kibana ์ค์ ํ์ผ ์์ (์๋ฒ IP ์ค์ )
# sudo nano /etc/kibana/kibana.yml
# server.host: "0.0.0.0" ๋๋ VM์ IP ์ฃผ์๋ก ๋ณ๊ฒฝํ์ฌ ์ธ๋ถ ์ ์ ํ์ฉ
# 3. ์๋น์ค ์์ ๋ฐ ๋ถํ
์ ์๋ ์์ ์ค์
sudo systemctl enable kibana
sudo systemctl start kibana
๋ฐฉํ๋ฒฝ ์ค์ (Firewall):
- Ubuntu VM์ ๊ธฐ๋ณธ ๋ฐฉํ๋ฒฝ์ธ ufw์์ Kibana์ ํฌํธ์ธ 5601๋ฒ TCP ํฌํธ๋ฅผ ์ด์ด์ค์ผ ํฉ๋๋ค.
sudo ufw allow 5601/tcp
sudo ufw enable
๐ Kibana ๋ฑ๋ก ํ ํฐ ์์ฑ ๋ฐฉ๋ฒ
ํ ํฐ์ Elasticsearch๊ฐ ์ค์น๋ ELK VM์์ root ๊ถํ์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
1. ํ ํฐ ์์ฑ ๋ช ๋ น์ด
๋ฆฌ๋ ์ค(Ubuntu) ํ๊ฒฝ์์๋ bin ๋๋ ํ ๋ฆฌ๊ฐ ์๋ /usr/share/elasticsearch/bin/ ๊ฒฝ๋ก์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token --scope kibana
2. ์คํ ๋ฐ ๊ฒฐ๊ณผ
๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด Elasticsearch๊ฐ ํด๋ฌ์คํฐ์ Kibana๋ฅผ ์์ ํ๊ฒ ๋ฑ๋กํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ผํ์ฑ ํ ํฐ์ ์์ฑํ์ฌ ํฐ๋ฏธ๋์ ์ถ๋ ฅํฉ๋๋ค.
# ๋ช
๋ น์ด ์คํ ๊ฒฐ๊ณผ ์์
Your enrollment token for Kibana is:
eyJ2Z...[๋งค์ฐ ๊ธด ๋ฌธ์์ด]...QkRjb
- ์ถ๋ ฅ๋ ๊ธด ๋ฌธ์์ด์ด ๋ฐ๋ก ํ์ํ ํ ํฐ ๊ฐ์ ๋๋ค.
3. Kibana์ ํ ํฐ ์ ๋ ฅ ๋ฐ ์ฐ๊ฒฐ
ํ ํฐ ๊ฐ์ ๋ณต์ฌํ ํ, Kibana ์น ์ธํฐํ์ด์ค๋ก ๋์๊ฐ์ ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
- Kibana ์ ์: ์น ๋ธ๋ผ์ฐ์ ์์ http://[ELK VM IP ์ฃผ์]:5601๋ก ์ ์ํฉ๋๋ค.
- ํ ํฐ ์ ๋ ฅ ํ๋ฉด: Kibana ์ด๊ธฐ ํ๋ฉด(๋๋ ์ฐ๊ฒฐ ์ค์ ํ๋ฉด)์ "Enrollment Token"์ ์ ๋ ฅํ๋ ํ๋๊ฐ ๋ํ๋ฉ๋๋ค.
- ์ฐ๊ฒฐ: ๋ณต์ฌํ ํ ํฐ์ ๋ถ์ฌ๋ฃ๊ณ Configure ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
http://[ELK VM IP ์ฃผ์]:5601

์ ๋ ฅํ๋ฉด Verification Code๋ฅผ ์ ๋ ฅํ๋ ์ฐฝ์ด ๋ฌ๋ค.
kivina.yml ํ์ผ์ server.host๊ฐ์ด 0.0.0.0์ผ๋ก ๋์ด์๊ณ localhost ์ธ๋ถ์์ ์ ์ํ ๊ฒฝ์ฐ, ์๋ฒ๋ ๋ค์๊ณผ ๊ฐ์ด verification ์ ์๊ตฌํ๋ค.
Kibana๊ฐ Elasticsearch์ ์ฑ๊ณต์ ์ผ๋ก ๋ฑ๋ก(Enrollment)๋ ํ์, Kibana๊ฐ Elasticsearch๋ก๋ถํฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ฐ์ ๋ก๊ทธ์ธ ์ฐ๊ฒฐ์ ์ต์ข ์ ์ผ๋ก ์๋ฃํ๊ธฐ ์ํด ํ์ํ ํ์ธ ์ฝ๋(Verification Code) ๋จ๊ณ์ ๋๋ค.
์ด 6์๋ฆฌ ์ฝ๋๋ Kibana๊ฐ ์ค์ค๋ก ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, Elasticsearch ์๋ฒ์์ ์ง์ ์คํ๋๋ ๋ช ๋ น์ด์ ๊ฒฐ๊ณผ๋ก ์ป์ด์ผ ํฉ๋๋ค.
์ด ์ฝ๋๋ ์์ ์ค์น๊ณผ์ ์ ์ถ๋ ฅ๊ฐ์ ์ดํด๋ณด๋ฉด ์ ์ ์๋ค.
๐ 6์๋ฆฌ ํ์ธ ์ฝ๋(Verification Code) ์ป๋ ๋ฐฉ๋ฒ
์ถ๋ ฅ๊ฐ์์ ์ฐพ์์์๋๊ฒฝ์ฐ, ์ด ์ฝ๋๋ฅผ ์ป๊ธฐ ์ํด์๋ Elasticsearch๊ฐ ์ค์น๋ ELK VM์ผ๋ก ๋์๊ฐ์ ํน์ ๋ช ๋ น์ด๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
root@cmd-VirtualBox:/etc/kibana: sudo /usr/share/kibana/bin/kibana-verification-code
Your verification code is: 082 318
3. Kibana์ ์ ๋ ฅ
- ์ถ๋ ฅ๋ 6์๋ฆฌ ์ฝ๋๋ฅผ ๋ณต์ฌํฉ๋๋ค.
- Kibana ์น ํ๋ฉด์ผ๋ก ๋์๊ฐ์ Verification code ์ ๋ ฅ ํ๋์ ์ด ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ๊ณ ํ์ธ(Verify)์ ์งํํฉ๋๋ค.
์ด ๊ณผ์ ์ ๊ฑฐ์น๋ฉด Kibana๊ฐ Elasticsearch์ ์์ ํ ์ฐ๊ฒฐ๋์ด ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค.

Enrollment Token → Verification Code ๋จ๊ณ๋ฅผ ๋์ด์
Elasticsearch ๋ก๊ทธ์ธ ๋จ๊ณ
#elastic ๊ณ์ ๋น๋ฐ๋ฒํธ ์ง์ ์์ฑ(Reset)
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Password for the [elastic] user successfully reset.
New value: bqXRJTq57-=g76cQO6G1

Explore on my own ์ ํด๋ฆญ (Add integrations ์ ๊ฐ์ ์ฐ๊ฒฐ์ ๋์ค์ ์์ )


| ๊ณต๊ฒฉ ๋์ ์๋ฒ (์ทจ์ฝ ์๋ฒ) | 192.168.16.33 | Apache + ModSecurity | ๊ณต๊ฒฉ์ ์ค์ ๋ก ํ์งํ๋ WAF ์ญํ |
| ๋คํธ์ํฌ ์นจ์ ํ์ง ์๋ฒ | 192.168.16.30 | Suricata IDS | ๋คํธ์ํฌ ๊ธฐ๋ฐ ๊ณต๊ฒฉ ํ์ง |
| ํตํฉ ๋ณด์ ๋ก๊ทธ ์์ง ์๋ฒ | 192.168.16.27 | Elasticsearch + Kibana | ์ค์ ๋ก๊ทธ ๋ถ์/๋์๋ณด๋ |
| ๊ณต๊ฒฉ์ | 192.168.16.58 | Kali, ๊ณต๊ฒฉ ์คํฌ๋ฆฝํธ | ๊ณต๊ฒฉ ์ํ |
โก ๋ชฉํ:
ModSecurity + Suricata์ ํ์ง ๋ก๊ทธ๋ฅผ ELK๋ก ๋ชจ๋ ๋ณด๋ด์ ํตํฉ ๋ชจ๋ํฐ๋ง
์ง๊ธ๋ถํฐ ํด์ผํ ์์
โ 1๋จ๊ณ: ModSecurity ์ค์น ๋ฐ ๋ก๊ทธ ์ค์ (192.168.16.33)
ModSecurity๋ Apache/Nginx ์๋จ์์
์น ๊ธฐ๋ฐ ๊ณต๊ฒฉ(SQL Injection, XSS ๋ฑ)์ ํ์งํ๋ WAF์ด๊ธฐ ๋๋ฌธ์,
โ ํด์ผ ํ ์์
- ModSecurity ์ค์น
- OWASP CRS ๋ฃฐ์ ์ ์ฉ
- Logging์ JSON ํ์์ผ๋ก ์ค์
- ๋ก๊ทธ๋ฅผ ELK(192.168.16.27)๋ก ์ ๋ฌ (Filebeat ์ค์น)
๐ฅ ์ค์: ModSecurity๋ ๋ก๊ทธ๋ฅผ ํ์ผ๋ก ๋จ๊น → Filebeat๊ฐ ๊ทธ ๋ก๊ทธ๋ฅผ ์ ์กํด์ผ ํจ
ModSec ๋ก๊ทธ ์์น๋ ๋ณดํต:
โ 2๋จ๊ณ: Suricata ์ค์ + ๋ก๊ทธ ์ ์ก (192.168.16.27)
Suricata๋ ๋คํธ์ํฌ IDS์ด๋ฏ๋ก
ํจํท ๊ธฐ๋ฐ ๊ณต๊ฒฉ, ์ค์บ, ํฌํธ์ค์, ์ต์คํ๋ก์์ ํ์ง ๊ฐ๋ฅ.
Suricata ๋ก๊ทธ ์์น:
์ด๋ฏธ JSON์ด๋ฏ๋ก Filebeat/Elastic Agent๊ฐ ๋ณด๋ด๊ธฐ ์ต๊ณ ๋ก ์ฌ์.
ํด์ผ ํ ์์
- Suricata ๋์ ํ์ธ
- eve.json JSON output ํ์ธ
- Filebeat ๋๋ Elastic Agent ์ค์น
- ELK๋ก ๋ก๊ทธ ์ ์ก
๐ ๊ทธ๋์ ์ค์ํ ๊ฒฐ๋ก :
๐ ๋ ์๋ฒ(33, 30)์ Filebeat๋ฅผ ์ค์นํด์ ELK๋ก ๋ก๊ทธ๋ฅผ ๋ณด๋ด์ผ ํ๋ค!!
ELK ์๋ฒ๋ ๋ก๊ทธ ์์ง๊ธฐ๊ฐ ์๋
→ ๋ก๊ทธ ์์ง์ ๋ณดํต Beats(Agent)๊ฐ ๋ด๋นํจ.
โ 3๋จ๊ณ: 192.168.16.33 ๋ฐ 192.168.16.30 ์ Filebeat ์ค์น
๋ชจ๋ ๋์ผํ ๋ฐฉ์.
Filebeat ์ค์น ๋ช ๋ น ์์ (Ubuntu)
Kibana์์ Index Template ์๋ ์์ฑ๋๋๋ก ์ค์
ELK(192.168.16.38)์ Kibana์์:
Integrations → Filebeat → System / Apache / Suricata ์ ํ
์ฌ๊ธฐ์ config snippet์ด ์ ๊ณต๋จ.
โ 4๋จ๊ณ: ๊ฐ ํ๊ฒฝ์ ๋ง๋ Filebeat ์ค์
๐ฆ 192.168.16.27 (WAF ์๋ฒ) → Apache + ModSec ๋ก๊ทธ ์ ์ก
Filebeat modules:
๋๋ ์ง์ path ์ง์ :
๐ฉ 192.168.16.30 (Suricata ์๋ฒ) → Suricata ๋ก๊ทธ ์ ์ก
์ค์ ํ์ผ ์์ :
๋ก๊ทธ ๊ฒฝ๋ก:
โ 5๋จ๊ณ: Filebeat๋ฅผ ELK์ ์ฐ๊ฒฐ
๋ ์๋ฒ์ filebeat.yml ๊ณตํต ์ค์ :
โ 6๋จ๊ณ: Kibana์์ ๋ฐ์ดํฐ ํ์ธ
- Kibana → Discover
- filebeat-* ์ธ๋ฑ์ค ์์ฑ ์ฌ๋ถ ํ์ธ
- Suricata + ModSecurity ์ด๋ฒคํธ ์ค์๊ฐ ํ์ง ํ์ธ
๐ฅ 7๋จ๊ณ: Visualize & Dashboard ๊ตฌ์ถ
Kibana์๋ ์ด๋ฏธ Suricata + Apache module ๋์๋ณด๋ ํ ํ๋ฆฟ์ด ์์.
Dashboard ๊ฒ์ → Suricata → Suricata Events Dashboard
Dashboard ๊ฒ์ → Apache → Access Logs Dashboard
๐ 8๋จ๊ณ: ๊ณต๊ฒฉ ์ํ → ํ์ง๋๋์ง ํ์ธ
์ด์ ๊ณต๊ฒฉ์ VM์์:
- SQL Injection
- XSS
- Directory Traversal
- nmap ์ค์บ
- Nikto ์ค์บ
๋ฑ ์ํ →
ModSec + Suricata → ๋ก๊ทธ ๋ฐ์ → Filebeat → ELK ์ ์ก → Kibana์์ ํ์ง๋จ.