본문 바로가기
클라우드/쿠버네티스

🐳 도커 이미지, 믿고 써도 될까? 공식 이미지와 일반 이미지의 서명 방식 파헤치기 (CA vs Notary)

by gasbugs 2025. 8. 21.

안녕하세요! 오늘은 많은 개발자분들이 애용하는 도커(Docker)의 이미지 보안에 대해 이야기해보려고 합니다. 도커 허브(Docker Hub)에 올라온 수많은 이미지들, 과연 모두 안전하게 믿고 사용할 수 있을까요? 🤔

우리가 docker pull 명령어로 이미지를 내려받을 때, 이 이미지가 정말 공식 기관에서 만든 것인지, 아니면 누군가 악의적으로 변조한 것은 아닌지 확인하는 과정이 매우 중요합니다. 이를 위해 디지털 서명 기술이 사용되는데요, 흥미롭게도 도커는 공식 이미지(Official Images)일반 사용자 이미지(User Images)에 각기 다른 서명 방식을 적용하고 있습니다.

오늘은 이 두 가지 서명 방식, 즉 CA(Certificate Authority) 방식노터리(Notary) 방식이 어떻게 다른지, 그리고 왜 다르게 적용되는지 쉽고 자세하게 알아보겠습니다!

 

 


📜 CA 방식: 전통적인 신뢰의 증명, 공식 이미지의 선택

마치 우리가 웹사이트에 접속할 때 자물쇠 아이콘을 보고 '아, 이 사이트는 신뢰할 수 있구나'라고 생각하는 것과 비슷합니다. 이는 웹사이트가 공인된 인증 기관(CA, Certificate Authority)으로부터 인증서를 발급받았기 때문인데요, 도커의 공식 이미지도 이와 유사한 CA 방식을 사용해 신뢰성을 보장합니다.

도커 공식 이미지(Official Images)는 도커사가 직접 관리하고 검증한, 품질과 보안이 보장된 이미지를 말합니다. ubuntu, nginx, mysql처럼 이름만 딱 명시된 이미지들이죠.

이 공식 이미지들은 도커의 내부 CA에 의해 서명됩니다. 전체적인 과정은 다음과 같습니다.

  1. 키 생성: 도커는 내부적으로 루트 키(Root Key)와 서명 키(Signing Key)를 생성하고 매우 안전하게 보관합니다. 🔐
  2. 인증서 발급: 도커의 내부 CA는 이 키들을 사용하여 공식 이미지 배포자에게 인증서를 발급해줍니다.
  3. 이미지 서명: 배포자는 발급받은 인증서(와 개인 키)를 이용해 자신이 빌드한 이미지에 서명을 합니다.
  4. 서명 검증: 우리가 docker pull 명령으로 공식 이미지를 내려받으면, 도커 엔진은 내장된 루트 인증서를 사용해 이미지의 서명이 유효한지 자동으로 검증합니다. 만약 서명이 없거나 변조되었다면 경고를 보내거나 다운로드를 중단시키죠.

이 방식은 중앙에서 엄격하게 통제되기 때문에 매우 강력한 신뢰를 제공합니다. 도커라는 회사가 직접 "이 이미지는 우리가 보증하는 안전한 이미지야!"라고 말해주는 것과 같습니다. 👍

 

https://www.docker.com/blog/signing-docker-official-images-using-openpubkey/

 


notarized notary 방식: 모두를 위한 신뢰 시스템, 일반 사용자 이미지의 선택

하지만 도커 허브에는 공식 이미지 외에도 수많은 일반 사용자들이나 기업들이 만든 이미지가 존재합니다. 이 모든 이미지에 대해 도커가 일일이 CA가 되어 서명을 발급해주는 것은 현실적으로 불가능하겠죠?

 

그래서 등장한 것이 바로 노터리(Notary)입니다. 노터리는 The Update Framework (TUF)라는 보안 프레임워크에 기반한 도커의 자체 서명 서비스입니다. TUF는 소프트웨어 업데이트 시스템을 각종 공격으로부터 보호하기 위해 설계된 강력한 프레임워크입니다.

 

https://8grams.medium.com/harbor-install-open-source-container-registry-on-kubernetes-52d931478d45

 

