SLSA provenance 사양

SLSA provenance 사양

GitLab이 생성하는 SLSA 레벨 3 provenance attestation이 정확히 어떤 구조인지, buildType 참조가 무엇을 의미하는지 궁금할 수 있어요. 이 문서는 GitLab SLSA provenance 문의 특정 필드를 소비자가 파싱할 때 참고할 수 있도록, SLSA 사양이 요구하는 buildType 참조를 설명합니다. 참고로 이 기능은 아직 실험(Experiment) 상태입니다.

출처: 문서

본문

  • Tier: Ultimate

  • Offering: GitLab.com

  • Status: Experiment

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

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

SLSA provenance 사양buildType 참조가 문서화되고 게시되도록 요구합니다. 이 참조는 GitLab SLSA provenance 문에만 있는 특정 필드를 파싱할 때 GitLab SLSA attestation 소비자를 돕기 위한 것입니다.

자세한 내용은 SLSA buildType 문서를 참고하세요.

buildType

이 공식 SLSA Provenance buildType 참조는:

  • GitLab CI/CD job의 실행을 설명해요.
  • GitLab이 호스팅하고 유지 관리합니다.

설명

이 buildType은 소프트웨어 아티팩트를 빌드하는 워크플로의 실행을 설명해요.

소비자는 인식할 수 없는 외부 파라미터를 무시해야 합니다. 어떤 변경도 기존 외부 파라미터의 의미를 바꾸면 안 됩니다.

외부 파라미터

외부 파라미터는 다음과 같아요.

| 필드 | 값 | | source | 프로젝트의 URL | | entryPoint | 빌드를 트리거한 CI/CD job의 이름 | | variables | 빌드를 위한 다음 CI/CD 변수의 값: CI_PIPELINE_ID, CI_PIPELINE_URL, CI_JOB_ID, CI_JOB_URL, CI_JOB_NAME, CI_PROJECT_ID, CI_PROJECT_NAME |

내부 파라미터

기본적으로 채워지는 내부 파라미터는 다음과 같아요.

| 필드 | 값 | | name | 러너의 이름 | | executor | 러너의 executor | | architecture | CI/CD job이 실행되는 아키텍처 | | job | 빌드를 트리거한 CI/CD job의 ID |

예제

이 예제는 GitLab이 생성한 provenance 문의 형식을 보여줍니다.

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [
    {
      "name": "artifacts.zip",
      "digest": {
        "sha256": "717a1ee89f0a2829cf5aad57054c83615675b04baa913bdc19999d7519edf3f2"
      }
    }
  ],
  "predicateType": "https://slsa.dev/provenance/v1",
  "predicate": {
    "buildDefinition": {
      "buildType": "<Link to Build Type>",
      "externalParameters": {
        "source": "http://gdk.test:3000/root/repo_name",
        "entryPoint": "build-job",
        "variables": {
          "CI_PIPELINE_ID": "576",
          "CI_PIPELINE_URL": "http://gdk.test:3000/root/repo_name/-/pipelines/576",
          "CI_JOB_ID": "412",
          "CI_JOB_URL": "http://gdk.test:3000/root/repo_name/-/jobs/987",
          "CI_JOB_NAME": "job_name",
          "CI_PROJECT_ID": "123",
          "CI_PROJECT_NAME": "repo_name",
        }
      },
      "internalParameters": {
        "architecture": "arm64",
        "executor": "docker",
        "job": 412,
        "name": "9-mfdkBG"
      },
      "resolvedDependencies": [
        {
          "uri": "http://gdk.test:3000/root/repo_name",
          "digest": {
            "gitCommit": "a288201509dd9a85da4141e07522bad412938dbe"
          }
        }
      ]
    },
    "runDetails": {
      "builder": {
        "id": "http://gdk.test:3000/groups/user/-/runners/33",
        "version": {
          "gitlab-runner": "4d7093e1"
        }
      },
      "metadata": {
        "invocationId": 412,
        "startedOn": "2025-06-05T01:33:18Z",
        "finishedOn": "2025-06-05T01:33:23Z"
      }
    }
  }
}

더 알아보기 (Learn more)

attestation을 실제로 생성하고 확인하는 방법이 궁금하다면 SLSA 레벨 3 문서를 참고하세요. SLSA 전반의 레벨 체계는 SLSA 개요 문서에서 확인할 수 있어요.