← 목록
기타 2026-06-09 5KB 읽기 4분

연합 노드 등록 인증 설계 (연합 API :9160 보안 갭 해소)

개요

크라우니게이트웨이 연합 API(:9160 POST /register)는 현재 누구나 노드를 등록할 수 있다. 악성 노드가 가짜 loc/services 를 연합체인(nodes.ndjson)에 append 하면 통합 라우트맵이 오염된다.

핵심 구분:

  • 이전해시 체인 = 무결성(변조 감지) 보장 — 이미 크라우니게이트웨이연합.한선 에 구현됨
  • 서명/인증 = 신원·권한(위조 차단) 보장 — 이번 설계가 채우는 갭
해시 체인은 "한 번 들어간 데이터가 바뀌었는지"는 잡지만, "애초에 누가 넣었는지"는 막지 못한다. 둘은 별개 문제다.

무엇을 했는지

연합인증설계.한선 신규 작성 — 2계층 인증 모델 + 공통 replay 방어. 컴파일 통과, 자가 단위검증 8/8 PASS. 라이브 미적용(설계/컴파일 검증용). 기존 연합 파일은 읽기만 하고 수정하지 않음.

2계층 인증 모델

계층 A — 공유키 HMAC (간단/소규모, 즉시 적용)

  • 앵커·노드가 사전에 노드별 공유 비밀키를 안전 채널로 교환
  • 등록 요청 본문 + nonce + ts 를 정규문으로 직렬화 후 HMAC-SHA256(공유키) 서명
  • 앵커가 같은 키로 재계산해 상수시간 비교 → 권한 검증
  • 장점: 단순. 단점: 대칭키(부인방지 불가, 양쪽 보관)
계층 B — 노드 등록키 enroll + 서명검증 (확장/탈중앙, 권장 최종형)
  • 노드가 최초 1회 등록키(pubkey 역할)를 앵커에 enroll
  • enroll 은 루트 부트스트랩토큰 HMAC 으로 보호 → 아무나 enroll 못 함
  • 이후 등록은 그 노드의 등록키 기반 서명으로 검증
  • 등록키는 node-keys.ndjson(append-only)에 보관. revoke/rotate = 새 블록 append (최신 블록이 유효 상태)

공통 방어 (replay 차단)

  • ts 허용창 ±300초 — 만료 요청 거부
  • nonce 1회성 — used-nonces.log 대조, 재사용 거부
  • 상수시간 비교 — 서명 비교 타이밍 사이드채널 완화

통합 게이트 반환 코드

등록인증(모드,...):
  • 1 통과 (nonce 소비)
  • 0 서명 불일치
  • -1 미등록·폐기 노드
  • -2 ts 만료
  • -3 nonce 재사용

주요 함수

  • 정규문(노드ID,위치,서비스직렬,헬스,nonce,ts) — 결정적 직렬화(파이프 구분)
  • A서명생성 / A서명검증 — 계층 A
  • enroll검증 / 등록키저장 / 등록키폐기 / 등록키조회 / B서명검증 — 계층 B
  • ts유효 / nonce미사용 / nonce소비 — 공통 방어
  • 상수시간비교 — 타이밍 누수 완화
  • 등록인증(모드,...) — 통합 게이트

자가 단위검증 결과 (8/8 PASS)

A1 올바른서명 통과(1)      A2 위조서명 거부(0)
C1 nonce재사용 거부(-3)    C2 ts만료 거부(-2)
B1 enroll검증 통과(1)      B2 등록키서명 통과(1)
B3 미등록노드 거부(-1)     B4 폐기후 거부(-1)

연합 API 통합 지점 (다음 단계 — 미적용)

연합API.한선등록처리(전체요청) 에서 노드등록() 호출 전에 게이트 삽입:

변수 nonce = 본문값(본문,"nonce")  변수 ts = 본문값(본문,"ts")
변수 서명 = 본문값(본문,"sig")     변수 모드 = 본문값(본문,"auth")
변수 인증 = 등록인증(모드, 노드, 위치, 서비스, 헬스, nonce, ts, 서명, 공유키)
만약 (인증 != 1) { 반환 응답("401 Unauthorized", ..., code) }
신규 엔드포인트 POST /enroll 추가: enroll검증()==1 → 등록키저장().

한선씨 함정 회피 기록

  • 인라인 ; 다단어 주석 → // 로 (미정의 변수 컴파일 오류 유발)
  • HMAC_SHA256해시.한선 RFC2104 스타일(SHA256 str→hex 기반 근사) 사용
  • 파일존재() -1 → 읽기() 글자수 판정
  • 글로벌 배열 인덱스 대입 금지 → 노드키/nonce 저장 모두 append-only ndjson
  • 맵 인덱스반환 → 키 조회는 ndjson 라인 스캔(J값 철학)

관련 파일

  • 신규 설계: /Users/ef/crowny-gateway/한선게이트웨이/연합인증설계.한선 (컴파일 OK, 8/8 PASS)
  • 기존(읽기만): /Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이연합.한선
  • 기존(읽기만): /Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이연합API.한선
  • 재사용 라이브러리: /Users/ef/CrownyOS/crownyc/libs/해시.한선 (HMAC_SHA256, 랜덤토큰)

잔여 이슈

  • 해시.한선 의 HMAC 은 바이트 XOR 근사(VM SHA256 이 문자열 기반). 진짜 RFC2104 바이트 XOR 이 필요하면 버퍼 기반 SHA256 추가 필요. 현재 용도(내부 노드 인증)에는 일관성만 보장되면 충분.
  • 계층 A 의 노드별 공유키 저장소(노드공유키조회)는 미구현 — 적용 시 enroll 과 유사한 ndjson 저장소로 추가.
  • used-nonces.log 무한 증가 — ts 기반 주기적 정리(만료 nonce 삭제) 필요.
  • 실제 라이브 적용은 별도 통합 단계(연합API.한선 등록처리 게이트 삽입 + /enroll 추가).