v0.0
감사 추적 체계 설계서¶
1. Executive Summary¶
본 문서는 D'CENT 엔터프라이즈 콜드월렛 커스터디 솔루션의 감사 추적(Audit Trail) 체계를 설계한다. 모든 시스템 액션을 변조 불가(Immutable)한 방식으로 기록하여, 규제 감사 대응, 내부 거버넌스 검증, 보안 사고 조사를 지원하는 핵심 컴플라이언스 인프라이다.
핵심 설계 원칙: - 완전성 (Completeness): 모든 시스템 액션 기록 — 누락 없음 - 변조 불가 (Immutability): 해시 체이닝으로 로그 무결성 보장 - 비부인 (Non-repudiation): 모든 액션에 행위자 서명 연결 - 가용성 (Availability): 온/오프라인 로그 동기화로 전체 이력 통합
규제 근거: | 제약조건 | 출처 | 요구사항 | |----------|------|---------| | AC-AU-01 | CCSS Aspect 10, SOC 2, ISO A.8.15, ISMS-P 6.1 | 변조 불가 감사 로그 | | AC-AU-02 | CCSS Aspect 10 | 온/오프라인 로그 동기화 | | AC-AU-03 | ISMS-P 6.2, MiCA, 특금법 | 로그 보존 5년 |
2. 감사 이벤트 분류¶
2.1. 이벤트 카테고리¶
| 카테고리 | 이벤트 유형 | 심각도 | 기록 위치 |
|---|---|---|---|
| 트랜잭션 | TX 생성, 승인, 서명, 전파, 확인, 거부, 타임아웃, 실패 | 높음 | 대시보드 + 오프라인앱 + 콜드월렛 |
| 정책 | 정책 생성/수정/삭제, 화이트리스트 변경, 정책 오버라이드 | 높음 | 대시보드 |
| 접근 | 로그인/로그아웃, MFA 성공/실패, 세션 만료 | 중간 | 대시보드 |
| 사용자 관리 | 역할 변경, 온보딩/오프보딩, 디바이스 등록/해제 | 높음 | 대시보드 |
| 서명자 관리 | 서명자 추가/제거, 임계값 변경, 대체 서명자 활성화 | 최고 | 대시보드 + 오프라인앱 |
| 시스템 | 펌웨어 업데이트, 설정 변경, 백업/복구, 키 세레모니 | 최고 | 전체 |
| 보안 경고 | 비정상 접근 시도, 정책 위반 감지, WYSIWYS 불일치 | 최고 | 대시보드 |
2.2. 세부 이벤트 목록¶
트랜잭션 이벤트:
| 이벤트 | 트리거 | 기록 데이터 |
|--------|--------|-----------|
| tx.created | Initiator가 TX 생성 | TX ID, 송신/수신 주소, 금액, 자산, 체인, 정책 검증 결과 |
| tx.approved | Approver가 TX 승인 | TX ID, 승인자 ID, 승인 순서, 현재 승인 수 (k/M) |
| tx.rejected | Approver가 TX 거부 | TX ID, 거부자 ID, 거부 사유 |
| tx.signed | 콜드월렛에서 서명 완료 | TX ID, 서명자 ID, 서명 해시, 디바이스 ID |
| tx.broadcast | TX 블록체인 전파 | TX ID, TX Hash, 노드 정보 |
| tx.confirmed | TX 블록 확인 | TX ID, TX Hash, 블록 높이, 확인 수 |
| tx.failed | TX 실패 | TX ID, 실패 사유, 에러 코드 |
| tx.expired | TX 타임아웃 | TX ID, 만료 시각, 미승인 승인자 목록 |
정책 이벤트:
| 이벤트 | 트리거 | 기록 데이터 |
|--------|--------|-----------|
| policy.created | 새 정책 생성 | 정책 ID, 정책 내용, 승인자 목록 |
| policy.updated | 정책 수정 | 정책 ID, 변경 diff, 이전/새 버전, 승인자 |
| policy.deleted | 정책 삭제 | 정책 ID, 삭제 사유, 승인자 |
| policy.overridden | 긴급 오버라이드 | 정책 ID, 오버라이드 사유, 승인자, 관련 TX ID |
| whitelist.added | 화이트리스트 주소 등록 | 주소, 체인, 라벨, 승인자, 쿨다운 종료 시각 |
| whitelist.removed | 화이트리스트 주소 삭제 | 주소, 삭제 사유, 승인자, 영향 TX 목록 |
3. 감사 로그 데이터 모델¶
3.1. 로그 엔트리 구조¶
AuditLogEntry = {
// 식별
id: UUID, // 고유 로그 ID
sequence: bigint, // 순서 번호 (단조 증가)
// 시간
timestamp: ISO-8601 (UTC), // 이벤트 발생 시각
server_timestamp: ISO-8601, // 서버 수신 시각 (동기화 시)
// 이벤트
event_type: string, // 이벤트 유형 (예: "tx.created")
category: string, // 카테고리 (transaction, policy, ...)
severity: "info"|"warn"|"critical",
// 행위자
actor_id: string, // 사용자 ID
actor_role: string, // 역할 (Admin, Initiator, ...)
actor_device: string (optional), // 디바이스 ID (콜드월렛 서명 시)
actor_ip: string (optional), // IP 주소 (대시보드 접근 시)
// 대상
target_type: string, // 대상 유형 (transaction, policy, user, ...)
target_id: string, // 대상 ID
target_details: JSON, // 대상 상세 데이터
// 결과
result: "success"|"failure"|"pending",
result_details: string (optional),
// 무결성
hash: SHA-256, // 현재 엔트리의 해시
previous_hash: SHA-256, // 이전 엔트리의 해시 (해시 체이닝)
signature: string (optional), // 행위자 서명 (비부인)
// 출처
source: "dashboard"|"offline_app"|"cold_wallet",
source_version: string // 소프트웨어/펌웨어 버전
}
3.2. 해시 체이닝 (변조 불가 보장)¶
Log[0]: hash_0 = SHA-256(event_data_0 + "GENESIS")
Log[1]: hash_1 = SHA-256(event_data_1 + hash_0)
Log[2]: hash_2 = SHA-256(event_data_2 + hash_1)
...
Log[N]: hash_N = SHA-256(event_data_N + hash_{N-1})
무결성 검증:
검증 시:
for i in range(1, N):
expected = SHA-256(event_data_i + hash_{i-1})
if hash_i != expected:
→ 변조 감지! 위치: Log[i]
→ 보안 경고 발생
강화 옵션: - Merkle Tree 주기적 스냅샷: 매 1,000건마다 Merkle Root 계산 → 빠른 구간 검증 - 외부 타임스탬프: 주기적으로 해시를 외부 타임스탬핑 서비스(RFC 3161)에 앵커링 - 블록체인 앵커링: 일간/주간 Merkle Root를 Bitcoin 블록체인에 OP_RETURN으로 기록 (최고 수준 불변성)
3.3. 비부인 (Non-repudiation)¶
- 대시보드 액션: 사용자의 세션 토큰 + MFA 기반 행위자 식별
- 오프라인 앱 액션: 앱 로그인 인증 기반 행위자 식별
- 콜드월렛 액션: SE의 디바이스 인증서 기반 서명 → 특정 물리 디바이스에서 수행됨을 증명
4. 컴포넌트별 로그 생성¶
4.1. 온라인 대시보드¶
| 로그 유형 | 생성 방식 | 저장 |
|---|---|---|
| 트랜잭션 이벤트 | 실시간 생성 | 서버 DB (즉시) |
| 접근 이벤트 | 실시간 생성 | 서버 DB (즉시) |
| 정책/사용자 이벤트 | 실시간 생성 | 서버 DB (즉시) |
4.2. 오프라인 서명 앱¶
| 로그 유형 | 생성 방식 | 저장 |
|---|---|---|
| 서명 요청/완료 | 로컬 생성 | 앱 로컬 DB → 동기화 시 대시보드 전송 |
| 에어갭 통신 이벤트 | 로컬 생성 | 앱 로컬 DB → 동기화 시 전송 |
4.3. D'CENT X 콜드월렛¶
| 로그 유형 | 생성 방식 | 저장 |
|---|---|---|
| 서명 이벤트 | SE 내부 생성 | SE 보안 영역 → 오프라인 앱으로 QR/USB-C 전달 |
| 정책 위반 거부 (Phase 4) | SE 내부 생성 | SE 보안 영역 → 전달 |
5. 온/오프라인 로그 동기화 (AC-AU-02)¶
5.1. 동기화 메커니즘¶
오프라인 앱 로컬 로그 축적
│
▼
대시보드와 QR/USB-C 교환 시점
│
▼
동기화 프로세스:
1. 오프라인 앱: 마지막 동기화 이후 로그 추출
2. 로그 데이터 패키징 (QR 인코딩 또는 USB-C 전송)
3. 대시보드: 수신 → 해시 체인 검증
4. 타임스탬프 기반 순서 정렬 (삽입 정렬)
5. 통합 해시 체인 업데이트
5.2. 동기화 지연 처리¶
| 시나리오 | 처리 |
|---|---|
| 정상 동기화 | 서명 수행 시마다 자동 동기화 |
| 지연 동기화 (24시간 이상) | 경고 알림, 누적 로그 일괄 전송 |
| 장기 미동기화 (7일 이상) | 관리자 알림, 로그 누락 위험 표시 |
| 동기화 중단 | 재시도, 실패 시 수동 동기화 절차 |
5.3. 타임스탬프 기반 순서 보장¶
| 컴포넌트 | 시간 소스 | 정밀도 |
|---|---|---|
| 대시보드 | NTP 동기화 서버 시간 | 밀리초 |
| 오프라인 앱 | 디바이스 시간 (NTP 미보장) | 초 |
| 콜드월렛 | 내부 RTC (제한적) | 초 |
순서 보장 전략:
- 모든 이벤트에 timestamp (로컬 시간) + server_timestamp (동기화 시 서버 시간) 이중 기록
- 순서 충돌 시: sequence 번호 + source 기준 결정적 정렬
- 오프라인 앱 시간 드리프트: 동기화 시 대시보드 서버 시간과의 오프셋 계산 및 보정
6. 로그 보존 및 아카이빙¶
6.1. 보존 기간¶
| 규제 | 최소 보존 기간 | 적용 시장 |
|---|---|---|
| 특금법 (한국) | 5년 | 한국 |
| MiCA (EU) | 5년 | EU |
| BSA (미국) | 5년 | 미국 |
| CCSS v9.0 | 명시 없음 (감사 가능 수준) | 글로벌 |
D'CENT 정책: 최소 5년 보존, 7년 권장 (감사 안전 마진)
6.2. 아카이빙 전략¶
활성 저장소 (0-1년):
- 대시보드 DB (전체 검색, 빠른 조회)
- 실시간 쿼리 가능
아카이브 저장소 (1-5년):
- 암호화된 아카이브 파일
- 읽기 전용, 조회 시 복원 필요 (수 분)
- 월간 아카이빙 배치
영구 보존 (5년+):
- 오프라인 저장 (암호화 백업)
- 법적 요청 시에만 접근
- 연간 무결성 검증
7. 컴플라이언스 매핑¶
| 제약조건 ID | 설명 | 충족 방식 |
|---|---|---|
| AC-AU-01 | 변조 불가 감사 로그 | SHA-256 해시 체이닝, Merkle Tree 스냅샷, 외부 타임스탬프 앵커링 |
| AC-AU-02 | 온/오프라인 로그 동기화 | QR/USB-C 기반 로그 전송, 타임스탬프 이중 기록, 순서 보장 |
| AC-AU-03 | 로그 보존 5년 | 3단계 아카이빙 전략 (활성/아카이브/영구) |
본 문서는 Phase 3 Core Product Design의 일부로, 감사 로그가 컴플라이언스 리포팅(compliance-reporting.md)의 데이터 소스로 사용된다. 모든 트랜잭션(airgap-signing-flow.md), 정책(policy-engine.md), 사용자 관리(rbac-role-model.md) 이벤트가 본 감사 체계에 기록된다.
관련 문서¶
- 에어갭 트랜잭션 서명 플로우 설계서 -- 제품 설계
- 컴플라이언스 리포팅 기능 정의서 -- 제품 설계
- 재해 복구 및 키 백업 절차 설계서 -- 제품 설계
- 키 세레모니 워크플로우 설계서 -- 제품 설계
- 멀티체인 지원 범위 및 우선순위 정의서 -- 제품 설계
- M-of-N 다중 서명 승인 워크플로우 설계서 -- 제품 설계
- 운영 시나리오 문서 -- 제품 설계
- 트랜잭션 정책 엔진 기능 정의서 -- 제품 설계
- RBAC 역할 체계 정의서 -- 제품 설계
- 화이트리스트 주소 관리 정책 설계서 -- 제품 설계