오늘 한 호스팅 제공업체가 고객 기반 전체(111개 지점)에 걸쳐 비밀번호 재설정을 강제했습니다. 그 수많은 사람들 중에는 모든 것을 완벽하게 처리한 팀도 있었습니다. 자격 증명은 문서화되었고, 비밀 정보는 볼트(vault)에 보관되어 있었으며, 소스 코드의 에스크로 사본은 다른 장소에 보관되어 있었습니다. 그럼에도 불구하고 그들은 재설정을 자신이 계획할 수 있는 상황이 아니었기 때문에 아침 내내 자신들의 인프라에 접근하지 못했습니다.
그것이 바로 에스크로 레이어(escrow layer)입니다. 상자가 존재하는지 여부가 아니라, 그 상자를 열 가치가 있는지의 문제입니다.
지난주 글은 승계(succession): 누가 의무를 물려받는가에 관한 것이었습니다. 이번 글은 무엇을 넘겨주는지에 관한 것입니다. 대부분의 에스크로 합의는 기념품 상자에 불과하다는 사실이 밝혀졌습니다.
zip 파일의 오류 (The zip file fallacy)
팀에게 그들의 소프트웨어 에스크로에 무엇이 들어있는지 물어보면, 보통 '저장소(repo)'라고 답할 것입니다. 때로는 tarball일 수도 있습니다. 가끔은 누군가의 필체로 라벨이 붙은 서랍 속 USB 드라이브일 정도입니다.
그것은 소스 코드입니다. 소스 코드는 상자 안에서 가장 쓸모없는 것인데, 왜냐하면 소스 코드만으로는 시스템을 구축할 수 있다는 **주장(claim)**일 뿐이기 때문입니다. 그것 자체가 빌드(build)는 아닙니다.
누군가가 그 상자를 여는 날 실제로 사실이어야 하는 것이 무엇인지 고려해 보십시오:
- 소스 코드 빌드(Source builds). '일주일간의 고고학적 발굴 끝에 결국 컴파일될 것'이 아니라, 오늘날 존재하는 기계에서 클린 체크아웃을 통해 실제로 빌드가 되어야 합니다. 만약 귀하의 빌드가 4년 동안 업데이트되지 않은 고정된 툴체인(toolchain)에 의존한다면, 그 상자는 박물관 유물을 담고 있는 것과 같습니다.
- 빌드 환경이 재구성 가능해야 합니다. 베이스 이미지(Base images), 컴파일러 버전, 시스템 라이브러리, 심지어 오래된 glibc로만 컴파일되는 네이티브 확장 기능 하나까지도 마찬가지입니다. 만약 이것들이 누군가의 머릿속이나 노트북의 셸 히스토리(shell history)에 존재한다면, 그것은 에스크로(escrow)되지 않은 것입니다.
- 자격 증명(credentials)을 로테이션할 수 있어야 합니다. 이 점은 거의 모든 사람이 놓치는 부분이며, 오늘날 강제 리셋이 그 증거입니다. API 키가 가득 담긴 상자는 자산(asset)이 아니라, 귀하가 통제할 수 없는 만료일자를 가진 부채(liability)입니다. 에스크로해야 할 것은 새 자격 증명을 발급하는 프로세스 자체입니다. 누가 이를 승인할 수 있는지, 복구 경로는 무엇인지, 어떤 계정이 핵심적인지 등이 중요합니다.
- 누군가가 어느 20%가 중요한지 알아야 합니다. 모든 시스템에는 제품을 담는 코어(core)와 관리 콘솔(admin console)을 담는 주변부(periphery)가 있습니다. 이 둘을 구분하지 못하는 후임자는 첫 달을 잘못된 절반에 보내게 될 것입니다.
이 중 어느 하나라도 실패하면 연속성(continuity)이 없습니다. 그저 폴더만 있을 뿐입니다.
상자가 비어버리는 세 가지 방법
오늘의 메인 페이지는 각각의 예시를 제공했습니다.
키가 귀하 없이 만료되었습니다. 호스팅 제공업체(Hosting provider)가 전역 비밀번호 재설정을 강제합니다. 아무도 침해한 것이 없고, 아무도 잘못한 것이 없습니다. 단지 제공업체의 보안 이벤트로 인해 대규모로 자격 증명이 무효화된 것입니다. 만약 귀하의 연속성 계획이 '우리가 키를 에스크로하고 있다'였다면, 방금 그 키들이 결코 자산 자체가 아니었음을 알게 된 것입니다. 접근 권한은 일방적이고 자체적인 시간표에 따라 취소할 수 있는 상대방(counterparty)과의 관계입니다. 자격 증명의 에스크로는 역량(capability)이 아니라 허가증(permission slip)의 에스크로일 뿐입니다.
당신이 에스크로한 것은 변동 목표물입니다. OpenAI와 Anthropic은 몇 달 사이에 LLM 가격을 최대 80%까지 인하했다고 보고되었습니다 (120 포인트). 이는 구매자에게는 좋은 소식이지만, 지속성 계획이 “제휴사 X에 우리가 협상했던 가격으로 폴백(fall back)하는 것”인 사람들에게는 끔찍한 소식입니다. 에스크로되는 대상 — 특정 모델에 대한 접근 권한, 특정 비율에서의 접근 권한, 그리고 특정 동작 방식 — 은 공급업체가 아무런 통보 없이 변경할 수 있는 바로 그 부분입니다. 당신은 가중치(weights)를 에스크로하거나 계약을 에스크로할 수는 있습니다. 하지만 가격 자체는 에스크로할 수 없습니다.
상자 안에는 루트가 있습니다. 소비자 TV에서의 루트 셸 익스플로잇(root shell exploit) 사례 (763 포인트)는 TV에 관한 이야기가 아닙니다. 그것은 당신이 더 이상 펌웨어(firmware)를 통제하지 못하고 업데이트 채널을 소유하지 못한 모든 기기에 대한 이야기입니다. 만약 에스크로된 대상이 누군가의 거실에 있는 하드웨어에서 완전한 권한으로 실행되는 바이너리라면, 후임자는 자산을 상속받는 것이 아닙니다. 그들은 사건(incident)을 상속받습니다.
4가지 항목 테스트
이것은 화요일 오후에 진행할 수 있습니다. 각 항목에 대해 답은 PASS, FAIL, 또는 UNKNOWN입니다 — 그리고 UNKNOWN은 추측이었다는 것을 발견하는 날이 바로 필요한 날일 수는 없기 때문에 FAIL로 간주됩니다.
| 항목 | PASS의 모습 | 일반적인 현실 |
|---|
| 소스 빌드가 깨끗함 (Source builds clean) | 새 기계, 문서화된 명령어, 녹색 빌드(green build), 올해 날짜가 찍힌 것 | 한 엔지니어의 노트북에서 빌드됨 |
| ... | | |
4가지 중 2개가 일반적인 점수입니다. 4가지 중 2개는 지속성이 아닙니다 — 그것은 지속성의 _시작_일 뿐이며, 단지 빠진 두 가지가 아무도 필요로 하지 않는 것들일 때만 해당됩니다. 그런 경우는 없습니다.
고객에게 실제로 빚지고 있는 것
문서가 아닙니다. 번역가가 필요 없이 고객이 읽을 수 있는 세 문장입니다.
시스템 장애 대비와 운영 위험 관리 방안
- 만약 우리의 주요 제공업체가 내일 사라진다면, 고객이 받게 될 서비스는 어떻게 변화할까요? 생존 여부가 아니라 구체적인 성능 저하에 대해 명시해야 합니다.
- 우리가 어느 정도 수준까지 기능 저하 상태를 유지할 수 있을까요? "최소한의 영향" 같은 표현이 아닌 숫자로 말해야 합니다. 시간이나 일 단위로요.
- 이 답변에 대한 책임은 회사 내 누구에게 있습니까? 팀 이름이 아니라 특정 역할을 명시해야 합니다.
만약 첫 번째 문장을 작성할 수 없다면, 스스로의 의존성 그래프(dependency graph)를 모른다는 뜻입니다. 두 번째 문장을 작성할 수 없다면, 테스트를 해본 적이 없다는 의미입니다. 세 번째 문장을 작성할 수 없다면, 답은 "아무도 없다"이며, 고객은 최악의 순간에 그 사실을 알게 될 것입니다.
비용 순으로 나열한 6가지 조치
- 이번 주에는 깨끗한 체크아웃(clean checkout) 상태에서 빌드를 실행하십시오. 새로운 브랜치가 아니라, 완전히 새로운 머신에서요. 문서화되지 않은 모든 단계를 기록하세요. 그 목록이 당신의 실제 에스크로 격차(escrow gap)입니다.
- 운영 절차를 사람들의 기억에 의존하는 방식에서 벗어나게 하십시오. 서면으로 된 단계와 지정된 승인자, 그리고 1년에 한 번 테스트한 실행을 갖추세요. 오늘 강제로 리셋하는 것이 당신이 아무것도 발명하지 않고도 상사에게 제시할 수 있는 논거가 됩니다.
- 키를 에스크로(escrow)하는 것을 멈추십시오. 대신 새로운 키를 얻는 능력을 에스크로하십시오. 로테이션 절차 없이 보관된 금고는 마케팅만 좋은 서랍장과 같습니다.
- '20%'에 대해 문서화하세요. 어떤 서비스가 수익을 창출하고, 어떤 서비스가 관리 기능을 담당하며, 그리고 어떤 서비스가 2021년에 누군가 필요해서 존재하게 되었는지 파악해야 합니다. 이 페이지를 가진 후임자는 한 달의 시간을 절약할 수 있습니다.
- 소스 코드뿐만 아니라 빌드 환경 전체 사본을 유지하십시오. 베이스 이미지 다이제스트(Base image digests), 툴체인 버전(toolchain versions), 그리고 보기 싫은 네이티브 빌드 단계까지요. 이것이야말로 항상 빠져 있고, 늘 장애물(blocker)이 되는 부분입니다.
- 낯선 사람과 함께 테스트하십시오. 시스템을 한 번도 만져본 적 없는 사람에게 상자를 건네고 하루를 주면서, 그 사람이 어디서 멈추는지 지켜보세요. 그 멈춘 지점이 당신의 에스크로가 가진 정직한 성숙도 수준입니다.
아무도 듣고 싶어 하지 않는 부분
한 번도 열어보지 않은 에스크로(escrow)는 계획이 아니라 가설이다. 오늘 강제된 비밀번호 재설정은 수백 개의 팀에게 있어 몇 년 동안 지니고 있던 연속성 가정(continuity assumption)에 대한 첫 번째 실제 테스트였다. 그리고 통과한 팀들은 문서화가 가장 완벽했던 팀들이 아니었다. 그들은 아무것도 불타고 있지 않던 조용한 날에 이미 한 번 해본 사람들이었다.
이 시리즈의 다음 글은 바로 그것, 즉 복구 드릴(restore drill)에 관한 것이다. 왜 한 번도 복구된 적 없는 에스크로가 존재하지 않는 에스크로와 구별할 수 없는지, 그리고 이 드릴을 실제로 1년에 두 번 수행할 만큼 충분히 저렴하게 실행하는 방법에 대해 다룰 것이다.