OpenShift Pipelines 보안


Red Hat OpenShift Pipelines 1.10

OpenShift Pipelines의 보안 기능

Red Hat OpenShift Documentation Team

초록

이 문서에서는 OpenShift Pipelines의 보안 기능에 대한 정보를 제공합니다.

1장. OpenShift Pipelines 공급망 보안에 Tekton 체인 사용

중요

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

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

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

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

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

참고

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

1.1. 주요 기능

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

1.2. Red Hat OpenShift Pipelines Operator를 사용하여 Tekton 체인 설치

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

참고

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

사전 요구 사항

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

프로세스

  1. Red Hat OpenShift Pipelines 클러스터에 대한 Tekton Cryostat CR을 생성합니다.

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonChain
    metadata:
      name: chain
    spec:
      targetNamespace: openshift-pipelines
    Copy to Clipboard Toggle word wrap
  2. Tekton Cryostat CR을 적용합니다.

    $ oc apply -f TektonChain.yaml 
    1
    Copy to Clipboard Toggle word wrap
    1
    Tekton Cryostat CR의 파일 이름으로 대체합니다.
  3. 설치 상태를 확인합니다.

    $ oc get tektonchains.operator.tekton.dev
    Copy to Clipboard Toggle word wrap

1.3. Tekton 체인 구성

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

Tekton 체인을 구성하려면 다음 예제를 사용합니다.

예: Tekton 체인 구성

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

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

1.3.1. Tekton 체인 구성에 지원되는 키

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

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

artifacts.taskrun.format

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

Tekton , in-to

Tekton

artifacts.taskrun.storage

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

Tekton,oci

Tekton

artifacts.taskrun.signer

작업 실행 페이로드에 서명할 서명 백엔드입니다.

x509

x509

1.3.1.2. OCI에 지원되는 키
Expand
표 1.2. 체인 구성: OCI에 대해 지원되는 키
지원되는 키설명지원되는 값기본값

artifacts.oci.format

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

단순 서명

단순 서명

artifacts.oci.storage

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

Tekton,oci

OCI

artifacts.oci.signer

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

x509, cosign

x509

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

artifacts.oci.repository

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

현재 체인은 내부 OpenShift OCI 레지스트리만 지원합니다. Quay 와 같은 기타 널리 사용되는 옵션은 지원되지 않습니다.

 

1.4. Tekton 체인의 보안 서명

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

현재 Tekton 체인은 x509cosign 서명 스키마를 지원합니다.

참고

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

1.4.1. x509를 사용하여 서명

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

1.4.2. cosign을 사용하여 서명

Tekton 체인에서 cosign 서명 스키마를 사용하려면 다음을 수행합니다.

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

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
    Copy to Clipboard Toggle word wrap

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

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

1.4.3. 서명 문제 해결

서명 보안이 이미 채워지면 다음과 같은 오류가 발생할 수 있습니다.

Error from server (AlreadyExists): secrets "signing-secrets" already exists
Copy to Clipboard Toggle word wrap

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

  1. 보안을 삭제합니다.

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

1.5. OCI 레지스트리에 인증

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

프로세스

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

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

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

    $ oc patch serviceaccount $SERVICE_ACCOUNT_NAME \
      -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE
    Copy to Clipboard Toggle word wrap

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

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

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

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

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

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

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

사전 요구 사항

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

  • Red Hat OpenShift Pipelines Operator
  • Tekton 체인
  • cosign

프로세스

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

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
    Copy to Clipboard Toggle word wrap

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

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

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

    $ oc delete po -n openshift-pipelines -l app=tekton-chains-controller
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
    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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  7. 서명을 확인합니다.

    $ cosign verify-blob --key k8s://openshift-pipelines/signing-secrets --signature ./signature ./payload
    Verified OK
    Copy to Clipboard Toggle word wrap

1.6. Tekton Chain을 사용하여 이미지와 검증에 서명 및 확인

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

  • 암호화된 x509 키 쌍을 생성하여 Kubernetes 시크릿으로 저장합니다.
  • 이미지, 이미지 서명 및 서명된 이미지 테스트를 저장하기 위해 OCI 레지스트리에 대한 인증을 설정합니다.
  • 검증 정보를 생성하고 서명하도록 Tekton 체인을 구성합니다.
  • 작업 실행에 Kaniko로 이미지를 생성합니다.
  • 서명된 이미지와 서명된 인증서를 확인합니다.

사전 요구 사항

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

  • Red Hat OpenShift Pipelines Operator
  • Tekton 체인
  • cosign
  • Rekor
  • jq

