SLSA 레벨 3 provenance attestation

SLSA 레벨 3 provenance attestation

SLSA(Supply-chain Levels for Software Artifacts)의 레벨 3는 레벨 1·2보다 한 단계 더 강화된 요구 사항을 담고 있어요. 특히 격리(isolation)와 "위조 불가(unforgeable)" 요건이 핵심 차이점입니다. 이 글에서는 GitLab이 SLSA 레벨 3 호환 provenance attestation(생산 이력 증명)을 어떻게 생성하는지, 전제 조건부터 아티팩트·컨테이너별 attestation 생성 방법, 확인(verify) 방법까지 설명할게요. 참고로 이 기능은 아직 실험(Experiment) 상태예요.

출처: 문서

본문

  • Tier: Ultimate

  • Offering: GitLab.com

  • Status: Experiment

  • GitLab 18.3에서 slsa_provenance_statement라는 기능 플래그와 함께 도입됐어요. 기본적으로 비활성화되어 있죠.

이 기능의 사용 가능 여부는 기능 플래그로 제어됩니다. 자세한 내용은 history를 참고하세요. 이 기능은 테스트용으로 제공되지만 아직 프로덕션 사용에는 적합하지 않아요.

GitLab은 SLSA 레벨 3 호환 provenance attestation을 생성할 수 있어요. 레벨 2와 레벨 3 provenance attestation의 핵심 차이는 격리와 "위조 불가" 요구 사항입니다.

attestation의 세부 사항은 GitLab SLSA provenance 사양을 참고하세요.

전제 조건

컨테이너 또는 아티팩트의 attestation에 대해 다음 조건이 충족되어야 해요.

  • 빌드와 연결된 프로젝트가 공개(public)여야 해요. Rekor로 정보가 실수로 노출되는 것을 막기 위한 요구 사항입니다.
  • 빌드가 build 스테이지를 사용해야 해요.
  • 프로젝트에 slsa_provenance_statement 기능 플래그가 활성화되어 있어야 해요.

아티팩트에 대한 attestation 생성

빌드가 생성한 모든 아티팩트에 대한 attestation을 생성하려면:

  • ATTEST_BUILD_ARTIFACTS CI/CD 변수를 true로 설정하세요.
  • 아티팩트가 100 MB를 초과하면 안 돼요.

예를 들어 GitLab은 이 CI/CD job의 아티팩트에 대한 attestation을 생성합니다.

build-job:
  stage: build
  variables:
    ATTEST_BUILD_ARTIFACTS: true
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo "Hello, $GITLAB_USER_LOGIN!" > test.txt
  artifacts:
    paths:
      - test.txt

컨테이너에 대한 attestation 생성

컨테이너에 대한 attestation을 생성하려면:

ATTEST_CONTAINER_IMAGES CI/CD 변수를 true로 설정하세요.

IMAGE_DIGEST 변수를 유효한 SHA256 참조로 설정하세요. 형식은 다음과 같습니다.

sha256:9bf00f5090086aba643d21f8ed663576855add63b7b780b4eaffc5124812c3c9
org/project-name@sha256:9bf00f5090086aba643d21f8ed663576855add63b7b780b4eaffc5124812c3c9
9bf00f5090086aba643d21f8ed663576855add63b7b780b4eaffc5124812c3c9

예를 들어 GitLab은 이 CI/CD job에서 만든 이미지에 대한 attestation을 생성합니다.

build-dockerhub:
  stage: build
  variables:
    ATTEST_CONTAINER_IMAGES: true
    CI_REGISTRY: docker.io
    DOCKER_IMAGE_NAME: sroqueworcel/test-slsa-sbom:stable
  script:
    - echo $DOCKER_REGISTRY_PASSWORD | docker login $CI_REGISTRY -u $DOCKER_REGISTRY_USER --password-stdin
    - docker build -t $DOCKER_IMAGE_NAME .
    - docker push $DOCKER_IMAGE_NAME
    - IMAGE_DIGEST="$(docker inspect --format='{{index .Id}}' "$DOCKER_IMAGE_NAME")"
    - echo "IMAGE_DIGEST=$IMAGE_DIGEST" >> build.env
  artifacts:
    reports:
      dotenv: build.env

attestation 보기

성공한 attestation은 attestations 페이지에 저장돼요. attestation을 보려면:

  • 상단 바에서 Search or go to를 선택해 프로젝트를 찾으세요.
  • 왼쪽 사이드바에서 Build > Attestations를 선택하세요.

attestation이 성공하지 못하면 CI/CD job 로그에 오류가 표시됩니다.

Attestations API로 성공한 attestation을 가져올 수도 있어요.

attestation 확인

glab 명령줄 인터페이스로 아티팩트와 컨테이너를 모두 확인할 수 있어요. 예를 들어:

성공적인 확인:

% glab attestation verify ~/file-or-container -p org/project-name
Artifact provenance successfully verified. Signatures confirm file.txt was attested by org/project-name

실패한 확인:

% glab attestation verify ~/file.txt -p org/project-name

   ERROR

  Unable to find a provenance statement for 1f9e5808a340916aa5618ee13a893dcf9d4f7e2d42a254be0f7eb06a094ab8ea.

더 알아보기 (Learn more)

attestation이 담고 있는 필드의 구조와 의미를 자세히 알고 싶다면 SLSA provenance 사양 문서를 참고하세요. 레벨 2와의 차이를 다시 확인하려면 SLSA 개요 문서로 돌아가 보세요.