์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ›ก๏ธ Fail2Ban: ์ž๋™ํ™”๋œ ์นจ์ž… ์ฐจ๋‹จ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์œผ๋กœ ์„œ๋ฒ„ ๋ณด์•ˆ ๊ฐ•ํ™”ํ•˜๊ธฐ

๐Ÿ›ก๏ธ Fail2Ban: ์ž๋™ํ™”๋œ ์นจ์ž… ์ฐจ๋‹จ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์œผ๋กœ ์„œ๋ฒ„ ๋ณด์•ˆ ๊ฐ•ํ™”ํ•˜๊ธฐ

๋กœ๊ทธ ํŒŒ์ผ์„ ๊ฐ์‹œํ•˜๋ฉฐ ์•…์˜์ ์ธ ์ ‘๊ทผ์„ ์ž๋™์œผ๋กœ ์ฐจ๋‹จํ•˜๋Š” ๋˜‘๋˜‘ํ•œ ๋ณด์•ˆ ์‹œ์Šคํ…œ

๐ŸŽฏ Fail2Ban์ด ๋ญ๊ธธ๋ž˜ ์ด๋ ‡๊ฒŒ ์ค‘์š”ํ• ๊นŒ?

์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ์ •๋ง ์‹ ๊ฒฝ ์“ธ ๊ฒŒ ํ•œ๋‘ ๊ฐ€์ง€๊ฐ€ ์•„๋‹ˆ์•ผ. ํŠนํžˆ ๋ณด์•ˆ ๋ฌธ์ œ๋Š” ์ž ์‹œ๋งŒ ๋ฐฉ์‹ฌํ•ด๋„ ํฐ์ผ ๋‚˜๋Š” ๋ถ€๋ถ„์ด์ง€. ๐Ÿ˜ฐ ๋งค์ผ๊ฐ™์ด ์ „ ์„ธ๊ณ„ ์–ด๋”˜๊ฐ€์—์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚ด ์„œ๋ฒ„์— ๋ฌด์ž‘์œ„ ๋Œ€์ž… ๊ณต๊ฒฉ(Brute Force Attack)์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑฐ, ์•Œ๊ณ  ์žˆ์—ˆ์–ด?

Fail2Ban์€ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ •๋ง ๋“ ๋“ ํ•œ ์นœ๊ตฌ ๊ฐ™์€ ์กด์žฌ์•ผ. ๋งˆ์น˜ 24์‹œ๊ฐ„ ๊นจ์–ด์žˆ๋Š” ๊ฒฝ๋น„์›์ฒ˜๋Ÿผ ์„œ๋ฒ„์˜ ๋กœ๊ทธ ํŒŒ์ผ์„ ๊ณ„์† ๊ฐ์‹œํ•˜๋ฉด์„œ, ์ˆ˜์ƒํ•œ ํ–‰๋™์„ ํ•˜๋Š” IP ์ฃผ์†Œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ฐจ๋‹จํ•ด์ฃผ๊ฑฐ๋“ . ๐Ÿšจ

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ? SSH ๋กœ๊ทธ์ธ์„ 5๋ฒˆ ์—ฐ์†์œผ๋กœ ์‹คํŒจํ•œ IP๊ฐ€ ์žˆ๋‹ค๋ฉด, "์•„, ์ด ๋…€์„ ๋ญ”๊ฐ€ ์ˆ˜์ƒํ•œ๋ฐ?"๋ผ๊ณ  ํŒ๋‹จํ•˜๊ณ  ๋ฐ”๋กœ ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ด์„œ ๊ทธ IP์˜ ์ ‘๊ทผ์„ ๋ง‰์•„๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์ง€. ์™„์ „ ์ž๋™์œผ๋กœ! ๋„ˆ๊ฐ€ ์ž ์ž๋Š” ์‹œ๊ฐ„์—๋„, ์ปคํ”ผ ๋งˆ์‹œ๋Š” ์‹œ๊ฐ„์—๋„ ๋ง์ด์•ผ. โ˜•

SERVER ๐Ÿ˜ˆ Attack! ๐Ÿ‘ค Safe Access Fail2Ban Shield โœ• Automated Intrusion Prevention System

๐Ÿ” Fail2Ban์˜ ์ž‘๋™ ์›๋ฆฌ: ์–ด๋–ป๊ฒŒ ์ด๋ ‡๊ฒŒ ๋˜‘๋˜‘ํ• ๊นŒ?

Fail2Ban์˜ ์ž‘๋™ ์›๋ฆฌ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ํšจ๊ณผ์ ์ด์•ผ. ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด:

๐Ÿ“‹ 1๋‹จ๊ณ„: ๋กœ๊ทธ ํŒŒ์ผ ๋ชจ๋‹ˆํ„ฐ๋ง

Fail2Ban์€ ์„ค์ •๋œ ๋กœ๊ทธ ํŒŒ์ผ๋“ค์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์‹œํ•ด. SSH ๋กœ๊ทธ์ธ ์‹œ๋„๋ฅผ ๊ธฐ๋กํ•˜๋Š” /var/log/auth.log, ์›น ์„œ๋ฒ„ ์ ‘๊ทผ ๊ธฐ๋ก์ธ /var/log/apache2/access.log ๊ฐ™์€ ํŒŒ์ผ๋“ค์„ ๊ณ„์† ์ฝ์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์ด ์ถ”๊ฐ€๋˜๋Š”์ง€ ํ™•์ธํ•˜์ง€.

๐ŸŽฏ 2๋‹จ๊ณ„: ํŒจํ„ด ๋งค์นญ

๋กœ๊ทธ์—์„œ ํŠน์ • ํŒจํ„ด์„ ์ฐพ์•„๋‚ด๋Š” ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด "Failed password for"๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด "์•„, ๋ˆ„๊ตฐ๊ฐ€ ๋กœ๊ทธ์ธ์— ์‹คํŒจํ–ˆ๊ตฌ๋‚˜"๋ผ๊ณ  ์ธ์‹ํ•˜๋Š” ๊ฑฐ์ง€. ์ด๋Ÿฐ ํŒจํ„ด๋“ค์€ ์ •๊ทœํ‘œํ˜„์‹(Regular Expression)์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด์„œ ๋งค์šฐ ์ •ํ™•ํ•˜๊ฒŒ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์–ด. ๐ŸŽช

โšก 3๋‹จ๊ณ„: ์ž๋™ ์ฐจ๋‹จ ์กฐ์น˜

์„ค์ •๋œ ์ž„๊ณ„๊ฐ’(์˜ˆ: 5๋ฒˆ ์‹คํŒจ)์„ ์ดˆ๊ณผํ•˜๋ฉด ์ฆ‰์‹œ ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๋‹น IP๋ฅผ ์ฐจ๋‹จํ•ด. iptables๋‚˜ firewalld ๊ฐ™์€ ๋ฐฉํ™”๋ฒฝ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ง์ด์•ผ. ๊ทธ๋ฆฌ๊ณ  ์ผ์ • ์‹œ๊ฐ„(์˜ˆ: 10๋ถ„)์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์ฐจ๋‹จ์„ ํ•ด์ œํ•˜๊ธฐ๋„ ํ•ด. ๐Ÿ”’

๐Ÿ’ป Fail2Ban ์„ค์น˜ํ•˜๊ธฐ: ์ฒซ ๊ฑธ์Œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ

์ž, ์ด์ œ ์‹ค์ œ๋กœ Fail2Ban์„ ์„ค์น˜ํ•ด๋ณด์ž! ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์—์„œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด. ๐Ÿ˜Š