노터리는 CA 방식보다 훨씬 더 유연하고 분산된 신뢰 모델을 제공합니다. 일반 사용자나 조직은 노터리를 사용해 자신의 이미지에 직접 서명하고, 이를 통해 이미지의 무결성(Integrity)과 출처(Provenance)를 증명할 수 있습니다.

노터리의 작동 방식은 조금 더 복잡하지만 핵심은 다음과 같습니다.

  1. 역할 기반 키 관리: 노터리는 여러 종류의 키(루트, 타겟, 스냅샷 등)를 역할에 따라 분리하여 관리합니다. 만약 하나의 키가 탈취되더라도 전체 시스템의 보안이 뚫리는 것을 막아줍니다. 마치 군대의 지휘 체계처럼 각자 역할과 권한이 나뉘어 있는 것과 비슷해요. 🛡️
  2. 콘텐츠 신뢰 위임 (Delegation): 이미지 저장소(Repository)의 소유자는 다른 팀원이나 협력자에게 특정 이미지 태그에 서명할 수 있는 권한을 위임할 수 있습니다. 이를 통해 여러 사람이 협업하며 안전하게 이미지를 관리할 수 있습니다.
  3. 신선도 보장 (Freshness): 노터리는 '스냅샷' 서명을 통해 저장소의 상태가 최신임을 보장합니다. 공격자가 예전에 서명된, 하지만 지금은 취약점이 발견된 옛날 버전의 이미지를 사용자에게 몰래 배포하려는 '롤백 공격(Rollback Attack)'을 방어할 수 있습니다. 🔄
  4. 서명 및 검증: 개발자는 자신의 개인 키로 이미지에 서명하여 노터리 서버에 올립니다. 사용자는 DOCKER_CONTENT_TRUST=1 환경 변수를 설정하여 이 서명을 검증하도록 강제할 수 있습니다. 이 설정이 켜져 있으면, 서명되지 않았거나 서명이 유효하지 않은 이미지는 pull이 거부됩니다.
# 콘텐츠 신뢰 기능을 활성화하고 이미지를 pull
export DOCKER_CONTENT_TRUST=1
docker pull my-awesome-app/webapp:latest

 

노터리는 "도커가 보증하진 않지만, 이 이미지는 'my-awesome-app'이라는 개발자가 서명한 것이 확실하며, 서명 이후 변경되지 않았어!"라고 말해주는 것과 같습니다.


📊 한눈에 보는 CA 방식 vs Notary 방식

특징 CA 방식 (공식 이미지) Notary 방식 (일반 이미지)
신뢰 주체 도커 (중앙 집중형) 이미지 소유자 (분산형)
목표 도커가 보증하는 이미지의 신뢰성 제공 이미지의 무결성 및 출처 증명
구조 전통적인 PKI (공개 키 기반 구조) TUF 프레임워크 기반
유연성 낮음 (도커만 서명 가능) 높음 (누구나 서명 가능, 위임 가능)
적용 대상 ubuntu, nginx 등 공식 이미지 모든 일반 사용자 및 조직의 이미지
사용자 설정 기본적으로 활성화 및 검증 DOCKER_CONTENT_TRUST=1 설정 필요
 

✨ 결론: 목적에 맞는 각기 다른 신뢰의 무게

결론적으로, 도커는 이미지의 성격에 따라 두 가지 다른 서명 방식을 현명하게 채택하고 있습니다.

  • CA 방식은 도커가 직접 품질을 보증하는 공식 이미지에 사용하여 사용자에게 최고 수준의 신뢰를 제공합니다.
  • Notary 방식은 수많은 개발자들이 자유롭게 이미지를 공유하는 생태계를 위해, 일반 사용자 이미지에 유연하면서도 강력한 보안(무결성, 출처 증명)을 제공합니다.

이제 도커 이미지를 사용할 때, 이 이미지가 어떤 방식으로 신뢰를 보장받고 있는지 이해하셨나요? 앞으로는 DOCKER_CONTENT_TRUST=1 옵션을 적극적으로 활용하여 더욱 안전한 개발 환경을 구축해 보시는 건 어떨까요? 😊

여러분의 안전한 컨테이너 라이프를 응원합니다!


도커, Docker, 이미지 서명, 도커 보안, CA, Notary, TUF, Docker Content Trust, 컨테이너 보안, 공식 이미지