🔒 보안

Cosign

컨테이너 이미지 서명 도구

📖 상세 설명

Cosign은 Sigstore 프로젝트의 핵심 도구로, 컨테이너 이미지에 디지털 서명을 추가하고 검증하는 기능을 제공합니다. 소프트웨어 공급망 보안이 중요해지면서, 배포되는 컨테이너 이미지가 신뢰할 수 있는 출처에서 왔고 변조되지 않았음을 증명하는 것이 필수가 되었습니다.

Cosign의 가장 큰 특징은 "keyless signing"입니다. 전통적인 서명 방식은 개인 키를 안전하게 보관해야 하지만, Cosign은 OIDC(OpenID Connect) 기반 인증을 통해 임시 키를 생성하고 서명합니다. GitHub Actions, GitLab CI에서 워크플로 아이덴티티를 사용하면 키 관리 부담 없이 서명할 수 있습니다.

서명된 이미지는 Rekor(투명성 로그)에 기록되어 누가 언제 서명했는지 공개적으로 검증 가능합니다. 이를 통해 SLSA(Supply-chain Levels for Software Artifacts) 요구사항을 충족하고, 감사 추적이 가능해집니다.

Kubernetes 환경에서는 Kyverno나 Gatekeeper와 연동하여 서명되지 않은 이미지의 배포를 차단할 수 있습니다. 이를 통해 "신뢰할 수 있는 이미지만 클러스터에 배포"라는 정책을 강제할 수 있습니다.

💻 코드 예제

# Cosign 설치 (macOS)
brew install cosign

# Keyless 서명 (GitHub Actions에서 자동으로 OIDC 토큰 사용)
cosign sign --yes ghcr.io/myorg/myapp:v1.0.0

# 서명 검증
cosign verify ghcr.io/myorg/myapp:v1.0.0 \
  --certificate-identity=https://github.com/myorg/myapp/.github/workflows/build.yml@refs/tags/v1.0.0 \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com

# SBOM 첨부 (소프트웨어 구성요소 목록)
cosign attach sbom --sbom sbom.spdx ghcr.io/myorg/myapp:v1.0.0

# Attestation 추가 (빌드 출처 증명)
cosign attest --predicate provenance.json --type slsaprovenance ghcr.io/myorg/myapp:v1.0.0

# GitHub Actions 워크플로 예시
# .github/workflows/build.yml
jobs:
  build:
    permissions:
      id-token: write  # OIDC 토큰 발급에 필요
      packages: write
    steps:
      - uses: sigstore/cosign-installer@v3
      - run: |
          cosign sign --yes ${{ env.IMAGE_TAG }}

🗣️ 실무에서 이렇게 말해요

시니어: "공급망 보안 감사 준비하려면 모든 프로덕션 이미지에 서명 붙여야 해요. Cosign keyless로 CI 파이프라인에 추가합시다."

주니어: "키 관리는 어떻게 하죠? 시크릿 저장소에 넣어야 하나요?"

시니어: "Keyless 모드 쓰면 GitHub OIDC로 자동 서명돼요. 키 관리 필요 없어요. Rekor에 기록되니까 감사 로그도 자동으로 남고요."

면접관: "컨테이너 이미지 공급망 보안을 어떻게 구현하시겠어요?"

지원자: "Cosign으로 CI에서 이미지 서명하고, Kyverno 정책으로 서명 검증된 이미지만 배포 허용합니다. Keyless 서명으로 키 관리 부담 없이 OIDC 기반으로 서명하고, Rekor 투명성 로그로 감사 추적합니다."

리뷰어: "cosign verify에 --certificate-identity 옵션이 빠졌네요. 서명자 신원 검증 안 하면 아무 서명이나 통과돼요."

작성자: "맞아요, 워크플로 파일 경로랑 OIDC issuer도 지정해서 우리 CI에서 서명한 것만 허용하도록 수정하겠습니다."

⚠️ 주의사항

📚 더 배우기