๐Ÿง Ubuntu/Debian ๊ณ„์—ด

sudo apt update
sudo apt install fail2ban

๐ŸŽฉ CentOS/RHEL ๊ณ„์—ด

sudo yum install epel-release
sudo yum install fail2ban

๐Ÿ”ต Fedora

sudo dnf install fail2ban

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ถ€ํŒ… ์‹œ ์ž๋™ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•ด:

sudo systemctl start fail2ban
sudo systemctl enable fail2ban
sudo systemctl status fail2ban

๋งˆ์ง€๋ง‰ ๋ช…๋ น์–ด๋กœ Fail2Ban์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด. active (running)์ด๋ผ๊ณ  ํ‘œ์‹œ๋˜๋ฉด ์„ฑ๊ณต์ด์•ผ! ๐ŸŽ‰

โš™๏ธ ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ ์ดํ•ดํ•˜๊ธฐ: ํ•ต์‹ฌ ๊ตฌ์กฐ ํŒŒ์•…

Fail2Ban์˜ ์„ค์ • ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒŒ ์ •๋ง ์ค‘์š”ํ•ด. ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์˜ ์„ค์ • ํŒŒ์ผ์ด ์žˆ๊ฑฐ๋“ :

๐Ÿ“ /etc/fail2ban/jail.conf
๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ์ด์•ผ. ํ•˜์ง€๋งŒ ์ด ํŒŒ์ผ์€ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋ฎ์–ด์”Œ์›Œ์งˆ ์ˆ˜ ์žˆ์–ด์„œ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ ๋ผ! ๋Œ€์‹  jail.local ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.
๐Ÿ“ /etc/fail2ban/jail.local
์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜์ •ํ•  ํŒŒ์ผ์ด์•ผ. ์ด ํŒŒ์ผ์˜ ์„ค์ •์ด jail.conf๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„์„œ, ์—ฌ๊ธฐ์— ์ž‘์„ฑํ•œ ๋‚ด์šฉ์ด ์ตœ์ข…์ ์œผ๋กœ ์ ์šฉ๋ผ. ๐Ÿ‘

jail.local ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์ž:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

์ด์ œ ์ด ํŒŒ์ผ ์•ˆ์—์„œ ์ค‘์š”ํ•œ ์„น์…˜๋“ค์„ ์‚ดํŽด๋ณผ๊ฒŒ:

[DEFAULT] ์„น์…˜

๋ชจ๋“  jail(๊ฐ์˜ฅ, ์ฐจ๋‹จ ๊ทœ์น™)์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ์„ค์ •์ด์•ผ. ์—ฌ๊ธฐ์„œ ์„ค์ •ํ•œ ๊ฐ’๋“ค์€ ๊ฐœ๋ณ„ jail์—์„œ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋‘ ์ ์šฉ๋ผ.

[DEFAULT]
# ์ฐจ๋‹จ ์‹œ๊ฐ„ (์ดˆ ๋‹จ์œ„, 600์ดˆ = 10๋ถ„)
bantime = 600

# ์‹คํŒจ ํšŸ์ˆ˜๋ฅผ ์นด์šดํŠธํ•  ์‹œ๊ฐ„ ๋ฒ”์œ„ (์ดˆ ๋‹จ์œ„)
findtime = 600

# ์ฐจ๋‹จ์„ ๋ฐœ๋™์‹œํ‚ฌ ์ตœ๋Œ€ ์‹คํŒจ ํšŸ์ˆ˜
maxretry = 5

# ์ฐจ๋‹จ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•  IP (์ž์‹ ์˜ IP๋ฅผ ๊ผญ ์ถ”๊ฐ€ํ•˜์ž!)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

์ด ์„ค์ •์˜ ์˜๋ฏธ๋Š” ์ด๋ž˜: "10๋ถ„ ๋™์•ˆ 5๋ฒˆ ์‹คํŒจํ•˜๋ฉด 10๋ถ„๊ฐ„ ์ฐจ๋‹จํ•œ๋‹ค"๋Š” ๊ฑฐ์•ผ. ๊ฐ„๋‹จํ•˜์ง€? ๐Ÿ˜„

โš ๏ธ ์ค‘์š”ํ•œ ์ฃผ์˜์‚ฌํ•ญ!
ignoreip์— ๋ฐ˜๋“œ์‹œ ์ž์‹ ์˜ IP ์ฃผ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด! ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹ค์ˆ˜๋กœ ๋กœ๊ทธ์ธ์„ ๋ช‡ ๋ฒˆ ์‹คํŒจํ–ˆ์„ ๋•Œ ์ž๊ธฐ ์ž์‹ ์„ ์ฐจ๋‹จํ•ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๊ฑฐ๋“ . ๊ทธ๋Ÿผ ์„œ๋ฒ„์— ์ ‘์†์กฐ์ฐจ ๋ชปํ•˜๋Š” ๋‚œ๊ฐํ•œ ์ƒํ™ฉ์ด ๋ฒŒ์–ด์ ธ. ๐Ÿ˜ฑ

๐Ÿ” SSH ๋ณดํ˜ธ ์„ค์ •: ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์–ด์„ 

SSH๋Š” ์„œ๋ฒ„ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ์ด์ž ๊ฐ€์žฅ ๋งŽ์ด ๊ณต๊ฒฉ๋ฐ›๋Š” ์„œ๋น„์Šค์•ผ. ๊ทธ๋ž˜์„œ Fail2Ban์œผ๋กœ SSH๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ฑด ํ•„์ˆ˜ ์ค‘์˜ ํ•„์ˆ˜์ง€! ๐Ÿ’ช

jail.local ํŒŒ์ผ์—์„œ [sshd] ์„น์…˜์„ ์ฐพ์•„์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด:

[sshd]
# ์ด jail์„ ํ™œ์„ฑํ™”
enabled = true

# ๋ชจ๋‹ˆํ„ฐ๋งํ•  ํฌํŠธ (SSH ๊ธฐ๋ณธ ํฌํŠธ๋Š” 22)
port = ssh

# ์‚ฌ์šฉํ•  ํ•„ํ„ฐ (์ •๊ทœํ‘œํ˜„์‹ ํŒจํ„ด ํŒŒ์ผ)
filter = sshd

# ๋ชจ๋‹ˆํ„ฐ๋งํ•  ๋กœ๊ทธ ํŒŒ์ผ
logpath = /var/log/auth.log

# ์ด jail์—์„œ๋งŒ ์ ์šฉํ•  ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’ ์žฌ์ •์˜)
maxretry = 3

# ์ฐจ๋‹จ ์‹œ๊ฐ„์„ 1์‹œ๊ฐ„์œผ๋กœ ์„ค์ • (3600์ดˆ)
bantime = 3600

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด SSH ๋กœ๊ทธ์ธ์„ 3๋ฒˆ ์‹คํŒจํ•œ IP๋Š” 1์‹œ๊ฐ„ ๋™์•ˆ ์ฐจ๋‹จ๋ผ. ๊ธฐ๋ณธ ์„ค์ •๋ณด๋‹ค ํ›จ์”ฌ ์—„๊ฒฉํ•˜์ง€? ๋ณด์•ˆ์€ ์กฐ๊ธˆ ๋นก๋นกํ•œ ๊ฒŒ ์ข‹์•„! ๐Ÿ›ก๏ธ