프로세스

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

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
    Copy to Clipboard Toggle word wrap

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

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

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

      $ oc create secret generic <docker_config_secret_name> \ 
      1
      
        --from-file <path_to_config.json> 
      2
      Copy to Clipboard Toggle word wrap
      1
      docker config secret 이름으로 대체합니다.
      2
      docker config.json 파일의 경로로 바꿉니다.
  3. chain-config 개체에서 artifacts.taskrun.format,artifacts.taskrun.storagetransparency.enabled 매개변수를 설정하여 Tekton 체인을 구성합니다.

    $ 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"}}'
    Copy to Clipboard Toggle word wrap
  4. Kaniko 작업을 시작합니다.

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

      $ oc apply -f examples/kaniko/kaniko.yaml 
      1
      Copy to Clipboard Toggle word wrap
      1
      Kaniko 작업의 URI 또는 파일 경로로 바꿉니다.
    2. 적절한 환경 변수를 설정합니다.

      $ export REGISTRY=<url_of_registry> 
      1
      
      
      $ export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json> 
      2
      Copy to Clipboard Toggle word wrap
      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
      Copy to Clipboard Toggle word wrap

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

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

    $ oc get tr <task_run_name> \ 
    1
    
    -o json | jq -r .metadata.annotations
    
    {
      "chains.tekton.dev/signed": "true",
      ...
    }
    Copy to Clipboard Toggle word wrap
    1
    작업 실행 이름으로 대체합니다.
  6. 이미지와 인증을 확인합니다.

    $ cosign verify --key cosign.pub $REGISTRY/kaniko-chains
    
    $ cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
    Copy to Clipboard Toggle word wrap
  7. Rekor에서 이미지의 출처를 확인합니다.

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

      $ rekor-cli search --sha <image_digest> 
      1
      
      
      <uuid_1> 
      2
      
      <uuid_2> 
      3
      
      ...
      Copy to Clipboard Toggle word wrap
      1
      이미지를 sha256 다이제스트로 대체합니다.
      2
      첫 번째 일치는 UUID(Universally unique identifier)입니다.
      3
      두 번째 일치하는 UUID입니다.

      검색 결과에는 일치하는 항목의 UUID가 표시됩니다. 해당 UUID 중 하나에 인증 정보가 있습니다.

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

      $ rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq
      Copy to Clipboard Toggle word wrap

2장. 권한 있는 보안 컨텍스트에서 Pod 사용

OpenShift Pipelines 1.3.x 이상 버전의 기본 구성에서는 파이프라인 실행 또는 작업 실행으로 인해 pod가 실행된 경우 권한 있는 보안 컨텍스트로 Pod를 실행할 수 없습니다. 이러한 Pod의 경우 기본 서비스 계정은 pipeline 이며 파이프라인 서비스 계정과 연결된 SCC(보안 컨텍스트 제약 조건)는 pipelines-scc 입니다. pipelines-scc SCC는 anyuid SCC와 유사하지만 파이프라인 SCC의 YAML 파일에 정의된 것과 약간의 차이점이 있습니다.

pipelines-scc.yaml 스니펫 예

apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
...
allowedCapabilities:
  - SETFCAP
...
fsGroup:
  type: MustRunAs
...
Copy to Clipboard Toggle word wrap

또한 OpenShift Pipelines의 일부로 제공되는 Buildah 클러스터 작업은 vfs 를 기본 스토리지 드라이버로 사용합니다.

프로세스

privileged있는 보안 컨텍스트를 사용하여 Pod(파이프라인 실행 또는 작업 실행)를 실행하려면 다음 수정 작업을 수행합니다.

  • 명시적 SCC를 갖도록 연결된 사용자 계정 또는 서비스 계정을 구성합니다. 다음 방법을 사용하여 구성을 수행할 수 있습니다.

    • 다음 명령을 실행합니다.

      $ oc adm policy add-scc-to-user <scc-name> -z <service-account-name>
      Copy to Clipboard Toggle word wrap
    • 또는 RoleBindingRole 또는 ClusterRole에 대한 YAML 파일을 수정합니다.

      RoleBinding 오브젝트의 예

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: service-account-name 
      1
      
        namespace: default
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: pipelines-scc-clusterrole 
      2
      
      subjects:
      - kind: ServiceAccount
        name: pipeline
        namespace: default
      Copy to Clipboard Toggle word wrap

      1
      적절한 서비스 계정 이름으로 바꿉니다.
      2
      사용하는 역할 바인딩에 따라 적절한 클러스터 역할로 바꿉니다.

      ClusterRole 오브젝트의 예

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: pipelines-scc-clusterrole 
      1
      
      rules:
      - apiGroups:
        - security.openshift.io
        resourceNames:
        - nonroot
        resources:
        - securitycontextconstraints
        verbs:
        - use
      Copy to Clipboard Toggle word wrap

      1
      사용하는 역할 바인딩에 따라 적절한 클러스터 역할로 바꿉니다.
    참고

    기본 YAML 파일의 복사본을 만들고 중복 파일을 변경하는 것이 좋습니다.

  • vfs 스토리지 드라이버를 사용하지 않는 경우 작업 실행 또는 파이프라인 실행과 연결된 서비스 계정을 구성하여 권한 있는 SCC를 구성하고 보안 컨텍스트를 privileged: true로 설정합니다.

기본 파이프라인 서비스 계정과 연결된 pipelines -scc SCC(보안 컨텍스트 제약 조건)를 사용하는 경우 파이프라인 실행 및 작업 실행 Pod가 시간 초과에 직면할 수 있습니다. 이는 기본 pipelines-scc SCC에서 fsGroup.type 매개변수가 MustRunAs 로 설정되어 있기 때문에 발생합니다.

참고

Pod 시간 초과에 대한 자세한 내용은 BZ#1995779 를 참조하십시오.

Pod 시간 초과를 방지하려면 fsGroup.type 매개변수를 RunAsAny 로 설정하여 사용자 지정 SCC를 생성하고 사용자 지정 서비스 계정과 연결할 수 있습니다.

참고

가장 좋은 방법은 파이프라인 실행 및 작업 실행을 위해 사용자 정의 SCC 및 사용자 정의 서비스 계정을 사용합니다. 이 접근 방식을 사용하면 유연성이 향상되고 업그레이드 중에 기본값이 수정될 때 실행이 중단되지 않습니다.

