Ver3.0 ๐ก๏ธ Fail2Ban: ์๋ํ๋ ์นจ์ ์ฐจ๋จ ์์คํ ๊ตฌ์ถ์ผ๋ก ์๋ฒ ๋ณด์ ๊ฐํํ๊ธฐ

๐ก๏ธ Fail2Ban: ์๋ํ๋ ์นจ์ ์ฐจ๋จ ์์คํ ๊ตฌ์ถ์ผ๋ก ์๋ฒ ๋ณด์ ๊ฐํํ๊ธฐ
๋ก๊ทธ ํ์ผ์ ๊ฐ์ํ๋ฉฐ ์ ์์ ์ธ ์ ๊ทผ์ ์๋์ผ๋ก ์ฐจ๋จํ๋ ๋๋ํ ๋ณด์ ์์คํ
๐ฏ Fail2Ban์ด ๋ญ๊ธธ๋ ์ด๋ ๊ฒ ์ค์ํ ๊น?
์๋ฒ๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด ์ ๋ง ์ ๊ฒฝ ์ธ ๊ฒ ํ๋ ๊ฐ์ง๊ฐ ์๋์ผ. ํนํ ๋ณด์ ๋ฌธ์ ๋ ์ ์๋ง ๋ฐฉ์ฌํด๋ ํฐ์ผ ๋๋ ๋ถ๋ถ์ด์ง. ๐ฐ ๋งค์ผ๊ฐ์ด ์ ์ธ๊ณ ์ด๋๊ฐ์์ ๋๊ตฐ๊ฐ๊ฐ ๋ด ์๋ฒ์ ๋ฌด์์ ๋์ ๊ณต๊ฒฉ(Brute Force Attack)์ ์๋ํ๊ณ ์๋ค๋ ๊ฑฐ, ์๊ณ ์์์ด?
Fail2Ban์ ์ด๋ฐ ์ํฉ์์ ์ ๋ง ๋ ๋ ํ ์น๊ตฌ ๊ฐ์ ์กด์ฌ์ผ. ๋ง์น 24์๊ฐ ๊นจ์ด์๋ ๊ฒฝ๋น์์ฒ๋ผ ์๋ฒ์ ๋ก๊ทธ ํ์ผ์ ๊ณ์ ๊ฐ์ํ๋ฉด์, ์์ํ ํ๋์ ํ๋ IP ์ฃผ์๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋์ผ๋ก ์ฐจ๋จํด์ฃผ๊ฑฐ๋ . ๐จ
์๋ฅผ ๋ค์ด๋ณผ๊น? SSH ๋ก๊ทธ์ธ์ 5๋ฒ ์ฐ์์ผ๋ก ์คํจํ IP๊ฐ ์๋ค๋ฉด, "์, ์ด ๋ ์ ๋ญ๊ฐ ์์ํ๋ฐ?"๋ผ๊ณ ํ๋จํ๊ณ ๋ฐ๋ก ๋ฐฉํ๋ฒฝ ๊ท์น์ ์ถ๊ฐํด์ ๊ทธ IP์ ์ ๊ทผ์ ๋ง์๋ฒ๋ฆฌ๋ ๊ฑฐ์ง. ์์ ์๋์ผ๋ก! ๋๊ฐ ์ ์๋ ์๊ฐ์๋, ์ปคํผ ๋ง์๋ ์๊ฐ์๋ ๋ง์ด์ผ. โ
๐ 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์ ์ค์ ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ ์ ๋ง ์ค์ํด. ํฌ๊ฒ ๋ ๊ฐ์ง ํ์ ์ ์ค์ ํ์ผ์ด ์๊ฑฐ๋ :
๊ธฐ๋ณธ ์ค์ ํ์ผ์ด์ผ. ํ์ง๋ง ์ด ํ์ผ์ ์ ๋ฐ์ดํธํ ๋ ๋ฎ์ด์์์ง ์ ์์ด์ ์ง์ ์์ ํ๋ฉด ์ ๋ผ! ๋์ 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์๊ฐ ๋์ ์ฐจ๋จ๋ผ. ๊ธฐ๋ณธ ์ค์ ๋ณด๋ค ํจ์ฌ ์๊ฒฉํ์ง? ๋ณด์์ ์กฐ๊ธ ๋นก๋นกํ ๊ฒ ์ข์! ๐ก๏ธ
๋ง์ ์ฌ๋๋ค์ด ๋ณด์์ ์ํด 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๋ก ์๋ฆผ์ ๋ฐ์ ์ ์์ด. ์ปค์คํ ์ก์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ฉด ๋๋๋ฐ, ์ด๊ฑด ์กฐ๊ธ ๊ณ ๊ธ ์ฃผ์ ๋ผ์ ๋์ค์ ์ต์ํด์ง๋ฉด ๋์ ํด๋ณด๋ ๊ฑธ ์ถ์ฒํด! ์ฌ๋ฅ๋ท์์ 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 ๋ฑ๊ณผ ์ฐ๋ํ ํตํฉ ๋ณด์ ๋ชจ๋ํฐ๋ง
๐ฌ ๋ง๋ฌด๋ฆฌ: ์ง๊ธ ๋ฐ๋ก ์์ํ์!
์ฌ๊ธฐ๊น์ง 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
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.