๐Ÿ’ก Pro Tip: SSH ํฌํŠธ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด?
๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ณด์•ˆ์„ ์œ„ํ•ด SSH ํฌํŠธ๋ฅผ 22๋ฒˆ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๋กœ ๋ณ€๊ฒฝํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด 2222๋ฒˆ์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค๋ฉด port = 2222๋กœ ์„ค์ •ํ•ด์•ผ ํ•ด. ์—ฌ๋Ÿฌ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด port = ssh,2222,2223 ์ด๋Ÿฐ ์‹์œผ๋กœ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋‚˜์—ดํ•˜๋ฉด ๋ผ!

๐Ÿ” ํ•„ํ„ฐ ํŒŒ์ผ ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ

๊ถ๊ธˆํ•˜์ง€ ์•Š์•„? Fail2Ban์ด ์–ด๋–ค ํŒจํ„ด์œผ๋กœ ์‹คํŒจํ•œ ๋กœ๊ทธ์ธ์„ ๊ฐ์ง€ํ•˜๋Š”์ง€ ๋ง์ด์•ผ. ํ•„ํ„ฐ ํŒŒ์ผ์„ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž:

sudo cat /etc/fail2ban/filter.d/sshd.conf

์ด ํŒŒ์ผ ์•ˆ์—๋Š” ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ์ž‘์„ฑ๋œ ํŒจํ„ด๋“ค์ด ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error|failed) for .* from <HOST>( via \S+)?\s*$
            ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
            ^%(__prefix_line)sFailed (?:password|publickey) for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$

๋ณต์žกํ•ด ๋ณด์ด์ง€? ํ•˜์ง€๋งŒ ์ด ํŒจํ„ด๋“ค์ด ๋กœ๊ทธ์—์„œ ์‹คํŒจํ•œ ๋กœ๊ทธ์ธ ์‹œ๋„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ด๋Š” ๊ฑฐ์•ผ. <HOST> ๋ถ€๋ถ„์ด ๊ณต๊ฒฉ์ž์˜ IP ์ฃผ์†Œ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ถ€๋ถ„์ด๊ณ ! ๐ŸŽฏ

๐ŸŒ ์›น ์„œ๋ฒ„ ๋ณดํ˜ธ: Apache์™€ Nginx ์„ค์ •

์›น ์„œ๋ฒ„๋„ SSH๋งŒํผ์ด๋‚˜ ๊ณต๊ฒฉ์˜ ๋Œ€์ƒ์ด ๋ผ. ํŠนํžˆ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋‚˜ ๋กœ๊ทธ์ธ ํผ์ด ์žˆ๋‹ค๋ฉด ๋”๋”์šฑ ๊ทธ๋ ‡์ง€. Apache์™€ Nginx๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž! ๐Ÿš€

๐Ÿ”ด Apache ๋ณดํ˜ธ ์„ค์ •

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
bantime = 3600

