M5. 보너스 — 인시던트 리포트 자동화 + 멀티에이전트 브릿지
보너스 모듈에서는 조사 결과를 사람이 읽는 완결형 인시던트 리포트로 자동 렌더하고, 실무 확장 방향으로 agents-as-tools 멀티에이전트 브릿지 스켈레톤을 훑어봅니다.
5.1 인시던트 리포트 자동 렌더
섹션 제목: “5.1 인시던트 리포트 자동 렌더”lab-src/m5/generate_report.py는 M3 실행 결과 JSON을 입력받아 7개 섹션의 완결형
리포트를 마크다운으로 뽑아냅니다.
-
- 요약(Executive Summary) — 공격 유형, 확신도, 영향 범위.
-
- 타임라인 — 발견 → 조사 → 판정 표.
-
- 증거 — 로그 근거·IoC(IP/계정/경로) 불릿.
-
- 근본 원인(5 Whys) — Why1 → Why5.
-
- 차단/격리 권고 — 즉시 실행할 조치.
-
- 재발 방지 — 중장기 개선안.
-
- 부록 — “모든 수치는 워크샵용 합성 데모 값입니다.” 고지 포함.
판정 티어와 동일한 모델(Claude Fable 5)을 사용해 톤 일관성을 유지합니다.
-
M3 조사 결과를 JSON 파일로 저장합니다.
M3의
invoke응답을 그대로 파일로 남깁니다.Terminal window cd aiopstriageagentagentcore invoke '{"prompt": "동일 IP에서 401 응답 500회 발생. 원인 분석해 주세요.", "session_id": "aiops-report-demo"}' \> /tmp/m3-result.json원본 알림 텍스트를 리포트에 반영하고 싶다면, JSON에
original_alert키를 추가해 두세요 (prompt키로도 인식됩니다). -
리포트를 렌더합니다.
Terminal window cd lab-src/m5python3 generate_report.py --input /tmp/m3-result.json --out /tmp/incident-report.md/tmp/incident-report.md를 열면 7개 섹션이 순서대로 채워진 마크다운 리포트가 보입니다. 부록에 “합성 데모 값” 고지가 들어 있는지 확인해 주세요.실측 출력 원문입니다 — 2026-07-16,
session_id=aiops-demo-incident-1입력으로generate_report.py실행 결과 상단 발췌(합성 데모 값):# 인시던트 리포트 — 크리덴셜 스터핑 계열 계정 탈취(ATO) 의심- **세션 ID**: aiops-demo-incident-1- **리포트 생성 시각**: 2026-07-16T10:42:07Z- **작성**: 보안 애널리스트팀---## 1. 요약 (Executive Summary)AnyCompany Fashion 온라인 쇼핑몰의 `/login` 엔드포인트를 대상으로203.0.113.x 대역에서 10분간 401 응답이 500회 이상 발생하였으며, 판정 결과**크리덴셜 스터핑 계열 계정 탈취(ATO) 공격**으로 확신도 **높음**으로판정되었습니다. WAF에서 203.0.113.17, 203.0.113.42, 198.51.100.9 발신 요청21건이 차단(BLOCK)되었고, app-auth 로그에서 다수의 401 실패 가운데**user0042@example.com 계정에 대한 성공 로그인 1건**이 확인되어 해당 계정은침해 의심(suspected_compromise) 상태입니다. ...[추정] 동일 공격자가 차단 회피를 위해 다른 IP 대역으로 로테이션할 가능성이있어 확장 모니터링이 필요합니다.---## 2. 타임라인| 순번 | 시각 (UTC) | 이벤트 ||---|---|---|| 1 | 리포트 생성 기준 직전 약 10분간 | 203.0.113.x 대역에서 `/login` 대상 401 응답 500회 이상 발생 — 최초 알림 트리거 || 2 | 알림 접수 직후 | 조사 개시 — 대상 로그 그룹(app-auth, alb, waf) 컨텍스트 확보 || 3 | 조사 중 | WAF BLOCK 21건, app-auth에서 user0042@example.com 성공 로그인 1건 확인 || 4 | 조사 중 | 상관관계 분석: 과거 credential_stuffing 이력 매치, WAF/ALB 교차 검증 || 5 | 2026-07-16T10:42:07Z 이전 | 판정 완료 — 크리덴셜 스터핑 계열 ATO, 확신도 높음 || 6 | 2026-07-16T10:42:07Z | 본 리포트 생성 |> ※ 개별 이벤트의 정확한 타임스탬프는 원본 로그에 대한 추가 조회가 필요합니다.부록(§7)의 “모든 수치는 워크샵용 합성 데모 값입니다.” 고지 문구까지 포함해 총 7개 섹션이 채워지는지 확인해 주세요. 판정 티어와 동일한 Claude Fable 5 호출이며 실측에서
temperature미지정 상태로 ValidationException 없이 정상 종료되었습니다. -
파이프 사용법.
agentcore invoke의 출력을 그대로 파이프로 넘길 수도 있습니다.Terminal window agentcore invoke '{"prompt": "...", "session_id": "..."}' \| python3 generate_report.py --out /tmp/report.md
5.2 멀티에이전트 브릿지 (실무 확장 스켈레톤)
섹션 제목: “5.2 멀티에이전트 브릿지 (실무 확장 스켈레톤)”lab-src/m5/multiagent_bridge.py는 agents-as-tools 패턴으로 3-티어 구조를
잡아 둔 교육용 스켈레톤입니다. 실행 자체가 목적이 아니라, 90분 실습이 끝난 뒤
각 팀의 시나리오로 확장할 때의 출발점입니다.
- Triage Orchestrator (coordinator) — 사용자 알림을 받아 어느 전문가에게
위임할지 결정합니다. 자기 자신은 도구를 직접 호출하지 않고, 두 서브에이전트를
@tool로 감싼 함수로 위임합니다. - Log Analysis Specialist — M2 조사관 역할. 실제 프로덕션에서는 여기에 Gateway MCP 클라이언트와 로그 도구가 붙습니다.
- Reporter Specialist — M5의
generate_report.py와 같은 리포트 티어. 조사 노트를 받아 완결형 리포트 초안을 반환합니다.
발췌:
# lab-src/m5/multiagent_bridge.py 발췌@tooldef analyze_logs(alert: str) -> str: """보안 로그 분석 전문가에게 알림 조사를 위임합니다.""" return str(_log_analysis_specialist(alert))
@tooldef draft_incident_report(investigation_notes: str) -> str: """조사 노트를 받아 완결형 인시던트 리포트 초안을 작성합니다.""" return str(_reporter_specialist(investigation_notes))
def build_orchestrator() -> Agent: return Agent( model=BedrockModel(model_id="global.anthropic.claude-sonnet-5", ...), system_prompt=ORCHESTRATOR_PROMPT, tools=[analyze_logs, draft_incident_report], )체크포인트
섹션 제목: “체크포인트”/tmp/incident-report.md가 7개 섹션 순서대로 채워져 있고, 부록에 “합성 데모 값” 고지가 있습니다.multiagent_bridge.py의 구조(Orchestrator + 두 Specialist)를 이해했습니다 — 실무 확장 시 여기서 시작합니다.
다음은 M6. 정리 — cleanup입니다.