폐쇄망 CVE 미러 설계 — 11일 지난 미러가 만든 조용한 거짓 안전감
인터넷이 없는 환경에서 SCA·의존성 스캔이 의미가 있으려면 CVE / OSV / 벤더 advisory 를 *내부에서* 유지해야 한다. 4 종류의 데이터 소스, 4가지 동기화 함정, 한 가지 검증.
작년 12월, 한 고객사 보안 검토 회의에서 한 줄을 듣는 데 2분 이 걸렸다.
"우리 SCA 가 clean 이라는데, 그 데이터가 얼마나 오래된 건가요?"
답이 11일 이었다. 우리 폐쇄망 CVE 미러가 11일 전에 마지막으로 동기화 됐다. 그 11일 동안 높은 심각도 CVE 가 7개 발표됐고, 그중 2개가 우리 의존성 트리에 영향 을 주는 것이었다. SCA 가 clean 이라고 보고한 건 사실이었다 — 11일 전 데이터로는.
그날 이후 우리 폐쇄망 CVE 미러 설계 전체를 다시 짰다. 이 글은 그 결과다.
왜 CVE 미러가 폐쇄망의 결정적 인프라인가
폐쇄망에서 SCA / 컨테이너 스캐너 / IaC 검사 도구는 내부 미러로부터 CVE 데이터를 받는다. 미러가 오래되면 도구는 오래된 데이터로 clean 보고 를 한다. 도구가 거짓말을 하는 게 아니라 — 미러가 거짓말을 시키는 것이다.
폐쇄망 보안 도구의 신뢰도는 도구 자체 가 아니라 그 도구에 들어가는 데이터의 신선도 가 결정한다.
4 종류의 데이터 소스
CVE 미러는 하나의 DB 가 아니라 4 개의 흐름 이다.
1. NVD / CVE.org — 공식 CVE 식별자 + CPE 매핑
2. OSV (Google) — open source 패키지별 advisory + 영향 범위
3. 벤더 advisories — RedHat / Debian / Ubuntu / Alpine / 사내 패키지 backport
4. 사내 패치 트래커 — *우리만* 의 fix / mitigation / 리스크 수용 기록이 넷이 정렬되지 않으면 같은 취약점이 다른 곳에서 다른 status 로 보고된다.
4가지 동기화 함정
함정 1 — sync 지연이 조용히 누적된다
NVD 의 매시간 업데이트를 매시간 받지 못하면, 지연이 조용히 누적 된다. 일주일 지나면 경고 가 떠야 하는데, 보통 알람이 안 울려서 11일이 된다.
해결: 미러의 마지막 sync 시간 을 자체 메트릭 으로 노출하고, 24시간 이상 지연되면 page 한다. 이 단순한 알람이 11일짜리 사고를 24시간짜리로 줄인다.
함정 2 — 단방향 sync 의 broken pipe
전송 영역(transit zone) 의 단방향 게이트웨이가 파일을 못 보내고 있는데도 오류는 안 나는 패턴. 게이트웨이 입장에서는 조용한 success, 우리 입장에서는 데이터가 안 들어옴.
해결: 미러가 마지막으로 받은 sync 의 hash 를 검증. 매 sync 마다 checksum 매칭 안 되면 alert. 이건 sync 실패 가 아니라 sync 위장 실패 를 잡는 것.
함정 3 — 벤더 advisory 가 언어가 다르다
RedHat 의 advisory 는 RHSA-XXXX, Ubuntu 는 USN-XXXX, Debian 은 DSA-XXXX. 같은 CVE 가 여러 벤더에서 다른 ID 로 다른 시점에 등장. 우리 미러가 한 벤더만 추적하면 다른 벤더 OS 를 쓰는 컨테이너가 내부 검사 통과 후 외부 인증 실패.
해결: 사내에서 쓰는 모든 base 이미지의 OS 의 advisory 를 명시적으로 추적. 4~6 종 보통.
함정 4 — 수용된 리스크 가 미러에 안 들어 있다
사내 정책으로 어떤 CVE 는 수용 한다는 결정이 있다. 그게 미러에 없으면 SCA 가 매번 수용된 CVE 를 경고 로 띄우고, 운영자는 경보 피로 로 진짜 경보 까지 무시.
해결: 내부 risk-accepted 트래커를 미러에 5번째 흐름 으로 박음. SCA 가 그것을 인식해 수용된 항목은 informational 로 강등.
한 가지 검증 — 알려진 좋은 CVE 가 알려진 시간 안에 보이는가
미러의 건강 을 어떻게 검증하나? 수동 검사는 안 된다. 우리는 다음 검증을 분기 1회 자동 으로 돌린다.
1. NVD 에 *지난 24시간 동안 발표된 CVE* 중 random 5개 선택
2. 우리 내부 미러에 *그 5개가 모두 있는지* 확인
3. 없으면 alert + 인시던트
4. 있으면 *한 단계 더* — 그 CVE 가 우리 의존성 트리와 매칭되는지이 검증을 하기 전에는 미러가 잘 작동한다 라는 게 느낌 에 가까웠다. 검증 도입 후 3분기 동안 4번 의 sync 지연을 자동으로 잡았다.
왜 이 글이 별로 없나
폐쇄망 CVE 미러는 돈도 안 되고, 화려하지도 않은 분야다. 글로벌 SaaS 회사들은 이 문제를 겪지 않는다. 한국·일본·EU 의 공공·금융·방산만 매일 마주한다. 그래서 영문 자료 가 빈약하고, 한국어 자료 는 거의 없다. 이 빈자리가 우리에게 영업 자산 이 됐다 — 컨퍼런스 발표 중 이 표 한 장이 5분 만에 PoC 제안 으로 이어진 적이 두 번.
누가 이 글을 읽으면 좋은가
폐쇄망에서 SCA / 컨테이너 스캐너 / IaC 검사 도구를 돌리고 있는 보안 엔지니어. 마지막으로 미러 sync 시간을 확인한 게 언제 인가요? 답이 즉시 나오지 않으면, 위 4가지 함정 중 한 개 이상에 이미 빠져 있다.
비슷한 글
에이전틱 DevOps 12개월 후 — 첫 가설 중 무엇이 *맞았고* 무엇이 *틀렸나*
12개월 전 다음 10년의 DevOps는 에이전틱이다 의 가설들. 12개월의 데이터로 어느 가설이 맞고 어느 게 틀렸는지의 정직한 평가.
백재민
3 pillars 그 후 — 4 추가 신호의 *6개월 후* 운영 노트
3 pillars 가 더 이상 충분하지 않은 이유 발행 후 6개월. 4 추가 신호 (events / user journeys / deploy correlation / similarity) 가 운영에서 어떻게 작동했는지의 후속.
백재민
GitHub Actions vs 자체 호스팅 — *진짜 비용* 비교 (12개월 데이터)
GitHub Actions 가 *비싸 보임* 은 표면. 12개월 자체 호스팅 vs SaaS 비교 — 단순 *분당 비용* 이 아니라 *총 운영 비용* 으로.
백재민