OpenShift Pipelines の保護


Red Hat OpenShift Pipelines 1.10

OpenShift Pipelines のセキュリティー機能

Red Hat OpenShift Documentation Team

概要

このドキュメントでは、OpenShift Pipelines のセキュリティー機能について説明します。

第1章 OpenShift Pipelines サプライチェーンセキュリティーでの Tekton Chains の使用

重要

Tekton Chains はテクノロジープレビュー機能のみです。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

Tekton Chains は、Kubernetes カスタムリソース定義 (CRD) コントローラーです。これを使用して、Red Hat OpenShift Pipelines を使用して作成されたタスクおよびパイプラインのサプライチェーンセキュリティーを管理できます。

デフォルトでは、Tekton Chains は OpenShift Container Platform クラスター内のすべてのタスク実行を監視します。タスクの実行が完了すると、Tekton Chains はタスク実行のスナップショットを取得します。次に、スナップショットを 1 つ以上の標準ペイロード形式に変換し、最後にすべてのアーティファクトに署名して保存します。

タスクの実行に関する情報を取得するために、Tekton Chains は Result オブジェクトと PipelineResource オブジェクトを使用します。オブジェクトが使用できない場合、Tekton は OCI イメージの URL と修飾されたダイジェストをチェーンします。

注記

PipelineResource オブジェクトは非推奨であり、将来のリリースで削除される予定です。手動で使用する場合は、Results オブジェクトを推奨します。

1.1. 主な特長

  • cosign や skopeo などのツールで生成された暗号キーを使用して、タスク実行、タスク実行結果、OCI レジストリーイメージに署名できます。
  • in-toto などの認証形式を使用できます。
  • OCI リポジトリーをストレージバックエンドとして使用して、署名と署名されたアーティファクトを安全に保存できます。

1.2. Red Hat OpenShift Pipelines Operator を使用した Tekton Chains のインストール

クラスター管理者は、TektonChain カスタムリソース (CR) を使用して、Tekton Chains をインストールおよび管理できます。

注記

Tekton Chains は、Red Hat パイプラインのオプションのコンポーネントです。現在、TektonConfig を使用してインストールすることはできません。

前提条件

  • Red Hat OpenShift Pipelines Operator がクラスターの openshift-pipelines namespace にインストールされていることを確認します。

手順

  1. Red Hat OpenShift Pipelines クラスターの TektonChain CR を作成します。

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonChain
    metadata:
      name: chain
    spec:
      targetNamespace: openshift-pipelines
    Copy to Clipboard Toggle word wrap
  2. TektonChain CR を適用します。

    $ oc apply -f TektonChain.yaml 
    1
    Copy to Clipboard Toggle word wrap
    1
    TektonChain CR のファイル名に置き換えます。
  3. インストールのステータスを確認します。

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

1.3. Tekton Chains の設定

Tekton Chains は、設定に openshift-pipelines namespace で chains-config という名前の ConfigMap オブジェクトを使用します。

Tekton Chains を設定するには、次の例を使用します。

例: Tekton Chains の設定

$ 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 Chains 設定でサポートされているキー

クラスター管理者は、サポートされているさまざまなキーと値を使用して、タスクの実行、OCI イメージ、およびストレージに関する仕様を設定できます。

1.3.1.1. タスク実行でサポートされるキー
Expand
表1.1 Chains 設定: タスク実行でサポートされるキー
サポートされているキー説明サポート対象の値デフォルト値

artifacts.taskrun.format

タスク実行ペイロードを格納するためのフォーマット。

tektonin-toto

tekton

artifacts.taskrun.storage

タスク実行署名のストレージバックエンド。“tekton,oci" のように、複数のバックエンドをコンマ区切りのリストとして指定できます。このアーティファクトを無効にするには、空の文字列 “" を指定します。

tektonoci

tekton

artifacts.taskrun.signer

タスク実行ペイロードに署名するための署名バックエンド。

x509

x509

1.3.1.2. OCI でサポートされているキー
Expand
表1.2 Chains 設定: OCI でサポートされているキー
サポートされているキー説明サポート対象の値デフォルト値

artifacts.oci.format

OCI ペイロードを格納するためのフォーマット。

simplesigning

simplesigning

artifacts.oci.storage

OCI 署名用のストレージバックエンド。“oci,tekton" のように、複数のバックエンドをコンマ区切りのリストとして指定できます。OCI アーティファクトを無効にするには、空の文字列 “" を指定します。

tektonoci

oci

artifacts.oci.signer

OCI ペイロードに署名するための署名バックエンド。

x509cosign

x509