프로세스

  1. fsGroup.type 매개변수를 RunAsAny 로 설정하여 사용자 지정 SCC를 정의합니다.

    예: 사용자 정의 SCC

    apiVersion: security.openshift.io/v1
    kind: SecurityContextConstraints
    metadata:
      annotations:
        kubernetes.io/description: my-scc is a close replica of anyuid scc. pipelines-scc has fsGroup - RunAsAny.
      name: my-scc
    allowHostDirVolumePlugin: false
    allowHostIPC: false
    allowHostNetwork: false
    allowHostPID: false
    allowHostPorts: false
    allowPrivilegeEscalation: true
    allowPrivilegedContainer: false
    allowedCapabilities: null
    defaultAddCapabilities: null
    fsGroup:
      type: RunAsAny
    groups:
    - system:cluster-admins
    priority: 10
    readOnlyRootFilesystem: false
    requiredDropCapabilities:
    - MKNOD
    runAsUser:
      type: RunAsAny
    seLinuxContext:
      type: MustRunAs
    supplementalGroups:
      type: RunAsAny
    volumes:
    - configMap
    - downwardAPI
    - emptyDir
    - persistentVolumeClaim
    - projected
    - secret
    Copy to Clipboard Toggle word wrap

  2. 사용자 지정 SCC를 생성합니다.

    예: my-scc SCC 생성

    $ oc create -f my-scc.yaml
    Copy to Clipboard Toggle word wrap

  3. 사용자 정의 서비스 계정을 생성합니다.

    예: fsgroup-runasany 서비스 계정 생성

    $ oc create serviceaccount fsgroup-runasany
    Copy to Clipboard Toggle word wrap

  4. 사용자 지정 SCC를 사용자 지정 서비스 계정과 연결합니다.

    예: my-scc SCC를 fsgroup-runasany 서비스 계정과 연결

    $ oc adm policy add-scc-to-user my-scc -z fsgroup-runasany
    Copy to Clipboard Toggle word wrap

    권한 있는 작업에 사용자 정의 서비스 계정을 사용하려면 다음 명령을 실행하여 권한 있는 SCC를 사용자 정의 서비스 계정과 연결할 수 있습니다.

    예: 권한 있는 SCC를 fsgroup-runasany 서비스 계정에 연결

    $ oc adm policy add-scc-to-user privileged -z fsgroup-runasany
    Copy to Clipboard Toggle word wrap

  5. 파이프라인 실행 및 작업 실행에서 사용자 정의 서비스 계정을 사용합니다.

    예: 파이프라인은 fsgroup-runasany 사용자 지정 서비스 계정으로 YAML을 실행합니다.

    apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      name: <pipeline-run-name>
    spec:
      pipelineRef:
        name: <pipeline-cluster-task-name>
      serviceAccountName: 'fsgroup-runasany'
    Copy to Clipboard Toggle word wrap

    예: 작업에서는 fsgroup-runasany 사용자 지정 서비스 계정으로 YAML을 실행합니다.

    apiVersion: tekton.dev/v1beta1
    kind: TaskRun
    metadata:
      name: <task-run-name>
    spec:
      taskRef:
        name: <cluster-task-name>
      serviceAccountName: 'fsgroup-runasany'
    Copy to Clipboard Toggle word wrap

3장. 이벤트 리스너로 Webhook 보안

관리자는 이벤트 리스너를 사용하여 Webhook를 보호할 수 있습니다. 네임스페이스를 생성한 후 네임스페이스에 operator.tekton.dev/enable-annotation=enabled 레이블을 추가하여 Eventlistener 리소스의 HTTPS를 활성화합니다. 그런 다음 재암호화 TLS 종료를 사용하여 Trigger 리소스 및 보안 경로를 생성합니다.

Red Hat OpenShift Pipelines에서 트리거는 Eventlistener 리소스에 대한 비보안 HTTP 및 보안 HTTPS 연결을 모두 지원합니다. HTTPS는 클러스터 내부 및 외부의 연결을 보호합니다.

Red Hat OpenShift Pipelines는 네임스페이스의 레이블을 감시하는 tekton-operator-proxy-webhook Pod를 실행합니다. 네임스페이스에 라벨을 추가하면 Webhook에서 EventListener 오브젝트에 service.beta.openshift.io/serving-cert-secret-name=<secret_name> 주석을 설정합니다. 이를 통해 시크릿과 필수 인증서를 생성합니다.

service.beta.openshift.io/serving-cert-secret-name=<secret_name>
Copy to Clipboard Toggle word wrap

또한 생성된 시크릿을 Eventlistener pod 마운트하여 요청을 보호할 수 있습니다.

3.1. OpenShift 경로와의 보안 연결 제공

재암호화 TLS 종료로 경로를 생성합니다.

$ oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
Copy to Clipboard Toggle word wrap

또는 재암호화된 TLS 종료 YAML 파일을 만들어 보안 경로를 만들 수도 있습니다.

보안 경로를 생성하기 위해 TLS 종료 YAML을 재암호화하는 예

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: route-passthrough-secured  
1

spec:
  host: <hostname>
  to:
    kind: Service
    name: frontend 
2

  tls:
    termination: reencrypt 
3

    key: [as in edge termination]
    certificate: [as in edge termination]
    caCertificate: [as in edge termination]
    destinationCACertificate: |- 
4

      -----BEGIN CERTIFICATE-----
      [...]
      -----END CERTIFICATE-----
Copy to Clipboard Toggle word wrap

