재구현 트랙 — 스펙만 보고 직접 다시 만든다¶
이 스택의 모든 통제는 실행 가능한 검증(verify 스위트·단위테스트)을 갖고 있다. 이 트랙은 그 검증기를 자동 채점기로 뒤집는다: 통제 하나를 빈 파일에서 직접 재구현하면 채점기가 PASS/FAIL로 판정한다. 따라치기가 아니라 — 스펙만 보고 쓰고, 틀리면 왜 틀렸는지 채점으로 배운다.
처음이라면 — 먼저 환경 준비: 환경 준비 (SETUP) 를 1분 보고(클론엔
.venv가 없다), 그다음 M0. 클러스터 없이 Python만으로 5분이면 첫 채점을 본다. 무엇이 빠졌는지 한 번에 보려면powershell -File scripts\doctor.ps1. 무설치로: GitHub Codespaces(Code ▸ Codespaces)면 무클러스터 랩이 브라우저에서 바로 돈다 — 진도는python scripts/progress.py.돌아온 학습자 / 면접 직전: 각 모듈의 구두 문답(접힌 답안)으로 복습하라. 어느 모듈이든 사이드바에서 1클릭으로 점프.
AI 도움받으며 하기:
TUTOR.md의 튜터 프롬프트를 claude.ai/ChatGPT/Claude Code에 붙여넣으면 — 정답은 안 흘리고 힌트·개념·구두문답으로 끌어주는 소크라테스 튜터가 된다(정답지 방화벽 내장, 적대적 레드팀 검증). 남에게 이 랩을 권할 때도 같이 주면 된다.
모듈 사다리¶
flowchart LR
M0[M0 · Cedar 인가] --> M1[M1 · 스캔] --> M2[M2 · 신원]
subgraph S["클러스터 1세션 · up → down"]
direction LR
M2 --> M3[M3 · 네트워크] --> M4[M4 · 런타임] --> M5[M5 · 암호화]
end
M5 --> M6[M6 · 에이전트]
M6 -. 졸업 후 .-> M7
subgraph ADV["심화 · 졸업 후 선택 (M7–M11)"]
direction LR
M7[M7 · 형식검증] ~~~ M8[M8 · 런타임 경계] ~~~ M9[M9 · 침해 가정] ~~~ M10[M10 · GitOps 무결성] ~~~ M11[M11 · BPF-LSM]
end
classDef nc fill:#e8eaf6,stroke:#3f51b5,color:#1a237e;
classDef cl fill:#fff3e0,stroke:#c2410c,color:#7c2d12;
class M0,M1,M6,M7 nc;
class M2,M3,M4,M5,M8,M9,M10,M11 cl;
각 모듈의 학습 루프 (strip → rebuild → 채점 → 복원):
flowchart LR
K[스켈레톤<br/>strip된 통제] --> W["내가 작성<br/>labs/m·/ 만 편집"]
W --> G{{"채점기 = 유일한 판정자"}}
G -- FAIL --> W
G -- PASS --> R[canonical<br/>자동 복원]
classDef judge fill:#1a1a2e,stroke:#3f51b5,color:#a5d6a7;
class G judge;
클러스터 채점기는 학습자 아티팩트를 적용해 검증한 뒤 canonical 정책을 자동 복원한다 — 스택은 항상 known-good 상태로 돌아온다.
한눈에 — 모듈별 스택 · 시간 · 비용¶
시간은 졸업까지의 대략치(읽기 + 재구현 + break/fix 포함) — 첫 채점은 ~5분으로 훨씬 빠르다. 비용은 전부 로컬 $0 — 클러스터 랩의 진짜 비용은 돈이 아니라 RAM ~6–8GB다. AWS는 선택(관리형 등가물 단발 체험 ~$1–3/세션; 끄는 걸 잊으면 월 $178 함정) → 비용 사다리. M0가 가장 길다(~3–6h) — Cedar 문법 + 핵심 사고(통과≠증명)를 처음 익히기 때문. 이후 클러스터 랩(M2–M5)은 짧다(스택은 무겁지만 작성량은 적다). 부담되면 M0의 5분 첫 채점만 먼저 보고 와도 된다. 트랙 = 코어 7(M0–M6) + 심화 5(M7–M11). 진도 카운터 'N / 7'은 코어 기준이고, M7·M8·M9·M10·M11은 졸업 후 선택하는 심화다.
| 모듈 | 스택 | 하는 일 (졸업 기준) | 클러스터 | ~시간 | 비용 |
|---|---|---|---|---|---|
| M0 | Cedar | 인가 정책을 빈 파일에서 재구현 (11/11) | 불필요 (Python) | ~3–6h | $0 로컬 |
| M1 | checkov | IaC 결함 16개 사냥·수정 (Failed 0) | 불필요 (Python) | ~1.5–3h | $0 로컬 |
| M2 | VAP + CEL | 라벨↔SA admission CEL 작성 (5/5) | 필요 · RAM ~6–8GB | ~30–45m | $0 로컬 |
| M3 | Cilium L3/L7 | 최소권한 네트워크 홉 재구성 (7/7) | 필요 · RAM ~6–8GB | ~30–45m | $0 로컬 |
| M4 | Tetragon eBPF | 선택적 셸 SIGKILL 룰 (id=0·sh=137) | 필요 · RAM ~6–8GB | ~20–35m | $0 로컬 |
| M5 | WireGuard + etcd | 전송·저장 암호화 실행·해석 (ET1) | 필요 · RAM ~6–8GB | ~30–45m | $0 로컬 |
| M6 | Cedar + OpenFGA | 에이전트 위임 ABAC+ReBAC (17/17 + 11/11) | 불필요 (Part B는 Docker) | ~2–4h | $0 로컬 |
| M7 | z3 (formal) | 교차계층 shadow/dead-rule 탐지 (심화) | 불필요 (Python) | ~1–2h | $0 로컬 |
| M8 | Tetragon | 런타임 kill 경계 측정 — detect≠prevent (심화) | 필요 · RAM ~6–8GB | ~30–45m | $0 로컬 |
| M9 | 전 계층 | 침해 가정 — 블래스트 반경 봉쇄 (제로데이 렌즈, 심화) | 필요 · RAM ~6–8GB | ~25–40m | $0 로컬 |
| M10 | ArgoCD | GitOps 무결성 — drift 자동교정·reconciler=새 신원-TCB (심화) | 필요 · RAM ~8–10GB | ~40–60m | $0 로컬 |
| M11 | Tetragon BPF-LSM | exec 허용목록은 LSM이 필요 — 적재-이미지 신원(arg0/caller 함정) (심화) | 필요 · BPF-LSM 커널 | ~30–50m | $0 로컬 |
먼저 읽을 개념 페이지(형식 1단계): M0→01 · M1→02 · M2→05 · M3→03 · M4→04 · M5→06 · M6→인가모델·NHI · M8→04. (번호 오프셋 주의: M2↔05, M3↔03, M5↔06.)
클러스터 랩(M2–M5)은 한 세션에 묶어라:
scripts/up.ps1(스탠드업 ~5–10m) → M2→M3→M4→M5 →scripts/down.ps1. M8은 별도 클러스터 세션. 무클러스터(M0·M1·M6·M7)는 아무 때나 독립 실행. 아래 카드/체크리스트의python ...은 활성화된 .venv 기준이다. 클론 직후엔.venv\Scripts\python.exe ...로 실행하라(SETUP)..sh채점기는 Git Bash,.ps1은 PowerShell.
모듈 카드 (요약)¶
- M0 · 인가 as-code (Cedar) — 빈 정책에서 owner·한도·역할·동결 인가 작성. 졸업 core 8 + ext 3 = 11/11. 채점
python labs/m0/grade.py --ext· 클러스터 불필요 - M1 · 쉬프트레프트 (checkov) — 신입이 짠 워크로드의 16개 결함을 사냥해 수정. 졸업 Failed checks 0. 채점
python labs/m1/grade.py· 클러스터 불필요 - M2 · 신원 (admission CEL) — 라벨↔SA 일관성 VAP(ValidatingAdmissionPolicy)의 CEL 작성. 졸업 위조 DENY / 정합 ADMIT 5/5. 채점
bash labs/m2/grade.sh· 클러스터 필요 - M3 · 네트워크 (Cilium) — default-deny에서 최소권한 홉(L3/L7/egress) 재구성. 졸업 7/7. 채점
bash labs/m3/grade.sh· 클러스터 필요 - M4 · 런타임 (Tetragon eBPF) — 셸 exec만 골라 SIGKILL하는 TracingPolicy. 졸업 id=0 + sh=137. 채점
bash labs/m4/grade.sh· 클러스터 필요 - M5 · 암호화 (실행·해석) — WireGuard 캡처·etcd 암호화를 직접 돌리고 해석. 졸업 ET1 채점 + 해석. 채점
bash labs/m5/grade.sh· 클러스터 필요 - M6 · 프런티어 (agent-ABAC + ReBAC) — AI 에이전트 위임을 ABAC 교집합 + ReBAC(관계기반) 그래프로. 졸업 17/17 + 11/11. 채점
python labs/m6/grade.py· 클러스터 불필요 (Part B Docker) - M7 · 심화 (교차계층 일관성, formal) — Cilium L7 × Cedar의 그림자/dead-rule을 z3로 탐지(ViewAuditLog shadow, 반증가능). 채점
python formal/cross_layer.py· 클러스터 불필요 - M8 · 심화 (런타임 kill 경계) — Tetragon shell-kill의 정직한 경계: detection≠prevention, execve vs I/O, io_uring 클래스. 채점
powershell -File scripts\verify-runtime-scope.ps1· 클러스터 필요 - M9 · 심화 (침해 가정·블래스트 반경) — 제로데이 RCE를 가정하고 횡이동·유출·권한상승이 어디서 막히나(+ 못 막는 것)를 추적. 기존 통제를 공격자 사후 렌즈로 재구성. 채점
bash labs/m9/grade.sh· 클러스터 필요 - M10 · 심화 (GitOps 무결성 통제판) — GitOps가 신원-TCB를 이전한다(B7→B8): drift 자동교정의 윈도우·admission과의 교착(fighting controllers)·reconciler 권한 경계를 라이브로 측정. 채점
bash labs/m10/grade.sh· 클러스터 필요 · 무클러스터 절반은 항상 CI-게이트(check-reconciler-rbac.py·check-sync-wave-order.py) - M11 · 심화 (BPF-LSM exec 허용목록) — exec 허용목록은 적재 이미지 신원을 봐야 한다(arg0=rename우회·matchBinaries=caller거꾸로). LSM
bprm_check_security로 건다. kind는 BPF-LSM 없어 SKIP-prone → ED3·헤드라인 불변. 채점bash labs/m11/grade.sh(SKIP-first) +python labs/m11/grade.py(무클러스터) · 클러스터 필요
형식 (모든 모듈 공통)¶
- 읽기 —
docs/의 개념 랩으로 정리 (이미 잘 써져 있다) - 재구현 —
labs/<모듈>/의 스켈레톤에 스펙만 보고 작성 → 채점기로 채점 - break-and-fix — 동작하는 내 답을 일부러 망가뜨리고, 어느 시나리오가 깨질지 먼저 예측한 뒤 확인
- 구두 문답 — 면접에서 나올 "왜?" (접힌 답안 — 먼저 소리 내어 답하고 열 것)
- 졸업 과제 — 스펙에 없던 확장을 직접 설계·구현
규칙¶
- 정답을 먼저 보지 않는다. repo의 canonical 파일(
cedar/policies.cedar,k8s/*.yaml등)이 곧 정답지다 — 졸업 후diff로 내 답과 비교하는 것이 마지막 단계다. (정답지가 같은 repo에 있으니 이건 자가학습 약속이지 anti-cheat가 아니다 — 복붙하면 채점기는 통과해도 유일하게 측정되는 것, 너의 배움이 사라진다.) - 편집은
labs/<모듈>/안의 작업 파일만. canonical을 건드리면 스택·채점기가 같이 망가진다. - 채점기가 유일한 판정자다. "된 것 같다"는 없다 — 이 repo의 철학 그대로.
- 클러스터 모듈(M2–M5)은 한 세션에 묶어서:
scripts/up.ps1→ M2→M3→M4→M5 연속 →scripts/down.ps1(심화 M8·M9도 스택 up 상태에서 같은 세션에 이어서 실행). (정확한 명령·기대결과·OOM 복구는 런북 00, 설치는 SETUP).
진도 체크리스트¶
졸업할 때마다 체크 (각 줄이 곧 채점 명령·목표 점수):
- [ ] M0 —
python labs/m0/grade.py --ext→ 11/11 - [ ] M1 —
python labs/m1/grade.py→ Failed checks 0 - [ ] M2 —
bash labs/m2/grade.sh→ 5/5 (클러스터) - [ ] M3 —
bash labs/m3/grade.sh→ 7/7 (클러스터) - [ ] M4 —
bash labs/m4/grade.sh→ id=0 + sh=137 (클러스터) - [ ] M5 —
bash labs/m5/grade.sh→ ET1 PASS + capture-wg/etcd 해석 (클러스터) - [ ] M6 —
python labs/m6/grade.py→ 17/17 + 11/11 - [ ] M7 (심화) —
python formal/cross_layer.py→ SHADOW 탐지(--open-auditlogs로 shadow 소멸=반증) +--ungate-transfer로 UNGATED FAIL 확인 - [ ] M8 (심화) —
powershell -File scripts\verify-runtime-scope.ps1→ 선택적→zero-exec 델타(id 0→137) + detection≠prevention 설명 - [ ] M9 (심화) —
bash labs/m9/grade.sh→ 모든 봉쇄 경계 HELD + assume-breach 한계 설명 (클러스터) - [ ] M10 (심화) —
bash labs/m10/grade.sh→ drift revert+/auditlogs 403재폐쇄 · fighting-controllers OutOfSync∞ · reconciler RBAC bounded (클러스터) · 무클러스터:python scripts/check-reconciler-rbac.py·check-sync-wave-order.py - [ ] M11 (심화) —
python labs/m11/grade.py(무클러스터: LSM 정책 구조) +bash labs/m11/grade.sh(BPF-LSM 커널서 적재-이미지 kill: nginx 생존·셸/renamed 137; kind는 SKIP)
코어 7개(M0–M6)를 다 졸업하면 → 캡스톤 · 면접 노트를 채워라. 무엇을 재구현했고, 각 통제가 막는 것과 막지 못하는 것을 정직하게 적으면 그대로 포트폴리오·면접 답변이 된다.