1.3.1.3. ストレージ用にサポートされているキー
Expand
表1.3 Chains 設定: ストレージでサポートされているキー
サポートされているキー説明サポート対象の値デフォルト値

artifacts.oci.repository

OCI 署名を格納するための OCI リポジトリー。

現在、Chains は内部 OpenShift OCI レジストリーのみをサポートしています。Quay などの他の一般的なオプションはサポートされていません。

 

1.4. Tekton Chains のシークレットに署名する

クラスター管理者は、キーペアを生成し、Tekton Chains を使用して、Kubernetes シークレットを使用してアーティファクトに署名できます。Tekton Chains が機能するには、暗号化されたキーの秘密鍵とパスワードが、openshift-pipelines namespace の signing-secrets Kubernetes シークレットの一部として存在している必要があります。

現在、Tekton Chains は x509 および cosign 署名スキームをサポートしています。

注記

サポートされている署名スキームの 1 つのみを使用してください。

1.4.1. x509 を使用した署名

Tekton Chains で x509 署名スキームを使用するには、ed25519 または ecdsa タイプの x509.pem 秘密鍵を signing-secrets Kubernetes シークレットに保存します。キーが暗号化されていない PKCS8 PEM ファイル (BEGIN PRIVATE KEY) として保存されていることを確認します。

1.4.2. cosign を使用した署名

Tekton Chains で cosign 署名スキームを使用するには:

  1. cosign をインストールします。
  2. cosign.key キーと cosign.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 Chains を設定する必要があります。Tekton Chains コントローラーは、タスクの実行と同じサービスアカウントを使用します。署名を OCI レジストリーにプッシュするために必要な認証情報を使用してサービスアカウントを設定するには、次の手順を実行します。

手順

  1. Kubernetes サービスアカウントの namespace と名前を設定します。

    $ export NAMESPACE=<namespace> 
    1
    
    $ export SERVICE_ACCOUNT_NAME=<service_account> 
    2
    Copy to Clipboard Toggle word wrap
    1
    サービスアカウントに関連付けられた namespace。
    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 がすべてのタスク実行に割り当てるデフォルトの pipeline サービスアカウントにパッチを適用すると、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 Chains バックエンドストレージを設定します。
  • タスク実行を作成して署名し、署名とペイロードをタスク実行自体にアノテーションとして保存します。
  • 署名されたタスクの実行から署名とペイロードを取得します。
  • タスク実行の署名を確認します。

前提条件

以下がクラスターにインストールされていることを確認します。

  • Red Hat OpenShift Pipelines Operator
  • Tekton Chains
  • Cosign

手順

  1. 暗号化された x509 鍵ペアを作成し、Kubernetes シークレットとして保存します。

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

    プロンプトが表示されたらパスワードを入力します。Cosign は、結果の秘密鍵を signing-secrets Kubernetes シークレットの一部として openshift-pipelines namespace に保存します。

  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"}}'
    Copy to Clipboard Toggle word wrap
  3. Tekton Chains コントローラーを再起動して、変更された設定が適用されていることを確認します。

    $ 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 Chains を使用してイメージと証明書を署名検証する

クラスター管理者は、Tekton Chains を使用して、以下のタスクを実行することで、イメージと証明書を署名および検証できます。

  • 暗号化された x509 鍵ペアを作成し、Kubernetes シークレットとして保存します。
  • 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
    Copy to Clipboard Toggle word wrap

    プロンプトが表示されたらパスワードを入力します。Cosign は、結果の秘密鍵を signing-secrets Kubernetes シークレットの一部として openshift-pipelinesnamespace に保存し、公開鍵を 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
      Copy to Clipboard Toggle word wrap
      1
      docker 設定シークレットの名前に置き換えます。
      2
      docker config.json ファイルへのパスに置き換えます。
  3. Tekton Chains を設定するには、chains-config オブジェクトで artifacts.taskrun.formatartifacts.taskrun.storagetransparency.enabled パラメーターを設定します。

    $ 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 Chains が証明書を生成して署名するまで 1 分ほど待ち、タスク実行時に chains.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)。
      3
      2 番目に一致する UUID。

      検索結果には、一致するエントリーの UUID が表示されます。それらの UUID の 1 つが証明書を保持します。

    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 であり、pipelines サービスアカウントに関連付けられた SCC (Security Context Constraint) は 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 Pipeline の一部として提供される Buildah クラスタータスクは、デフォルトのストレージドライバーとして vfs を使用します。

手順

