← λ©”μΈμœΌλ‘œ

πŸ›‘οΈ μ„œλ²„ λ³΄μ•ˆ 사건 (2026-06-30)

SSH brute-force 곡격 + 3쀑 λ°©μ–΄ 확립 + 검증 자료 μœ„μΉ˜ Β· μ–΄μ œ μ„Έμ…˜ λ©”λͺ¨

🚨 사건 μš”μ•½

μ§„ν–‰ 쀑 λŸ¬μ‹œμ•„ IP 87.251.64.145μ—μ„œ μ„œλ²„ 22번 포트둜 root νŒ¨μŠ€μ›Œλ“œ λŒ€μž… 곡격 (μˆ˜μ‹­ 회/λΆ„).

차단 μ™„λ£Œ λ‹€ν–‰νžˆ PasswordAuthentication no둜 인증 μžμ²΄κ°€ λΆˆκ°€λŠ₯. 곡격은 무λ ₯ν™”λμ§€λ§Œ μ„œλ²„ λΆ€ν•˜ + μ‹œμŠ€ν…œ 침식이 문제.

⚠️ 곡격의 μ§„μ§œ μœ„ν—˜ β€” 인증이 μ•„λ‹Œ μ‹œμŠ€ν…œ 침식

연쇄 λ°˜μ‘ (6/30 μ‹€μΈ‘)

πŸ”΄ ssh brute-force β†’ PAM auth.log 폭증 (μˆ˜μ‹­ 쀄/λΆ„)
🟠 Hermes gateway stdout contention (PAM λ‘œκ·Έκ°€ gateway stdout μΉ¨λ²”)
🟠 Hermes gateway 비정상 μ’…λ£Œ (code 1)
🟑 systemd μžλ™ 7번 μž¬μ‹œμž‘ (μž μ‹œ μ•ˆμ •-μž¬μ’…λ£Œ 반볡)
πŸ”΄ chrome-devtools μ’€λΉ„ ν”„λ‘œμ„ΈμŠ€ λˆ„μ  (μž¬μ‹œλ„ 도쀑 fork λˆ„λ½)
πŸ”΄ μ‹œμŠ€ν…œ load 8.53 (정상 0.5~1.0 λŒ€λΉ„ 8λ°°)
πŸ”΄ μ‹œμŠ€ν…œ 멈좀 직전
πŸ“‘ λͺ©μ°¨ 1. 사건 νƒ€μž„λΌμΈ (6/30) 2. 3쀑 λ°©μ–΄ (확립) 3. ν˜„μž¬ μƒνƒœ (μ‹€μ‹œκ°„ 점검) 4. 점검/볡ꡬ λͺ…λ Ήμ–΄ 5. μ•Œλ €μ§„ 함정 6. μ°Έκ³  자료 μœ„μΉ˜

1. 사건 νƒ€μž„λΌμΈ (2026-06-30)

μ‹œκ°„ (KST)μ‚¬κ±΄μ‘°μΉ˜
μ˜€ν›„root νŒ¨μŠ€μ›Œλ“œ λŒ€μž… μ‹œμž‘ (87.251.64.145)PasswordAuthentication no둜 인증 차단됨
저녁auth.log 폭증 β†’ gateway stdout 좩돌gateway 비정상 μ’…λ£Œ
저녁systemd 7번 μž¬μ‹œμž‘ β†’ chrome-devtools μ’€λΉ„ λˆ„μ load 8.53 도달
저녁3쀑 λ°©μ–΄ κ²°μ • + ꡬ좕sshd + fail2ban + ν•œκ΅­ IP ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ
19:36korea-firewall 자료 μ €μž₯~/.local/korea-firewall/kr.zone 38KB (2426 λŒ€μ—­)
2026-07-01 06:00곡격 재개 (μ‹€μΈ‘)fail2ban λ™μž‘ 쀑

2. 3쀑 λ°©μ–΄ (확립 + 6/30 μ‹€μΈ‘ 검증)

β‘  sshd: PasswordAuthentication 끄기 ν™œμ„±

/etc/ssh/sshd_config:
PasswordAuthentication no

