Sigstore를 사용하여 키리스 서명 및 확인

Tier: Free, Premium, Ultimate Offering: GitLab.com

Sigstore 프로젝트는 Cosign이라는 CLI를 제공하며, 이는 GitLab CI/CD로 빌드된 컨테이너 이미지의 키리스 서명에 사용할 수 있습니다. 키리스 서명에는 개인 키를 관리, 보호 및 회전할 필요가 없는 등 여러 가지 이점이 있습니다. Cosign은 서명에 사용할 단명한 키 쌍을 요청하고, 이를 인증 투명성 로그에 기록한 후 폐기합니다. 해당 키는 사용자의 OIDC 신원을 사용하여 GitLab 서버에서 얻은 토큰을 통해 생성됩니다. 이 토큰에는 CI/CD 파이프라인에서 생성된 것임을 증명하는 고유한 클레임이 포함되어 있습니다. 더 알아보려면, 키리스 서명에 대한 Cosign 문서를 참조하세요.

GitLab OIDC 클레임과 Fulcio 인증서 확장 사이의 매핑에 대한 자세한 내용은 Mapping OIDC token claims to Fulcio OIDs의 GitLab 열을 확인하세요.

준비 사항:

  • GitLab.com을 사용해야 합니다.
  • 프로젝트의 CI/CD 구성 파일이 프로젝트에 있어야 합니다.

Cosign을 사용하여 컨테이너 이미지 및 빌드 아티팩트 서명 또는 확인

Cosign을 사용하여 컨테이너 이미지와 빌드 아티팩트를 서명 및 확인할 수 있습니다.

준비 사항:

  • Cosign의 버전은 >= 2.0.1을 사용해야 합니다.

제한 사항

  • CI/CD 구성 파일의 id_tokens 부분은 빌드 및 서명 중인 프로젝트에 있어야 합니다. AutoDevOps, 다른 저장소에서 가져온 CI 파일 및 하위 파이프라인은 지원되지 않습니다. 이 제한 사항의 제거 작업은 이슈 411317에서 추적되고 있습니다.

최상의 실천 방법:

  • 이미지/아티팩트가 서명되기 전에 변경되지 않도록 하기 위해 서명 및 빌드 아티팩트를 동일한 작업에서 빌드 및 서명하세요.
  • 컨테이너 이미지를 서명할 때는 태그 대신 요약(불변)을 서명하세요.

GitLab ID 토큰은 Cosign에서 키리스 서명에 사용될 수 있습니다. 해당 토큰은 aud 클레임으로 sigstore가 설정되어 있어야 합니다. 해당 토큰은 SIGSTORE_ID_TOKEN 환경 변수에 설정되어 있으면 Cosign에서 자동으로 사용할 수 있습니다.

Cosign의 설치 방법에 대해 자세히 알아보려면 Cosign 설치 문서를 참조하세요.

서명

컨테이너 이미지

Cosign.gitlab-ci.yml 템플릿은 GitLab CI에서 컨테이너 이미지를 빌드하고 서명하는 데 사용할 수 있습니다. 서명은 자동으로 이미지와 동일한 컨테이너 저장소에 저장됩니다.

include:
- template: Cosign.gitlab-ci.yml

컨테이너 서명에 대해 자세히 알아보려면 Cosign 컨테이너 서명 문서를 참조하세요.

빌드 아티팩트

아래 예시는 GitLab CI에서 빌드 아티팩트를 서명하는 방법을 보여줍니다. cosign sign-blob에 의해 생성된 cosign.bundle 파일을 저장해야 합니다. 이 파일은 서명 확인에 사용됩니다.

빌드 아티팩트의 서명에 대해 자세히 알아보려면 Cosign 아티팩트 서명 문서를 참조하세요.

build_and_sign_artifact:
  stage: build
  image: alpine:latest
  variables:
    COSIGN_YES: "true"
  id_tokens:
    SIGSTORE_ID_TOKEN:
      aud: sigstore
  before_script:
    - apk add --update cosign
  script:
    - echo "This is a build artifact" > artifact.txt
    - cosign sign-blob artifact.txt --bundle cosign.bundle
  artifacts:
    paths:
      - artifact.txt
      - cosign.bundle

확인

명령줄 인수

이름
--certificate-identity Fulcio에서 발급된 서명 인증서의 SAN입니다. 이미지/아티팩트가 서명된 프로젝트의 다음 정보를 사용하여 생성됩니다: GitLab 인스턴스 URL + 프로젝트 경로 + // + CI 구성 경로 + @ + ref 경로.
--certificate-oidc-issuer 이미지/아티팩트가 서명된 GitLab 인스턴스 URL입니다. 예: https://gitlab.com.
--bundle cosign sign-blob에 의해 생성된 bundle 파일입니다. 빌드 아티팩트를 확인하는 데에만 사용됩니다.

서명된 이미지/아티팩트를 확인하는 방법에 대해 자세히 알아보려면 Cosign 확인 문서를 참조하세요.

컨테이너 이미지

아래 예시는 GitLab CI에서 서명된 컨테이너 이미지를 확인하는 방법을 보여줍니다. 명령줄 인수는 에서 설명되어 있습니다.

verify_image:
  image: alpine:3.20
  stage: verify
  before_script:
    - apk add --update cosign docker
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - cosign verify "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" --certificate-identity "https://gitlab.com/my-group/my-project//path/to/.gitlab-ci.yml@refs/heads/main" --certificate-oidc-issuer "https://gitlab.com"