privileged セキュリティーコンテキストで (パイプライン実行またはタスク実行で作成された) Pod を実行するには、以下の変更を行います。

  • 関連するユーザーアカウントまたはサービスアカウントを、明示的な SCC を持つように設定します。以下の方法のいずれかを使用して設定を実行できます。

    • 以下のコマンドを実行します。

      $ oc adm policy add-scc-to-user <scc-name> -z <service-account-name>
      Copy to Clipboard Toggle word wrap
    • もしくは、RoleBinding および、Role または 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 サービスアカウントに関連付けられた pipelines-scc SCC (Security Context Constraints) を使用する場合、パイプライン実行およびタスク実行 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

    特権付きタスクにカスタムサービスアカウントを使用する必要がある場合は、以下のコマンドを実行して privileged SCC をカスタムサービスアカウントに関連付けることができます。

    例: fsgroup-runasany サービスアカウントを使用した privileged SCC の関連付け

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

  5. パイプライン実行およびタスク実行でカスタムサービスアカウントを使用します。

    例: fsgroup-runasany カスタムサービスアカウントを使用した Pipeline 実行 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 をセキュアにできます。namespace の作成後に、operator.tekton.dev/enable-annotation=enabled ラベルを namespace に追加して、Eventlistener リソースの HTTPS を有効にします。次に、再暗号化した TLS 終端を使用して Trigger リソースとセキュアなルートを作成します。

Red Hat OpenShift Pipelines のトリガーは、Eventlistener リソースへの非セキュアな HTTP およびセキュアな HTTPS 接続の両方をサポートします。HTTPS は、クラスター内外の接続を保護します。

Red Hat OpenShift Pipelines は、namespace のラベルを監視する tekton-operator-proxy-webhook Pod を実行します。ラベルを namespace に追加する場合、Webhook は service.beta.openshift.io/serving-cert-secret-name=<secret_name> アノテーションを EventListener オブジェクトに設定します。これにより、シークレットおよび必要な証明書が作成されます。

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
termination フィールドは reencrypt に設定されます。これは、必要な唯一の TLS フィールドです。
4
これは、再暗号化に必要です。destinationCACertificate は CA 証明書を指定してエンドポイントの証明書を検証し、ルーターから宛先 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 リポジトリーで利用可能な YAML ファイルから TriggerTemplate リソースを作成します。

    $ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/02_template.yaml
    Copy to Clipboard Toggle word wrap
  3. Trigger リソースを pipelines-tutorial リポジトリーから直接作成します。

    $ 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 Pipeline は、Git シークレットの Basic 認証および SSH ベースの認証のアノテーション (鍵と値のペア) としての使用をサポートします。

4.1. 認証情報の選択

パイプライン実行またはタスク実行には、異なる Git リポジトリーにアクセスするために複数の認証が必要になる場合があります。OpenShift Pipeline がその認証情報を使用できるドメインで各シークレットにアノテーションを付けます。

Git シークレットの認証情報アノテーションキーは tekton.dev/git- で開始する必要があり、その値は OpenShift Pipeline がその認証情報を使用するホストの URL になります。

以下の例では、OpenShift Pipeline はユーザー名とパスワードに依存する basic-auth シークレットを使用して、github.com および gitlab.com のリポジトリーにアクセスします。

例: Basic 認証用の複数の認証情報

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 の Basic 認証の設定

パイプラインが、パスワードで保護されたリポジトリーからリソースを取得するには、そのパイプラインの Basic 認証を設定する必要があります。

パイプラインの Basic 認証を設定するには、secret.yamlserviceaccount.yaml、および run.yaml ファイルを指定されたリポジトリーの Git シークレットからの認証情報で更新します。このプロセスが完了すると、OpenShift Pipeline はその情報を使用して指定されたパイプラインリソースを取得できます。

注記

GitHub では、プレーンパスワードを使用した認証は非推奨になりました。代わりに、パーソナルアクセストークン を使用します。

手順

  1. secret.yaml ファイルで、ターゲット Git リポジトリーにアクセスするためのユーザー名とパスワードまたは GitHub パーソナルアクセストークン を指定します。

    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 ベースの認証を設定するには、secret.yamlserviceaccount.yaml、および run.yaml ファイルを、指定されたリポジトリーの SSH 秘密鍵からの認証情報を使用して更新します。このプロセスが完了すると、OpenShift Pipelines はその情報を使用して指定されたパイプラインリソースを取得できます。

注記

Basic 認証ではなく 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 ポートを指定するには、annotation 値の最後に :<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. root 以外のユーザーとしてのシークレットの使用