1 2
63자로 제한되는 개체의 이름입니다.
3
종료 필드는 reencrypt로 설정됩니다. 이 필드는 유일한 필수 TLS 필드입니다.
4
이는 재암호화에 필요합니다. destinationCACertificate 필드는 엔드포인트 인증서의 유효성을 검사하고 라우터에서 대상 pod로의 연결을 보호합니다. 다음 시나리오 중 하나에서 이 필드를 생략할 수 있습니다.
  • 서비스는 서비스 서명 인증서를 사용합니다.
  • 관리자는 라우터의 기본 CA 인증서를 지정하고 서비스에는 해당 CA에서 서명한 인증서가 있습니다.

oc create route reencrypt --help 명령을 실행하여 더 많은 옵션을 표시할 수 있습니다.

3.2. 보안 HTTPS 연결을 사용하여 샘플 EventListener 리소스 생성

이 섹션에서는 pipelines-tutorial 예제를 사용하여 보안 HTTPS 연결을 사용하여 샘플 EventListener 리소스 생성을 만드는 방법을 보여줍니다.

프로세스

  1. pipelines-tutorial 리포지토리에서 사용 가능한 YAML 파일에서 TriggerBinding 리소스를 생성합니다.

    $ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/01_binding.yaml
    Copy to Clipboard Toggle word wrap
  2. pipelines-tutorial 리포지토리에서 직접 TriggerTemplate 리소스를 생성합니다.

    $ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/02_template.yaml
    Copy to Clipboard Toggle word wrap
  3. pipelines-tutorial 리포지토리에서 직접 Trigger 리소스를 생성합니다.

    $ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/03_trigger.yaml
    Copy to Clipboard Toggle word wrap
  4. 보안 HTTPS 연결을 사용하여 EventListener 리소스를 생성합니다.

    1. Eventlistener 리소스에 대한 보안 HTTPS 연결을 활성화하려면 레이블을 추가합니다.

      $ oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabled
      Copy to Clipboard Toggle word wrap
    2. pipelines-tutorial 리포지토리에서 사용 가능한 YAML 파일에서 EventListener 리소스를 생성합니다.

      $ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/04_event_listener.yaml
      Copy to Clipboard Toggle word wrap
    3. 재암호화 TLS 종료로 경로를 생성합니다.

      $ oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
      Copy to Clipboard Toggle word wrap

4장. git 보안을 사용하여 파이프라인 인증

Git 시크릿은 Git 리포지토리와 안전하게 상호 작용하는 인증 정보로 구성되며 인증을 자동화하는 데 자주 사용됩니다. Red Hat OpenShift Pipelines에서는 Git 시크릿을 사용하여 실행 중에 Git 리포지토리와 상호 작용하는 파이프라인 실행 및 작업 실행을 인증할 수 있습니다.

파이프라인 실행 또는 작업 실행에서는 연결된 서비스 계정을 통해 시크릿에 액세스할 수 있습니다. OpenShift Pipelines는 기본 인증 및 SSH 기반 인증을 위해 Git 보안을 주석(키-값 쌍)으로 사용하도록 지원합니다.

4.1. 인증 정보 선택

파이프라인 실행 또는 작업 실행에는 다른 Git 리포지토리에 액세스하려면 여러 인증이 필요할 수 있습니다. OpenShift Pipelines에서 인증 정보를 사용할 수 있는 도메인으로 각 보안에 주석을 답니다.

Git 보안에 대한 인증 정보 주석 키는 tekton.dev/git- 로 시작해야 하며, 해당 값은 OpenShift Pipelines에서 해당 인증 정보를 사용할 호스트의 URL입니다.

다음 예에서 OpenShift Pipelines는 사용자 이름과 암호를 사용하는 basic-auth 시크릿을 사용하여 github.comgitlab.com 의 리포지토리에 액세스합니다.

예: 기본 인증을 위한 여러 인증 정보

apiVersion: v1
kind: Secret
metadata:
  annotations:
    tekton.dev/git-0: github.com
    tekton.dev/git-1: gitlab.com
type: kubernetes.io/basic-auth
stringData:
  username: <username> 
1

  password: <password> 
2
Copy to Clipboard Toggle word wrap

1
리포지토리의 사용자 이름
2
리포지토리의 암호 또는 개인 액세스 토큰

ssh-auth 시크릿(개인 키)을 사용하여 Git 리포지토리에 액세스할 수도 있습니다.

예: SSH 기반 인증을 위한 개인 키

apiVersion: v1
kind: Secret
metadata:
  annotations:
    tekton.dev/git-0: https://github.com
type: kubernetes.io/ssh-auth
stringData:
  ssh-privatekey: 
1
Copy to Clipboard Toggle word wrap

1
SSH 개인 키 파일의 내용입니다.

4.2. Git의 기본 인증 구성

암호로 보호된 리포지토리에서 리소스를 검색하려면 파이프라인의 기본 인증을 구성해야 합니다.

파이프라인에 대한 기본 인증을 구성하려면 지정된 리포지토리의 Git 시크릿에서 인증 정보를 사용하여 secret.yaml,serviceaccount.yamlrun.yaml 파일을 업데이트합니다. 이 프로세스를 완료하면 OpenShift Pipelines에서 해당 정보를 사용하여 지정된 파이프라인 리소스를 검색할 수 있습니다.

참고

GitHub의 경우 일반 암호를 사용한 인증은 더 이상 사용되지 않습니다. 대신 개인 액세스 토큰 을 사용합니다.

