86 lines
4.6 KiB
Markdown
86 lines
4.6 KiB
Markdown
# 배포 보안과 품질 승인 신뢰 경계
|
|
|
|
## 범위와 현재 상태
|
|
|
|
현재 코어의 SHA-256 fingerprint는 초안, 공고, 분석, 근거 매핑, 콘텐츠 계획,
|
|
설정, 평가 정책이 바뀌었는데 과거 평가를 재사용하는 오류를 막습니다. 그러나
|
|
fingerprint는 비밀키가 없는 무결성 표식이므로 품질 보고서의 발급자나
|
|
`category_scores`·`findings`의 위변조를 인증하지 않습니다.
|
|
|
|
따라서 현재 `resume-harness render`는 사용자가 입력 파일과 품질 보고서를 모두
|
|
관리하는 **단일 사용자 로컬 도구**의 신뢰 경계입니다. 지원자와 보고서 제출자가
|
|
분리되는 웹 서비스, 사내 승인 서비스, 다중 사용자 API에서는 아래 서명 계층을
|
|
구현하기 전까지 이 CLI 경로를 그대로 외부에 노출하면 안 됩니다.
|
|
|
|
| 배포 형태 | 품질 보고서 신뢰 | 허용 정책 |
|
|
|---|---|---|
|
|
| 단일 사용자 로컬 | 동일 사용자가 입력·평가 파일을 관리 | 현재 fingerprint와 로컬 하드 게이트 사용, 보안 인증으로 오해하지 않음 |
|
|
| 다중 사용자/원격 서비스 | 요청자가 보고서를 바꿀 수 있음 | 서명된 attestation 필수, unsigned 보고서 fail-closed |
|
|
|
|
## 프로덕션 `QualityAttestation` 계약
|
|
|
|
프로덕션 승인 서비스는 독립 평가와 모든 결정적 게이트가 끝난 뒤 다음 envelope를
|
|
Ed25519로 서명해야 합니다. 실제 `QualityReport` 전체를 envelope 안에 넣어 점수와
|
|
finding도 서명 범위에 포함합니다.
|
|
|
|
```text
|
|
schema_version
|
|
attestation_id
|
|
issuer
|
|
audience
|
|
key_id
|
|
issued_at
|
|
expires_at
|
|
validator_version
|
|
evaluation_policy_fingerprint
|
|
evaluator.provider / evaluator.model / evaluator.version
|
|
quality_report # 전체 QualityReport
|
|
signature_algorithm = Ed25519
|
|
signature
|
|
```
|
|
|
|
서명 payload는 `signature` 필드만 제외한 envelope 전체를 RFC 8785(JCS) 고정
|
|
canonical JSON 규칙으로 직렬화하고, 다른 토큰과 혼동되지 않도록
|
|
`resume-harness-quality-attestation-v1\0` 도메인 구분자를 앞에 붙입니다. envelope가
|
|
가져온 공개키를 신뢰하지 않으며, 운영자가 관리하는 읽기 전용 trust store에서
|
|
`issuer + key_id`로 공개키를 선택합니다.
|
|
|
|
렌더 서비스는 다음 순서로 검증하고 어느 단계에서든 실패하면 출력하지 않습니다.
|
|
|
|
1. 스키마, 알고리즘, `issuer`, `audience`, `key_id` 허용 목록
|
|
2. Ed25519 서명과 발급·만료 시간(허용 clock skew 포함)
|
|
3. evaluator·validator·평가 정책 버전 허용 목록
|
|
4. 현재 아티팩트에 대한 draft/evaluation fingerprint 재계산
|
|
5. evidence/requirement coverage와 가중 총점 재계산
|
|
6. 개인정보·근거·공고 출력 제약의 로컬 결정적 검사 재실행
|
|
7. blocking finding, 총점, 영역별 임계값 확인 후 렌더
|
|
|
|
서명 성공은 이력서 내용이 사실이라는 외부 증명이 아닙니다. 지정된 평가 서비스가
|
|
특정 입력과 정책으로 해당 보고서를 발급했다는 사실만 인증합니다. 근거 원장의
|
|
진위는 `verification_status`와 별도의 증빙 검토 문제입니다.
|
|
|
|
## 키와 운영 정책
|
|
|
|
- 서명 개인키는 평가 worker 또는 KMS/HSM만 사용하고 렌더러·요청자에게 주지 않음
|
|
- 렌더러에는 공개키와 issuer/policy allowlist만 읽기 전용으로 배포
|
|
- 키 회전 시 `key_id`, 활성 시작일, 폐기일을 기록하고 만료된 보고서를 재평가
|
|
- unsigned 우회 옵션은 로컬 개발 명령에만 둘 수 있으며 서버 API·사용자 설정에는
|
|
노출하지 않음
|
|
- 검증 실패 로그에는 원문 이력서, 연락처, 서명 payload 전체를 남기지 않고
|
|
attestation ID, 비식별 fingerprint, 오류 코드만 기록
|
|
- 재생 방지가 필요한 제출 시스템은 `audience`, 짧은 만료 시간, 제출별 nonce를
|
|
함께 검증
|
|
|
|
## 필수 보안 회귀 테스트
|
|
|
|
- 점수, finding, 임계값, evaluator 정보 중 한 바이트만 바꿔도 서명 실패
|
|
- 다른 초안·공고·매핑·계획·설정의 정상 서명을 재사용해도 fingerprint 실패
|
|
- self-signed 공개키, 알 수 없는 issuer/key, 잘못된 audience, 만료·미래 발급 거부
|
|
- 폐기된 키와 허용되지 않은 평가 정책·모델 버전 거부
|
|
- 동일 JSON의 필드 순서·Unicode 정규화 차이를 canonicalization 규칙으로 고정
|
|
- 서명이 유효해도 로컬 개인정보·근거·출력 제약이 실패하면 렌더 거부
|
|
|
|
Ed25519 서명과 trust store는 현재 저장소에 구현된 기능이 아니라 다중 사용자 배포의
|
|
필수 확장 계약입니다. 구현 전에는 현재 CLI를 신뢰 경계 밖의 승인 서비스로
|
|
간주하지 않습니다.
|