β†’ νŒ¨μŠ€μ›Œλ“œ 인증 μžμ²΄κ°€ λΆˆκ°€λŠ₯. ν‚€ 인증만 ν—ˆμš©. brute-force 무λ ₯ν™”.

β‘‘ fail2ban: sshd jail ν™œμ„±

/etc/fail2ban/jail.local:
[sshd]
enabled = true
maxretry = 3
findtime = 600      # 10λΆ„ λ‚΄ 3회
bantime = 3600      # 1μ‹œκ°„ 차단

β†’ 10λΆ„ λ‚΄ 3회 μ‹€νŒ¨ μ‹œ 1μ‹œκ°„ IP 차단. 반볡 곡격자 λˆ„μ  차단.

6/30 검증: 19:10 87.251.64.145 Ban 4회 + already banned 3회 (1h ν›„ Unban)

β‘’ ν•œκ΅­ IP ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ (iptables + ipset) ν™œμ„± Β· 검증 μ™„λ£Œ

7/1 06:19 μ‹€μΈ‘ (μ†Œμž₯λ‹˜ 직접 μ‹€ν–‰):

Chain INPUT (policy ACCEPT 311K packets, 430M bytes)
num   pkts bytes target prot opt source      destination
1     1410  102K ACCEPT tcp  0.0.0.0/0    match-set whitelist src /* jaekyung home */
2        0     0 ACCEPT tcp  0.0.0.0/0    match-set korea src /* korea IPs only */
3       90  5352 DROP   tcp  0.0.0.0/0    tcp dpt:22 /* block non-Korea SSH */

β†’ rule 3개 μž‘λ™ 확인:

영ꡬ μ €μž₯ 검증:

$ ls -la /etc/iptables/rules.v4
-rw-r----- 1 root root 529 Jul  1 06:16 /etc/iptables/rules.v4  ← reboot 후에도 μœ μ§€

⚠️ ipset 이름 미슀맀치 (memory outdated):

3. ν˜„μž¬ μƒνƒœ (μ‹€μ‹œκ°„ 점검)

ν•­λͺ©μƒνƒœ (7/1 06:19)검증
sshd PasswordAuthenticationno (μ•ˆμ „)grep /etc/ssh/sshd_config
fail2ban μ„œλΉ„μŠ€active Β· 7/1 06:01 μž¬μ‹œμž‘systemctl is-active
iptables rule 1 (whitelist)1410 νŒ¨ν‚· ACCEPTiptables -L INPUT
iptables rule 2 (korea)0 νŒ¨ν‚· (μ™ΈλΆ€ ν•œκ΅­ 미접속)iptables -L INPUT
iptables rule 3 (DROP)90 νŒ¨ν‚· DROP (곡격자)iptables -L INPUT
/etc/iptables/rules.v4529 bytes Β· 영ꡬ μ €μž₯ls -la /etc/iptables/rules.v4
fail2ban ν˜„μž¬ 차단 IP0 (곡격 μΌμ‹œ 멈좀)fail2ban-client status sshd
fail2ban total failed0 (ν˜„μž¬)journalctl -u sshd

4. 점검/볡ꡬ λͺ…λ Ήμ–΄

πŸ” μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§

# 1) ν˜„μž¬ brute-force μ‹œλ„ IP + λΉˆλ„
sudo grep "Failed password" /var/log/auth.log | tail -20

# 2) μ°¨λ‹¨λœ IP λͺ©λ‘
sudo fail2ban-client status sshd

# 3) ipset ν•œκ΅­ IP 개수
sudo ipset list korea-whitelist | wc -l

# 4) 22번 포트 μ™ΈλΆ€ λ…ΈμΆœ μ‹œλ„
sudo ss -tnp 'sport = :22' | head

# 5) μ‹œμŠ€ν…œ load
uptime

πŸ› οΈ fail2ban μž¬μ‹œμž‘ (μ˜€μž‘λ™ μ‹œ)

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

πŸ› οΈ ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ μž¬λ‘œλ“œ (rule λ³€κ²½ ν›„)

sudo iptables -F INPUT
sudo iptables -A INPUT -m set --match-set korea-whitelist src -j ACCEPT
sudo iptables -A INPUT -m set --match-set internal src -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP   # λ§ˆμ§€λ§‰: λ‚˜λ¨Έμ§€ 차단