프로세스

  1. secret.yaml 파일에서 사용자 이름과 암호 또는 GitHub 개인 액세스 토큰 을 지정하여 대상 Git 리포지토리에 액세스합니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: basic-user-pass 
    1
    
      annotations:
        tekton.dev/git-0: https://github.com
    type: kubernetes.io/basic-auth
    stringData:
      username: <username> 
    2
    
      password: <password> 
    3
    Copy to Clipboard Toggle word wrap
    1
    보안의 이름입니다. 예에서는 basic-user-pass 입니다.
    2
    Git 리포지토리의 사용자 이름입니다.
    3
    Git 리포지토리의 암호입니다.
  2. serviceaccount.yaml 파일에서 보안을 적절한 서비스 계정과 연결합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 
    1
    
    secrets:
      - name: basic-user-pass 
    2
    Copy to Clipboard Toggle word wrap
    1
    서비스 계정의 이름입니다. 이 예에서는 build-bot 입니다.
    2
    보안의 이름입니다. 예에서는 basic-user-pass 입니다.
  3. run.yaml 파일에서 서비스 계정을 작업 실행 또는 파이프라인 실행과 연결합니다.

    • 서비스 계정을 작업 실행과 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
        name: build-push-task-run-2 
      1
      
      spec:
        serviceAccountName: build-bot 
      2
      
        taskRef:
          name: build-push 
      3
      Copy to Clipboard Toggle word wrap
      1
      작업 실행의 이름입니다. 예에서는 build-push-task-run-2 입니다.
      2
      서비스 계정의 이름입니다. 이 예에서는 build-bot 입니다.
      3
      작업 이름입니다. 예에서는 build-push.
    • 서비스 계정을 PipelineRun 리소스와 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 
      1
      
        namespace: default
      spec:
        serviceAccountName: build-bot 
      2
      
        pipelineRef:
          name: demo-pipeline 
      3
      Copy to Clipboard Toggle word wrap
      1
      파이프라인 실행의 이름입니다. 예에서는 demo-pipeline 입니다.
      2
      서비스 계정의 이름입니다. 이 예에서는 build-bot 입니다.
      3
      파이프라인의 이름입니다. 예에서는 demo-pipeline 입니다.
  4. 변경 사항을 적용합니다.

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
    Copy to Clipboard Toggle word wrap

4.3. Git에 대한 SSH 인증 구성

SSH 키를 사용하여 구성된 리포지토리에서 리소스를 검색하려면 파이프라인에 대한 SSH 기반 인증을 구성해야 합니다.

파이프라인에 대한 SSH 기반 인증을 구성하려면 지정된 리포지토리의 SSH 개인 키에서 인증 정보를 사용하여 secret .yaml,serviceaccount.yaml 파일을 업데이트하고.yaml 파일을 실행합니다. 이 프로세스를 완료하면 OpenShift Pipelines에서 해당 정보를 사용하여 지정된 파이프라인 리소스를 검색할 수 있습니다.

참고

기본 인증이 아닌 SSH 기반 인증을 사용하는 것이 좋습니다.

프로세스

  1. SSH 개인 키를 생성하거나 일반적으로 ~/.ssh/id_rsa 파일에서 사용할 수 있는 기존 개인 키를 복사합니다.
  2. secret.yaml 파일에서 ssh-privatekey 의 값을 SSH 개인 키 파일의 콘텐츠로 설정하고 known_hosts 값을 알려진 호스트 파일의 콘텐츠로 설정합니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: ssh-key 
    1
    
      annotations:
        tekton.dev/git-0: github.com
    type: kubernetes.io/ssh-auth
    stringData:
      ssh-privatekey: 
    2
    
      known_hosts: 
    3
    Copy to Clipboard Toggle word wrap
    1
    SSH 개인 키가 포함된 시크릿의 이름입니다. 예에서는 ssh-key.
    2
    SSH 개인 키 파일의 내용입니다.
    3
    알려진 호스트 파일의 내용입니다.
    Important

    개인 키를 생략하면 OpenShift Pipelines에서 서버의 공개 키를 수락합니다.

  3. 선택 사항: 사용자 정의 SSH 포트를 지정하려면 주석 값 끝에 :<port number >를 추가합니다. 예: tekton.dev/git-0: github.com:2222.
  4. serviceaccount.yaml 파일에서 ssh-key 시크릿을 build-bot 서비스 계정과 연결합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 
    1
    
    secrets:
      - name: ssh-key 
    2
    Copy to Clipboard Toggle word wrap
    1
    서비스 계정의 이름입니다. 이 예에서는 build-bot 입니다.
    2
    SSH 개인 키가 포함된 시크릿의 이름입니다. 예에서는 ssh-key.
  5. run.yaml 파일에서 서비스 계정을 작업 실행 또는 파이프라인 실행과 연결합니다.

    • 서비스 계정을 작업 실행과 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
        name: build-push-task-run-2 
      1
      
      spec:
        serviceAccountName: build-bot 
      2
      
        taskRef:
          name: build-push 
      3
      Copy to Clipboard Toggle word wrap
      1
      작업 실행의 이름입니다. 예에서는 build-push-task-run-2 입니다.
      2
      서비스 계정의 이름입니다. 이 예에서는 build-bot 입니다.
      3
      작업 이름입니다. 예에서는 build-push.
    • 서비스 계정을 파이프라인 실행과 연결합니다.

      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 
      1
      
        namespace: default
      spec:
        serviceAccountName: build-bot 
      2
      
        pipelineRef:
          name: demo-pipeline 
      3
      Copy to Clipboard Toggle word wrap
      1
      파이프라인 실행의 이름입니다. 예에서는 demo-pipeline 입니다.
      2
      서비스 계정의 이름입니다. 이 예에서는 build-bot 입니다.
      3
      파이프라인의 이름입니다. 예에서는 demo-pipeline 입니다.
  6. 변경 사항을 적용합니다.

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
    Copy to Clipboard Toggle word wrap

