코드 서명(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)에 저장되고 레지스트리의 이미지와 연결돼요.