SSH brute-force 곡격 + 3μ€ λ°©μ΄ ν립 + κ²μ¦ μλ£ μμΉ Β· μ΄μ μΈμ λ©λͺ¨
μ§ν μ€ λ¬μμ IP 87.251.64.145μμ μλ² 22λ² ν¬νΈλ‘ root ν¨μ€μλ λμ 곡격 (μμ ν/λΆ).
μ°¨λ¨ μλ£ λ€νν PasswordAuthentication noλ‘ μΈμ¦ μμ²΄κ° λΆκ°λ₯. 곡격μ 무λ ₯νλμ§λ§ μλ² λΆν + μμ€ν
μΉ¨μμ΄ λ¬Έμ .
μ°μ λ°μ (6/30 μ€μΈ‘)
π΄ ssh brute-force β PAMauth.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λ°°)
π΄ μμ€ν λ©μΆ€ μ§μ
| μκ° (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:36 | korea-firewall μλ£ μ μ₯ | ~/.local/korea-firewall/kr.zone 38KB (2426 λμ) |
| 2026-07-01 06:00 | 곡격 μ¬κ° (μ€μΈ‘) | fail2ban λμ μ€ |
/etc/ssh/sshd_config:
PasswordAuthentication no
β ν¨μ€μλ μΈμ¦ μμ²΄κ° λΆκ°λ₯. ν€ μΈμ¦λ§ νμ©. brute-force 무λ ₯ν.
/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)
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κ° μλ νμΈ:
whitelist set (μμ₯λ μ§/λ΄λΆλ§) β 1410 ACCEPTkorea set (νκ΅ IP) β 0 (μΈλΆ νκ΅ μ μ μμ§ μμ)μꡬ μ μ₯ κ²μ¦:
$ ls -la /etc/iptables/rules.v4
-rw-r----- 1 root root 529 Jul 1 06:16 /etc/iptables/rules.v4 β reboot νμλ μ μ§
β οΈ ipset μ΄λ¦ λ―Έμ€λ§€μΉ (memory outdated):
whitelist + korea λ λΆλ¦¬λ set~/.local/korea-firewall/kr.zone (CIDR μλ³Έ)| νλͺ© | μν (7/1 06:19) | κ²μ¦ |
|---|---|---|
| sshd PasswordAuthentication | no (μμ ) | grep /etc/ssh/sshd_config |
| fail2ban μλΉμ€ | active Β· 7/1 06:01 μ¬μμ | systemctl is-active |
| iptables rule 1 (whitelist) | 1410 ν¨ν· ACCEPT | iptables -L INPUT |
| iptables rule 2 (korea) | 0 ν¨ν· (μΈλΆ νκ΅ λ―Έμ μ) | iptables -L INPUT |
| iptables rule 3 (DROP) | 90 ν¨ν· DROP (곡격μ) | iptables -L INPUT |
| /etc/iptables/rules.v4 | 529 bytes Β· μꡬ μ μ₯ | ls -la /etc/iptables/rules.v4 |
| fail2ban νμ¬ μ°¨λ¨ IP | 0 (곡격 μΌμ λ©μΆ€) | fail2ban-client status sshd |
| fail2ban total failed | 0 (νμ¬) | journalctl -u sshd |
# 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
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
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 # λ§μ§λ§: λλ¨Έμ§ μ°¨λ¨
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
Linger=yes μΈλ°λ user manager λ―ΈκΈ°λ κ°λ₯Permission denied to socket β root λλ fail2ban κ·Έλ£Ή νμ| μλ£ | κ²½λ‘ | μ€λͺ |
|---|---|---|
| νκ΅ IP λμ (38KB) | ~/.local/korea-firewall/kr.zone | 2426κ° KR CIDR |
| μ μ°¨ λ¬Έμ | ~/.hermes/skills/devops/mcp-server-install/references/korea-ip-whitelist-firewall-20260630.md | νμ΄νΈλ¦¬μ€νΈ κ΅¬μΆ λ¨κ³λ³ |
| MCP λꡬ νν© (μμ ) | ~/.local/korea-firewall/MCPλꡬνν©_20260630.xlsx | 6/30 μμ MCP 42κ° λꡬ μ 리 |
| 곡격 λ‘κ·Έ | /var/log/auth.log | PAM sshd λ‘κ·Έ (μμ μ€/λΆ νμ¦) |
| fail2ban λ‘κ·Έ | /var/log/fail2ban.log | μ°¨λ¨ μ΄λ²€νΈ |
μ΅μ’ μ κ² κ²°κ³Ό (μμ₯λ sudo μ§μ μ€ν):
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
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λ°°μ© μ¦κ°).
sudo ipset list korea | wc -l β νκ΅ IP CIDR κ°μ νμΈ (2426κ°μ¬μΌ μ μ)sudo ipset list whitelist β μμ₯λ μ§/λ΄λΆλ§ IP λͺ©λ‘μμ±: 2026-07-01 Β· μ΄μ (6/30) μΈμ λ©λͺ¨ κΈ°λ° Β· λ©μΈμΌλ‘