콘텐츠로 이동

재구현 트랙 — 스펙만 보고 직접 다시 만든다

이 스택의 모든 통제는 실행 가능한 검증(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, .ps1PowerShell.

모듈 카드 (요약)

  • 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(무클러스터) · 클러스터 필요

형식 (모든 모듈 공통)

  1. 읽기docs/의 개념 랩으로 정리 (이미 잘 써져 있다)
  2. 재구현labs/<모듈>/의 스켈레톤에 스펙만 보고 작성 → 채점기로 채점
  3. break-and-fix — 동작하는 내 답을 일부러 망가뜨리고, 어느 시나리오가 깨질지 먼저 예측한 뒤 확인
  4. 구두 문답 — 면접에서 나올 "왜?" (접힌 답안 — 먼저 소리 내어 답하고 열 것)
  5. 졸업 과제 — 스펙에 없던 확장을 직접 설계·구현

규칙

  • 정답을 먼저 보지 않는다. 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).

진도 체크리스트

졸업할 때마다 체크 (각 줄이 곧 채점 명령·목표 점수):

  • [ ] M0python labs/m0/grade.py --ext11/11
  • [ ] M1python labs/m1/grade.pyFailed checks 0
  • [ ] M2bash labs/m2/grade.sh5/5 (클러스터)
  • [ ] M3bash labs/m3/grade.sh7/7 (클러스터)
  • [ ] M4bash labs/m4/grade.shid=0 + sh=137 (클러스터)
  • [ ] M5bash labs/m5/grade.shET1 PASS + capture-wg/etcd 해석 (클러스터)
  • [ ] M6python labs/m6/grade.py17/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)를 다 졸업하면 → 캡스톤 · 면접 노트를 채워라. 무엇을 재구현했고, 각 통제가 막는 것막지 못하는 것을 정직하게 적으면 그대로 포트폴리오·면접 답변이 된다.