[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
bantime = 86400

[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache2/error.log
maxretry = 3
bantime = 3600

[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache2/error.log
maxretry = 2
bantime = 3600

๊ฐ jail์ด ๋ณดํ˜ธํ•˜๋Š” ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋ฉด:

  • apache-auth: HTTP ์ธ์ฆ ์‹คํŒจ ๊ฐ์ง€ (๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๋กœ๊ทธ์ธ ์‹คํŒจ ๋“ฑ)
  • apache-badbots: ์•…์„ฑ ๋ด‡์ด๋‚˜ ์Šคํฌ๋ž˜ํผ ์ฐจ๋‹จ
  • apache-noscript: ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์š”์ฒญ ์ฐจ๋‹จ (ํ•ดํ‚น ์‹œ๋„)
  • apache-overflows: ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ณต๊ฒฉ ์‹œ๋„ ์ฐจ๋‹จ

๐ŸŸข Nginx ๋ณดํ˜ธ ์„ค์ •

[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600

[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 3600

[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400

Nginx๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์–ด. nginx-limit-req๋Š” ํŠนํžˆ ์ค‘์š”ํ•œ๋ฐ, Nginx์˜ rate limiting ๊ธฐ๋Šฅ๊ณผ ์—ฐ๋™ํ•ด์„œ ๊ณผ๋„ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” IP๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋“ . ๐Ÿ‘Š

โš ๏ธ ๋กœ๊ทธ ๊ฒฝ๋กœ ํ™•์ธ ํ•„์ˆ˜!
์„ค์ •ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์‹ค์ œ ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ด. ๋ฐฐํฌํŒ์ด๋‚˜ ์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ฑฐ๋“ . ls -la /var/log/apache2/ ๋˜๋Š” ls -la /var/log/nginx/ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•ด๋ณด์ž!

๐Ÿ“ง ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์„ค์ •: ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณต๊ฒฉ ๊ฐ์ง€ํ•˜๊ธฐ

Fail2Ban์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์ฐจ๋‹จํ–ˆ์„ ๋•Œ ์ด๋ฉ”์ผ๋กœ ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ์ •๋ง ์œ ์šฉํ•ด. ์–ด๋–ค IP๊ฐ€ ๊ณต๊ฒฉ์„ ์‹œ๋„ํ–ˆ๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ณต๊ฒฉ์ด ์žˆ์—ˆ๋Š”์ง€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ! ๐Ÿ“ฌ

๋จผ์ € ์‹œ์Šคํ…œ์— ๋ฉ”์ผ ์ „์†ก ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ ํ•ด. sendmail์ด๋‚˜ postfix๋ฅผ ์„ค์น˜ํ•˜์ž:

sudo apt install sendmail
# ๋˜๋Š”
sudo apt install postfix

๊ทธ๋ฆฌ๊ณ  jail.local์˜ [DEFAULT] ์„น์…˜์— ๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด:

[DEFAULT]
# ์ด๋ฉ”์ผ ์•Œ๋ฆผ ์„ค์ •
destemail = your-email@example.com
sender = fail2ban@your-server.com
mta = sendmail

# ์•Œ๋ฆผ ์•ก์…˜ ์„ค์ •
action = %(action_mwl)s

์—ฌ๊ธฐ์„œ action ๊ฐ’์— ๋”ฐ๋ผ ์•Œ๋ฆผ ์ˆ˜์ค€์ด ๋‹ฌ๋ผ์ ธ:

์•ก์…˜ ๊ฐ’ ์„ค๋ช…
action_ ์ฐจ๋‹จ๋งŒ ํ•˜๊ณ  ์ด๋ฉ”์ผ ๋ณด๋‚ด์ง€ ์•Š์Œ
action_mw ์ฐจ๋‹จํ•˜๊ณ  whois ์ •๋ณด์™€ ํ•จ๊ป˜ ์ด๋ฉ”์ผ ์ „์†ก
action_mwl ์ฐจ๋‹จํ•˜๊ณ  whois ์ •๋ณด + ๊ด€๋ จ ๋กœ๊ทธ ๋ผ์ธ๊นŒ์ง€ ์ด๋ฉ”์ผ ์ „์†ก (๊ฐ€์žฅ ์ƒ์„ธํ•จ)

๊ฐœ์ธ์ ์œผ๋กœ๋Š” action_mwl์„ ์ถ”์ฒœํ•ด! ๊ณต๊ฒฉ ์‹œ๋„์˜ ์ „์ฒด ๋งฅ๋ฝ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ณด์•ˆ ๋ถ„์„์— ๋„์›€์ด ๋˜๊ฑฐ๋“ . ๐Ÿ”

๐Ÿ’ก Slack์ด๋‚˜ Discord ์•Œ๋ฆผ๋„ ๊ฐ€๋Šฅํ•ด!
์ด๋ฉ”์ผ ๋ง๊ณ ๋„ Slack์ด๋‚˜ Discord๋กœ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด. ์ปค์Šคํ…€ ์•ก์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ด๊ฑด ์กฐ๊ธˆ ๊ณ ๊ธ‰ ์ฃผ์ œ๋ผ์„œ ๋‚˜์ค‘์— ์ต์ˆ™ํ•ด์ง€๋ฉด ๋„์ „ํ•ด๋ณด๋Š” ๊ฑธ ์ถ”์ฒœํ•ด! ์žฌ๋Šฅ๋„ท์—์„œ Fail2Ban ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„์„œ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ๐Ÿ˜Š

๐ŸŽจ ์ปค์Šคํ…€ ํ•„ํ„ฐ ๋งŒ๋“ค๊ธฐ: ๋‚˜๋งŒ์˜ ๋ณด์•ˆ ๊ทœ์น™

๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ํ•„ํ„ฐ๋„ ํ›Œ๋ฅญํ•˜์ง€๋งŒ, ๋•Œ๋กœ๋Š” ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์ƒํ™ฉ์— ๋งž๋Š” ์ปค์Šคํ…€ ํ•„ํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž์ฒด ๊ฐœ๋ฐœํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊ทธ์ธ ์‹คํŒจ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ์ง์ ‘ ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ด! ๐ŸŽจ

๐Ÿ“ ์ปค์Šคํ…€ ํ•„ํ„ฐ ์ž‘์„ฑ ์˜ˆ์ œ

๊ฐ€์ƒ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž:

2024-01-15 14:23:45 [ERROR] Login failed for user 'admin' from IP 192.168.1.100
2024-01-15 14:23:50 [ERROR] Login failed for user 'root' from IP 192.168.1.100

์ด๋Ÿฐ ๋กœ๊ทธ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. /etc/fail2ban/filter.d/myapp-auth.conf ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด:

[Definition]
# ์‹คํŒจ ํŒจํ„ด ์ •์˜
failregex = ^\s*\[ERROR\]\s+Login failed for user .* from IP <HOST>\s*$

# ๋ฌด์‹œํ•  ํŒจํ„ด (์„ ํƒ์‚ฌํ•ญ)
ignoreregex =

# ๋‚ ์งœ ํŒจํ„ด (์„ ํƒ์‚ฌํ•ญ, ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
datepattern = ^%%Y-%%m-%%d %%H:%%M:%%S

์ •๊ทœํ‘œํ˜„์‹ ์„ค๋ช…:

  • ^\s*: ์ค„ ์‹œ์ž‘, ๊ณต๋ฐฑ ํ—ˆ์šฉ
  • \[ERROR\]: [ERROR] ๋ฌธ์ž์—ด (๋Œ€๊ด„ํ˜ธ๋Š” ์ด์Šค์ผ€์ดํ”„ ํ•„์š”)
  • \s+: ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ณต๋ฐฑ
  • Login failed for user .*: ๊ณ ์ • ๋ฌธ์ž์—ด๊ณผ ์ž„์˜์˜ ์‚ฌ์šฉ์ž๋ช…
  • from IP <HOST>: IP ์ฃผ์†Œ ์ถ”์ถœ (Fail2Ban์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ)
  • \s*$: ์ค„ ๋, ๊ณต๋ฐฑ ํ—ˆ์šฉ

๐Ÿงช ํ•„ํ„ฐ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ด! Fail2Ban์€ fail2ban-regex๋ผ๋Š” ํ›Œ๋ฅญํ•œ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด:

fail2ban-regex /var/log/myapp/auth.log /etc/fail2ban/filter.d/myapp-auth.conf

์ด ๋ช…๋ น์–ด๋Š” ์‹ค์ œ ๋กœ๊ทธ ํŒŒ์ผ๊ณผ ํ•„ํ„ฐ๋ฅผ ๋น„๊ตํ•ด์„œ ๋งค์นญ๋˜๋Š” ๋ผ์ธ์„ ๋ณด์—ฌ์ค˜. ๊ฒฐ๊ณผ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต์ด์•ผ:

Running tests
=============

Use   failregex filter file : myapp-auth, basedir: /etc/fail2ban
Use         log file : /var/log/myapp/auth.log
Use         encoding : UTF-8

Results
=======

Failregex: 15 total
|-  #) [# of hits] regular expression
|   1) [15] ^\s*\[ERROR\]\s+Login failed for user .* from IP <HOST>\s*$
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [15] {^LN-BEG}%%Y-%%m-%%d %%H:%%M:%%S
`-

Lines: 15 lines, 0 ignored, 15 matched, 0 missed

15 matched, 0 missed๋ผ๊ณ  ๋‚˜์˜ค๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฑฐ์•ผ! ๐ŸŽ‰

์ด์ œ jail.local์— ์ƒˆ๋กœ์šด jail์„ ์ถ”๊ฐ€ํ•˜์ž:

[myapp-auth]
enabled = true
port = http,https
filter = myapp-auth
logpath = /var/log/myapp/auth.log
maxretry = 3
bantime = 3600
findtime = 600

์„ค์ •์„ ์ €์žฅํ•˜๊ณ  Fail2Ban์„ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ๋!

sudo systemctl restart fail2ban

๐Ÿ”ง ๊ณ ๊ธ‰ ์„ค์ •: ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ ์œ„ํ•ด

๊ธฐ๋ณธ ์„ค์ •์— ์ต์ˆ™ํ•ด์กŒ๋‹ค๋ฉด ์ด์ œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•ด๋ณผ ์ฐจ๋ก€์•ผ. ๋” ์ •๊ตํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณด์ž! ๐Ÿ’ช

โฐ ์ ์ง„์  ์ฐจ๋‹จ ์‹œ๊ฐ„ (Progressive Ban Time)

๊ฐ™์€ IP๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•œ๋‹ค๋ฉด? ์ฐจ๋‹จ ์‹œ๊ฐ„์„ ์ ์  ๋Š˜๋ ค๊ฐ€๋Š” ๊ฒŒ ํšจ๊ณผ์ ์ด์•ผ. ์ด๊ฑธ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

# ์ฒซ ๋ฒˆ์งธ ์ฐจ๋‹จ: 10๋ถ„
bantime = 600

# ์žฌ๋ฒ” ์‹œ ์ฐจ๋‹จ ์‹œ๊ฐ„ ์ฆ๊ฐ€
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 604800  # ์ตœ๋Œ€ 1์ฃผ์ผ

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด:

  • 1์ฐจ ์œ„๋ฐ˜: 10๋ถ„ ์ฐจ๋‹จ
  • 2์ฐจ ์œ„๋ฐ˜: 20๋ถ„ ์ฐจ๋‹จ (10๋ถ„ ร— 2)
  • 3์ฐจ ์œ„๋ฐ˜: 40๋ถ„ ์ฐจ๋‹จ (20๋ถ„ ร— 2)
  • 4์ฐจ ์œ„๋ฐ˜: 80๋ถ„ ์ฐจ๋‹จ...
  • ์ตœ๋Œ€ 1์ฃผ์ผ๊นŒ์ง€ ์ฆ๊ฐ€

๋ˆ์งˆ๊ธด ๊ณต๊ฒฉ์ž์—๊ฒŒ ํ™•์‹คํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿ˜ค

๐ŸŒ ์ง€์—ญ ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ (GeoIP Blocking)

ํŠน์ • ๊ตญ๊ฐ€์—์„œ๋งŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋ฉด, ๋‹ค๋ฅธ ๊ตญ๊ฐ€์˜ IP๋ฅผ ์•„์˜ˆ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด์•ผ. ์ด๋ฅผ ์œ„ํ•ด GeoIP ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด:

sudo apt install geoip-bin geoip-database

๊ทธ๋ฆฌ๊ณ  ์ปค์Šคํ…€ ์•ก์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์„œ ํŠน์ • ๊ตญ๊ฐ€์˜ IP๋งŒ ์ฐจ๋‹จํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด ์ค‘๊ตญ๊ณผ ๋Ÿฌ์‹œ์•„์—์„œ์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๋ ค๋ฉด:

[sshd]
enabled = true
filter = sshd
action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
         geoip-action[countries="CN RU"]
logpath = /var/log/auth.log

๋ฌผ๋ก  ์ด๊ฑด ์กฐ๊ธˆ ๊ทน๋‹จ์ ์ธ ๋ฐฉ๋ฒ•์ด๊ณ , ์ •๋‹นํ•œ ์‚ฌ์šฉ์ž๊นŒ์ง€ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด! โš ๏ธ

๐Ÿ”„ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์™€ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ

ํŠน์ • IP๋Š” ์ ˆ๋Œ€ ์ฐจ๋‹จํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๊ฑฐ๋‚˜(ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ), ์˜๊ตฌ์ ์œผ๋กœ ์ฐจ๋‹จํ•ด์•ผ ํ•œ๋‹ค๋ฉด(๋ธ”๋ž™๋ฆฌ์ŠคํŠธ) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด:

[DEFAULT]
# ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ (์ ˆ๋Œ€ ์ฐจ๋‹จํ•˜์ง€ ์•Š์„ IP)
ignoreip = 127.0.0.1/8 ::1
           192.168.1.0/24
           203.0.113.50
           
# ์˜๊ตฌ ์ฐจ๋‹จ (๋ธ”๋ž™๋ฆฌ์ŠคํŠธ)
# ๋ณ„๋„ jail ์ƒ์„ฑ
[blacklist]
enabled = true
filter = blacklist
action = iptables-allports[name=BLACKLIST]
logpath = /var/log/fail2ban-blacklist.log
maxretry = 1
findtime = 31536000  # 1๋…„
bantime = -1  # ์˜๊ตฌ ์ฐจ๋‹จ

๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— IP๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋กœ๊ทธ ํŒŒ์ผ์— ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด ๋ผ:

echo "$(date) Blacklist 1.2.3.4" | sudo tee -a /var/log/fail2ban-blacklist.log

๐Ÿ“Š ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ด€๋ฆฌ: Fail2Ban ์ƒํƒœ ํ™•์ธํ•˜๊ธฐ

Fail2Ban์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ณต๊ฒฉ์„ ์ฐจ๋‹จํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด. ๋‹ค์–‘ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ช…๋ น์–ด๋“ค์„ ์•Œ์•„๋ณด์ž! ๐Ÿ“ˆ

๐Ÿ” ๊ธฐ๋ณธ ์ƒํƒœ ํ™•์ธ ๋ช…๋ น์–ด

# Fail2Ban ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ
sudo systemctl status fail2ban

# ํ™œ์„ฑํ™”๋œ jail ๋ชฉ๋ก ๋ณด๊ธฐ
sudo fail2ban-client status

# ํŠน์ • jail์˜ ์ƒ์„ธ ์ •๋ณด ๋ณด๊ธฐ
sudo fail2ban-client status sshd

# ํ˜„์žฌ ์ฐจ๋‹จ๋œ IP ๋ชฉ๋ก ๋ณด๊ธฐ
sudo fail2ban-client get sshd banned

fail2ban-client status sshd ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     127
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 5
   |- Total banned:     42
   `- Banned IP list:   192.168.1.100 203.0.113.25 198.51.100.50 ...

์ด ์ •๋ณด๋ฅผ ๋ณด๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ณต๊ฒฉ ์‹œ๋„๊ฐ€ ์žˆ์—ˆ๋Š”์ง€, ํ˜„์žฌ ๋ช‡ ๊ฐœ์˜ IP๊ฐ€ ์ฐจ๋‹จ๋˜์–ด ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ์–ด! ๐Ÿ‘€

๐Ÿ”“ ์ˆ˜๋™์œผ๋กœ IP ์ฐจ๋‹จ ํ•ด์ œํ•˜๊ธฐ

์‹ค์ˆ˜๋กœ ์ •๋‹นํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์ฐจ๋‹จํ–ˆ๊ฑฐ๋‚˜, ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ ์ฐจ๋‹จ์„ ํ•ด์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:

# ํŠน์ • IP ์ฐจ๋‹จ ํ•ด์ œ
sudo fail2ban-client set sshd unbanip 192.168.1.100

# ๋ชจ๋“  ์ฐจ๋‹จ ํ•ด์ œ (์ฃผ์˜!)
sudo fail2ban-client unban --all

๊ธ‰ํ•œ ์ƒํ™ฉ์—์„œ ์ •๋ง ์œ ์šฉํ•œ ๋ช…๋ น์–ด์•ผ! ๐Ÿš‘

๐Ÿ“‹ ๋กœ๊ทธ ํŒŒ์ผ ๋ถ„์„

Fail2Ban ์ž์ฒด์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด:

# Fail2Ban ๋กœ๊ทธ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
sudo tail -f /var/log/fail2ban.log

# ์ตœ๊ทผ ์ฐจ๋‹จ ๊ธฐ๋ก๋งŒ ๋ณด๊ธฐ
sudo grep "Ban" /var/log/fail2ban.log | tail -20

# ํŠน์ • IP์˜ ์ฐจ๋‹จ ์ด๋ ฅ ๊ฒ€์ƒ‰
sudo grep "192.168.1.100" /var/log/fail2ban.log

๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ์ด๋Ÿฐ ๋‚ด์šฉ๋“ค์ด ๊ธฐ๋ก๋˜์–ด ์žˆ์–ด:

2024-01-15 14:25:32,123 fail2ban.actions [12345]: NOTICE  [sshd] Ban 192.168.1.100
2024-01-15 14:35:32,456 fail2ban.actions [12345]: NOTICE  [sshd] Unban 192.168.1.100
2024-01-15 15:10:15,789 fail2ban.filter  [12345]: INFO    [apache-auth] Found 203.0.113.25
๐Ÿ’ก ์‹œ๊ฐํ™” ๋„๊ตฌ ํ™œ์šฉํ•˜๊ธฐ
๋กœ๊ทธ๋ฅผ ํ…์ŠคํŠธ๋กœ๋งŒ ๋ณด๋Š” ๊ฑด ์ข€ ์ง€๋ฃจํ•˜์ง€? Fail2Ban Dashboard ๊ฐ™์€ ์›น ๊ธฐ๋ฐ˜ ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ž˜ํ”„์™€ ์ฐจํŠธ๋กœ ๊ณต๊ฒฉ ํŒจํ„ด์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด. ๋˜๋Š” ELK Stack(Elasticsearch, Logstash, Kibana)๊ณผ ์—ฐ๋™ํ•ด์„œ ๋” ๊ฐ•๋ ฅํ•œ ๋ถ„์„๋„ ๊ฐ€๋Šฅํ•ด! ์žฌ๋Šฅ๋„ท์—์„œ ์ด๋Ÿฐ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ๋„์™€์ค„ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ๐Ÿ“Š

โšก ์„ฑ๋Šฅ ์ตœ์ ํ™”: ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ค„์ด๊ธฐ

Fail2Ban์€ ๋กœ๊ทธ ํŒŒ์ผ์„ ๊ณ„์† ์ฝ๊ณ  ์ •๊ทœํ‘œํ˜„์‹์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ค์ •์ด ์ž˜๋ชป๋˜๋ฉด ์„œ๋ฒ„ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด. ์ตœ์ ํ™” ํŒ์„ ์•Œ์•„๋ณด์ž! ๐Ÿš€

โฑ๏ธ ํด๋ง ๊ฐ„๊ฒฉ ์กฐ์ •

Fail2Ban์ด ๋กœ๊ทธ ํŒŒ์ผ์„ ํ™•์ธํ•˜๋Š” ์ฃผ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด:

[DEFAULT]
# ๋กœ๊ทธ ํŒŒ์ผ ํด๋ง ๊ฐ„๊ฒฉ (์ดˆ ๋‹จ์œ„, ๊ธฐ๋ณธ๊ฐ’ 1์ดˆ)
# ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์ง€ ์•Š๋‹ค๋ฉด 5์ดˆ๋กœ ๋Š˜๋ ค๋„ ์ถฉ๋ถ„ํ•ด
logtarget = /var/log/fail2ban.log
loglevel = INFO
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400  # 1์ผ ์ง€๋‚œ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ผ! ๐Ÿงน

๐ŸŽฏ ์ •๊ทœํ‘œํ˜„์‹ ์ตœ์ ํ™”

๋ณต์žกํ•œ ์ •๊ทœํ‘œํ˜„์‹์€ CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด. ๊ฐ€๋Šฅํ•œ ํ•œ ๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์ข‹์•„:

# ๋น„ํšจ์œจ์ ์ธ ์˜ˆ
failregex = .*Failed.*password.*for.*from.*<HOST>.*

# ํšจ์œจ์ ์ธ ์˜ˆ
failregex = ^Failed password for .* from <HOST>

์•ž๋ถ€๋ถ„์— ^(์ค„ ์‹œ์ž‘)์„ ๋ถ™์ด๋ฉด ๋งค์นญ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ์ ธ! ์ž‘์€ ์ฐจ์ด ๊ฐ™์ง€๋งŒ ๋กœ๊ทธ๊ฐ€ ๋งŽ์„ ๋•Œ๋Š” ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์–ด. โšก

๐Ÿ“ฆ ๋ถˆํ•„์š”ํ•œ jail ๋น„ํ™œ์„ฑํ™”

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์„œ๋น„์Šค์˜ jail์€ ๊ณผ๊ฐํ•˜๊ฒŒ ๋น„ํ™œ์„ฑํ™”ํ•˜์ž:

# ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์„œ๋น„์Šค๋Š” enabled = false๋กœ ์„ค์ •
[proftpd]
enabled = false

[postfix]
enabled = false

[dovecot]
enabled = false

ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿ’ฐ

๐Ÿ› ๋ฌธ์ œ ํ•ด๊ฒฐ: ํ”ํ•œ ์ด์Šˆ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Fail2Ban์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ€๋” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด. ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ดค์–ด! ๐Ÿ”ง

โŒ ๋ฌธ์ œ 1: Fail2Ban์ด ์‹œ์ž‘๋˜์ง€ ์•Š์•„์š”!

์ฆ์ƒ: systemctl start fail2ban ์‹คํ–‰ ์‹œ ์‹คํŒจ

์›์ธ: ๋Œ€๋ถ€๋ถ„ ์„ค์ • ํŒŒ์ผ์˜ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๋•Œ๋ฌธ์ด์•ผ.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# ์„ค์ • ํŒŒ์ผ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ
sudo fail2ban-client -t

# ์ƒ์„ธํ•œ ์—๋Ÿฌ ๋กœ๊ทธ ํ™•์ธ
sudo journalctl -u fail2ban -n 50

# ์„ค์ • ํŒŒ์ผ ๋ฐฑ์—…๋ณธ์œผ๋กœ ๋ณต๊ตฌ
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

๋ฌธ๋ฒ• ๊ฒ€์‚ฌ ๋ช…๋ น์–ด๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋””๊ฐ€ ์ž˜๋ชป๋๋Š”์ง€ ์•Œ๋ ค์ค„ ๊ฑฐ์•ผ! ๐Ÿ”

โŒ ๋ฌธ์ œ 2: ์ฐจ๋‹จ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•„์š”!

์ฆ์ƒ: ๊ณต๊ฒฉ์ด ๊ณ„์†๋˜๋Š”๋ฐ IP๊ฐ€ ์ฐจ๋‹จ๋˜์ง€ ์•Š์Œ

์›์ธ: ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋๊ฑฐ๋‚˜, ํ•„ํ„ฐ ํŒจํ„ด์ด ๋งž์ง€ ์•Š๊ฑฐ๋‚˜, ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์ด ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์ง€ ์•Š์Œ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# 1. ๋กœ๊ทธ ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
ls -la /var/log/auth.log

# 2. ํ•„ํ„ฐ ํ…Œ์ŠคํŠธ
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

# 3. ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™ ํ™•์ธ
sudo iptables -L -n | grep fail2ban

# 4. Fail2Ban ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ ์‹คํ–‰
sudo fail2ban-client -vvv start

๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์ž์„ธํžˆ ๋ณผ ์ˆ˜ ์žˆ์–ด! ๐Ÿž

โŒ ๋ฌธ์ œ 3: ์ž๊ธฐ ์ž์‹ ์ด ์ฐจ๋‹จ๋์–ด์š”! ๐Ÿ˜ฑ

์ฆ์ƒ: SSH ์ ‘์†์ด ์•ˆ ๋˜๊ณ  "Connection refused" ์—๋Ÿฌ ๋ฐœ์ƒ

์›์ธ: ๋กœ๊ทธ์ธ ์‹คํŒจ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ–ˆ๊ฑฐ๋‚˜, ignoreip์— ์ž์‹ ์˜ IP๊ฐ€ ์—†์Œ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

์ด๊ฑด ์ •๋ง ๋‚œ๊ฐํ•œ ์ƒํ™ฉ์ด์•ผ. ์„œ๋ฒ„์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด(์ฝ˜์†” ์ ‘์†):

# ๋ชจ๋“  ์ฐจ๋‹จ ํ•ด์ œ
sudo fail2ban-client unban --all

# ๋˜๋Š” iptables์—์„œ ์ง์ ‘ ์ œ๊ฑฐ
sudo iptables -D fail2ban-sshd -s YOUR_IP -j REJECT

์„œ๋ฒ„์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋ฉด... ํ˜ธ์ŠคํŒ… ์—…์ฒด์— ์—ฐ๋ฝํ•ด์„œ ๋„์›€์„ ์š”์ฒญํ•ด์•ผ ํ•ด. ๊ทธ๋ž˜์„œ ignoreip ์„ค์ •์ด ์ •๋ง ์ค‘์š”ํ•œ ๊ฑฐ์•ผ! ๐Ÿ’ก

โŒ ๋ฌธ์ œ 4: ์ด๋ฉ”์ผ ์•Œ๋ฆผ์ด ์˜ค์ง€ ์•Š์•„์š”!

์ฆ์ƒ: ์ฐจ๋‹จ์€ ๋˜๋Š”๋ฐ ์ด๋ฉ”์ผ์ด ์•ˆ ์˜ด

์›์ธ: ๋ฉ”์ผ ์„œ๋ฒ„ ์„ค์ • ๋ฌธ์ œ ๋˜๋Š” action ์„ค์ • ์˜ค๋ฅ˜

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# ๋ฉ”์ผ ์ „์†ก ํ…Œ์ŠคํŠธ
echo "Test email" | mail -s "Test" your-email@example.com

# Fail2Ban ์•ก์…˜ ํ…Œ์ŠคํŠธ
sudo fail2ban-client set sshd banip 1.2.3.4

# ๋กœ๊ทธ์—์„œ ์ด๋ฉ”์ผ ์ „์†ก ์‹œ๋„ ํ™•์ธ
sudo grep "mail" /var/log/fail2ban.log

๋ฉ”์ผ ์„œ๋ฒ„ ์„ค์ •์ด ๋ณต์žกํ•˜๋‹ค๋ฉด ์™ธ๋ถ€ SMTP ์„œ๋น„์Šค(Gmail, SendGrid ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด์•ผ! ๐Ÿ“ง

๐Ÿ” ๋ณด์•ˆ ๋ชจ๋ฒ” ์‚ฌ๋ก€: ๋” ์•ˆ์ „ํ•œ ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

Fail2Ban๋งŒ์œผ๋กœ๋Š” ์™„๋ฒฝํ•œ ๋ณด์•ˆ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์–ด. ๋‹ค๋ฅธ ๋ณด์•ˆ ์กฐ์น˜๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ์ง„์งœ ๊ฐ•๋ ฅํ•œ ๋ฐฉ์–ด ์‹œ์Šคํ…œ์ด ์™„์„ฑ๋˜์ง€! ๐Ÿ›ก๏ธ

1๏ธโƒฃ SSH ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‚ฌ์šฉ

๋น„๋ฐ€๋ฒˆํ˜ธ ๋Œ€์‹  SSH ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์ž‘์œ„ ๋Œ€์ž… ๊ณต๊ฒฉ์ด ๊ฑฐ์˜ ๋ฌด์˜๋ฏธํ•ด์ ธ:

# ๋กœ์ปฌ์—์„œ SSH ํ‚ค ์ƒ์„ฑ
ssh-keygen -t ed25519 -C "your-email@example.com"

# ๊ณต๊ฐœ ํ‚ค๋ฅผ ์„œ๋ฒ„์— ๋ณต์‚ฌ
ssh-copy-id user@server-ip

# ์„œ๋ฒ„์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ ๋น„ํ™œ์„ฑํ™”
sudo nano /etc/ssh/sshd_config
# PasswordAuthentication no ๋กœ ๋ณ€๊ฒฝ
sudo systemctl restart sshd

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Fail2Ban์€ ๋ฐฑ์—… ๋ฐฉ์–ด์„ ์ด ๋˜๋Š” ๊ฑฐ์•ผ! ๐Ÿ”‘

2๏ธโƒฃ ๋ฐฉํ™”๋ฒฝ ๊ธฐ๋ณธ ์ •์ฑ… ์„ค์ •

ํ•„์š”ํ•œ ํฌํŠธ๋งŒ ์—ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ์ฐจ๋‹จํ•˜๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด:

# UFW ์‚ฌ์šฉ ์˜ˆ์ œ
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Fail2Ban๊ณผ ๋ฐฉํ™”๋ฒฝ์˜ ์กฐํ•ฉ์€ ์ •๋ง ๊ฐ•๋ ฅํ•ด! ๐Ÿ’ช

3๏ธโƒฃ ์ •๊ธฐ์ ์ธ ์—…๋ฐ์ดํŠธ

์‹œ์Šคํ…œ๊ณผ Fail2Ban์„ ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์œ ์ง€ํ•ด:

# Ubuntu/Debian
sudo apt update && sudo apt upgrade

# CentOS/RHEL
sudo yum update

๋ณด์•ˆ ํŒจ์น˜๋Š” ๋ฏธ๋ฃจ์ง€ ๋ง๊ณ  ๋ฐ”๋กœ๋ฐ”๋กœ ์ ์šฉํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด! โฐ

4๏ธโƒฃ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง ์ž๋™ํ™”

Fail2Ban ๋กœ๊ทธ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž:

#!/bin/bash
# /usr/local/bin/fail2ban-report.sh

echo "=== Fail2Ban Daily Report ==="
echo "Date: $(date)"
echo ""

for jail in $(fail2ban-client status | grep "Jail list" | sed "s/.*://g" | sed "s/,//g"); do
    echo "--- $jail ---"
    fail2ban-client status $jail | grep "Currently banned\|Total banned"
    echo ""
done

์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ cron์œผ๋กœ ๋งค์ผ ์‹คํ–‰ํ•˜๋ฉด ๋ณด์•ˆ ์ƒํ™ฉ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿ“Š

๐ŸŒŸ ์‹ค์ „ ํ™œ์šฉ ์‚ฌ๋ก€: ์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ฐฐ์› ์œผ๋‹ˆ ์ด์ œ ์‹ค์ œ ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž! ๐Ÿ’ผ

๐Ÿ“ฑ ์‚ฌ๋ก€ 1: WordPress ์‚ฌ์ดํŠธ ๋ณดํ˜ธ

WordPress๋Š” ์ „ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” CMS๋ผ์„œ ๊ณต๊ฒฉ ๋Œ€์ƒ 1์ˆœ์œ„์•ผ. wp-login.php์— ๋Œ€ํ•œ ๋ฌด์ž‘์œ„ ๋Œ€์ž… ๊ณต๊ฒฉ์ด ์ •๋ง ๋งŽ๊ฑฐ๋“ !

WordPress ์ „์šฉ ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž:

# /etc/fail2ban/filter.d/wordpress-auth.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
            ^<HOST> .* "POST /xmlrpc.php

ignoreregex =

๊ทธ๋ฆฌ๊ณ  jail ์„ค์ •:

[wordpress-auth]
enabled = true
port = http,https
filter = wordpress-auth
logpath = /var/log/apache2/access.log
maxretry = 3
bantime = 3600
findtime = 600

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด wp-login.php๋‚˜ xmlrpc.php์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” IP๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์–ด! ๐ŸŽฏ

๐Ÿ—„๏ธ ์‚ฌ๋ก€ 2: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ ๋ณดํ˜ธ

MySQL์ด๋‚˜ PostgreSQL ์„œ๋ฒ„๋„ ๋ณดํ˜ธํ•ด์•ผ ํ•ด. ํŠนํžˆ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค๋ฉด ๋”๋”์šฑ!

# MySQL ๋ณดํ˜ธ
[mysqld-auth]
enabled = true
port = 3306
filter = mysqld-auth
logpath = /var/log/mysql/error.log
maxretry = 3
bantime = 7200

# PostgreSQL ๋ณดํ˜ธ
[postgresql]
enabled = true
port = 5432
filter = postgresql
logpath = /var/log/postgresql/postgresql-*-main.log
maxretry = 3
bantime = 7200

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ •๋ง ์ค‘์š”ํ•œ ์ž์‚ฐ์ด๋‹ˆ๊นŒ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๋Š” ๊ฒŒ ์ข‹์•„! ๐Ÿ—„๏ธ

๐Ÿ“ง ์‚ฌ๋ก€ 3: ๋ฉ”์ผ ์„œ๋ฒ„ ๋ณดํ˜ธ

๋ฉ”์ผ ์„œ๋ฒ„๋Š” ์ŠคํŒธ ๋ฐœ์†ก ์‹œ๋„๋‚˜ ๊ณ„์ • ํƒˆ์ทจ ์‹œ๋„๊ฐ€ ๋งŽ์•„. Postfix์™€ Dovecot์„ ๋ณดํ˜ธํ•˜๋Š” ์„ค์ •:

[postfix-sasl]
enabled = true
port = smtp,submission,smtps
filter = postfix-sasl
logpath = /var/log/mail.log
maxretry = 3
bantime = 3600

[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission,submissions
filter = dovecot
logpath = /var/log/mail.log
maxretry = 3
bantime = 3600

๋ฉ”์ผ ์„œ๋ฒ„๊ฐ€ ์ŠคํŒธ ๋ฐœ์†ก ๋ด‡๋„ท์— ์•…์šฉ๋˜๋Š” ๊ฑธ ๋ง‰์„ ์ˆ˜ ์žˆ์–ด! ๐Ÿ“ฌ

๐ŸŽ“ ๋” ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด: ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค

Fail2Ban์€ ์ •๋ง ๊นŠ์ด ์žˆ๋Š” ๋„๊ตฌ์•ผ. ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ์€ ๋น™์‚ฐ์˜ ์ผ๊ฐ์ด๊ณ , ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๊ณผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด! ๐ŸŒŠ

๐Ÿ“š ๊ณต์‹ ๋ฌธ์„œ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ
  • ๊ณต์‹ GitHub: github.com/fail2ban/fail2ban - ์ตœ์‹  ์—…๋ฐ์ดํŠธ์™€ ์ด์Šˆ ํŠธ๋ž˜ํ‚น
  • ๊ณต์‹ ์œ„ํ‚ค: ๋‹ค์–‘ํ•œ ์„ค์ • ์˜ˆ์ œ์™€ ๊ฐ€์ด๋“œ
  • Stack Overflow: ์‹ค์ œ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‚ฌ๋ก€๋“ค
  • Reddit r/selfhosted: ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒฝํ—˜ ๊ณต์œ 
๐ŸŽฏ ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€ ์ฐพ๊ธฐ
Fail2Ban ์„ค์ •์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ํŠน์ˆ˜ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ์„œ๋ฒ„ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ์‹ค์ „ ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ์ „๋ฌธ๊ฐ€๋“ค์ด ๋งž์ถคํ˜• ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ด์ค„ ์ˆ˜ ์žˆ๊ฑฐ๋“ ! ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋‚˜ ๋ณต์žกํ•œ ์ธํ”„๋ผ๋ฅผ ์šด์˜ํ•œ๋‹ค๋ฉด ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์ด ์ •๋ง ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์–ด. ๐Ÿ’ผ
๐Ÿ”ง ๊ณ ๊ธ‰ ์ฃผ์ œ๋“ค
๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ์ฃผ์ œ๋“ค์„ ํƒ๊ตฌํ•ด๋ด:
  • Fail2Ban + Cloudflare ์—ฐ๋™: ๋ฐฉํ™”๋ฒฝ ์ฐจ๋‹จ๊ณผ ํ•จ๊ป˜ CDN ๋ ˆ๋ฒจ์—์„œ๋„ ์ฐจ๋‹จ
  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ Fail2Ban: ์—ฌ๋Ÿฌ ์„œ๋ฒ„์˜ ์ฐจ๋‹จ ์ •๋ณด ๊ณต์œ 
  • Machine Learning ๊ธฐ๋ฐ˜ ์ด์ƒ ํƒ์ง€: ํŒจํ„ด ๊ธฐ๋ฐ˜์„ ๋„˜์–ด์„  ์ง€๋Šฅํ˜• ๋ฐฉ์–ด
  • SIEM ํ†ตํ•ฉ: Splunk, ELK ๋“ฑ๊ณผ ์—ฐ๋™ํ•œ ํ†ตํ•ฉ ๋ณด์•ˆ ๋ชจ๋‹ˆํ„ฐ๋ง
๐Ÿšซ โœ… ๐Ÿšซ โœ… Protected by Fail2Ban Your Server is Safe

๐ŸŽฌ ๋งˆ๋ฌด๋ฆฌ: ์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘ํ•˜์ž!

์—ฌ๊ธฐ๊นŒ์ง€ Fail2Ban์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค˜์–ด! ์ฒ˜์Œ์—” ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ ํ•˜๋‹ค ๋ณด๋ฉด ๊ธˆ๋ฐฉ ์ต์ˆ™ํ•ด์งˆ ๊ฑฐ์•ผ. ๐Ÿ˜Š

โœ… ํ•ต์‹ฌ ์š”์•ฝ

1. ์„ค์น˜์™€ ๊ธฐ๋ณธ ์„ค์ •
ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ๊ฐ„๋‹จํžˆ ์„ค์น˜ํ•˜๊ณ , jail.local ํŒŒ์ผ๋กœ ์„ค์ •์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•ด.

2. SSH ๋ณดํ˜ธ๋Š” ํ•„์ˆ˜
๊ฐ€์žฅ ๋จผ์ € SSH๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ์ž์‹ ์˜ IP๋Š” ๋ฐ˜๋“œ์‹œ ignoreip์— ์ถ”๊ฐ€ํ•ด.

3. ์›น ์„œ๋ฒ„์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณดํ˜ธ
Apache, Nginx, WordPress ๋“ฑ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์— ๋งž๋Š” jail์„ ํ™œ์„ฑํ™”ํ•ด.

4. ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์•Œ๋ฆผ
์ •๊ธฐ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ด๋ฉ”์ผ ์•Œ๋ฆผ์„ ์„ค์ •ํ•ด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒŒ์•…ํ•ด.

5. ์ง€์†์ ์ธ ๊ฐœ์„ 
๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ์„ค์ •์„ ์กฐ์ •ํ•˜๋ฉฐ, ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์„ ์œ ์ง€ํ•ด.

์„œ๋ฒ„ ๋ณด์•ˆ์€ ํ•œ ๋ฒˆ ์„ค์ •ํ•˜๊ณ  ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ์ง€์†์ ์ธ ๊ด€์‹ฌ๊ณผ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€. ํ•˜์ง€๋งŒ Fail2Ban ๊ฐ™์€ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ํ›จ์”ฌ ์ˆ˜์›”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด! ๐ŸŽฏ

ํ˜น์‹œ ์„ค์ • ์ค‘์— ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜, ๋” ๋ณต์žกํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ์„ ํƒ์ด์•ผ. ๋•Œ๋กœ๋Š” ๊ฒฝํ—˜ ๋งŽ์€ ์ „๋ฌธ๊ฐ€์˜ ํ•œ ๋งˆ๋””๊ฐ€ ๋ฉฐ์น ๊ฐ„์˜ ์‚ฝ์งˆ์„ ์ค„์—ฌ์ฃผ๊ธฐ๋„ ํ•˜๊ฑฐ๋“ ! ๐Ÿ’ก

์ž, ์ด์ œ ๋‹น์‹ ์˜ ์„œ๋ฒ„๋ฅผ Fail2Ban์œผ๋กœ ๋ฌด์žฅ์‹œํ‚ฌ ์‹œ๊ฐ„์ด์•ผ! ํ•ด์ปค๋“ค์—๊ฒŒ "์—ฌ๊ธด ๋งŒ๋งŒํ•œ ๊ณณ์ด ์•„๋‹ˆ์•ผ!"๋ผ๊ณ  ํ™•์‹คํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ์ž! ๐Ÿ’ช๐Ÿ›ก๏ธ

๐Ÿš€ Happy Securing! ๐Ÿš€

์•ˆ์ „ํ•œ ์„œ๋ฒ„ ์šด์˜์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค!

Remember: Security is not a product, but a process! ๐Ÿ”

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.