4.4. git 유형 작업에서 SSH 인증 사용

Git 명령을 호출할 때 작업 단계에서 직접 SSH 인증을 사용할 수 있습니다. SSH 인증은 $HOME 변수를 무시하고 /etc/passwd 파일에 지정된 사용자의 홈 디렉터리만 사용합니다. 따라서 작업의 각 단계는 /tekton/home/.ssh 디렉토리를 연결된 사용자의 홈 디렉터리에 심볼릭 링크해야 합니다.

그러나 git 유형의 파이프라인 리소스를 사용하거나 Tekton 카탈로그에서 사용할 수 있는 git-clone 작업을 사용하는 경우 명시적 심볼릭 링크가 필요하지 않습니다.

git 유형 작업에서 SSH 인증을 사용하는 예로, authenticating-git-commands.yaml 을 참조하십시오.

4.5. 루트가 아닌 사용자로 시크릿 사용

다음과 같은 특정 시나리오에서 루트가 아닌 사용자로 시크릿을 사용해야 할 수 있습니다.

  • 컨테이너가 실행을 실행하는 데 사용하는 사용자 및 그룹은 플랫폼에 의해 무작위화됩니다.
  • 작업의 단계에서는 루트가 아닌 보안 컨텍스트를 정의합니다.
  • 작업은 작업의 모든 단계에 적용되는 글로벌 루트가 아닌 보안 컨텍스트를 지정합니다.

이러한 시나리오에서는 작업 실행 및 파이프라인 실행을 루트가 아닌 사용자로 실행할 때 다음 측면을 고려하십시오.

  • Git에 대한 SSH 인증을 사용하려면 사용자에게 /etc/passwd 디렉터리에 유효한 홈 디렉터리가 구성되어 있어야 합니다. 유효한 홈 디렉터리가 없는 UID를 지정하면 인증에 실패합니다.
  • SSH 인증은 $HOME 환경 변수를 무시합니다. 따라서 OpenShift Pipelines(/tekton/home)에서 루트가 아닌 사용자의 유효한 홈 디렉터리에 정의된 $HOME 디렉터리의 적절한 시크릿 파일을 심볼릭해야 합니다.

또한 루트가 아닌 보안 컨텍스트에서 SSH 인증을 구성하려면 git 명령을 인증하는 예제를 참조하십시오.

4.6. 특정 단계에 대한 시크릿 액세스 제한

기본적으로 OpenShift Pipelines의 시크릿은 $HOME/tekton/home 디렉터리에 저장되며 작업의 모든 단계에서 사용할 수 있습니다.

보안을 특정 단계로 제한하려면 시크릿 정의를 사용하여 볼륨을 지정하고 특정 단계에서 볼륨을 마운트합니다.

5장. Buildah를 루트가 아닌 사용자로 사용하여 컨테이너 이미지 빌드

컨테이너에서 root 사용자로 OpenShift Pipelines를 실행하면 컨테이너 프로세스 및 호스트를 다른 잠재적으로 악의적인 리소스에 노출할 수 있습니다. 컨테이너에서 루트가 아닌 특정 사용자로 워크로드를 실행하여 이러한 유형의 노출을 줄일 수 있습니다. Buildah를 루트가 아닌 사용자로 사용하여 컨테이너 이미지의 빌드를 실행하려면 다음 단계를 수행할 수 있습니다.

  • 사용자 정의 서비스 계정(SA) 및 SCC(보안 컨텍스트 제약 조건)를 정의합니다.
  • ID 1000 과 함께 build 사용자를 사용하도록 Buildah를 구성합니다.
  • 사용자 정의 구성 맵으로 작업 실행을 시작하거나 파이프라인 실행과 통합합니다.

5.1. 사용자 정의 서비스 계정 및 보안 컨텍스트 제약 조건 구성

기본 파이프라인 SA에서는 네임스페이스 범위 외부의 사용자 ID를 사용할 수 있습니다. 기본 SA에 대한 종속성을 줄이기 위해 사용자 ID 1000 을 사용하여 빌드 사용자에 필요한 클러스터 역할 및 역할 바인딩을 사용하여 사용자 지정 SA 및 SCC를 정의할 수 있습니다.

중요

현재 컨테이너에서 Buildah를 성공적으로 실행하려면 allowPrivilegeEscalation 설정을 활성화해야 합니다. 이 설정을 통해 Buildah는 루트가 아닌 사용자로 실행할 때 SETUIDSETGID 기능을 활용할 수 있습니다.

