← 목록

fail2ban 24시간으로 늘렸더니 recidive가 죽어있었다

#security#fail2ban#ssh#nftables

공격 들어오는걸 봤으니 막아야지. 손본거 정리해둠

밴 1시간은 너무 짧았다

bantime이 1시간이었다. 한 시간 지나면 풀린다. 그러니까 같은 봇이 하루 741번 다시 붙었음

이게 보안 문제만이 아니다. 다시 붙을때마다 공유기가 새 NAT 세션을 잡는다. 세션 테이블 터지는 원인이 이거였을 가능성이 높다. 밴 기간 늘리는게 네트워크 부하 줄이는 조치이기도 함

일단 24시간으로 올렸다.

# /etc/fail2ban/jail.d/sshd.local
bantime = 24h

근데 이러면 recidive가 안 돈다

recidive는 반복해서 밴되는 IP를 잡아서 더 오래 막는 jail이다. 기본 findtime이 1일인데...

밴이 24시간 유지되면 그 24시간 동안 재범이 관측될 수가 없다. 밴 상태니까 접속 자체가 안되고, 접속을 안하니 다시 밴될 일도 없다. 즉 recidive가 영원히 발동 안함

관측 창을 4주로 늘렸다.

# /etc/fail2ban/jail.d/recidive.local
[recidive]
enabled   = true
logpath   = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime   = -1
findtime  = 4w
maxretry  = 3

bantime = -1이 영구다. banaction_allports면 SSH만이 아니라 전 포트를 막는다.

재범할수록 늘어나게

fail2ban 0.11부터 bantime.increment가 있다. 같은 IP가 또 오면 밴 기간을 배로 늘린다.

# /etc/fail2ban/jail.d/00-bantime-increment.local
[DEFAULT]
bantime.increment = true
bantime.factor    = 2
bantime.maxtime   = 52w
bantime.rndtime   = 30m

24h → 48h → 96h ... 상한 1년. 434개를 손으로 칠 수는 없으니까 상습범만 자동으로 걸러지게 두는 것.

이거 다 넣어도 무력화되는 함정

dbpurgeage가 기본 1일이다. 밴 이력을 하루 만에 지운다.

그러면 두 가지가 동시에 깨진다.

  • bantime.increment의 재범 카운트가 매일 초기화된다. 영원히 1회차 취급
  • 영구밴이 fail2ban 재시작하면 복원이 안된다

위에 공들여 넣은 설정 두 개가 통째로 헛수고가 되는 조합이다. recidive의 findtime(4주)보다 길게 잡아야 함

# /etc/fail2ban/fail2ban.local
[Definition]
dbpurgeage = 10w

dbpurgeage는 reload로 안 먹어서 restart 해야 한다.

확인은 이렇게

fail2ban-client get sshd bantime            # 86400
fail2ban-client get sshd bantime.increment  # True
fail2ban-client get recidive bantime        # -1
fail2ban-client get recidive findtime       # 2419200

골치아픈 놈들 일괄 영구밴

자동 장치를 걸어놨어도 이미 한달째 때리고 있는 애들은 지금 정리하고 싶었다.

기준은 두 개를 다 만족할 것. 인증 실패 50건 이상 그리고 활동 기간 2일 이상. 하루 반짝 왔다 간 IP는 유동 주소일 가능성이 있어서 뺐다.

안전장치는 세 겹으로 걸었다.

  1. 한번이라도 로그인 성공한 이력이 있는 IP는 무조건 제외 — 내 IP가 여기서 걸러졌다
  2. 사설, 루프백, 링크로컬 제외
  3. 서버 자기 공인 IP 제외

자기 자신 잠그는 사고가 전에 있어서 이건 좀 꼼꼼하게 했음

결과 84개. 이 84개가 전체 공격의 89.6%였다. 활동 기간이 20~39일씩이라 유동 IP가 아니라 고정으로 감염돼있는 기기들이다. 영구밴 걸어도 나중에 엉뚱한 사람 막을 위험이 낮다는 뜻

fail2ban-client set recidive banip <IP>    # recidive는 bantime=-1이니까 영구
recidive currently banned: 84
nftables addr-set-recidive 등록: 84개

풀 때는 unbanip.

영구밴이 만능은 아니라서

가정용 IP는 유동이다. 몇 달 뒤에 그 IP를 받은 사람이 억울하게 막힐 수 있다. 그래서 수동 영구밴은 확실한 상습범한테만 쓰고 나머지는 자동 증가밴이 처리하게 두는게 맞다.

진짜 답은 따로 있다

솔직히 이렇게 정교하게 막아봐야 봇은 계속 두들긴다. 두들기는 그 자체가 공유기한테 부담이고.

SSH 포트를 아예 안 열면 하루 5,700건이 애초에 공유기에 도달을 안한다. WireGuard만 열어두면 VPN 켜고 SSH 붙으면 되고 비밀번호 인증도 그대로 쓸 수 있다.

불편한건 하나. VPN 안 켜면 밖에서 SSH를 못 붙는다.

아직 안 닫았다. 고민중

사실은...

그냥 처음부터 22번 안 열었으면 이 글을 쓸 일이 없었다.

← 목록으로
오늘 0·전체 0