코드 서명(Code signing)

코드 서명(Code signing)

Docker 이미지 같은 소프트웨어 아티팩트에 암호화 서명을 적용해 무결성과 정품성을 검증하는 코드 서명의 개념과, Docker Hardened Images에서 서명을 확인·적용하는 방법을 살펴봐요.

출처: 문서

본문

코드 서명이란 무엇인가요?

코드 서명(Code signing)은 Docker 이미지 같은 소프트웨어 아티팩트에 암호화 서명을 적용해 무결성과 정품성을 검증하는 프로세스예요. 이미지에 서명하면 서명된 이후 변경되지 않았고, 신뢰할 수 있는 출처에서 왔다는 것을 보장해요.

Docker Hardened Images(DHI)의 맥락에서 코드 서명은 Cosign을 사용해 이루어져요. Cosign은 Sigstore 프로젝트가 개발한 도구로, 컨테이너 이미지에 안전하고 검증 가능한 서명을 할 수 있게 해줘 소프트웨어 공급망의 신뢰와 보안을 높여줘요.

코드 서명이 왜 중요한가요?

코드 서명은 현대 소프트웨어 개발과 사이버보안에서 핵심적인 역할을 해요.

  • 정품성(Authenticity): 이미지가 신뢰할 수 있는 출처에서 만들어졌는지 검증해요.
  • 무결성(Integrity): 서명된 이후 이미지가 변조되지 않았음을 보장해요.
  • 컴플라이언스(Compliance): 규제 및 조직 보안 요구사항을 충족하도록 도와줘요.

Docker Hardened Image의 코드 서명

각 DHI는 Cosign을 사용해 암호화 방식으로 서명되어, 이미지가 변조되지 않았고 신뢰할 수 있는 출처에서 왔음을 보장해요.

왜 자신의 이미지에도 서명해야 하나요?

Docker Hardened Images는 그 기원과 무결성을 증명하기 위해 Docker가 서명해요. 하지만 DHI를 베이스로 확장하거나 사용하는 애플리케이션 이미지를 빌드한다면, 자신의 이미지에도 서명해야 해요.

자신의 이미지에 서명하면 다음을 할 수 있어요.

  • 이미지가 내 팀이나 파이프라인에 의해 빌드되었음을 증명
  • 푸시한 후 빌드가 변조되지 않았음을 보장
  • SLSA 같은 소프트웨어 공급망 프레임워크를 지원
  • 배포 워크플로에서 이미지 검증을 활성화

이는 이미지를 자주 빌드하고 푸시하는 CI/CD 환경이나, 이미지 provenance가 감사 가능해야 하는 모든 시나리오에서 특히 중요해요.

코드 서명 확인 및 사용 방법

서명 보기

Docker Scout 또는 Cosign을 사용해 Docker Hardened Image가 서명되었고 신뢰할 수 있는지 검증할 수 있어요.

이미지에 첨부된 서명 메타데이터를 포함한 모든 attestation을 나열하려면 다음 명령을 사용해요.

$ docker scout attest list <image-name>:<tag>

[!NOTE]

이미지가 로컬 디바이스에 존재한다면 이미지 이름 앞에 registry:// 접두사를 붙여야 해요. 예를 들어 dhi.io/python 대신 registry://dhi.io/python을 사용해요.

특정 서명된 attestation(예: SBOM, VEX, provenance)을 검증하려면:

$ docker scout attest get \
  --predicate-type <predicate-uri> \
  --verify \
  <image-name>:<tag>

[!NOTE]

이미지가 로컬 디바이스에 존재한다면 이미지 이름 앞에 registry:// 접두사를 붙여야 해요. 예를 들어 dhi.io/python:3.13 대신 registry://dhi.io/python:3.13을 사용해요.

예를 들면:

$ docker scout attest get \
  --predicate-type https://openvex.dev/ns/v0.2.0 \
  --verify \
  dhi.io/python:3.13

유효하다면 Docker Scout가 서명을 확인하고 서명 페이로드와 함께, 이미지를 검증하기 위한 동등한 Cosign 명령도 표시해줘요.

이미지 서명하기

Docker 이미지에 서명하려면 Cosign을 사용해요. <image-name>:<tag>를 이미지 이름과 태그로 바꾸면 돼요.

$ cosign sign <image-name>:<tag>

이 명령은 OIDC 공급자(GitHub, Google, Microsoft 등)를 통한 인증을 요청해요. 인증에 성공하면 Cosign이 단기 인증서를 생성하고 이미지에 서명해요. 서명은 투명성 로그(transparency log)에 저장되고 레지스트리의 이미지와 연결돼요.

더 알아보기 (Learn more)