프로세스

  • 필요한 클러스터 역할 및 역할 바인딩을 사용하여 사용자 지정 SA 및 SCC를 만듭니다.

    예: 사용된 ID 1000의 사용자 정의 SA 및 SCC

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: pipelines-sa-userid-1000 
    1
    
    ---
    kind: SecurityContextConstraints
    metadata:
      annotations:
      name: pipelines-scc-userid-1000 
    2
    
    allowHostDirVolumePlugin: false
    allowHostIPC: false
    allowHostNetwork: false
    allowHostPID: false
    allowHostPorts: false
    allowPrivilegeEscalation: true 
    3
    
    allowPrivilegedContainer: false
    allowedCapabilities: null
    apiVersion: security.openshift.io/v1
    defaultAddCapabilities: null
    fsGroup:
      type: MustRunAs
    groups:
    - system:cluster-admins
    priority: 10
    readOnlyRootFilesystem: false
    requiredDropCapabilities:
    - MKNOD
    - KILL
    runAsUser: 
    4
    
      type: MustRunAs
      uid: 1000
    seLinuxContext:
      type: MustRunAs
    supplementalGroups:
      type: RunAsAny
    users: []
    volumes:
    - configMap
    - downwardAPI
    - emptyDir
    - persistentVolumeClaim
    - projected
    - secret
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: pipelines-scc-userid-1000-clusterrole 
    5
    
    rules:
    - apiGroups:
      - security.openshift.io
      resourceNames:
      - pipelines-scc-userid-1000
      resources:
      - securitycontextconstraints
      verbs:
      - use
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: pipelines-scc-userid-1000-rolebinding 
    6
    
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: pipelines-scc-userid-1000-clusterrole
    subjects:
    - kind: ServiceAccount
      name: pipelines-sa-userid-1000
    Copy to Clipboard Toggle word wrap

1
사용자 지정 SA를 정의합니다.
2
수정된 runAsUser 필드를 사용하여 제한된 권한을 기반으로 생성된 사용자 정의 SCC를 정의합니다.
3
현재 컨테이너에서 Buildah를 성공적으로 실행하려면 allowPrivilegeEscalation 설정을 활성화해야 합니다. 이 설정을 통해 Buildah는 루트가 아닌 사용자로 실행할 때 SETUIDSETGID 기능을 활용할 수 있습니다.
4
사용자 ID 1000 으로 실행되도록 사용자 지정 SCC와 함께 연결된 모든 Pod를 제한합니다.
5
사용자 지정 SCC를 사용하는 클러스터 역할을 정의합니다.
6
사용자 지정 SCC를 사용하는 클러스터 역할을 사용자 지정 SA에 바인딩합니다.

5.2. 빌드 사용자를 사용하도록 Buildah 구성

Buildah 작업을 정의하여 사용자 ID 1000 과 함께 빌드 사용자를 사용할 수 있습니다.

프로세스

  1. buildah 클러스터 작업의 사본을 일반 작업으로 생성합니다.

    $ oc get clustertask buildah -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
    Copy to Clipboard Toggle word wrap
  2. 복사한 buildah 작업을 편집합니다.

    $ oc edit task buildah-as-user
    Copy to Clipboard Toggle word wrap

    예: build 사용자를 사용하여 Buildah 작업

    apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
      name: buildah-as-user
    spec:
      description: >-
        Buildah task builds source into a container image and
        then pushes it to a container registry.
        Buildah Task builds source into a container image using Project Atomic's
        Buildah build tool.It uses Buildah's support for building from Dockerfiles,
        using its buildah bud command.This command executes the directives in the
        Dockerfile to assemble a container image, then pushes that image to a
        container registry.
      params:
      - name: IMAGE
        description: Reference of the image buildah will produce.
      - name: BUILDER_IMAGE
        description: The location of the buildah builder image.
        default: registry.redhat.io/rhel8/buildah@sha256:99cae35f40c7ec050fed3765b2b27e0b8bbea2aa2da7c16408e2ca13c60ff8ee
      - name: STORAGE_DRIVER
        description: Set buildah storage driver
        default: vfs
      - name: DOCKERFILE
        description: Path to the Dockerfile to build.
        default: ./Dockerfile
      - name: CONTEXT
        description: Path to the directory to use as context.
        default: .
      - name: TLSVERIFY
        description: Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)
        default: "true"
      - name: FORMAT
        description: The format of the built container, oci or docker
        default: "oci"
      - name: BUILD_EXTRA_ARGS
        description: Extra parameters passed for the build command when building images.
        default: ""
      - description: Extra parameters passed for the push command when pushing images.
        name: PUSH_EXTRA_ARGS
        type: string
        default: ""
      - description: Skip pushing the built image
        name: SKIP_PUSH
        type: string
        default: "false"
      results:
      - description: Digest of the image just built.
        name: IMAGE_DIGEST
        type: string
      workspaces:
      - name: source
      steps:
      - name: build
        securityContext:
          runAsUser: 1000 
    1
    
        image: $(params.BUILDER_IMAGE)
        workingDir: $(workspaces.source.path)
        script: |
          echo "Running as USER ID `id`" 
    2
    
          buildah --storage-driver=$(params.STORAGE_DRIVER) bud \
            $(params.BUILD_EXTRA_ARGS) --format=$(params.FORMAT) \
            --tls-verify=$(params.TLSVERIFY) --no-cache \
            -f $(params.DOCKERFILE) -t $(params.IMAGE) $(params.CONTEXT)
          [[ "$(params.SKIP_PUSH)" == "true" ]] && echo "Push skipped" && exit 0
          buildah --storage-driver=$(params.STORAGE_DRIVER) push \
            $(params.PUSH_EXTRA_ARGS) --tls-verify=$(params.TLSVERIFY) \
            --digestfile $(workspaces.source.path)/image-digest $(params.IMAGE) \
            docker://$(params.IMAGE)
          cat $(workspaces.source.path)/image-digest | tee /tekton/results/IMAGE_DIGEST
        volumeMounts:
        - name: varlibcontainers
          mountPath: /home/build/.local/share/containers 
    3
    
      volumes:
      - name: varlibcontainers
        emptyDir: {}
    Copy to Clipboard Toggle word wrap

    1
    Buildah 이미지의 빌드 사용자에게 해당하는 사용자 ID 1000 으로 명시적으로 컨테이너를 실행합니다.
    2
    사용자 ID를 표시하여 프로세스가 사용자 ID 1000 으로 실행되고 있는지 확인합니다.
    3
    필요에 따라 볼륨 마운트의 경로를 변경할 수 있습니다.

