본문 바로가기
C.W.K.
Stream
Lesson 05 of 05 · published

operation 의 모양을 굳혀라

~9 min · frozen-kind, fail-closed, domain-bound, boundaries

Level 0Lone Machine
0 XP0/37 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"어느 기계인지는 굳혔어. 이제 operation 이 뭔지를 굳혀. Low 가 네 등 뒤에서 High 로 자라지 못하게."

하나가 아니라 둘이 굳어

durable-operations 트랙은 operation 이 어느 기계를 겨누는지를 굳혔어. 이번엔 operation 이 뭔지를 굳혀. 그 kind 랑 risk class. 둘 다 승인 순간부터 실행 순간까지 가만히 있어야 해. 승인은 특정 집합에 대한 특정 행동에의 동의니까. 나중에 둘 중 하나라도 바뀌면, 그 동의는 처음 뜻하던 게 아니게 돼.

kind 랑 risk 는 domain-bound

kind 는 취향대로 고르는 자유 라벨이 아냐. 고정된 risk class 를 가진 domain 에 묶여. restart_service 는 Medium, migrate_control_plane 은 High. High 짜리 행동을 조용히 Low 로 다시 라벨링해서 절차를 건너뛸 수 없어. (kind → risk) 매핑이 요청마다 고르는 게 아니라 domain 에 한 번 정의되니까.

매 경계에서 다시 확인

(kind, risk) 쌍은 세 경계에서 확인돼. operation 이 정의될 때, delegate 가 claim 할 때, 그리고 시작할 때. delegate 가 restart_service 를 claim 하고 조용히 purge_host_data 를 시작할 순 없어. kind 가 승인된 것과 안 맞는 시작은 거부돼. 승인은 나중에 그 안에서 흘러갈 수 있는 느슨한 카테고리가 아니라, 특정 행동에 딱 붙어.

fail closed, 모든 mode 에서

그리고 어떤 mismatch 든 대응은 어디서나 같아. 거부. 어느 경계의 kind-or-risk mismatch 든 operation 을 fail closed 해. 모든 mutation mode 에서, production 이 잠겼든 활짝 열렸든. 애매함의 기본값은 정지지 절대 진행이 아냐. 불분명한 operation 을 한 번 통과시키는 그때가, 알고 보면 위험한 그거였던 때니까.

target 만이 아니라 동사를 굳혀. 어느 기계인지만 못 박고 행동 자체는 흘러가게 두는 승인은, 제일 중요한 단어를 빈칸으로 둔 문장을 승인한 거야.

Code

(kind, risk) 쌍은 매 경계에서 재확인·python
# Kind -> risk 는 domain 에 한 번 정의돼. 요청마다 고르는 게 아냐.
DOMAIN = {
    "restart_service":        "medium",
    "apply_update":           "high",
    "migrate_control_plane":  "high",
    "purge_host_data":        "high",
}

def guard(op, expected_kind):
    # define, claim, start 에서 확인. 같은 확인, 세 번.
    if op.kind != expected_kind:            fail_closed("kind 바뀜")
    if op.risk != DOMAIN[op.kind]:          fail_closed("risk mismatch")
    if op.kind not in op.approved_kinds:    fail_closed("승인된 게 아님")

# delegate 가 'restart_service' 를 claim 하고 'purge_host_data' 를
# 시작 못 해. 어떤 mismatch 든, 어떤 mutation mode 든, 거부. 기본은 정지.

External links

Exercise

target 이랑 행동을 둘 다 못 박는 승인을 설계해. 세 순간, 그러니까 operation 이 define 될 때, 누가 claim 할 때, start 할 때 다시 확인할 걸 쓰고, mismatch 나면 뭐가 벌어질지 정해. 그다음 네 세 확인이 막게 설계된 'wrapper' 공격을 그려봐.
Hint
wrapper 공격은 무해한 걸 승인받고, 같은 id 랑 승인은 그대로 둔 채 하는 일만 바꾸는 거야. 네 확인은 행동을 domain 의 고정 risk 에 묶고, kind 가 서명된 것과 안 맞는 claim/start 를 거부해서 그걸 이겨. 'allow' 가 아니라 'refuse' 를 기본값으로 두고.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.