AI가 공격을 감지→Slack에서 승인→방화벽에 자동 차단을 추가하는 구조를 구축했다

AI가 공격을 감지→Slack에서 승인→방화벽에 자동 차단을 추가하는 구조를 구축했다

5 min read

2026.04 / Tech Blog / BASTION

AI가 공격을 탐지→Slack에서 승인→방화벽에 자동 차단을 설정하는 구조를 만들었습니다 #

BASTION의 「탐지→알림」 루프에 「자동 대응」을 추가했습니다. 포트 스캔을 탐지한 AI가 차단 제안을 Slack에 게시하고, 사람이 승인하면 OPNsense 방화벽에 즉시 차단 규칙이 적용됩니다. 24시간 후 자동 해제됩니다.

「탐지해서 알림하기」만으로는 부족합니다 #

기존의 BASTION은 로그를 분석하여 이상을 탐지하고 Slack으로 알림하는 구조였습니다(제1회 참조). 그러나 알림을 받은 후의 조치——공격 출발지 IP의 방화벽 차단——는 사람이 수동으로 OPNsense 관리 화면을 열어 작업해야 했습니다.

새벽 3시에 알림이 오면 다음날 아침 로그인해서 차단합니다. 그 사이 6시간 동안 공격자는 마음대로 스캔할 수 있습니다.

그래서 BASTION에 반응형 방어를 구현했습니다. AI가 공격을 탐지하면 방화벽 차단 추가를 자동으로 제안하고, Slack에서 승인만 하면 OPNsense에 즉시 규칙이 적용됩니다.

단, 갑자기 완전 자동화하지는 않습니다. AI에게 방화벽 규칙을 변경할 권한을 부여한다는 것은 오판으로 정상 통신을 차단할 위험이 있습니다. 먼저 「AI 제안→사람 승인→실행」의 Slack 승인 게이트 방식으로 시작하여 실적을 축적한 후 단계적으로 자율화합니다.

전체 흐름 #

단계 실행자 동작
1. 공격 탐지 analyze.sh(15분마다) 로그 분석으로 포트 스캔·무차별 대입 공격 탐지. severity: HIGH 판정
2. 차단 제안 propose-block.sh 화이트리스트 대조→중복 확인→Slack에 제안 게시
3. 사람 승인 운영자 Slack에서 @OpenClaw-Monitor 승인 block-XXXXX
4. 차단 실행 fw-action.sh OPNsense API로 Alias(BASTION_AutoBlock)에 IP 추가
5. 자동 해제 auto-expire.sh(매시 cron) 24시간 경과 후 Alias에서 IP 삭제

실제 동작 #

1. 차단 제안이 Slack에 도착 #

15분마다의 정기 분석에서 severity: HIGH가 탐지되면 공격 출발지 IP의 차단 제안이 자동으로 Slack에 게시됩니다.

incoming-webhook 13:31

🛡️ 차단 제안 [block-20260423-003]

공격 출발지 IP: xxx.xxx.119.51
탐지 사유: port_scan — 3,003회의 차단/실패
중대도: HIGH
자동 해제: 24시간 후

승인: @OpenClaw-Monitor 승인 block-20260423-003
거부: @OpenClaw-Monitor 거부 block-20260423-003

※ 30분 이내에 응답이 없으면 자동으로 거부됩니다.

incoming-webhook 13:31

🛡️ 차단 제안 [block-20260423-004]

공격 출발지 IP: xxx.xxx.47.173
탐지 사유: port_scan — 977회의 차단/실패
중대도: HIGH
자동 해제: 24시간 후

incoming-webhook 13:31

🛡️ 차단 제안 [block-20260423-005]

공격 출발지 IP: xxx.xxx.102.23
탐지 사유: port_scan — 965회의 차단/실패
중대도: HIGH
자동 해제: 24시간 후

1회 분석에서 최대 3건까지 제안됩니다. 차단 횟수가 많은 순으로 상위 IP가 선택됩니다.

2. 승인하면 방화벽에 즉시 반영 #

Slack에서 승인 명령을 보내면 fw-action.sh가 OPNsense의 API를 호출하여 차단 목록에 IP를 추가합니다.

운영자 13:37
@OpenClaw-Monitor 승인 block-20260423-003
incoming-webhook 13:37

✅ 차단 실행 완료 [block-20260423-003]
IP: xxx.xxx.119.51
자동 해제: 2026-04-24T13:37:14+09:00

OPNsense 측에서는 BASTION_AutoBlock이라는 Alias에 IP가 추가됩니다. 이 Alias를 참조하는 WAN 차단 규칙이 사전에 설정되어 있어, API로 Alias에 IP를 추가하기만 하면 즉시 차단이 활성화됩니다.

3. 24시간 후 자동 해제 #

auto-expire.sh가 매시 cron으로 실행되어 기한이 만료된 차단을 자동 해제합니다.

incoming-webhook 00:00

⏰ 자동 해제: xxx.xxx.119.51(24시간 경과)

해제 후 동일한 IP가 다시 스캔을 수행하면 다음 분석에서 다시 제안됩니다.

안전 메커니즘 #

AI에게 방화벽을 조작하도록 하는 이상, 오판으로 정상적인 통신을 차단하지 않기 위한 안전 메커니즘이 필요합니다. 5단계 방어를 구축했습니다.

