Sigstore를 사용하여 키 없이 서명 및 확인하기
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을 사용하여 컨테이너 이미지 및 빌드 아티팩트를 서명 및 확인할 수 있습니다.
요구 사항:
-
>= 2.0.1
버전의 Cosign을 사용해야 합니다.
제한 사항
- 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 구성 경로 + @ + 참조 경로.
|
--certificate-oidc-issuer
| 이미지/아티팩트가 서명된 GitLab 인스턴스 URL입니다. 예: https://gitlab.com .
|
--bundle
|
cosign sign-blob 에 의해 생성된 bundle 파일입니다. 빌드 아티팩트 확인에만 사용됩니다.
|
서명된 이미지/아티팩트 확인에 대해 자세히 알아보려면 Cosign 확인 문서를 참조하세요.
컨테이너 이미지
아래 예제는 GitLab CI에서 서명된 컨테이너 이미지를 확인하는 방법을 보여줍니다. 명령행 인수는 위에서 설명되어 있습니다.
verify_image:
image: alpine:3.18
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_SHORT_SHA" --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에서 서명된 빌드 아티팩트를 확인하는 방법을 보여줍니다. 아티팩트를 확인하려면 빌드 아티팩트와 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"
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 패키지의 원본을 생성하고 서명할 수 있습니다.
사전 준비 사항
- GitLab ID 토큰 ‘aud’를
sigstore
로 설정하세요. - 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:
CI: 'true'
CI_API_GRAPHQL_URL: https://gitlab.com/api/graphql
CI_API_V4_URL: https://gitlab.com/api/v4
CI_COMMIT_BEFORE_SHA: 7d3e913e5375f68700e0c34aa90b0be7843edf6c
CI_COMMIT_BRANCH: main
CI_COMMIT_REF_NAME: main
CI_COMMIT_REF_PROTECTED: 'true'
CI_COMMIT_REF_SLUG: main
CI_COMMIT_SHA: 6e02e901e936bfac3d4691984dff8c505410cbc3
CI_COMMIT_SHORT_SHA: 6e02e901
CI_COMMIT_TIMESTAMP: '2023-05-19T10:17:12-04:00'
CI_COMMIT_TITLE: trying to publish to gitlab reg
CI_CONFIG_PATH: .gitlab-ci.yml
CI_DEFAULT_BRANCH: main
CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX: gitlab.com:443/strongjz/dependency_proxy/containers
CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX: gitlab.com:443/strongjz/dependency_proxy/containers
CI_DEPENDENCY_PROXY_SERVER: gitlab.com:443
CI_DEPENDENCY_PROXY_USER: gitlab-ci-token
CI_JOB_ID: '4316132595'
CI_JOB_NAME: deploy
CI_JOB_NAME_SLUG: deploy
CI_JOB_STAGE: deploy
...