콘텐츠로 이동

설치 OSS CVE 대응

admin devops

스택이 설치한 OSS(GitLab · Harbor · Argo CD · Keycloak …)에 CVE 가 공개됐을 때 Nullus 가 무엇을 하고, 스택 운영자는 무엇을 하면 되는지 정리한 페이지입니다. 화면 하나가 아니라 이미지 취약점 탭 · 알림 채널 · 버전 업그레이드 탭(스택 목록)에 걸친 흐름입니다.

Nullus 자체 이미지와는 약속이 다릅니다

"수정판 있는 CRITICAL 은 24시간 안에 패치 릴리즈" 는 Nullus 가 직접 빌드하는 이미지(API · Web · Jenkins · SonarScanner)의 약속입니다. 스택이 설치하는 OSS 는 상류 이미지라서 Nullus 가 다시 빌드하지 않습니다 — 그래서 고지와 검증된 업그레이드 제공을 나눈 아래 기한을 따릅니다.

무엇을 스캔하나

스택에 이미지 스캐너(Trivy)를 넣었다면, 스택 네임스페이스에서 도는 모든 이미지와 스택이 쓰는 클러스터 공용 구성요소(cert-manager · metrics-server · External Secrets)를 스캔합니다. 설치 직후 한 번, 그다음은 24시간마다(STACK_IMAGE_RESCAN_INTERVAL) 다시 스캔합니다 — 설치 뒤에 공개된 CVE 는 다시 스캔해야 보입니다. API 가 다시 뜨면 마지막 스캔이 주기보다 오래된 스택부터 스캔합니다.

결과는 스택 상세의 이미지 취약점 탭에 있습니다. 행마다 두 표시가 붙을 수 있습니다.

표시 뜻
외부 노출 클러스터 밖에 열린 이미지입니다 — 게이트웨이(HTTPRoute → Service → 파드)로 열린 것, 그리고 LoadBalancer · NodePort Service 가 고르는 것(스택 게이트웨이의 Envoy 포함). 마우스를 올리면 호스트가 나옵니다
공용 스택 네임스페이스 밖의 공용 구성요소입니다. 클러스터에 원래 있던 것을 재사용했다면 패치는 클러스터 관리자 몫이고, Nullus 는 알리기만 합니다

스캐너를 넣지 않은 스택은 탐지가 없습니다

Trivy 를 고르지 않은 스택의 이미지 취약점 탭은 "이 스택은 Trivy 를 선택하지 않아 설치 이미지를 스캔하지 않습니다" 라고 밝힙니다 — 취약점이 없다는 뜻이 아닙니다. 운영 스택에는 Trivy 를 넣기를 권합니다.

언제 알리나

재스캔이 아직 알리지 않은 수정판 있는 CRITICAL 을 찾으면, 알림 채널로 stack_cve_found 를 스택당 한 건 보냅니다.

  • 외부 노출 이미지의 것이 하나라도 있으면 심각도 critical, 아니면 warning 입니다
  • 본문에는 CVE 다섯 개까지(패키지 설치 버전 → 수정 버전 · 이미지 · 노출 호스트)가 실리고 나머지는 수만 나옵니다
  • 스택에 처음 보내는 것은 지금 있는 것을 "첫 고지" 로 한 번에 알립니다 — 새 스택이면 설치 시점에 있던 것, 이 기능 전에 설치한 스택이면 지금의 현황입니다
  • 한 번 알린 CVE 는 그 스택에서 다시 보내지 않습니다 — 이미지 하나의 스캔이 실패했다 돌아와도, 어느 채널의 발송이 실패해도(발송 이력에 남습니다) 그렇습니다
  • HIGH 와 수정판 없는 것은 보내지 않습니다 — 이미지 취약점 탭에서 봅니다

이 이벤트가 생기기 전에 만든 채널은 저절로 받지 않습니다. 채널을 편집해 이벤트를 체크하세요.

등급과 기한

기계가 수정판 · 심각도 · 외부 노출로 등급을 매기고, A · B 는 사람이 한 번 더 판단합니다(그 패키지를 실제로 쓰는지, 알려진 익스플로잇이 있는지, 완화책이 있는지).

등급 조건 고지 검증된 업그레이드
A CRITICAL · 수정판 있음 · 외부 노출 24시간 안 (critical) 7일 안, 또는 완화책 공지
B CRITICAL · 수정판 있음 · 내부 24시간 안 (warning) 30일 안 또는 다음 정기 릴리즈 중 빠른 쪽
C HIGH · 수정판 있음 화면 분기마다 템플릿 기본 버전을 올릴 때
D 수정판 없음 화면 수정판이 나온 때부터 위 기한

기한은 그 CVE 를 스택에 처음 알린 시각부터 셉니다. 못 지키면 Nullus 릴리즈 노트의 ### Security 에 사유와 다음 목표일을 적습니다.

받고 나서 할 일

  1. 알림의 스택을 열어 이미지 취약점 탭에서 어느 이미지 · 어느 호스트인지 확인합니다
  2. 그 패키지를 실제로 쓰는지, 완화책(기능 끄기 · 게이트웨이에서 경로 막기)이 있는지 판단합니다
  3. 버전 업그레이드 탭을 엽니다. 검증된 업그레이드가 이 스택에서 발견된 CVE 를 고치면 행에 이 스택에서 발견된 CVE N건을 고칩니다 가 붙고, 대화 상자에 그 CVE 목록이 나옵니다
  4. 검증된 업그레이드가 없으면 완화책을 적용하고 Nullus 릴리즈 노트의 ### Security 를 기다립니다

검증된 업그레이드는 지금 Argo CD 만 있습니다

실클러스터 리허설을 거친 경로만 실행할 수 있습니다. 다른 도구는 템플릿 기본 버전을 올린 Nullus 릴리즈(새 설치)나 절차 안내로 올립니다.

폐쇄망(에어갭)

폐쇄망 설치도 같은 스캔을 돕니다. 이미지는 번들이 올린 내부 레지스트리(NULLUS_HELM_OCI_REGISTRY 의 호스트)에서 받고, 취약점 DB 는 번들과 함께 반입한 것을 씁니다. 그래서 이미지 취약점 탭에 "폐쇄망 설치 — 번들과 함께 반입한 취약점 DB 로 스캔했습니다" 안내가 붙습니다 — 반입 뒤에 공개된 CVE 는 다음 번들을 반입해야 보입니다.

알림은 밖으로 나가지 못하므로 사내 SMTP 릴레이를 쓰는 이메일 채널이 현실적입니다. 에어갭 번들의 릴리즈 노트 ### Security 에 Nullus 의 판정이 함께 실립니다.

한계

  • 외부 노출은 HTTPRoute 와 LoadBalancer · NodePort Service 로 봅니다. 손으로 더한 Ingress 가 ClusterIP Service 를 가리키면 모릅니다
  • 공용 구성요소는 정해진 네임스페이스(cert-manager · kube-system · external-secrets)에서 릴리스 라벨로 찾습니다. 재사용한 것이 다른 네임스페이스에 있거나 그 라벨이 없으면(배포판 애드온 metrics-server 등) 스캔하지 않습니다
  • 이미지 취약점 탭의 CVE 행에서 그것을 고치는 업그레이드로 바로 가는 길은 아직 없습니다 — 버전 업그레이드 탭에서 봅니다