cloudsec/M10 · GitOps 무결성 통제판·B7 → B8

GitOps는 통제를 *추가*하지 않는다 —
신뢰를 *이전*한다.

주니어: "Git이 진실원천." 시니어: GitOps는 B7의 신원-TCB를 재배치한다. "누가 app:api 파드를 만드나""누가 repo에 머지하나 + reconciler가 무엇을 적용/사칭하나"가 된다. M10은 그 이전을 — drift 자동교정의 윈도우·admission과의 교착· reconciler 권한 경계를 — 라이브로 측정한다.


신뢰 경계의 이전

B7 — imperative (kubectl)

TCB = RBAC: 누가 app:api 라벨 파드를 만드나.

분산된 사람·운영자 + kubectl. 추적은 audit log/감사에 의존.

B8 — GitOps (relocated)

TCB = repo merge 권한(code-review·signed commit) reconciler SA가 사칭/적용할 수 있는 범위.

capability가 재중앙화(하나의 봇 + 모든 권한 + git log)되어 추적성을 산다 → AppProject로 최소화 필수(LP7 analogue).

// GitOps는 root kubectl trust를 *제거*하지 않고 *사용 빈도*만 줄인다. reconciler를 cluster-admin으로 두면 B7이 분산시킨 권한이 통째로 되돌아온다.


세 번째 자세 — correction

DETECTION
M8 · Tetragon이 *본다*(탐지). 막진 않음 — write-window 잔존.
PREVENTION
M2/admission · VAP가 *막는다*(거부). 위조 신원은 절대 admit 안 됨.
CORRECTION
M10 · reconciler가 *되돌린다*. drift를 ≤ sync interval로 경계짓고 자동교정.

// detection ≠ prevention ≠ correction. M10이 더하는 *유일한* 새 통제는 런타임 무결성(correction)이다 — 그래서 coverage 신규 후보는 단 1행(IN1).


라이브로 측정 — 그리고 정직한 대시보드

L1 drift
공격자 kubectl patch≤ interval에 revert + /auditlogs 403 재폐쇄(spec-equality ≠ 의미적 재폐쇄)
L2 교착
위조 manifest를 Git에 머지 → admission DENY → Application OutOfSync ∞(fighting controllers, GitOps는 admission 우회 못 함)
L3 경계
reconciler는 clusterrolebinding·kube-system secret 못 만듦, ciliumnetworkpolicy는 patch 가능(tight ≠ broken)

대시보드는 *위조하지 않는다* — 살아있는 패널 대신, 그것이 렌더하는 CLI 원천(재현 가능):

$ argocd app get shop-network-runtime
Sync Status:  OutOfSync (drift)     Health: Healthy
cilium.io  CiliumNetworkPolicy  allow-web-to-api  OutOfSync  # L1: reconciler가 곧 revert
$ argocd app get m10-forge
Sync Status:  OutOfSync            Health: Missing
Condition: SyncError — admission webhook denied: forged identity (app:api on web-sa)
           # L2: admission이 막아 영원히 Synced에 못 닿는다

못 막는 것 (정직)


← 한 장 소개 커리큘럼