以下のような特定のシナリオでは、root 以外のユーザーとしてシークレットを使用する必要がある場合があります。

  • コンテナーが実行するために使用するユーザーとグループは、プラットフォームによってランダム化されます。
  • タスクの手順では、root 以外のセキュリティーコンテキストを定義します。
  • タスクは、root 以外のグローバルセキュリティーコンテキストを指定します。これは、タスクのすべての手順に適用されます。

このようなシナリオでは、root 以外のユーザーとしてタスク実行とパイプライン実行を実行する際の次の側面を考慮してください。

  • Git の SSH 認証では、ユーザーが /etc/passwd ディレクトリーに有効なホームディレクトリーを設定している必要があります。有効なホームディレクトリーのない UID を指定すると、認証に失敗します。
  • SSH 認証は $HOME 環境変数を無視します。そのため、OpenShift Pipelines によって定義された $HOME ディレクトリー (/tekton/home) から適切なシークレットファイルを非 root ユーザーの有効なホームディレクトリーにシンボリックリンクする必要があります。

さらに、root 以外のセキュリティーコンテキストで SSH 認証を設定するには、git コマンドを認証する例 を参照してください。

4.6. 特定の手順へのシークレットアクセスの制限

デフォルトで、OpenShift Pipeline のシークレットは $HOME/tekton/home ディレクトリーに保存され、タスクのすべての手順で利用できます。

シークレットを特定の手順に制限するには、シークレット定義を使用してボリュームを指定し、特定の手順でボリュームをマウントします。

第5章 非 root ユーザーとして Buildah を使用したコンテナーイメージのビルド

コンテナーで root ユーザーとして OpenShift Pipelines を実行すると、コンテナープロセスとホストが他の悪意のあるリソースにさらされる可能性があります。コンテナー内の特定の root 以外のユーザーとしてワークロードを実行すると、このタイプの露出を減らすことができます。非 root ユーザーとして Buildah を使用してコンテナーイメージのビルドを実行するには、次の手順を実行します。

  • カスタムサービスアカウント (SA) とセキュリティーコンテキスト制約 (SCC) を定義します。
  • ID が 1000build ユーザーを使用するように Buildah を設定します。
  • カスタム設定マップを使用してタスクの実行を開始するか、パイプラインの実行と統合します。

5.1. カスタムサービスアカウントとセキュリティーコンテキストの制約の設定

デフォルトの pipeline SA では、namespace の範囲外のユーザー ID を使用できます。デフォルト SA への依存を減らすために、ユーザー ID 1000build ユーザーに必要なクラスターロールとロールバインディングを使用して、カスタム SA と SCC を定義できます。

重要

現時点で、Buildah がコンテナー内で正常に実行されるためには、allowPrivilegeEscalation 設定を有効にする必要があります。この設定により、Buildah は非 root ユーザーとして実行するときに SETUID および SETGID 機能を活用できます。

手順

  • 必要なクラスターロールとロールバインディングを使用して、カスタム 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 は非 root ユーザーとして実行するときに SETUID および SETGID 機能を活用できます。
4
カスタム SA を介してカスタム SCC にアタッチされた Pod を、ユーザー ID が 1000 として実行されるように制限します。
5
カスタム SCC を使用するクラスターロールを定義します。
6
カスタム SCC を使用するクラスターロールをカスタム SA にバインドします。

5.2. build ユーザーを使用するための Buildah の設定

ユーザー ID が 1000build ユーザーを使用する Buildah タスクを定義できます。

手順

  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 イメージの build ユーザーに対応し、明示的に ID が 1000 のユーザーとして指定してコンテナーを実行します。
    2
    ユーザー ID を表示して、プロセスがユーザー ID 1000 として実行されていることを確認します。
    3
    必要に応じて、ボリュームマウントのパスを変更できます。

5.3. カスタムの config map を使用したタスク実行またはパイプライン実行の開始

カスタム Buildah クラスタータスクを定義したら、ユーザー ID が 1000build ユーザーとしてイメージをビルドする TaskRun オブジェクトを作成できます。さらに、TaskRun オブジェクトを PipelineRun オブジェクトの一部として統合できます。

手順

  1. カスタム ConfigMap および Dockerfile オブジェクトを使用して 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 を使用してソースを取得するなどの事前タスクはなく、タスクの実行に焦点が置かれているため、config map を使用します。
    2
    作成したサービスアカウントの名前。
    3
    buildah-as-user タスクのソースワークスペースとして config map をマウントします。
  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 オプションの使用は、必要となる権限の問題が原因で失敗する場合があります。詳細は、この記事 を参照してください。
  • --mount=type=secret オプションの使用は失敗します。リソースのマウントには、カスタム SCC によって提供されない追加の機能が必要になるためです。

法律上の通知

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 では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat