검색

3.16. OpenShift Pipelines 공급망 보안을 위해 Tekton Chains 사용

download PDF
중요

Tekton Chains는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

Tekton Chains는 Kubernetes CRD(Custom Resource Definition) 컨트롤러입니다. 이를 사용하여 Red Hat OpenShift Pipelines를 사용하여 생성된 작업 및 파이프라인의 공급망 보안을 관리할 수 있습니다.

기본적으로 Tekton Chains는 OpenShift Container Platform 클러스터에서 모든 작업 실행 실행을 관찰합니다. 작업이 완료되면 Tekton Chains가 작업 실행 스냅샷을 생성합니다. 그런 다음 스냅샷을 하나 이상의 표준 페이로드 형식으로 변환하고 마지막으로 모든 아티팩트를 서명하고 저장합니다.

작업 실행에 대한 정보를 캡처하기 위해 Tekton Chains는 ResultPipelineResource 오브젝트를 사용합니다. 오브젝트를 사용할 수 없는 경우 Tekton은 OCI 이미지의 URL 및 정규화된 다이제스트를 제공합니다.

참고

PipelineResource 오브젝트는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 수동 사용을 위해 Results 오브젝트가 권장됩니다.

3.16.1. 주요 기능

  • cosign 과 같은 암호화 키 유형 및 서비스를 사용하여 작업 실행, 작업 실행 결과 및 OCI 레지스트리 이미지에 서명할 수 있습니다.
  • in-to-to 와 같은 테스트 형식을 사용할 수 있습니다.
  • OCI 리포지토리를 스토리지 백엔드로 사용하여 서명 및 서명된 아티팩트를 안전하게 저장할 수 있습니다.

3.16.2. Red Hat OpenShift Pipelines Operator를 사용하여 Tekton Chains 설치

클러스터 관리자는 TektonChain CR(사용자 정의 리소스)을 사용하여 Tekton Chains를 설치 및 관리할 수 있습니다.

참고

Tekton Chains는 Red Hat OpenShift Pipelines의 선택적 구성 요소입니다. 현재 TektonConfig CR을 사용하여 설치할 수 없습니다.

사전 요구 사항

  • Red Hat OpenShift Pipelines Operator가 클러스터의 openshift-pipelines 네임스페이스에 설치되어 있는지 확인합니다.

절차

  1. OpenShift Container Platform 클러스터에 대한 TektonChain CR을 생성합니다.

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonChain
    metadata:
      name: chain
    spec:
      targetNamespace: openshift-pipelines
  2. TektonChain CR을 적용합니다.

    $ oc apply -f TektonChain.yaml 1
    1
    TektonChain CR의 파일 이름으로 바꿉니다.
  3. 설치 상태를 확인합니다.

    $ oc get tektonchains.operator.tekton.dev

3.16.3. Tekton 체인 구성

Tekton Chains는 openshift-pipelines 네임스페이스에서 구성을 위해 chain-config 라는 ConfigMap 오브젝트를 사용합니다.

Tekton Chains를 구성하려면 다음 예제를 사용하십시오.

예: Tekton 체인 구성

$ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}' 1

1
JSON 페이로드에서 지원되는 키-값 쌍의 조합을 사용합니다.

3.16.3.1. Tekton Chains 구성에 지원되는 키

클러스터 관리자는 다양한 지원되는 키와 값을 사용하여 작업 실행, OCI 이미지 및 스토리지에 대한 사양을 구성할 수 있습니다.

3.16.3.1.1. 작업 실행에 지원되는 키
표 3.13. 체인 구성: 작업 실행에 지원되는 키
지원되는 키설명지원되는 값기본값

artifacts.taskrun.format

작업 실행 페이로드를 저장할 형식입니다.

tekton, in-toto

tekton

artifacts.taskrun.storage

작업 실행 서명을 위한 스토리지 백엔드입니다. 여러 백엔드를 "tekton,oci" 와 같이 쉼표로 구분된 목록으로 지정할 수 있습니다. 이 아티팩트를 비활성화하려면 빈 문자열 "" 을 제공합니다.

tekton, oci

tekton

artifacts.taskrun.signer

작업에 서명하기 위한 서명 백엔드는 페이로드를 실행합니다.

x509

x509

3.16.3.1.2. OCI에서 지원되는 키
표 3.14. 체인 구성: OCI에 지원되는 키
지원되는 키설명지원되는 값기본값

artifacts.oci.format

OCI 페이로드를 저장할 형식입니다.

Shosigning

Shosigning

artifacts.oci.storage

OCI 서명용 스토리지 백엔드입니다. 여러 백엔드를 "oci,tekton" 와 같이 쉼표로 구분된 목록으로 지정할 수 있습니다. OCI 아티팩트를 비활성화하려면 빈 문자열 "" 을 제공합니다.

tekton, oci

oci

artifacts.oci.signer

OCI 페이로드에 서명할 서명 백엔드입니다.

x509, cosign

x509

3.16.3.1.3. 스토리지에 지원되는 키
표 3.15. 체인 구성: 스토리지에 지원되는 키
지원되는 키설명지원되는 값기본값

artifacts.oci.repository

OCI 서명을 저장할 OCI 리포지토리입니다.

현재 Chains는 내부 OpenShift OCI 레지스트리만 지원합니다. Quay 와 같은 다른 많이 사용되는 옵션은 지원되지 않습니다.

 

3.16.4. Tekton 체인의 보안 서명

클러스터 관리자는 키 쌍을 생성하고 Tekton Chains를 사용하여 Kubernetes 시크릿을 사용하여 아티팩트에 서명할 수 있습니다. Tekton Chains가 작동하려면 개인 키와 암호화된 키의 암호가 openshift-pipelines 네임스페이스에 signing-secrets Kubernetes 시크릿의 일부로 있어야 합니다.

현재 Tekton Chains는 x509cosign 서명 체계를 지원합니다.

참고

지원되는 서명 체계 중 하나만 사용하십시오.

3.16.4.1. x509를 사용한 서명

Tekton Chains와 함께 x509 서명 스키마를 사용하려면 signing-secrets Kubernetes 시크릿에 ed25519 또는 ecdsa 유형의 x509.pem 개인 키를 저장합니다. 키가 암호화되지 않은 PKCS8 PEM 파일(BEGIN PRIVATE KEY)으로 저장되었는지 확인합니다.

3.16.4.2. cosign을 사용하여 서명

Tekton Chains와 함께 cosign 서명 스키마를 사용하려면 다음을 수행합니다.

  1. cosign 을 설치합니다.
  2. cosign.keycosign.pub 키 쌍을 생성합니다.

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets

    cosign은 암호를 입력하라는 메시지를 표시하고 Kubernetes 시크릿을 생성합니다.

  3. 암호화된 cosign.key 개인 키와 cosign.password 암호 해독 암호를 signing-secrets Kubernetes 보안에 저장합니다. 개인 키가 ENCRYPTED COSIGND PRIVATE KEY 유형의 암호화된 PEM 파일로 저장되었는지 확인합니다.

3.16.4.3. 서명 문제 해결

서명 보안이 이미 채워져 있으면 다음 오류가 발생할 수 있습니다.

Error from server (AlreadyExists): secrets "signing-secrets" already exists

오류를 해결하려면 다음을 수행합니다.

  1. 시크릿을 삭제합니다.

    $ oc delete secret signing-secrets -n openshift-pipelines
  2. 키 쌍을 다시 생성하고 선호하는 서명 스키마를 사용하여 시크릿에 저장합니다.

3.16.5. OCI 레지스트리에 인증

클러스터 관리자는 서명을 OCI 레지스트리로 푸시하기 전에 레지스트리에 인증하도록 Tekton Chains를 구성해야 합니다. Tekton Chains 컨트롤러는 작업이 실행되는 동일한 서비스 계정을 사용합니다. OCI 레지스트리로 서명을 내보내는 데 필요한 인증 정보를 사용하여 서비스 계정을 설정하려면 다음 단계를 수행합니다.

절차

  1. Kubernetes 서비스 계정의 네임스페이스 및 이름을 설정합니다.

    $ export NAMESPACE=<namespace> 1
    $ export SERVICE_ACCOUNT_NAME=<service_account> 2
    1
    서비스 계정과 연결된 네임스페이스입니다.
    2
    서비스 계정의 이름입니다.
  2. Kubernetes 시크릿을 생성합니다.

    $ oc create secret registry-credentials \
      --from-file=.dockerconfigjson \ 1
      --type=kubernetes.io/dockerconfigjson \
      -n $NAMESPACE
    1
    Docker 구성 파일의 경로로 바꿉니다. 기본 경로는 ~/.docker/config.json 입니다.
  3. 시크릿에 대한 서비스 계정 액세스 권한을 부여합니다.

    $ oc patch serviceaccount $SERVICE_ACCOUNT_NAME \
      -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE

    Red Hat OpenShift Pipelines가 모든 작업 실행에 할당한 기본 파이프라인 서비스 계정을 패치하면 Red Hat OpenShift Pipelines Operator가 서비스 계정을 재정의합니다. 모범 사례로 다음 단계를 수행할 수 있습니다.

    1. 별도의 서비스 계정을 생성하여 사용자의 작업 실행에 할당합니다.

      $ oc create serviceaccount <service_account_name>
    2. 작업 실행 템플릿에서 serviceaccountname 필드의 값을 설정하여 서비스 계정을 작업 실행에 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
      name: build-push-task-run-2
      spec:
      serviceAccountName: build-bot 1
      taskRef:
        name: build-push
      ...
      1
      새로 생성된 서비스 계정 이름으로 바꿉니다.

3.16.5.1. 추가 인증 없이 작업 실행 서명 생성 및 확인

추가 인증이 있는 Tekton Chains를 사용하여 작업 실행 서명을 확인하려면 다음 작업을 수행합니다.

  • 암호화된 x509 키 쌍을 생성하고 Kubernetes 시크릿으로 저장합니다.
  • Tekton Chains 백엔드 스토리지를 구성합니다.
  • 작업 실행을 생성하고 서명하고, 페이로드를 작업 실행 자체에 주석으로 저장합니다.
  • 서명된 작업 실행에서 서명 및 페이로드를 검색합니다.
  • 작업 실행의 서명을 확인합니다.

사전 요구 사항

다음 사항이 클러스터에 설치되어 있는지 확인합니다.

  • Red Hat OpenShift Pipelines Operator
  • Tekton Chains
  • cosign

절차

  1. 암호화된 x509 키 쌍을 생성하고 Kubernetes 시크릿으로 저장합니다.

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets

    메시지가 표시되면 암호를 입력합니다. cosign은 생성된 개인 키를 openshift-pipelines 네임스페이스에 signing-secrets Kubernetes 시크릿의 일부로 저장합니다.

  2. Tekton Chains 구성에서 OCI 스토리지를 비활성화하고 작업 실행 스토리지 및 형식을 tekton 로 설정합니다.

    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}'
  3. Tekton Chains 컨트롤러를 다시 시작하여 수정된 구성이 적용되었는지 확인합니다.

    $ oc delete po -n openshift-pipelines -l app=tekton-chains-controller
  4. 작업 실행을 생성합니다.

    $ oc create -f https://raw.githubusercontent.com/tektoncd/chains/main/examples/taskruns/task-output-image.yaml 1
    taskrun.tekton.dev/build-push-run-output-image-qbjvh created
    1
    작업 실행을 가리키는 URI 또는 파일 경로로 바꿉니다.
  5. 단계 상태를 확인하고 프로세스가 완료될 때까지 기다립니다.

    $ tkn tr describe --last
    [...truncated output...]
    NAME                            STATUS
    ∙ create-dir-builtimage-9467f   Completed
    ∙ git-source-sourcerepo-p2sk8   Completed
    ∙ build-and-push                Completed
    ∙ echo                          Completed
    ∙ image-digest-exporter-xlkn7   Completed
  6. base64 로 인코딩된 주석으로 저장된 오브젝트에서 서명 및 페이로드를 검색합니다.

    $ export TASKRUN_UID=$(tkn tr describe --last -o  jsonpath='{.metadata.uid}')
    $ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" > signature
    $ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/payload-taskrun-$TASKRUN_UID}" | base64 -d > payload
  7. 서명을 확인합니다.

    $ cosign verify-blob --key k8s://openshift-pipelines/signing-secrets --signature ./signature ./payload
    Verified OK

3.16.6. Tekton Chains를 사용하여 이미지 및 검증에 서명 및 검증

클러스터 관리자는 다음 작업을 수행하여 Tekton Chains를 사용하여 이미지 및 검증에 서명하고 확인할 수 있습니다.

  • 암호화된 x509 키 쌍을 생성하고 Kubernetes 시크릿으로 저장합니다.
  • 이미지, 이미지 서명 및 서명된 이미지 attestations를 저장할 OCI 레지스트리에 대한 인증을 설정합니다.
  • 자격 증명을 생성하고 서명하도록 Tekton Chains를 구성합니다.
  • 작업 실행에 Kaniko를 사용하여 이미지를 만듭니다.
  • 서명된 이미지 및 서명된 출처를 확인합니다.

사전 요구 사항

다음 사항이 클러스터에 설치되어 있는지 확인합니다.

  • Red Hat OpenShift Pipelines Operator
  • Tekton Chains
  • cosign
  • Rekor
  • jq

절차

  1. 암호화된 x509 키 쌍을 생성하고 Kubernetes 시크릿으로 저장합니다.

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets

    메시지가 표시되면 암호를 입력합니다. cosign은 생성된 개인 키를 openshift-pipelines 네임스페이스에 signing-secrets Kubernetes 시크릿의 일부로 저장하고 공개 키를 cosign.pub 로컬 파일에 씁니다.

  2. 이미지 레지스트리에 대한 인증을 구성합니다.

    1. OCI 레지스트리로 서명을 푸시하기 위해 Tekton Chains 컨트롤러를 구성하려면 작업 실행의 서비스 계정과 연결된 인증 정보를 사용합니다. 자세한 내용은 " OCI 레지스트리 인증" 섹션을 참조하십시오.
    2. 이미지를 레지스트리에 빌드하고 푸시하는 Kaniko 작업에 대한 인증을 구성하려면 필요한 인증 정보가 포함된 docker config.json 파일의 Kubernetes 시크릿을 생성합니다.

      $ oc create secret generic <docker_config_secret_name> \ 1
        --from-file <path_to_config.json> 2
      1
      docker config secret 이름으로 바꿉니다.
      2
      docker config.json 파일의 경로로 바꿉니다.
  3. chain-config 오브젝트에서 artifacts.taskrun.format,artifacts.taskrun.storagetransparency.enabled 매개변수를 설정하여 Tekton Chains를 구성합니다.

    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.format": "in-toto"}}'
    
    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.storage": "oci"}}'
    
    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"transparency.enabled": "true"}}'
  4. Kaniko 작업을 시작합니다.

    1. Kaniko 작업을 클러스터에 적용합니다.

      $ oc apply -f examples/kaniko/kaniko.yaml 1
      1
      Kaniko 작업의 URI 또는 파일 경로를 사용합니다.
    2. 적절한 환경 변수를 설정합니다.

      $ export REGISTRY=<url_of_registry> 1
      
      $ export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json> 2
      1
      이미지를 푸시하려는 레지스트리의 URL로 바꿉니다.
      2
      docker config.json 파일에서 보안 이름으로 바꿉니다.
    3. Kaniko 작업을 시작합니다.

      $ tkn task start --param IMAGE=$REGISTRY/kaniko-chains --use-param-defaults --workspace name=source,emptyDir="" --workspace name=dockerconfig,secret=$DOCKERCONFIG_SECRET_NAME kaniko-chains

      모든 단계가 완료될 때까지 이 작업의 로그를 관찰합니다. 인증에 성공하면 최종 이미지가 $REGISTRY/kaniko-chains 로 푸시됩니다.

  5. Tekton Chains가 provenance를 생성하고 서명할 때까지 잠시 기다린 다음 작업 실행에서 chain.tekton.dev/signed=true 주석의 가용성을 확인합니다.

    $ oc get tr <task_run_name> \ 1
    -o json | jq -r .metadata.annotations
    
    {
      "chains.tekton.dev/signed": "true",
      ...
    }
    1
    을 작업 실행 이름으로 바꿉니다.
  6. 이미지와 테스트 결과를 확인합니다.

    $ cosign verify --key cosign.pub $REGISTRY/kaniko-chains
    
    $ cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
  7. Rekor에서 이미지의 출처를 찾으십시오.

    1. $REGISTRY/kaniko-chains 이미지의 다이제스트를 가져옵니다. 작업 실행으로 검색하거나 이미지를 가져와 다이제스트를 추출할 수 있습니다.
    2. Rekor를 검색하여 이미지의 sha256 다이제스트와 일치하는 모든 항목을 찾습니다.

      $ rekor-cli search --sha <image_digest> 1
      
      <uuid_1> 2
      <uuid_2> 3
      ...
      1
      이미지의 sha256 다이제스트로 바꿉니다.
      2
      첫 번째로 일치하는 UUID(Universally unique identifier)입니다.
      3
      두 번째 일치 UUID입니다.

      검색 결과에 일치하는 항목의 UUID가 표시됩니다. 이러한 UUID 중 하나가 attestation을 갖습니다.

    3. 테스트 결과를 확인하십시오.

      $ rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq

3.16.7. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.