사용자 정의 Buildah 클러스터 작업을 정의한 후 사용자 ID 1000 을 사용하여 이미지를 빌드 사용자로 빌드 하는 TaskRun 오브젝트를 생성할 수 있습니다. 또한 PipelineRun 오브젝트의 일부로 TaskRun 오브젝트를 통합할 수 있습니다.

프로세스

  1. 사용자 정의 ConfigMapDockerfile 오브젝트를 사용하여 TaskRun 오브젝트를 생성합니다.

    예: Buildah를 사용자 ID 1000으로 실행하는 작업 실행

    apiVersion: v1
    data:
      Dockerfile: |
        ARG BASE_IMG=registry.access.redhat.com/ubi8/ubi
        FROM $BASE_IMG AS buildah-runner
        RUN dnf -y update && \
            dnf -y install git && \
            dnf clean all
        CMD git
    kind: ConfigMap
    metadata:
      name: dockerfile 
    1
    
    ---
    apiVersion: tekton.dev/v1beta1
    kind: TaskRun
    metadata:
      name: buildah-as-user-1000
    spec:
      serviceAccountName: pipelines-sa-userid-1000 
    2
    
      params:
      - name: IMAGE
        value: image-registry.openshift-image-registry.svc:5000/test/buildahuser
      taskRef:
        kind: Task
        name: buildah-as-user
      workspaces:
      - configMap:
          name: dockerfile 
    3
    
        name: source
    Copy to Clipboard Toggle word wrap

    1
    Dockerfile이 있는 일부 소스를 가져오는 이전 작업 없이 작업에 중점을 두고 있으므로 구성 맵을 사용합니다.
    2
    생성한 서비스 계정의 이름입니다.
    3
    buildah-as-user 작업의 소스 작업 공간으로 구성 맵을 마운트합니다.
  2. (선택 사항) 파이프라인 및 해당 파이프라인 실행을 생성합니다.

    예: 파이프라인 및 해당 파이프라인 실행

    apiVersion: tekton.dev/v1beta1
    kind: Pipeline
    metadata:
      name: pipeline-buildah-as-user-1000
    spec:
      params:
      - name: IMAGE
      - name: URL
      workspaces:
      - name: shared-workspace
      - name: sslcertdir
        optional: true
      tasks:
      - name: fetch-repository 
    1
    
        taskRef:
          name: git-clone
          kind: ClusterTask
        workspaces:
        - name: output
          workspace: shared-workspace
        params:
        - name: url
          value: $(params.URL)
        - name: subdirectory
          value: ""
        - name: deleteExisting
          value: "true"
      - name: buildah
        taskRef:
          name: buildah-as-user 
    2
    
        runAfter:
        - fetch-repository
        workspaces:
        - name: source
          workspace: shared-workspace
        - name: sslcertdir
          workspace: sslcertdir
        params:
        - name: IMAGE
          value: $(params.IMAGE)
    ---
    apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      name: pipelinerun-buildah-as-user-1000
    spec:
      taskRunSpecs:
        - pipelineTaskName: buildah
          taskServiceAccountName: pipelines-sa-userid-1000 
    3
    
      params:
      - name: URL
        value: https://github.com/openshift/pipelines-vote-api
      - name: IMAGE
        value: image-registry.openshift-image-registry.svc:5000/test/buildahuser
      pipelineRef:
        name: pipeline-buildah-as-user-1000
      workspaces:
      - name: shared-workspace 
    4
    
        volumeClaimTemplate:
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 100Mi
    Copy to Clipboard Toggle word wrap

    1
    git-clone 클러스터 작업을 사용하여 Dockerfile이 포함된 소스를 가져와서 수정된 Buildah 작업을 사용하여 빌드합니다.
    2
    수정된 Buildah 작업을 참조합니다.
    3
    Buildah 작업에 대해 생성한 서비스 계정을 사용합니다.
    4
    컨트롤러에서 자동으로 생성한 PVC(영구 볼륨 클레임)를 사용하여 git-clone 작업과 수정된 Buildah 작업 간에 데이터를 공유합니다.
  3. 작업 실행 또는 파이프라인 실행을 시작합니다.

5.4. 권한이 없는 빌드의 제한

권한이 없는 빌드의 프로세스는 대부분의 Dockerfile 오브젝트에서 작동합니다. 그러나 몇 가지 알려진 제한 사항으로 인해 빌드가 실패할 수 있습니다.

  • 필요한 권한 문제 부족으로 인해 --mount=type=cache 옵션을 사용하면 실패할 수 있습니다. 자세한 내용은 이 문서를 참조하십시오.
  • 마운트 리소스에 사용자 정의 SCC에서 제공하지 않는 추가 기능이 필요하므로 --mount=type=secret 옵션을 사용하면 실패합니다.

법적 공지

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2026 Red Hat
맨 위로 이동