추가 정보:

  • 프로젝트 경로와 .gitlab-ci.yml 경로 사이의 이중 역슬래시는 오류가 아니며, 확인이 성공하려면 필요합니다. 단일 슬래시를 사용할 경우 전형적인 오류는 Error: none of the expected identities matched what was in the certificate, got subjects와 같으며, 서명된 URL 뒤에 프로젝트 경로와 .gitlab-ci.yml 경로 사이에 슬래시가 두 개 있습니다.
  • 확인이 서명과 동일한 파이프라인에서 실행된다면 다음 경로를 사용할 수 있습니다: "${CI_PROJECT_URL}//.gitlab-ci.yml@refs/heads/${CI_COMMIT_REF_NAME}"

빌드 아티팩트

아래 예제는 GitLab CI에서 서명된 빌드 아티팩트를 확인하는 방법을 보여줍니다. 아티팩트를 확인하려면 cosign.sign-blob에 의해 생성된 자체 cosign.bundle 파일과 아티팩트 자체가 모두 필요합니다. 명령줄 인자는 에 설명되어 있습니다.

verify_artifact:
  stage: verify
  image: alpine:latest
  before_script:
    - apk add --update cosign
  script:
    - cosign verify-blob artifact.txt --bundle cosign.bundle --certificate-identity "https://gitlab.com/my-group/my-project//path/to/.gitlab-ci.yml@refs/heads/main" --certificate-oidc-issuer "https://gitlab.com"

추가 세부정보:

  • 프로젝트 경로와 .gitlab-ci.yml 경로 사이의 두 번의 역 슬래시는 잘못된 것이 아니며 성공적인 검증을 위해 필요합니다. 단일 슬래시를 사용하면 일반적인 오류가 발생합니다. 오류 메시지는 Error: none of the expected identities matched what was in the certificate, got subjects이며 이어서 프로젝트 경로와 .gitlab-ci.yml 경로 사이에 두 개의 슬래시가 있는 서명된 URL이 표시됩니다.
  • 서명과 동일한 파이프라인에서 검증이 수행되는 경우 다음 경로를 사용할 수 있습니다: "${CI_PROJECT_URL}//.gitlab-ci.yml@refs/heads/${CI_COMMIT_REF_NAME}"

Sigstore 및 npm을 사용하여 무키 검증을 생성하세요

Sigstore 및 npm을 GitLab CI/CD와 함께 사용하여 빌드 아티팩트에 디지털 서명을 적용할 수 있으며 이는 키 관리의 부담을 덜 수 있습니다.

npm 검증 정보

npm CLI는 패키지 유지 관리자가 사용자에게 출처 증명서를 제공할 수 있도록 합니다. npm CLI 출처 생성을 사용하면 사용자가 다운로드하고 사용 중인 패키지가 해당 빌드 시스템에서 작성되었으며 출처가 당신임을 신뢰하고 검증할 수 있습니다.

npm 패키지를 게시하는 방법에 대한 자세한 정보는 GitLab npm 패키지 레지스트리를 참조하세요.

Sigstore

Sigstore는 Fulcio, Cosign, Rekor와 같은 무료 오픈 소스 기술을 결합하여 소프트웨어 공급망을 공격으로부터 안전하게 보호하는 데 사용할 수 있는 일련의 도구입니다. 디지털 서명, 검증, 그리고 출처를 확인하는 작업을 처리하여 오픈 소스 소프트웨어를 배포하고 사용하는 데 더 안전하게 만들어줍니다.

관련 주제:

GitLab CI/CD에서 검증 생성

위에서 설명한대로 Sigstore가 GitLab OIDC를 지원하기 때문에 GitLab CI/CD 및 Sigstore를 사용하여 GitLab CI/CD 파이프라인에서 npm 패키지를 위한 검증 생성 및 서명을 할 수 있습니다.

전제 조건

  1. GitLab ID 토큰audsigstore로 설정합니다.
  2. npm 게시에 --provenance 플래그를 추가합니다.

.gitlab-ci.yml 파일에 추가할 내용의 예:

image: node:latest

build:
  id_tokens:
    SIGSTORE_ID_TOKEN:
      aud: sigstore
  script:
    - npm publish --provenance --access public

npm GitLab 템플릿도 이 기능을 제공합니다. 해당 예제는 템플릿 문서에 있습니다.

npm 출처 검증

npm CLI는 끝 사용자가 패키지 출처를 검증할 수 있는 기능도 제공합니다.

npm audit signatures
audited 1 package in 0s
1 package has a verified registry signature

출처 메타데이터 검토

Rekor 투명성 로그에는 출처가 포함된 모든 패키지에 대한 인증서와 증명이 저장됩니다. 예를 들어, 아래 예제에 대한 항목이 있습니다.

npm에 의해 생성된 예제 출처 문서:

_type: https://in-toto.io/Statement/v0.1
subject:
  - name: pkg:npm/%40strongjz/strongcoin@0.0.13
    digest:
      sha512: >-
        924a134a0fd4fe6a7c87b4687bf0ac898b9153218ce9ad75798cc27ab2cddbeff77541f3847049bd5e3dfd74cea0a83754e7686852f34b185c3621d3932bc3c8
predicateType: https://slsa.dev/provenance/v0.2
predicate:
  buildType: https://github.com/npm/CLI/gitlab/v0alpha1
  builder:
    id: https://gitlab.com/strongjz/npm-provenance-example/-/runners/12270835
  invocation:
    configSource:
      uri: git+https://gitlab.com/strongjz/npm-provenance-example
      digest:
        sha1: 6e02e901e936bfac3d4691984dff8c505410cbc3
      entryPoint: deploy
    parameters:
      (...)
  metadata:
    buildInvocationId: https://gitlab.com/strongjz/npm-provenance-example/-/jobs/4316132595
    (...)