단계 내용 목적
화이트리스트 내부 IP·DNS·자사 글로벌 IP는 절대 차단하지 않음 자기 자신의 통신 차단 방지
Slack 승인 게이트 사람이 확인한 후 실행(초기 단계) AI의 오판을 사람이 포착
속도 제한 시간당 최대 10건까지 비정상적인 대량 차단 방지
자동 해제 24시간 후 자동으로 차단 해제 오차단도 24시간 후 자동 복구
긴급 플러시 Slack에서 모든 차단 즉시 해제 가능 업무 영향 시 긴급 롤백

화이트리스트 조회 구현 #

화이트리스트 조회는 Python의 ipaddress 모듈로 구현되어 있습니다. CIDR 표기(10.0.0.0/8 등)를 지원하며, 프라이빗 IP·루프백·링크 로컬·멀티캐스트·예약된 주소는 내장 검사로 자동 제외됩니다.

# 화이트리스트 조회 흐름
1. 내장 검사: is_private / is_loopback / is_link_local / is_multicast / is_reserved
2. 파일 조회: block-whitelist.txt의 각 줄(IP 단독 or CIDR)에 대해 판정
3. 결과: exit 0=차단 금지 / exit 1=차단 가능

OPNsense API 연동 #

차단의 실체는 OPNsense의 Alias(IP 주소 그룹)입니다. 사전에 “BASTION_AutoBlock”이라는 Alias를 만들고, 이 Alias를 Source로 하는 WAN 차단 규칙을 설정해 둡니다.

# IP 추가(차단 실행)
curl -k -u "${API_KEY}:${API_SECRET}" \
  -X POST "${OPNSENSE}/api/firewall/alias_util/add/BASTION_AutoBlock" \
  -d '{"address":"공격원 IP"}'

# IP 삭제(차단 해제)
curl -k -u "${API_KEY}:${API_SECRET}" \
  -X POST "${OPNSENSE}/api/firewall/alias_util/delete/BASTION_AutoBlock" \
  -d '{"address":"공격원 IP"}'

alias_util은 런타임 테이블을 직접 조작하기 때문에 API 호출 하나로 즉시 차단이 활성화됩니다. 방화벽 규칙을 다시 로드할 필요가 없습니다.

감사 로그 #

모든 차단·해제·승인·거부·타임아웃은 감사 로그에 기록됩니다.

2026-04-23 13:31:33 [PROPOSE] new block-20260423-003 ip=xxx.xxx.119.51 reason=port_scan count=3003
2026-04-23 13:37:14 [BLOCK]   approved block-20260423-003 ip=xxx.xxx.119.51 expires=2026-04-24T13:37:14
2026-04-24 00:00:03 [EXPIRE]  auto-expire block-20260423-003 ip=xxx.xxx.119.51 api=done

grep으로 태그([PROPOSE] / [BLOCK] / [EXPIRE] 등)를 지정하면 특정 작업만 추출할 수 있습니다.

단계적 자율화 #

현재는 Slack 승인 게이트 방식이지만, 실적을 축적하여 단계적으로 자율화하는 설계입니다.

단계 모델 전환 조건
Phase 1(현재) Slack 승인 게이트
Phase 2 조건부 자율 confidence: high 및 차단 일정 횟수 이상 → 자동 실행. 그 외에는 승인 게이트
Phase 3 완전 자율 오판률이 0.1% 미만을 3개월 유지

왜 단계적으로 하는가 #

BASTION의 개발 과정에서 LLM이 “존재하지 않는 인시던트를 조작하는” 환각(hallucination)을 실제로 경험했습니다. 어떤 계정이 “18회 잠금되었다”고 보고서에 기재되었지만, 실제 로그의 이벤트는 0건이었습니다. 만약 리액티브 방어가 먼저 구현되었다면 가상의 공격 IP를 차단했을 가능성이 있습니다. 이 경험이 “먼저 사람이 확인한 후 실행”이라는 설계 판단의 근거입니다.

Slack 승인 게이트의 한계도 보이고 있다 #

OpenClaw를 경유한 Slack 승인에서는 여러 명령의 일괄 처리 시 LLM이 일부 명령을 실행하지 않고 “완료했다”고 응답하는 케이스가 발생했습니다. 에이전트 기반의 LLM을 거치는 이상, 이러한 종류의 불확실성은 구조적으로 남습니다. 완전 자동화(analyze.sh→propose-block.sh→fw-action.sh의 직접 파이프라인)에서는 LLM의 응답 생성을 경유하지 않기 때문에 이 문제는 사라집니다.

요약 #

BASTION의 리액티브 방어는 로그 분석→차단 제안→Slack 승인→OPNsense API 차단→24시간 자동 해제의 플로우를 전자동으로 실행합니다. 5층의 안전 메커니즘(화이트리스트, 승인 게이트, 속도 제한, 자동 해제, 긴급 플러시)을 통해 오판으로 인한 업무 영향을 최소화합니다.

현재는 Slack 승인 게이트 방식으로 운영 중이지만, 실적 데이터를 축적하여 단계적으로 자율화해 나가는 설계입니다. “탐지→알림”으로 끝나던 모니터링 시스템이 “탐지→판단→대응→자동 해제”의 루프를 완성했습니다.

BASTION은 폐쇄망 환경에서 AI 보안 모니터링을 실현하는 서비스입니다.

BASTION 서비스 페이지
문의하기

Updated on 2026年6月9日

What are your feelings

  • Happy
  • Normal
  • Sad