Menu Close

4.15.5. OCI レジストリーへの認証

OCI レジストリーに署名をプッシュする前に、クラスター管理者はレジストリーとの認証に使用するように Tekton Chains を設定する必要があります。Tekton Chains コントローラーは、タスクを実行するサービスアカウントと同じものを使用します。OCI レジストリーにプッシュするために必要な認証情報を使用してサービスアカウントを設定するには、以下の手順を実行します。

手順

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

    $ export NAMESPACE=<namespace> 1
    $ export SERVICE_ACCOUNT_NAME=<service_account> 2
    1
    サービスアカウントに関連付けられた namespace。
    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
      新規作成されたサービスアカウント名に置き換えます。

4.15.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 は、生成されるプライベートキーを 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"}}'
  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