🚨 fail2ban κΆŒν•œ 였λ₯˜ μ‹œ (root κΆŒν•œ ν•„μš”)

Permission denied to socket: /var/run/fail2ban/fail2ban.sock, (you must be root)

β†’ sudo fail2ban-client status sshd 둜 μž¬μ‹œλ„. systemd socket κΆŒν•œ 점검 ν•„μš” μ‹œ:
sudo chmod 660 /var/run/fail2ban/fail2ban.sock
sudo chown root:fail2ban /var/run/fail2ban/fail2ban.sock

5. μ•Œλ €μ§„ 함정

6. μ°Έκ³  자료 μœ„μΉ˜

μžλ£Œκ²½λ‘œμ„€λͺ…
ν•œκ΅­ IP λŒ€μ—­ (38KB)~/.local/korea-firewall/kr.zone2426개 KR CIDR
절차 λ¬Έμ„œ~/.hermes/skills/devops/mcp-server-install/references/korea-ip-whitelist-firewall-20260630.mdν™”μ΄νŠΈλ¦¬μŠ€νŠΈ ꡬ좕 단계별
MCP 도ꡬ ν˜„ν™© (μ—‘μ…€)~/.local/korea-firewall/MCPλ„κ΅¬ν˜„ν™©_20260630.xlsx6/30 μ‹œμ  MCP 42개 도ꡬ 정리
곡격 둜그/var/log/auth.logPAM sshd 둜그 (μˆ˜μ‹­ 쀄/λΆ„ 폭증)
fail2ban 둜그/var/log/fail2ban.log차단 이벀트

βœ… κ²°λ‘ : 3쀑 λ°©μ–΄ μ™„μ „ 검증 μ™„λ£Œ (7/1 06:19)

μ΅œμ’… 점검 κ²°κ³Ό (μ†Œμž₯λ‹˜ sudo 직접 μ‹€ν–‰):

πŸ” fail2ban.log 검증 증거 (2026-06-30 β†’ 2026-07-01)

2026-06-30 19:10:38,069 fail2ban.filter [168020]: INFO  [sshd] Found 87.251.64.145
2026-06-30 19:10:38,161 fail2ban.actions [168020]: NOTICE [sshd] Ban 87.251.64.145
2026-06-30 19:10:38,220 fail2ban.actions [168020]: NOTICE [sshd] 87.251.64.145 already banned
2026-06-30 19:10:38,227 fail2ban.actions [168020]: NOTICE [sshd] 87.251.64.145 already banned
2026-06-30 19:10:38,227 fail2ban.actions [168020]: NOTICE [sshd] 87.251.64.145 already banned
2026-06-30 19:11:42,668 fail2ban.actions [168020]: NOTICE [sshd] Unban 87.251.64.145  ← 1h ν›„
2026-07-01 06:01:52,461 fail2ban.server  [168020]: INFO  Shutdown in progress...
2026-07-01 06:01:53,021 fail2ban.jail    [207299]: INFO  Creating new jail 'sshd'
2026-07-01 06:01:53,103 fail2ban.filter  [207299]: INFO  maxRetry: 3, findtime: 600, banTime: 3600

⚠️ fail2ban down 11h 사건 (재발 λ°©μ§€)

6/30 19:11 Unban 직후 fail2ban μ„œλΉ„μŠ€ down β†’ 7/1 06:01 μžλ™ μž¬μ‹œμž‘.
이 μ‹œκ°„ λ™μ•ˆ 87.251.64.145 재곡격 μ‹œ 차단 λͺ»ν•¨.
λŒ€μ‘ (선택): bantime 늘리기 (3600 β†’ 86400=24h) λ˜λŠ” bantime.increment = true + bantime.factor = 2 (반볡 μ‹œ 차단 μ‹œκ°„ 2λ°°μ”© 증가).

πŸ“‹ ν–₯ν›„ 점검 사항

μž‘μ„±: 2026-07-01 Β· μ–΄μ œ(6/30) μ„Έμ…˜ λ©”λͺ¨ 기반 Β· λ©”μΈμœΌλ‘œ