본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

Blacklist — 저장, lift, audit

~15 min · blacklist, auto-lift, admin

Level 0Greenhorn
0 XP0/53 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Blacklist 는 brute force 가 성공하기 전 마지막 방어선이야. 필요한 건 셋. 재시작해도 살아남을 것, 잘못 걸린 IP 를 풀어줄 수 있을 것 (대개 네 IP 야), 그리고 각 entry 가 왜 들어왔는지 볼 수 있을 것.

Entry release — admin 만

Auto-lift vs 수동 lift — trade

모드방법장점단점
수동필요 시 admin unblock 클릭사람이 반드시 한 번 보게 되고, 패턴도 눈에 들어옴스스로 잠기면 잠긴 그 머신에선 풀 수가 없음
시간 기반 auto-lift예: 24시간 후 expire알아서 풀림. 영영 잠기는 일이 없음끈질긴 공격자는 24시간 기다렸다 다시 옴
Hybrid"exceeded_retry" 는 1시간 뒤 자동 해제, "honeypot" 은 영구둘 다 best코드가 조금 더 듦 (그만한 값어치는 있음)

Code

Schema (Track 5 에도)·sql
CREATE TABLE security_blacklist (
  ip          TEXT PRIMARY KEY,
  reason      TEXT,
  blocked_at  INTEGER NOT NULL
);
Admin 전용 unblock 엔드포인트·python
@app.post("/admin/security/unblock")
async def unblock(request: Request, ip: str = Form(...)):
    require_admin(request)
    db.execute("DELETE FROM security_blacklist WHERE ip = ?", (ip,))
    db.execute("DELETE FROM security_attempts  WHERE ip = ?", (ip,))
    db.commit()
    return RedirectResponse("/admin/security", status_code=302)
Hybrid auto-lift sweep·python
RETRY_BLOCK_TTL = 3600   # 1 hour

def auto_lift_blacklist():
    cutoff = now() - RETRY_BLOCK_TTL
    db.execute("""
      DELETE FROM security_blacklist
      WHERE reason = 'exceeded_retry' AND blocked_at < ?
    """, (cutoff,))
    db.commit()

# 앱 시작할 때, 또는 주기적 task 로, 또는 로그인 시도 전마다

External links

Exercise

Unblock 엔드포인트와 auto_lift_blacklist 함수 추가. FastAPI startup 이벤트나 background task 로 auto_lift_blacklist 스케줄. 테스트해봐. lockout 을 일으키고 한 시간 기다린 다음 (아니면 RETRY_BLOCK_TTL 을 잠깐 10 으로 낮추고) entry 가 사라졌는지 확인해. honeypot entry 는 남아 있어야 하고.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.