검증된 신원과 안정적인 계정 참조¶
상태: 선택적 메커니즘 구현됨, 알파. 이 문서는 브랜치의 신원 구현을 설명하며 실행 중 배포에 활성화되었다는 뜻은 아닙니다. 조직·팀 범위의 관리 역할 6개, 완전한 프리미엄·총예산 풀 계약, 운영 검증은 남아 있습니다.
자격 증명을 (organization, kind, issuer, subject)에 바인딩합니다. 사람의 발급자·주체는 검증된 OIDC 클레임에서 얻습니다. JSON, userinfo, owner는 신원 증거가 아닙니다. 서비스 발급자는 inferplane://<organization>/service-account로 유도합니다. 저장소·권한 네임스페이스 하나에 불변 조직 하나를 지원합니다. 발급자·주체 문자열을 정확히 유지하고 정규화·추측하지 마세요. SQLite와 Postgres가 레지스트리를 영속 저장합니다. 신원 기능은 배포 프로파일의 요청률·금전·가용성 보장을 바꾸지 않습니다.
설정¶
| 설정 | 동작 |
|---|---|
| 한 번도 필수 모드였던 적 없는 저장소에 선언 없음 | 기존 owner 귀속 유지. 검증된 신원은 기본 집행되지 않음 |
key_store.identity, required: false |
선택적 형식화 귀속, 기존 회계 참조 유지. 필수 집행이나 모의 실행이 아니며 선언·레지스트리 메타데이터가 저장될 수 있음 |
key_store.identity, required: true |
유효한 레지스트리 바인딩 필수. 비호환 기존 키·선언·이전 쓰기 거부 |
declaration.json과 keystore.json은 새 저장소 예제입니다. 빈 바인딩을 이미 데이터가 있는 저장소의 마이그레이션 선언으로 사용할 수 없습니다. 조직·경로·검토한 바인딩을 바꾸세요. keystore 예제는 특권 키 CLI용이며 완전한 게이트웨이 설정은 아닙니다.
기존 설정의 key_store.identity 아래에 선언 객체를 직접 넣습니다. 파일명이 아니라 객체입니다. SQLite/Postgres 백엔드와 공급자·정책 설정을 유지하세요. CP 연결 필수 모드는 control_plane.require_sync: true도 필요합니다. 원격 CP에는 HTTPS, 참조된 비어 있지 않은 비-JWT 머신 토큰을 사용합니다. 로컬 개발에서는 루프백 HTTP가 허용됩니다.
inferplaned의 INFERPLANED_IDENTITY_CONFIG에는 key_store 래퍼가 아닌 선언 객체 자체를 담은 JSON 파일 경로를 넣습니다. 머신 자격 증명, 정책 저장소, ADR-045/046 설정을 대체하지 않습니다. 필수 CP와 참여 데이터 영역은 같은 검증된 선언을 사용해야 합니다. 바인딩 순서·JSON 공백은 지문에 영향을 주지 않지만 조직·필수 모드·바인딩은 영향을 줍니다. 새 정규 신원의 동적 등록은 선언 지문을 바꾸지 않습니다.
필수 동기화는 정책·권한 설치 전에 누락·구형·불일치 신원 지문을 거부합니다. 불일치 감지 시 관리되는 생성을 차단하며 토큰 계산은 로컬/200을 유지합니다. 지문 일치는 상호 운용성 검사이지 머신 인증이나 침해된 노드 방어가 아닙니다.
필수 모드는 완전한 정책·권한 스냅샷을 게시하는 동안 신규 생성을 의도적으로 차단합니다. 짧은 갱신 중 요청은 503을 받을 수 있습니다. 계산은 로컬/200이고 이미 승인한 시도의 회계는 유지합니다. 같은 세대의 전체 스냅샷을 포함한 영속 권한 하트비트도 해당합니다. 실패 시 거부하는 게시 경계이며 무중단 승인 보장이 아닙니다. 재시도 가능한 오류는 재시도하고 지연·부하 영향은 배포에서 검증하세요.
필수 신원 적용 전에 기존 계정 보존¶
자동 마이그레이션·병합 명령은 없습니다. 설정은 레지스트리 바인딩과 신원 증거를 트랜잭션으로 설치하지만 회계 계정·윈도·권한·허가를 다시 쓰지 않습니다.
- 폐기된 키까지 포함해 과거의 비어 있지 않은 legacy owner를 모두 조사합니다. 활성 키만 검토하면 부족합니다. 폐기된 키에만 있는 owner에도 의무가 남을 수 있습니다. 신뢰할 수 있는 일치 바인딩이 필요하며 legacy owner에는 명시적 선언을 사용합니다. 이미 등록된 정규 신원은 기존 레지스트리와 일치해야 합니다.
- 신뢰할 수 있는 근거로 정확한 발급자·주체·조직을 정합니다. 이메일, owner 철자,
metadata.source에서 추론하지 마세요. 서로 다른 사람이 같은 owner를 썼다면 계정을 나누거나 지출자를 추측하지 말고 전환을 중지합니다. - 활성 빈-owner 키를 폐기하고 검증된 자격 증명을 재발급합니다. 빈 참조는 바인딩이 아닙니다. 폐기로 지출이 환급되거나 의무가 사라지지 않으므로 과거 행·폐기 이력을 유지합니다.
- 일대일 선언을 준비합니다. 아래 예시는 운영자가 검증한 매핑으로 교체하세요.
{
"identity": {
"organization": "example-org",
"kind": "human",
"issuer": "https://idp.example.invalid",
"subject": "verified-opaque-subject"
},
"account_ref": "legacy-owner-001"
}
양쪽의 bindings에 넣습니다. 기존의 비어 있지 않은 형식화 신원 증거와 일치해야 합니다. 여러 신원이 계정을 공유하거나 하나의 신원이 다른 참조를 얻을 수 없습니다. 계정 병합·분할·암묵적 환급은 지원하지 않습니다.
5. 전환에 필요한 이전 쓰기·신규 승인을 중지하고 참여 프로세스를 업그레이드·차단한 뒤 열린 권한을 대조합니다. 사용할 수 없거나 미해결인 잔액을 다시 사용 가능하게 만들지 마세요. 저장소·CP·데이터 영역 선언을 일치시키고 준비 상태·발급을 확인합니다. 미매핑 이력·불일치 키로 필수 활성화가 거부되면 행 삭제나 필수 모드 완화로 우회하지 마세요.
선언·백엔드 변경은 재시작이 필요합니다. 필수 모드가 저장된 후에는 선언 누락·비활성화·충돌을 거부하므로 이전 바인딩을 먼저 완료하세요. 후속 선언 변경도 별도 검토한 마이그레이션이며 핫 리로드나 임의 SQL 수정이 아닙니다.
감사 별칭이 아닌 계정 참조 사용¶
legacy 바인딩이 없는 새 신원은 identity-v1:<SHA-256> 정규 회계 참조를 받습니다. legacy 바인딩된 사람은 정책·회계 조회에 기존 account_ref를 그대로 유지합니다. managed 사용량 텔레메트리는 다이제스트 기반 정규 신원 참조를, 기존 텔레메트리는 account subject를 사용합니다. CP 정책 목록의 identity_bindings는 선언된 참조를 사용자 비용 조회에서 연결하며 회계 계정을 변경하지 않습니다.
위 예제의 subject.user는 legacy-owner-001입니다. 정규 identity-v1:… 참조로 교체하지 마세요. 다른 계정을 가리키므로 필수 정책 검증이 거부합니다. 정규 참조는 상관 분석을 위한 신원 감사 증거에는 남습니다. 권한 있는 키 조회의 account_ref를 회계 선택자에 사용하고, 다이제스트 전용 identity.reference는 신원 증거에 사용하세요.
Users & costs는 이 선언된 연결만 사용하며 예산·토큰 정책에는 정확한 재무 참조를 채웁니다. 연결이 없는 managed 보고 ID를 legacy 회계 계정으로 추측하지 않습니다.
키 교체와 두 번째 기기도 등록 계정을 유지합니다. 과거 계정·윈도 키와 지연 정산도 유지합니다. 선택적 귀속이 몰래 새 회계 참조를 대체하지 않습니다.
자격 증명 발급¶
- 사람: 설정된 OIDC 로그인(
mayu login, CLI 로그인)을 사용합니다. 검증된 발급자·주체·조직과 발급자별 제한을 이용합니다. 필수 모드에서는 레지스트리가 Owner를 정하며 호출자가 제공한 튜플로 사람을 사칭하거나 서비스 종류를 고를 수 없습니다. - 관리 API: 전체 관리자만
account_ref로 등록 신원을 선택하거나service_account로 안정적인 서비스 신원을 만들 수 있습니다. 두 입력은 동시에 사용할 수 없습니다. 팀 권한의 OIDC 사용자는 이를 이용해 사용자 한도를 벗어날 수 없습니다. 자기 발급은 자신의 검증된 사람 신원을 사용하며 필수 모드의 owner-only 발급은 거부합니다. - 서비스 CLI: 검토된 설정을 설치한 특권 저장소 관리자는 다음 명령을 사용할 수 있습니다.
mayu keys create --config /etc/inferplane/config.json \
--team engineering --service-account ci-runner
교체 시 같은 서비스 ID를 사용하세요. 키 저장소·DSN 직접 접근은 특권 관리이며 팀 사용자 권한 경로가 아닙니다. 사람은 임의 발급자·주체 CLI 플래그가 아니라 OIDC로 생성합니다. CLI는 관계없는 공급자·CP 비밀을 해석하지 않고 키 저장소 설정만 읽습니다.
감사는 선택적 정규 참조·종류·조직·발급자/주체 다이제스트를 덧붙이며 기존 기록 바이트를 보존합니다. 새 신원 DTO에는 원문 발급자·주체가 없고 메트릭에 신원·계정 라벨을 추가하지 않습니다. 권한 있는 계정 참조에는 과거 owner 바이트가 남을 수 있습니다. 식별 정보이므로 선언 파일·레지스트리·지원용 내보내기를 보호하세요.
장애·복원·검증¶
신원 기능은 기존 실패 조건을 제거하지 않습니다. 최초 필수 동기화, max_policy_age, 권한·윈도 만료·소진이 계속 적용됩니다. 감지된 신원 불일치는 유효 잔액으로 우회할 수 없습니다. 정상 동기화 후 단순 CP 접근 불가와 명시적 비호환 응답은 다릅니다. ADR-045는 모든 조건 내에서 기존 권한만 사용하고 ADR-046은 새 키 조회·승인에 DB가 필요하며 DB 장애 시 거부합니다.
오래된 레지스트리·DB 복원만으로 환급이나 안전한 롤백이 되지 않습니다. 신원·정책·권한을 일관되게 복원하고 쓰기 주체를 차단한 뒤 발급된 모든 권한을 계산해야 합니다. DB 복원은 오프라인 권한을 소급 폐기하지 못합니다. 더 최신 미해결 권한을 추적할 수 없으면 오래된 스냅샷을 다시 열지 마세요. 접근 불가 노드·만료 권한은 미사용의 증거가 아닙니다. 미해결 의무를 보존하세요. 신원 기능은 자동 복구·계정 재작성 기능을 제공하지 않으며 중개·지문도 침해된 노트북의 우회를 막지 못합니다.
운영 활성화 전 기기·발급자 간 교체, 폐기된 키만 있는 이력의 불변 참조, 오래된·미매핑 키와 선언 거부, DB 장애·복원, 프로파일 용량을 검증하세요. 소스 변경·로컬 테스트만으로 전체 운영 배포를 검증할 수 없습니다.