OpenShift Pipelines の保護
OpenShift Pipelines のセキュリティー機能
概要
第1章 OpenShift Pipelines サプライチェーンセキュリティーでの Tekton Chains の使用
Tekton Chains は、Kubernetes カスタムリソース定義 (CRD) コントローラーです。これを使用して、Red Hat OpenShift Pipelines を使用して作成されたタスクおよびパイプラインのサプライチェーンセキュリティーを管理できます。
デフォルトでは、Tekton Chains は OpenShift Container Platform クラスター内のすべてのタスク実行を監視します。タスクの実行が完了すると、Tekton Chains はタスク実行のスナップショットを取得します。次に、スナップショットを 1 つ以上の標準ペイロード形式に変換し、最後にすべてのアーティファクトに署名して保存します。
タスクの実行に関する情報を取得するために、Tekton Chains は Result
オブジェクトを使用します。オブジェクトが使用できない場合、Tekton Chains は OCI イメージの URL と修飾ダイジェストを使用します。
1.1. 主な特長
-
cosign
やskopeo
などのツールで生成された暗号キーを使用して、タスク実行、タスク実行結果、OCI レジストリーイメージに署名できます。 -
in-toto
などの認証形式を使用できます。 - OCI リポジトリーをストレージバックエンドとして使用して、署名と署名されたアーティファクトを安全に保存できます。
1.2. Tekton Chains の設定
Red Hat OpenShift Pipelines Operator は、デフォルトで Tekton Chains をインストールします。TektonConfig
カスタムリソースを変更することで、Tekton Chains を設定できます。Operator は、このカスタムリソースに加えた変更を自動的に適用します。
カスタムリソースを編集するには、次のコマンドを使用します。
$ oc edit TektonConfig config
カスタムリソースには、chain:
配列が含まれます。次の例に示すように、サポートされている設定パラメーターをこの配列に追加できます。
apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: addon: {} chain: artifacts.taskrun.format: tekton config: {}
1.2.1. Tekton Chains 設定でサポートされているパラメーター
クラスター管理者は、サポートされているさまざまなパラメーターのキーと値を使用して、タスクの実行、OCI イメージ、およびストレージに関する仕様を設定できます。
1.2.1.1. タスク実行アーティファクトでサポートされているパラメーター
キー | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
| タスク実行ペイロードを保存するための形式。 |
|
|
|
タスク実行署名のストレージバックエンド。 |
|
|
| タスク実行ペイロードに署名するための署名バックエンド。 |
|
|
slsa/v1
は、下位互換性のための in-toto
のエイリアスです。
1.2.1.2. パイプライン実行アーティファクトでサポートされているパラメーター
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
| パイプライン実行ペイロードを保存する形式。 |
|
|
|
パイプライン実行署名を保存するためのストレージバックエンド。 |
|
|
| パイプライン実行ペイロードに署名するための署名バックエンド。 |
|
|
|
このパラメーターが |
|
|
-
slsa/v1
は、下位互換性のためのin-toto
のエイリアスです。 -
Grafeas
ストレージバックエンドの場合、Container Analysis のみがサポートされます。Tekton Chains の現在のバージョンでは、grafeas
サーバーアドレスを設定できません。
1.2.1.3. OCI アーティファクトでサポートされているパラメーター
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
| OCI ペイロードを保存するための形式。 |
|
|
|
OCI 署名を保存するためのストレージバックエンド。 |
|
|
| OCI ペイロードに署名するための署名バックエンド。 |
|
|
1.2.1.4. KMS 署名者でサポートされているパラメーター
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
|
|
サポートされているスキーム: |
1.2.1.5. ストレージでサポートされているパラメーター
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
| ストレージ用の GCS バケット | ||
| OCI 署名と証明書を保存するための OCI リポジトリー。 |
アーティファクトストレージバックエンドの 1 つを | |
| in-toto 証明書に設定するビルダー ID |
| |
|
in-toto アテステーションのビルドタイプ。このパラメーターが |
|
|
任意のアーティファクトに対して docdb
ストレージ方法を有効にする場合は、docstore ストレージオプションを設定します。go-cloud docstore URI 形式の詳細は、docstore パッケージのドキュメント を参照してください。Red Hat OpenShift Pipelines は、次の docstore サービスをサポートしています。
-
firestore
-
dynamodb
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
|
|
| |
|
| ||
|
|
例の値: |
アーティファクトに対して Grafeas
ストレージ方式を有効にする場合は、Grafeas ストレージオプションを設定します。Grafeas のメモとオカレンスの詳細は、Grafeas の概念 を参照してください。
オカレンスを作成するには、Red Hat OpenShift Pipelines はまずオカレンスのリンクに使用されるノートを作成する必要があります。Red Hat OpenShift Pipelines は、ATTESTATION
オカレンスと BUILD
オカレンスの 2 種類のオカレンスを作成します。
Red Hat OpenShift Pipelines は、設定可能な noteid
をノート名の接頭辞として使用します。ATTESTATION
ノートには接尾辞 -simplesigning
が、BUILD
ノートには接尾辞 -intoto
が追加されます。noteid
フィールドが設定されていない場合、Red Hat OpenShift Pipelines は接頭辞として tekton-<NAMESPACE>
を使用します。
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
| オカレンスを保存する Grafeas サーバーが配置されている OpenShift Container Platform プロジェクト。 | ||
| オプション: 作成されたすべてのメモの名前に使用する接頭辞。 | スペースなしの文字列。 | |
|
オプション: Grafeas |
|
オプションで、バイナリー透明性証明書の追加アップロードを有効にできます。
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
| 自動バイナリー透明性アップロードを有効または無効にします。 |
|
|
| バイナリー透明性証明書をアップロードするための URL (有効な場合)。 |
|
transparency.enabled
を manual
に設定すると、次のアノテーションが付いたタスク実行とパイプライン実行のみが透過性ログにアップロードされます。
chains.tekton.dev/transparency-upload: "true"
x509
署名バックエンドを設定する場合、オプションで Fulcio を使用したキーレス署名を有効にできます。
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
| Fulcio からの自動証明書の要求を有効または無効にします。 |
|
|
| 証明書を要求するための Fulcio アドレス (有効な場合)。 |
| |
| 予想される OIDC 発行者。 |
| |
| ID トークンを要求するプロバイダー。 |
| Red Hat OpenShift Pipelines はすべてのプロバイダーの使用を試みます |
| ID トークンを含むファイルへのパス。 | ||
|
TUF サーバーの URL。 |
|
kms
署名バックエンドを設定する場合は、必要に応じて OIDC や Spire を含む KMS 設定を行います。
パラメーター | 説明 | サポート対象の値 | デフォルト値 |
---|---|---|---|
|
KMS サーバーの URI ( | ||
|
KMS サーバーの認証トークン ( | ||
|
KMS サーバーの認証トークン ( |
値の例: | |
|
OIDC 認証のパス (Vault の場合は | ||
| OIDC 認証のロール。 | ||
|
KMS トークンの Spire ソケットの URI (例: | ||
| Spire から SVID を要求する対象者。 |
1.2.2. Mongo サーバーの URL シークレットの作成とマウント
シークレットを使用して、docdb
ストレージに使用する Mongo サーバー URL (MONGO_SERVER_URL
) の値を指定できます。このシークレットを作成し、Tekton Chains コントローラーにマウントして、storage.docdb.mongo-server-url-dir
パラメーターをシークレットがマウントされるディレクトリーに設定する必要があります。
前提条件
-
OpenShift CLI (
oc
) ユーティリティーがインストールされている。 -
openshift-pipelines
namespace の管理者権限で OpenShift Container Platform クラスターにログインしている。
手順
次のコマンドを入力して、Mongo サーバーの URL 値を含む
MONGO_SERVER_URL
ファイルを使用して、mongo-url
という名前のシークレットを作成します。$ oc create secret generic mongo-url -n tekton-chains \ --from-file=MONGO_SERVER_URL=<path>/MONGO_SERVER_URL 1
- 1
- Mongo サーバーの URL 値が含まれる
MONGO_SERVER_URL
ファイルの完全なパスと名前。
TektonConfig
カスタムリソース (CR) のchain
セクションで、Tekton Chains コントローラーにシークレットをマウントするように設定し、次の例に示すように、storage.docdb.mongo-server-url-dir
パラメーターをシークレットがマウントされるディレクトリーに設定します。mongo-url
シークレットをマウントする設定例apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false storage.docdb.mongo-server-url-dir: /tmp/mongo-url options: deployments: tekton-chains-controller: spec: template: spec: containers: - name: tekton-chains-controller volumeMounts: - mountPath: /tmp/mongo-url name: mongo-url volumes: - name: mongo-url secret: secretName: mongo-url # ...
1.2.3. KMS 認証トークンシークレットの作成とマウント
シークレットを使用して KMS サーバーの認証トークンを提供できます。たとえば、KMS プロバイダーが Hashicorp Vault の場合、シークレットには VAULT_TOKEN
の値が含まれている必要があります。
このシークレットを作成し、Tekton Chains コントローラーにマウントし、signers.kms.auth.token-path
パラメーターを認証トークンファイルのフルパス名に設定する必要があります。
前提条件
-
OpenShift CLI (
oc
) ユーティリティーがインストールされている。 -
openshift-pipelines
namespace の管理者権限で OpenShift Container Platform クラスターにログインしている。
手順
次のコマンドを入力して、KMS サーバーの認証トークンを含む
KMS_AUTH_TOKEN
ファイルを使用して、kms-secrets
という名前のシークレットを作成します。$ oc create secret generic kms-secrets -n tekton-chains \ --from-file=KMS_AUTH_TOKEN=<path_and_name> 1
- 1
- KMS サーバーの認証トークンを含むファイルの完全なパスと名前 (例:
/home/user/KMS_AUTH_TOKEN)
。KMS_AUTH_TOKEN
の代わりに別のファイル名を使用することもできます。
TektonConfig
カスタムリソース (CR) のchain
セクションで、Tekton Chains コントローラーにシークレットをマウントするように設定し、signers.kms.auth.token-path
パラメーターを認証トークンファイルのフルパス名に設定します (次の例を参照)。kms-secrets
シークレットをマウントする設定例apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false signers.kms.auth.token-path: /etc/kms-secrets/KMS_AUTH_TOKEN options: deployments: tekton-chains-controller: spec: template: spec: containers: - name: tekton-chains-controller volumeMounts: - mountPath: /etc/kms-secrets name: kms-secrets volumes: - name: kms-secrets secret: secretName: kms-secrets # ...
1.2.4. 選択された namespace でのみ Tekton Chains が動作するようにする手順
デフォルトでは、Tekton Chains コントローラーはすべての namespace のリソースを監視します。Tekton Chains を特定の namespace でのみ実行するようにカスタマイズできるため、操作を細かく制御できます。
前提条件
-
cluster-admin
権限で OpenShift Container Platform クラスターにログインしている。
手順
TektonConfig
CR のchain
セクションで、コントローラーが監視する namespace を含める--namespace=
引数を追加します。次の例は、Tekton Chains コントローラーが
dev
およびtest
namespace 内のリソースのみを監視し、それに応じてPipelineRun
およびTaskRun
オブジェクトをフィルタリングする設定を示しています。apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: chain: disabled: false options: deployments: tekton-chains-controller: spec: template: spec: containers: - args: - --namespace=dev, test 1 name: tekton-chains-controller
- 1
--namespace
引数が指定されていないか空のままの場合、コントローラーはデフォルトですべての namespace を監視します。
1.3. Tekton Chains でデータに署名するための秘密
クラスター管理者は、キーペアを生成し、Tekton Chains を使用して、Kubernetes シークレットでアーティファクトに署名できます。Tekton Chains が機能するには、暗号化されたキーの秘密鍵とパスワードが、openshift-pipelines
namespace の signing-secrets
シークレットの一部として存在している必要があります。
現在、Tekton Chains は x509
および cosign
署名スキームをサポートしています。
使用できるのは、サポートされている署名スキームのいずれか 1 つのみです。
x509 署名スキーム
Tekton Chains で x509
署名スキームを使用するには、次の要件を満たす必要があります。
-
x509.pem
構造を使用してsigning-secrets
に秘密鍵を保存します。 -
秘密鍵を暗号化されていない
PKCS #8
PEM ファイルとして保存します。 -
鍵は
ed25519
またはecdsa
タイプです。
cosign 署名スキーム
Tekton Chains で cosign
署名スキームを使用するには、次の要件を満たす必要があります。
-
秘密鍵を
cosign.key
構造を使用してsigning-secrets
に保存します。 -
パスワードを
cosign.password
構造でsigning-secrets
に保存します。 -
秘密鍵を
ENCRYPTED COSIGN PRIVATE KEY
タイプの暗号化された PEM ファイルとして保存します。
1.3.1. TektonConfig CR を使用した x509 キーペアの生成
Tekton Chains シークレット用に x509
署名スキームを使用するには、x509
キーペアを生成する必要があります。
TektonConfig
カスタムリソース (CR) の generateSigningSecret
フィールドを true
に設定することで、x509
キーペアを生成できます。Red Hat OpenShift Pipelines Operator は、ecdsa
タイプのキーペア (x509.pem
秘密鍵および x509-pub.pem
公開鍵) を生成します。Operator はキーを openshift-pipelines
namespace の signing-secrets
シークレットに保存します。
generateSigningSecret
フィールドを true
から false
に設定すると、Red Hat OpenShift Pipelines Operator は signing-secrets
シークレットの値をオーバーライドおよび空にします。鍵が削除されないようにするには、シークレットの外部に x509-pub.pem
公開鍵を保存するようにしてください。Operator は後でキーを使用して、アーティファクトの証明を検証できます。
Red Hat OpenShift Pipelines Operator は、潜在的なセキュリティー問題を制限するために、以下の機能を提供しません。
- キーのローテーション
- 鍵の使用の監査
- 鍵への適切なアクセス制御
前提条件
-
OpenShift CLI (
oc
) ユーティリティーがインストールされている。 -
openshift-pipelines
namespace の管理者権限で OpenShift Container Platform クラスターにログインしている。
手順
次のコマンドを実行して、
TektonConfig
CR を編集します。$ oc edit TektonConfig config
TektonConfig
CR で、generateSigningSecret
の値をtrue
に設定します。TektonConfig CR を使用して ecdsa キーペアを作成する例
apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false generateSigningSecret: true 1 # ...
- 1
- デフォルト値は
false
です。値をtrue
に設定すると、ecdsa
キーペアが生成されます。
1.3.2. cosign ツールを使用した署名
cosign
署名ツールを使用すると、Tekton Chains で cosign
スキームを使用できます。
前提条件
- Cosign ツールをインストールしている。Cosign ツールのインストールについては、Cosign の Sigstore ドキュメント を参照してください。
手順
次のコマンドを実行して、
cosign.key
とcosign.pub
キーのペアを生成します。$ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
Cosign はパスワードの入力を求め、Kubernetes シークレットを作成します。
-
暗号化された
cosign.key
秘密鍵とcosign.password
復号化パスワードを、signing-secrets
Kubernetes シークレットに保存します。秘密鍵がENCRYPTED COSIGN PRIVATE KEY
型の暗号化された PEM ファイルとして保存されていることを確認します。
1.3.3. skopeo ツールを使用した署名
skopeo
ツールを使用して鍵を生成し、Tekton Chains で cosign
署名スキームで使用できます。
前提条件
- skopeo ツールをインストールしている。
手順
次のコマンドを実行して、公開鍵と秘密鍵のペアを生成します。
$ skopeo generate-sigstore-key --output-prefix <mykey> 1
- 1
<mykey>
を選択した鍵名に置き換えます。
Skopeo は秘密鍵のパスフレーズの入力を求め、
<mykey>.private
および<mykey>.pub
という名前の鍵ファイルを作成します。次のコマンドを実行し、
base64
ツールを使用して<mykey>.pub
ファイルをエンコードします。$ base64 -w 0 <mykey>.pub > b64.pub
次のコマンドを実行し、
base64
ツールを使用して<mykey>.private
ファイルをエンコードします。$ base64 -w 0 <mykey>.private > b64.private
次のコマンドを実行し、
base64
ツールを使用してパスフレーズをエンコードします。$ echo -n '<passphrase>' | base64 -w 0 > b64.passphrase 1
- 1
<passphrase>
を鍵ペアに使用したパスフレーズに置き換えます。
次のコマンドを実行して、
openshift-pipelines
namespace にsigning-secrets
シークレットを作成します。$ oc create secret generic signing-secrets -n openshift-pipelines
以下のコマンドを実行して
signing-secrets
シークレットを編集します。$ oc edit secret -n openshift-pipelines signing-secrets
次の方法で、エンコードされた鍵をシークレットのデータに追加します。
apiVersion: v1 data: cosign.key: <Encoded <mykey>.private> 1 cosign.password: <Encoded passphrase> 2 cosign.pub: <Encoded <mykey>.pub> 3 immutable: true kind: Secret metadata: name: signing-secrets # ... type: Opaque
1.3.4. "secret already exists" エラーの解決
signing-secret
シークレットがすでに入力されている場合、このシークレットを作成するコマンドは次のエラーメッセージを出力する可能性があります。
Error from server (AlreadyExists): secrets "signing-secrets" already exists
このエラーは、シークレットを削除することで解決できます。
手順
次のコマンドを実行して、
signing-secret
シークレットを削除します。$ oc delete secret signing-secrets -n openshift-pipelines
- 鍵ペアを再作成し、任意の署名スキームを使用してシークレットに保存します。
1.4. OCI レジストリーへの認証
署名を OCI レジストリーにプッシュする前に、クラスター管理者は、レジストリーで認証するように Tekton Chains を設定する必要があります。Tekton Chains コントローラーは、タスクの実行と同じサービスアカウントを使用します。署名を OCI レジストリーにプッシュするために必要な認証情報を使用してサービスアカウントを設定するには、次の手順を実行します。
手順
Kubernetes サービスアカウントの namespace と名前を設定します。
$ export NAMESPACE=<namespace> 1 $ export SERVICE_ACCOUNT_NAME=<service_account> 2
Kubernetes シークレットを作成します。
$ oc create secret registry-credentials \ --from-file=.dockerconfigjson \ 1 --type=kubernetes.io/dockerconfigjson \ -n $NAMESPACE
- 1
- Docker 設定ファイルへのパスに置き換えます。デフォルトのパスは
~/.docker/config.json
です。
サービスアカウントにシークレットへのアクセス権限を付与します。
$ oc patch serviceaccount $SERVICE_ACCOUNT_NAME \ -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE
Red Hat OpenShift Pipelines がすべてのタスク実行に割り当てるデフォルトの
pipeline
サービスアカウントにパッチを適用すると、Red Hat OpenShift Pipelines Operator はサービスアカウントをオーバーライドします。ベストプラクティスとして、次の手順を実行できます。ユーザーのタスク実行に割り当てる別のサービスアカウントを作成します。
$ oc create serviceaccount <service_account_name>
タスク実行テンプレートの
serviceaccountname
フィールドの値を設定して、サービスアカウントをタスク実行に関連付けます。apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 spec: taskRunTemplate: serviceAccountName: build-bot 1 taskRef: name: build-push ...
- 1
- 新しく作成したサービスアカウントの名前に置き換えます。
1.5. 追加認証なしでタスク実行の署名を作成および検証する
追加認証を使用して Tekton Chains でタスク実行の署名を検証するには、次のタスクを実行します。
-
暗号化された
x509
またはcosign
キーペアを生成し、Kubernetes シークレットとして保存します。 - Tekton Chains バックエンドストレージを設定します。
- タスク実行を作成して署名し、署名とペイロードをタスク実行自体にアノテーションとして保存します。
- 署名されたタスクの実行から署名とペイロードを取得します。
- タスク実行の署名を確認します。
前提条件
次のコンポーネントがクラスターにインストールされていることを確認する。
- Red Hat OpenShift Pipelines Operator
- Tekton Chains
- Cosign
手順
-
暗号化された
x509
またはcosign
キーペアを生成します。キーペアの作成とそれをシークレットとして保存する方法の詳細は、「Tekton Chains でデータを署名するためのシークレット」を参照してください。 Tekton Chains 設定で、OCI ストレージを無効にし、タスク実行ストレージとフォーマットを
tekton
に設定します。TektonConfig
カスタムリソースで次の値を設定します。apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: # ... chain: artifacts.oci.storage: "" artifacts.taskrun.format: tekton artifacts.taskrun.storage: tekton # ...
TektonConfig
カスタムリソースを使用した Tekton チェーンの設定の詳細は、「Tekton チェーンの設定」を参照してください。Tekton Chains コントローラーを再起動して、変更した設定が確実に適用されるようにするには、次のコマンドを入力します。
$ oc delete po -n openshift-pipelines -l app=tekton-chains-controller
次のコマンドを入力してタスク実行を作成します。
$ oc create -f https://raw.githubusercontent.com/tektoncd/chains/main/examples/taskruns/task-output-image.yaml 1
- 1
- サンプル URI を、タスクの実行を指す URI またはファイルパスに置き換えます。
出力例
taskrun.tekton.dev/build-push-run-output-image-qbjvh created
次のコマンドを入力して、ステップのステータスを確認します。プロセスが完了するまで待ちます。
$ 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
Base64
でエンコードされたアノテーションとして保存されたオブジェクトから署名を取得するには、次のコマンドを入力します。$ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" | base64 -d > sig
$ export TASKRUN_UID=$(tkn tr describe --last -o jsonpath='{.metadata.uid}')
- 作成した公開鍵を使用して署名を検証するには、次のコマンドを入力します。
$ cosign verify-blob-attestation --insecure-ignore-tlog --key path/to/cosign.pub --signature sig --type slsaprovenance --check-claims=false /dev/null 1
- 1
path/to/cosign.pub
を公開鍵ファイルのパス名に置き換えます。出力例
Verified OK
1.6. Tekton Chains を使用したイメージと取得元の署名および検証
クラスター管理者は、Tekton Chains を使用して、以下のタスクを実行することで、イメージと証明書を署名および検証できます。
-
暗号化された
x509
またはcosign
キーペアを生成し、Kubernetes シークレットとして保存します。 - OCI レジストリーの認証を設定して、イメージ、イメージ署名、および署名されたイメージ証明書を保存します。
- Tekton Chains を設定して、証明書を生成し署名します。
- タスク実行で Kaniko を使用してイメージを作成します。
- 署名されたイメージと署名された証明書を検証する。
前提条件
以下のツールがクラスターにインストールされている。
手順
-
暗号化された
x509
またはcosign
キーペアを生成します。キーペアの作成とそれをシークレットとして保存する方法の詳細は、「Tekton Chains でデータを署名するためのシークレット」を参照してください。 イメージレジストリーの認証を設定します。
- 署名を OCI レジストリーにプッシュするように Tekton Chains コントローラーを設定するには、タスク実行のサービスアカウントに関連付けられた認証情報を使用します。詳細は、「OCI レジストリーへの認証」を参照してください。
イメージをビルドしてレジストリーにプッシュする Kaniko タスクの認証を設定するには、必要な認証情報を含む docker
config.json
ファイルの Kubernetes シークレットを作成します。$ oc create secret generic <docker_config_secret_name> \ 1 --from-file <path_to_config.json> 2
Tekton Chains を設定するには、
chains-config
オブジェクトでartifacts.taskrun.format
、artifacts.taskrun.storage
、transparency.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"}}'
Kaniko タスクを開始します。
Kaniko タスクをクラスターに適用します。
$ oc apply -f examples/kaniko/kaniko.yaml 1
- 1
- Kaniko タスクへの URI またはファイルパスに置き換えます。
適切な環境変数を設定します。
$ export REGISTRY=<url_of_registry> 1 $ export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json> 2
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
にプッシュされます。
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", ... }
- 1
- タスク実行の名前に置き換えます。
イメージとアテステーションを確認します。
$ cosign verify --key cosign.pub $REGISTRY/kaniko-chains $ cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
Rekor でイメージの証明書を見つけます。
- $ REGISTRY/kaniko-chains イメージのダイジェストを取得します。タスクの実行中に検索するか、イメージをプルしてダイジェストをデプロイメントできます。
Rekor を検索して、イメージの
sha256
ダイジェストに一致するすべてのエントリーを見つけます。$ rekor-cli search --sha <image_digest> 1 <uuid_1> 2 <uuid_2> 3 ...
検索結果には、一致するエントリーの UUID が表示されます。それらの UUID の 1 つが証明書を保持します。
アテステーションを確認してください。
$ rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq
1.7. 関連情報
第2章 Web コンソールで OpenShift Pipelines を設定してソフトウェアサプライチェーンのセキュリティー要素を表示する方法
開発者 または 管理者 のパースペクティブを使用して、パイプラインを作成または変更し、プロジェクト内の主要なソフトウェアサプライチェーンセキュリティー要素を表示します。
以下を表示するには OpenShift Pipelines を設定します。
- プロジェクトの脆弱性: プロジェクト内で特定された脆弱性の視覚的な表現。
- ソフトウェア部品表 (SBOM): PipelineRun コンポーネントの詳細なリストをダウンロードまたは表示します。
さらに、Tekton Chains の要件を満たす PipelineRun には、名前の横に署名付きバッジが表示されます。このバッジは、パイプライン実行の実行結果が暗号的に署名され、OCI イメージ内などに安全に保存されていることを示します。
図2.1 署名済みのバッジ

PipelineRun では、Tekton Chains が設定されている場合にのみ、名前の横に署名されたバッジが表示されます。Tekton Chains の設定は、OpenShift Pipelines サプライチェーンセキュリティーでの Tekton Chains の使用 を参照してください。
2.1. プロジェクトの脆弱性を表示するための OpenShift Pipelines の設定
PipelineRun の詳細ページには、特定された脆弱性が重大度 (重大、高、中、低) 別に分類されて視覚的に表示されます。この合理化されたビューにより、優先順位付けと修復作業が容易になります。
図2.2 PipelineRun
の詳細ページでの脆弱性表示

パイプライン実行リストビューページの Vulnerabilities 列で脆弱性を確認することもできます。
図2.3 PipelineRun
リストビューでの脆弱性表示

特定された脆弱性の視覚的な表現は、OpenShift Container Platform バージョン 4.15 リリース以降で利用できます。
前提条件
- Web コンソールにログイン している。
- OpenShift Container Platform でアプリケーションおよび他のワークロードを作成するための適切なプロジェクト内の ロールおよび権限 がある。
- 既存の脆弱性スキャンタスクがある。
手順
- 開発者 または 管理者 のパースペクティブで、脆弱性を視覚的に表現する関連プロジェクトに切り替えます。
既存の脆弱性スキャンタスクを更新して、出力が .json ファイルに保存され、次の形式で脆弱性の概要が抽出されるようにします。
# The format to extract vulnerability summary (adjust the jq command for different JSON structures). jq -rce \ '{vulnerabilities:{ critical: (.result.summary.CRITICAL), high: (.result.summary.IMPORTANT), medium: (.result.summary.MODERATE), low: (.result.summary.LOW) }}' scan_output.json | tee $(results.SCAN_OUTPUT.path)
注記異なる JSON 構造に合わせて jq コマンドを調整する必要がある場合があります。
(オプション) 脆弱性スキャンタスクがない場合は、次の形式で作成します。
Roxctl を使用した脆弱性スキャンタスクの例
apiVersion: tekton.dev/v1 kind: Task metadata: name: vulnerability-scan 1 annotations: task.output.location: results 2 task.results.format: application/json task.results.key: SCAN_OUTPUT 3 spec: params: - description: Image to be scanned name: image type: string results: - description: CVE result format 4 name: SCAN_OUTPUT steps: - name: roxctl image: 'quay.io/lrangine/crda-maven:11.0' 5 env: - name: ROX_CENTRAL_ENDPOINT valueFrom: secretKeyRef: key: rox_central_endpoint 6 name: roxsecrets - name: ROX_API_TOKEN valueFrom: secretKeyRef: key: rox_api_token 7 name: roxsecrets name: roxctl-scan script: | 8 #!/bin/sh curl -k -L -H "Authorization: Bearer $ROX_API_TOKEN" https://$ROX_CENTRAL_ENDPOINT/api/cli/download/roxctl-linux --output ./roxctl chmod +x ./roxctl ./roxctl image scan --insecure-skip-tls-verify -e $ROX_CENTRAL_ENDPOINT --image $(params.image) --output json > roxctl_output.json jq -rce \ "{vulnerabilities:{ critical: (.result.summary.CRITICAL), high: (.result.summary.IMPORTANT), medium: (.result.summary.MODERATE), low: (.result.summary.LOW) }}" roxctl_output.json | tee $(results.SCAN_OUTPUT.path)
- 1
- タスクの名前。
- 2
- タスク出力を保存する場所。
- 3
- スキャンタスク結果の命名規則。有効な命名規則は、
SCAN_OUTPUT
文字列で終わる必要があります。たとえば、SCAN_OUTPUT、MY_CUSTOM_SCAN_OUTPUT、ACS_SCAN_OUTPUT などです。 - 4
- 結果の説明。
- 5
- スキャンツールを実行するコンテナーイメージの場所です。
- 6
- Advanced Cluster Security for Kubernetes (ACS) から取得した
rox_central_endpoint
キー。 - 7
- ACS から取得した
rox_api_token
。 - 8
- シェルスクリプトは脆弱性スキャンを実行し、タスク実行結果にスキャン出力を設定します。
注記これは設定例です。結果を必要とされる形式で設定するには、特定のスキャンツールに合わせて値を変更します。
適切なパイプラインを更新して、次の形式で脆弱性の仕様を追加します。
... spec: results: - description: The common vulnerabilities and exposures (CVE) result name: SCAN_OUTPUT value: $(tasks.vulnerability-scan.results.SCAN_OUTPUT)
検証
-
PipelineRun
の詳細ページに移動し、特定された脆弱性の視覚的な表現について Vulnerabilities 行を確認します。 -
または、
PipelineRun
リストビューページに移動して、Vulnerabilities 列を確認することもできます。
2.2. SBOM をダウンロードまたは表示するための OpenShift Pipeline の設定
PipelineRun
の詳細ページには、ソフトウェア部品表 (SBOM) をダウンロードまたは表示するオプションが用意されており、サプライチェーン内の透明性と制御が強化されます。SBOM には、コンポーネントが使用するすべてのソフトウェアライブラリーがリストされます。これらのライブラリーは、特定の機能を有効にしたり、開発を容易にしたりすることができます。
SBOM を使用すると、ソフトウェアの構成をより深く理解し、脆弱性を特定し、発生する可能性のあるセキュリティー問題の影響を評価できます。
図2.4 SBOM をダウンロードまたは表示するオプション

前提条件
- Web コンソールにログイン している。
- OpenShift Container Platform でアプリケーションおよび他のワークロードを作成するための適切なプロジェクト内の ロールおよび権限 がある。
手順
- 開発者 または 管理者 のパースペクティブで、SBOM を視覚的に表現する関連プロジェクトに切り替えます。
SBOM 情報を表示またはダウンロードするには、次の形式でタスクを追加します。
SBOM タスクの例
apiVersion: tekton.dev/v1 kind: Task metadata: name: sbom-task 1 annotations: task.output.location: results 2 task.results.format: application/text task.results.key: LINK_TO_SBOM 3 task.results.type: external-link 4 spec: results: - description: Contains the SBOM link 5 name: LINK_TO_SBOM steps: - name: print-sbom-results image: quay.io/image 6 script: | 7 #!/bin/sh syft version syft quay.io/<username>/quarkus-demo:v2 --output cyclonedx-json=sbom-image.json echo 'BEGIN SBOM' cat sbom-image.json echo 'END SBOM' echo 'quay.io/user/workloads/<namespace>/node-express/node-express:build-8e536-1692702836' | tee $(results.LINK_TO_SBOM.path) 8
新しく作成された SBOM タスクを参照するようにパイプラインを更新します。
... spec: tasks: - name: sbom-task taskRef: name: sbom-task 1 results: - name: IMAGE_URL 2 description: url value: <oci_image_registry_url> 3
- 影響を受ける OpenShift Pipeline を再実行します。
2.2.1. Web UI での SBOM の表示
前提条件
- SBOM をダウンロードまたは表示するために OpenShift Pipeline を設定している。
手順
- アクティビティー→PipelineRuns タブに移動します。
- SBOM を表示するプロジェクトには、最新のパイプライン実行を選択します。
PipelineRun
の詳細ページで、SBOM の表示 を選択します。-
Web ブラウザーを使用すると、ソフトウェアサプライチェーンの脆弱性を示す用語を SBOM ですぐに検索できます。たとえば、
log4j
を検索してみてください。 - SBOM をダウンロードするには Download を選択し、全画面で表示するには Expand を選択できます。
-
Web ブラウザーを使用すると、ソフトウェアサプライチェーンの脆弱性を示す用語を SBOM ですぐに検索できます。たとえば、
2.2.2. CLI での SBOM のダウンロード
前提条件
- Cosign CLI ツールがインストールされている。Cosign ツールのインストールについては、Cosign の Sigstore ドキュメント を参照してください。
- SBOM をダウンロードまたは表示するために OpenShift Pipeline を設定している。
手順
- ターミナルを開き、開発者 または 管理者 のパースペクティブにログインして、関連するプロジェクトに切り替えます。
OpenShift Web コンソールから、
download sbom
コマンドをコピーし、ターミナルで実行します。cosign コマンドの例
$ cosign download sbom quay.io/<workspace>/user-workload@sha256
(オプション) 完全な SBOM を検索可能な形式で表示するには、次のコマンドを実行して出力をリダイレクトします。
cosign コマンドの例
$ cosign download sbom quay.io/<workspace>/user-workload@sha256 > sbom.txt
2.2.3. SBOM の確認
SBOM では、次の抜粋例に示すように、プロジェクトが使用する各ライブラリーの 4 つの特性を確認できます。
- 作成者または公開者
- 名前
- バージョン
- ライセンス
この情報は、個々のライブラリーが安全なソースからのものであり、更新済みで、コンプライアンスに準拠したものであることを確認するのに役立ちます。
SBOM の例
{ "bomFormat": "CycloneDX", "specVersion": "1.4", "serialNumber": "urn:uuid:89146fc4-342f-496b-9cc9-07a6a1554220", "version": 1, "metadata": { ... }, "components": [ { "bom-ref": "pkg:pypi/flask@2.1.0?package-id=d6ad7ed5aac04a8", "type": "library", "author": "Armin Ronacher <armin.ronacher@active-4.com>", "name": "Flask", "version": "2.1.0", "licenses": [ { "license": { "id": "BSD-3-Clause" } } ], "cpe": "cpe:2.3:a:armin-ronacher:python-Flask:2.1.0:*:*:*:*:*:*:*", "purl": "pkg:pypi/Flask@2.1.0", "properties": [ { "name": "syft:package:foundBy", "value": "python-package-cataloger" ...
2.3. 関連情報
第3章 Pod のセキュリティーコンテキストの設定
OpenShift Pipelines が開始する Pod のデフォルトのサービスアカウントは、Pipeline
です。pipeline
サービスアカウントに関連付けられた Security Context Constraint (SCC) は、pipelines-scc
です。pipelines-scc
SCC は anyuid
SCC に基づいていますが、次の YAML 仕様で定義されているように若干の違いがあります。
pipelines-scc.yaml
スニペットの例
apiVersion: security.openshift.io/v1 kind: SecurityContextConstraints # ... allowedCapabilities: - SETFCAP # ... fsGroup: type: MustRunAs # ...
さらに、OpenShift Pipelines の一部として提供される Buildah
タスクは、デフォルトのストレージドライバーとして vfs
を使用します。
OpenShift Pipelines がパイプライン実行およびタスク実行用に作成する Pod のセキュリティーコンテキストを設定できます。次の変更を加えることができます。
- すべての Pod のデフォルトおよび最大 SCC を変更する
- 特定の namespace でのパイプライン実行およびタスク実行用に作成された Pod のデフォルト SCC を変更する
- カスタム SCC およびサービスアカウントを使用するように特定のパイプライン実行またはタスク実行を設定する
すべてのイメージを確実にビルドできるように buildah
を実行する最も簡単な方法は、特権
SCC を使用して Pod 内で root として実行することです。より制限的なセキュリティー設定で buildah
を実行する手順は、root 以外のユーザーとして Buildah を使用したコンテナーイメージのビルド を参照してください。
3.1. OpenShift Pipelines が作成する Pod のデフォルトおよび最大 SCC の設定
OpenShift Pipelines がタスク実行およびパイプライン実行用に作成するすべての Pod に対して、デフォルトの security context constraint (SCC) を設定できます。最大 SCC を設定することもできますが、これは、任意の namespace 内のこれらの Pod に対して設定できる最も制限の少ない SCC です。
手順
次のコマンドを入力して、
TektonConfig
カスタムリソース (CR) を編集します。$ oc edit TektonConfig config
次の例のように、仕様でデフォルトと最大の SCC を設定します。
apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: # ... platforms: openshift: scc: default: "restricted-v2" 1 maxAllowed: "privileged" 2
- 1
spec.platforms.openshift.scc.default
は、OpenShift Pipelines がワークロードに使用されるサービスアカウント (SA) にアタッチするデフォルトの SCC (デフォルトではpipeline
SA) を指定します。この SCC は、すべてのパイプライン実行 Pod とタスク実行 Pod に使用されます。- 2
spec.platforms.openshift.scc.maxAllowed
は、任意の namespace のパイプライン実行 Pod およびタスク実行 Pod に対して設定できる最も制限の少ない SCC を指定します。この設定は、特定のパイプライン実行またはタスク実行でカスタム SA および SCC を設定する場合には適用されません。
3.2. namespace 内の Pod の SCC 設定
特定の namespace で作成したパイプライン実行およびタスク実行用に OpenShift Pipelines が作成するすべての Pod に対してセキュリティーコンテキスト制約 (SCC) を設定できます。この SCC は、spec.platforms.openshift.scc.maxAllowed
仕様で TektonConfig
CR を使用して設定した最大 SCC よりも制限が厳密に指定することはできません。
手順
namespace の
operator.tekton.dev/scc
アノテーションを SCC の名前に設定します。OpenShift Pipelines Pod の SCC を設定するための namespace アノテーションの例
apiVersion: v1 kind: Namespace metadata: name: test-namespace annotations: operator.tekton.dev/scc: nonroot
3.3. カスタム SCC およびカスタムサービスアカウントを使用したパイプライン実行とタスク実行
デフォルトの pipelines
サービスアカウントに関連付けられた pipelines-scc
SCC (Security Context Constraints) を使用する場合、パイプライン実行およびタスク実行 Pod にタイムアウトが生じる可能性があります。これは、デフォルトの pipelines-scc
SCC で fsGroup.type
パラメーターが MustRunAs
に設定されているために発生します。
Pod タイムアウトの詳細は、BZ#1995779 を参照してください。
Pod タイムアウトを回避するには、fsGroup.type
パラメーターを RunAsAny
に設定してカスタム SCC を作成し、これをカスタムサービスアカウントに関連付けることができます。
ベストプラクティスとして、パイプライン実行とタスク実行にカスタム SCC およびカスタムサービスアカウントを使用します。このアプローチを使用することで、柔軟性が増し、アップグレード時にデフォルト値が変更されても実行が失敗することはありません。
手順
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
カスタム SCC を作成します。
例:
my-scc
SCC の作成$ oc create -f my-scc.yaml
カスタムサービスアカウントを作成します。
例:
fsgroup-runasany
サービスアカウントの作成$ oc create serviceaccount fsgroup-runasany
カスタム SCC をカスタムサービスアカウントに関連付けます。
例:
my-scc
SCC をfsgroup-runasany
サービスアカウントに関連付けます。$ oc adm policy add-scc-to-user my-scc -z fsgroup-runasany
特権付きタスクにカスタムサービスアカウントを使用する必要がある場合は、以下のコマンドを実行して
privileged
SCC をカスタムサービスアカウントに関連付けることができます。例:
fsgroup-runasany
サービスアカウントを使用したprivileged
SCC の関連付け$ oc adm policy add-scc-to-user privileged -z fsgroup-runasany
パイプライン実行およびタスク実行でカスタムサービスアカウントを使用します。
例:
fsgroup-runasany
カスタムサービスアカウントを使用した Pipeline 実行 YAMLapiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: <pipeline-run-name> spec: pipelineRef: name: <pipeline-cluster-task-name> taskRunTemplate: serviceAccountName: 'fsgroup-runasany'
例:
fsgroup-runasany
カスタムサービスアカウントを使用したタスク実行 YAMLapiVersion: tekton.dev/v1 kind: TaskRun metadata: name: <task-run-name> spec: taskRef: name: <cluster-task-name> taskRunTemplate: serviceAccountName: 'fsgroup-runasany'
3.4. 関連情報
第4章 イベントリスナーによる 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>
さらに、作成されたシークレットを Eventlistener
Pod にマウントし、要求を保護できます。
4.1. OpenShift ルートを使用したセキュアな接続の提供
再暗号化した TLS 終端を使用してルートを作成するには、以下を実行します。
$ oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
または、再暗号化 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-----
- 1 2
- オブジェクトの名前 (63 文字のみに制限)。
- 3
- termination フィールドは
reencrypt
に設定されます。これは、必要な唯一の TLS フィールドです。 - 4
- これは、再暗号化に必要です。
destinationCACertificate
は CA 証明書を指定してエンドポイントの証明書を検証し、ルーターから宛先 Pod への接続のセキュリティーを保護します。このフィールドは以下のいずれかのシナリオで省略できます。- サービスは、サービス署名証明書を使用します。
- 管理者はルーターのデフォルト CA 証明書を指定し、サービスにはその CA によって署名された証明書を指定します。
oc create route reencrypt --help
コマンドを実行すると、他のオプションを表示できます。
4.2. セキュアな HTTPS 接続を使用して EventListener リソースの作成
このセクションでは、pipelines-tutorial の例を使用して、セキュアな HTTPS 接続を使用した EventListener リソースのサンプルの作成を説明します。
手順
pipelines-tutorial リポジトリーで利用可能な YAML ファイルから
TriggerBinding
リソースを作成します。$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/01_binding.yaml
pipelines-tutorial リポジトリーで利用可能な YAML ファイルから
TriggerTemplate
リソースを作成します。$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/02_template.yaml
Trigger
リソースを pipelines-tutorial リポジトリーから直接作成します。$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/03_trigger.yaml
セキュアな HTTPS 接続を使用して
EventListener
リソースの作成します。ラベルを追加して、
Eventlistener
リソースへのセキュアな HTTPS 接続を有効にします。$ oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabled
pipelines-tutorial リポジトリーで利用可能な YAML ファイルから
EventListener
リソースを作成します。$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/04_event_listener.yaml
再暗号化 TLS 終端でルートを作成します。
$ oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
第5章 シークレットを使用したリポジトリーでのパイプラインの認証
パイプラインとタスクでは、Git リポジトリーとコンテナーリポジトリーで認証するために認証情報が必要になる場合があります。Red Hat OpenShift Pipelines では、シークレットを使用して、実行中に Git リポジトリーまたはコンテナーリポジトリーと対話するパイプライン実行およびタスク実行を認証できます。
Git リポジトリーでの認証用のシークレットは Git シークレット と呼ばれます。
パイプライン実行またはタスク実行は、関連付けられたサービスアカウントを介してシークレットにアクセスできます。あるいは、パイプラインまたはタスクでワークスペースを定義し、そのワークスペースにシークレットをバインドすることもできます。
5.1. 前提条件
-
oc
OpenShift コマンドラインユーティリティーがインストールされている。
5.2. サービスアカウントを使用したシークレットの提供
サービスアカウントを使用して、Git リポジトリーおよびコンテナーリポジトリーでの認証用のシークレットを提供できます。
シークレットをサービスアカウントに関連付けることができます。シークレット内の情報は、このサービスアカウントで実行されるタスクで利用できるようになります。
5.2.1. サービスアカウントのシークレットの種類とアノテーション
サービスアカウントを使用して認証シークレットを提供する場合、OpenShift Pipelines はいくつかのシークレットタイプをサポートします。これらのシークレットタイプの多くでは、認証シークレットが有効なリポジトリーを定義するアノテーションを指定する必要があります。
5.2.1.1. Git 認証シークレット
サービスアカウントを使用して認証シークレットを指定する場合、OpenShift Pipelines は Git 認証用に次のタイプのシークレットをサポートします。
-
kubernetes.io/basic-auth
: Basic 認証のユーザー名とパスワード -
kubernetes.io/ssh-auth
: SSH ベースの認証用のキー
サービスアカウントを使用して認証シークレットを指定する場合、Git シークレットには 1 つ以上のアノテーションキーが必要です。各キーの名前は tekton.dev/git-
で開始する必要があります。また、値は OpenShift Pipelines がシークレット内の認証情報を使用する必要があるホストの URL に指定します。
次の例では、OpenShift Pipelines は basic-auth
シークレットを使用して github.com
および gitlab.com
のリポジトリーにアクセスします。
例: 複数の Git リポジトリーでの Basic 認証の認証情報
apiVersion: v1 kind: Secret metadata: name: git-secret-basic 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
次の例のように、ssh-auth
シークレットを使用して Git リポジトリーにアクセスするための秘密鍵を指定することもできます。
例: SSH ベースの認証の秘密鍵
apiVersion: v1
kind: Secret
metadata:
name: git-secret-ssh
annotations:
tekton.dev/git-0: https://github.com
type: kubernetes.io/ssh-auth
stringData:
ssh-privatekey: 1
- 1
- SSH 秘密鍵ファイルの内容。
5.2.1.2. コンテナーレジストリーの認証シークレット
サービスアカウントを使用して認証シークレットを提供する場合、OpenShift Pipelines はコンテナー (Docker) レジストリー認証用に次のタイプのシークレットをサポートします。
-
kubernetes.io/basic-auth
: Basic 認証のユーザー名とパスワード -
kubernetes.io/dockercfg
: シリアル化された~/.dockercfg
ファイル -
kubernetes.io/dockerconfigjson
: シリアル化された~/.docker/config.json
ファイル
サービスアカウントを使用して認証シークレットを指定する場合、kubernetes.io/basic-auth
タイプのコンテナーレジストリーシークレットに 1 つ以上のアノテーションキーが必要です。各キーの名前は tekton.dev/docker-
で開始する必要があります。また、値は OpenShift Pipelines がシークレット内の認証情報を使用する必要があるホストの URL に指定します。このアノテーションは、他のタイプのコンテナーレジストリーシークレットには必要ありません。
次の例では、OpenShift Pipelines はユーザー名とパスワードに依存する basic-auth
シークレットを使用して、quay.io
および my-registry.example.com
のコンテナーレジストリーにアクセスします。
例: 複数のコンテナーリポジトリーでの Basic 認証の認証情報
apiVersion: v1 kind: Secret metadata: name: docker-secret-basic annotations: tekton.dev/docker-0: quay.io tekton.dev/docker-1: my-registry.example.com type: kubernetes.io/basic-auth stringData: username: <username> 1 password: <password> 2
次の例のように、既存の設定ファイルから kubernetes.io/dockercfg
および kubernetes.io/dockerconfigjson
シークレットを作成できます。
例: 既存の設定ファイルからコンテナーリポジトリーへの認証用のシークレットを作成するコマンド
$ oc create secret generic docker-secret-config \ --from-file=config.json=/home/user/.docker/config.json \ --type=kubernetes.io/dockerconfigjson
次の例のように、oc
コマンドラインユーティリティーを使用して、認証情報から kubernetes.io/dockerconfigjson
シークレットを作成することもできます。
例: 認証情報からコンテナーリポジトリーへの認証用のシークレットを作成するコマンド
$ oc create secret docker-registry docker-secret-config \ --docker-email=<email> \ 1 --docker-username=<username> \ 2 --docker-password=<password> \ 3 --docker-server=my-registry.example.com:5000 4
5.2.2. サービスアカウントを使用した Git の Basic 認証の設定
パスワードで保護されたリポジトリーからリソースを取得するパイプラインの場合は、そのパイプラインの Basic 認証を設定できます。
Basic 認証ではなく SSH ベースの認証を使用することを検討してください。
パイプラインの Basic 認証を設定するには、Basic 認証シークレットを作成し、このシークレットをサービスアカウントに関連付け、このサービスアカウントを TaskRun
または PipelineRun
リソースに関連付けます。
GitHub では、プレーンパスワードを使用した認証は非推奨になりました。代わりに、Personal Access Token を使用します。
手順
secret.yaml
ファイルにシークレットの YAML マニフェストを作成します。このマニフェストでは、対象の Git リポジトリーにアクセスするためのユーザー名とパスワード、または GitHub Personal Access Token を指定します。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
サービスアカウントの YAML マニフェストを
serviceaccount.yaml
ファイルに作成します。このマニフェストで、シークレットをサービスアカウントに関連付けます。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: basic-user-pass 2
run.yaml
ファイルにタスク実行またはパイプライン実行の YAML マニフェストを作成し、サービスアカウントをタスク実行またはパイプライン実行に関連付けます。次のいずれかの例を使用します。サービスアカウントを
TaskRun
リソースに関連付けます。apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 1 spec: taskRunTemplate: serviceAccountName: build-bot 2 taskRef: name: build-push 3
サービスアカウントを
PipelineRun
リソースに関連付けます。apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: taskRunTemplate: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
次のコマンドを入力して、作成した YAML マニフェストを適用します。
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
5.2.3. サービスアカウントを使用した Git の SSH 認証の設定
パイプラインが SSH キーで設定されたリポジトリーからリソースを取得するには、そのパイプラインの SSH ベースの認証を設定する必要があります。
パイプラインの SSH ベースの認証を設定するには、SSH 秘密鍵を使用して認証シークレットを作成し、このシークレットをサービスアカウントに関連付け、このサービスアカウントを TaskRun
または PipelineRun
リソースに関連付けます。
手順
-
SSH 秘密鍵 を生成するか、既存の秘密鍵をコピーします。これは通常
~/.ssh/id_rsa
ファイルで入手できます。 secret.yaml
ファイルにシークレットの 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
重要既知のホストファイルを省略すると、OpenShift Pipelines は任意のサーバーの公開鍵を受け入れます。
-
オプション: アノテーション値の末尾に
:<port_number>
を追加して、カスタム SSH ポートを指定します。たとえば、tekton.dev/git-0: github.com:2222
などです。 サービスアカウントの YAML マニフェストを
serviceaccount.yaml
ファイルに作成します。このマニフェストで、シークレットをサービスアカウントに関連付けます。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: ssh-key 2
run.yaml
ファイルで、サービスアカウントをタスク実行またはパイプライン実行に関連付けます。次のいずれかの例を使用します。サービスアカウントをタスク実行に関連付けます。
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 1 spec: taskRunTemplate: serviceAccountName: build-bot 2 taskRef: name: build-push 3
サービスアカウントをパイプライン実行に関連付けます。
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: taskRunTemplate: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
変更を適用します。
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
5.2.4. サービスアカウントを使用したコンテナーレジストリー認証の設定
パイプラインがレジストリーからコンテナーイメージを取得したり、コンテナーイメージをレジストリーにプッシュしたりするには、そのレジストリーの認証を設定する必要があります。
パイプラインのレジストリー認証を設定するには、Docker 設定ファイルを使用して認証シークレットを作成し、このシークレットをサービスアカウントに関連付け、このサービスアカウントを TaskRun
または PipelineRun
リソースに関連付けます。
手順
次のコマンドを入力して、認証情報を含めて、既存の
config.json
ファイルからコンテナーレジストリー認証シークレットを作成します。$ oc create secret generic my-registry-credentials \ 1 --from-file=config.json=/home/user/credentials/config.json 2
サービスアカウントの YAML マニフェストを
serviceaccount.yaml
ファイルに作成します。このマニフェストで、シークレットをサービスアカウントに関連付けます。apiVersion: v1 kind: ServiceAccount metadata: name: container-bot 1 secrets: - name: my-registry-credentials 2
タスク実行またはパイプライン実行の YAML マニフェストを
run.yaml
ファイルとして作成します。このファイルで、サービスアカウントをタスク実行またはパイプライン実行に関連付けます。次のいずれかの例を使用します。サービスアカウントをタスク実行に関連付けます。
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-container-task-run-2 1 spec: taskRunTemplate: serviceAccountName: container-bot 2 taskRef: name: build-container 3
サービスアカウントをパイプライン実行に関連付けます。
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: taskRunTemplate: serviceAccountName: container-bot 2 pipelineRef: name: demo-pipeline 3
次のコマンドを入力して変更を適用します。
$ oc apply --filename serviceaccount.yaml,run.yaml
5.2.5. サービスアカウントを使用した認証に関する追加の考慮事項
場合によっては、サービスアカウントを使用して提供する認証シークレットを使用するために追加の手順を実行する必要があります。
5.2.5.1. タスクでの SSH Git 認証
タスクのステップで Git コマンドを直接呼び出して SSH 認証を使用することもできますが、追加のステップを完了する必要があります。
OpenShift Pipelines は、/tekton/home/.ssh
ディレクトリーに SSH ファイルを提供し、$HOME
変数を /tekton/home
に設定します。ただし、Git SSH 認証では $HOME
変数は無視され、ユーザーの /etc/passwd
ファイルで指定されたホームディレクトリーが使用されます。したがって、Git コマンドを使用するステップでは、/tekton/home/.ssh
ディレクトリーを関連付けられたユーザーのホームディレクトリーに対するシンボリックリンクを作成する必要があります。
たとえば、root
ユーザーがタスクを実行する場合、手順には Git コマンドの前に次のコマンドが含まれている必要があります。
apiVersion: tekton.dev/v1 kind: Task metadata: name: example-git-task spec: steps: - name: example-git-step # ... script: ln -s $HOME/.ssh /root/.ssh # ...
ただし、git
タイプのパイプラインリソースまたは Tekton カタログで使用可能な git-clone
タスクを使用する場合は、明示的なシンボリックリンクは必要ありません。
git
タイプのタスクで SSH 認証を使用する例として、authenticating-git-commands.yaml を参照してください。
5.2.5.2. ルート以外のユーザーとしてのシークレットの使用
以下のような特定のシナリオでは、root 以外のユーザーとしてシークレットを使用する必要がある場合があります。
- コンテナーが実行するために使用するユーザーとグループは、プラットフォームによってランダム化されます。
- タスクの手順では、root 以外のセキュリティーコンテキストを定義します。
- タスクは、root 以外のグローバルセキュリティーコンテキストを指定します。これは、タスクのすべての手順に適用されます。
このようなシナリオでは、root 以外のユーザーとしてタスク実行とパイプライン実行を行う際の次の側面を考慮してください。
-
Git の SSH 認証では、ユーザーが
/etc/passwd
ディレクトリーに有効なホームディレクトリーを設定している必要があります。有効なホームディレクトリーのない UID を指定すると、認証に失敗します。 -
SSH 認証は
$HOME
環境変数を無視します。そのため、OpenShift Pipelines によって定義された$HOME
ディレクトリー (/tekton/home
) から適切なシークレットファイルを非 root ユーザーの有効なホームディレクトリーにシンボリックリンクする必要があります。
さらに、root 以外のセキュリティーコンテキストで SSH 認証を設定するには、git コマンドの認証の例 の git-clone-and-check
手順を参照してください。
5.3. ワークスペースを使用したシークレットの提供
ワークスペースを使用して、Git リポジトリーおよびコンテナーリポジトリー向けの認証シークレットを提供できます。
タスク名前付き Workspace を Task に設定し、ワークスペースのマウント先となるパスを指定できます。タスクを実行するときに、この名前のワークスペースとしてシークレットを指定します。OpenShift Pipelines がタスクを実行すると、シークレット内の情報がタスクで利用できるようになります。
ワークスペースを使用して認証シークレットを指定する場合は、シークレットのアノテーションは必要ありません。
5.3.1. ワークスペースを使用した Git の SSH 認証の設定
パイプラインが SSH キーで設定されたリポジトリーからリソースを取得するには、そのパイプラインの SSH ベースの認証を設定する必要があります。
パイプラインの SSH ベースの認証を設定するには、SSH 秘密鍵を使用して認証シークレットを作成し、タスクでこのシークレットの名前付きワークスペースを設定し、タスクの実行時にシークレットを指定します。
手順
次のコマンドを入力して、既存の
.ssh
ディレクトリー内のファイルから Git SSH 認証シークレットを作成します。$ oc create secret generic my-github-ssh-credentials \ 1 --from-file=id_ed25519=/home/user/.ssh/id_ed25519 \ 2 --from-file=known_hosts=/home/user/.ssh/known_hosts 3
タスク定義で、Git 認証用の名前付きワークスペース (例:
ssh-directory)
を設定します。ワークスペースの定義例
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: git-clone spec: workspaces: - name: ssh-directory description: | A .ssh directory with private key, known_hosts, config, etc.
-
タスクの手順では、
$(workspaces.<workspace_name>.path)
環境変数のパスを使用してディレクトリーにアクセスします (例:$(workspaces.ssh-directory.path))
。 タスクを実行するときは、
tkn task start
コマンドに--workspace
引数を含めて、名前付きワークスペースのシークレットを指定します。$ tkn task start <task_name> --workspace name=<workspace_name>,secret=<secret_name> 1 # ...
- 1
<workspace_name>
は、設定したワークスペースの名前に、<secret_name>
は、作成したシークレットの名前に置き換えます。
認証に SSH 鍵を使用して Git リポジトリーをクローンするタスクの例
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: git-clone
spec:
workspaces:
- name: output
description: The git repo will be cloned onto the volume backing this Workspace.
- name: ssh-directory
description: |
A .ssh directory with private key, known_hosts, config, etc. Copied to
the user's home before git commands are executed. Used to authenticate
with the git remote when performing the clone. Binding a Secret to this
Workspace is strongly recommended over other volume types
params:
- name: url
description: Repository URL to clone from.
type: string
- name: revision
description: Revision to checkout. (branch, tag, sha, ref, etc...)
type: string
default: ""
- name: gitInitImage
description: The image providing the git-init binary that this Task runs.
type: string
default: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.37.0"
results:
- name: commit
description: The precise commit SHA that was fetched by this Task.
- name: url
description: The precise URL that was fetched by this Task.
steps:
- name: clone
image: "$(params.gitInitImage)"
script: |
#!/usr/bin/env sh
set -eu
# This is necessary for recent version of git
git config --global --add safe.directory '*'
cp -R "$(workspaces.ssh-directory.path)" "${HOME}"/.ssh 1
chmod 700 "${HOME}"/.ssh
chmod -R 400 "${HOME}"/.ssh/*
CHECKOUT_DIR="$(workspaces.output.path)/"
/ko-app/git-init \
-url="$(params.url)" \
-revision="$(params.revision)" \
-path="${CHECKOUT_DIR}"
cd "${CHECKOUT_DIR}"
RESULT_SHA="$(git rev-parse HEAD)"
EXIT_CODE="$?"
if [ "${EXIT_CODE}" != 0 ] ; then
exit "${EXIT_CODE}"
fi
printf "%s" "${RESULT_SHA}" > "$(results.commit.path)"
printf "%s" "$(params.url)" > "$(results.url.path)"
- 1
- スクリプトは、シークレットの内容 (フォルダー形式) を
${HOME}/.ssh
にコピーします。これは、ssh
が認証情報を検索する標準フォルダーです。
タスクを実行するためのコマンドの例
$ tkn task start git-clone --param url=git@github.com:example-github-user/buildkit-tekton --workspace name=output,emptyDir="" --workspace name=ssh-directory,secret=my-github-ssh-credentials --use-param-defaults --showlog
5.3.2. ワークスペースを使用したコンテナーレジストリー認証の設定
パイプラインがレジストリーからコンテナーイメージを取得するには、そのレジストリーの認証を設定する必要があります。
コンテナーレジストリーの認証を設定するには、Docker 設定ファイルを使用して認証シークレットを作成し、タスクでこのシークレットの名前付きワークスペースを設定し、タスクの実行時にシークレットを指定します。
手順
次のコマンドを入力して、認証情報を含めて、既存の
config.json
ファイルからコンテナーレジストリー認証シークレットを作成します。$ oc create secret generic my-registry-credentials \ 1 --from-file=config.json=/home/user/credentials/config.json 2
タスク定義で、Git 認証用の名前付きワークスペース (例:
ssh-directory)
を設定します。ワークスペースの定義例
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: skopeo-copy spec: workspaces: - name: dockerconfig description: Includes a docker `config.json` # ...
-
タスクの手順では、
$(workspaces.<workspace_name>.path)
環境変数のパス (例:$(workspaces.dockerconfig.path))
を使用してディレクトリーにアクセスします。 タスクを実行するには、
tkn task start
コマンドに--workspace
引数を含めて、名前付きワークスペースのシークレットを指定します。$ tkn task start <task_name> --workspace name=<workspace_name>,secret=<secret_name> 1 # ...
- 1
<workspace_name>
は、設定したワークスペースの名前に、<secret_name>
は、作成したシークレットの名前に置き換えます。
Skopeo を使用してコンテナーリポジトリーからイメージをコピーするタスクの例
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: skopeo-copy spec: workspaces: - name: dockerconfig 1 description: Includes a docker `config.json` steps: - name: clone image: quay.io/skopeo/stable:v1.8.0 env: - name: DOCKER_CONFIG value: $(workspaces.dockerconfig.path) 2 script: | #!/usr/bin/env sh set -eu skopeo copy docker://docker.io/library/ubuntu:latest docker://quay.io/example_repository/ubuntu-copy:latest
タスクを実行するためのコマンドの例
$ tkn task start skopeo-copy --workspace name=dockerconfig,secret=my-registry-credentials --use-param-defaults --showlog
5.3.3. ワークスペースを使用してシークレットを特定のステップのみに限定する手順
ワークスペースを使用して認証シークレットを提供し、タスクでワークスペースを定義すると、デフォルトでは、そのワークスペースはタスク内のすべてのステップで使用できるようになります。
シークレットを特定のステップに制限するには、タスク仕様とステップ仕様の両方でワークスペースを定義します。
手順
次の例のように、タスク仕様とステップ仕様の両方の下に、
workspaces:
定義を追加します。1 つのステップのみが認証情報ワークスペースにアクセスできるタスク定義の例
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: git-clone-build spec: workspaces: 1 - name: ssh-directory description: | A .ssh directory with private key, known_hosts, config, etc. # ... steps: - name: clone workspaces: 2 - name: ssh-directory # ... - name: build 3 # ...
第6章 非 root ユーザーとして Buildah を使用したコンテナーイメージのビルド
コンテナーで root ユーザーとして OpenShift Pipelines を実行すると、コンテナープロセスとホストが他の悪意のあるリソースにさらされる可能性があります。コンテナー内の特定の root 以外のユーザーとしてワークロードを実行すると、このタイプの露出を減らすことができます。
ほとんどの場合は、イメージを構築するためのカスタムタスクを作成し、このタスクでユーザー namespace を設定することで、root 権限なしで Buildah を実行できます。
この設定を使用してイメージが正常にビルドされない場合は、カスタムサービスアカウント (SA) およびセキュリティーコンテキスト制約 (SCC) 定義を使用できます。ただし、このオプションを使用する場合は、Buildah ステップを有効にして権限を上げる必要があります (allowPrivilegeEscalation: true
)。
6.1. ユーザー namespace を設定して非ルートユーザーとして Buildah を実行する
ユーザー namespace を設定することは、非 root ユーザーとしてタスクで Buildah を実行する最も簡単な方法です。ただし、このオプションを使用しても一部のイメージはビルドされない可能性があります。
前提条件
-
oc
コマンドラインユーティリティーがインストールされました。
手順
openshift-pipelines
namespace で提供されているbuildah
タスクのコピーを作成し、そのコピーの名前をbuildah-as-user
に変更するには、次のコマンドを入力します。$ oc get task buildah -n openshift-pipelines -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
次のコマンドを入力して、コピーした
buildah
タスクを編集します。$ oc edit task buildah-as-user
新しいタスクで、次の例に示すように、
annotations
とstepTemplate
セクションを作成します。buildah-as-user
タスクへの追加例apiVersion: tekton.dev/v1 kind: Task metadata: annotations: io.kubernetes.cri-o.userns-mode: 'auto:size=65536;map-to-root=true' io.openshift.builder: 'true' name: assemble-containerimage namespace: pipeline-namespace spec: description: This task builds an image. # ... stepTemplate: env: - name: HOME value: /tekton/home image: $(params.builder-image) imagePullPolicy: IfNotPresent name: '' resources: limits: cpu: '1' memory: 4Gi requests: cpu: 100m memory: 2Gi securityContext: capabilities: add: - SETFCAP runAsNonRoot: true runAsUser: 1000 1 workingDir: $(workspaces.working-directory.path) # ...
- 1
podTemplate
が使用されるため、runAsUser:
設定は厳密には必要ありません。
-
新しい
buildah-as-user
タスクを使用して、パイプラインでイメージをビルドします。
6.2. カスタム SA と SCC を定義して非ルートユーザーとして Buildah を実行する
非 root ユーザーとして Buildah を使用してコンテナーイメージのビルドを実行するには、次の手順を実行します。
- カスタムサービスアカウント (SA) とセキュリティーコンテキスト制約 (SCC) を定義します。
-
ID が
1000
のbuild
ユーザーを使用するように Buildah を設定します。 - カスタム設定マップを使用してタスクの実行を開始するか、パイプラインの実行と統合します。
6.2.1. カスタムサービスアカウントとセキュリティーコンテキストの制約の設定
デフォルトの pipeline
SA では、namespace の範囲外のユーザー ID を使用できます。デフォルト SA への依存を減らすために、ユーザー ID 1000
の build
ユーザーに必要なクラスターロールとロールバインディングを使用して、カスタム SA と SCC を定義できます。
現時点で、Buildah がコンテナー内で正常に実行されるためには、allowPrivilegeEscalation
設定を有効にする必要があります。この設定により、Buildah は非 root ユーザーとして実行するときに SETUID
および SETGID
機能を活用できます。
手順
必要なクラスターロールとロールバインディングを使用して、カスタム SA と SCC を作成します。
例: 使用される ID が
1000
のカスタム SA および SCCapiVersion: 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
- 1
- カスタム SA を定義します。
- 2
runAsUser
フィールドを変更して、制限された権限に基づいて作成されたカスタム SCC を定義します。- 3
- 現時点で、Buildah がコンテナー内で正常に実行されるためには、
allowPrivilegeEscalation
設定を有効にする必要があります。この設定により、Buildah は非 root ユーザーとして実行するときにSETUID
およびSETGID
機能を活用できます。 - 4
- カスタム SA を介してカスタム SCC にアタッチされた Pod を、ユーザー ID が
1000
として実行されるように制限します。 - 5
- カスタム SCC を使用するクラスターロールを定義します。
- 6
- カスタム SCC を使用するクラスターロールをカスタム SA にバインドします。
6.2.2. build
ユーザーを使用するための Buildah の設定
ユーザー ID が 1000
の build
ユーザーを使用する Buildah タスクを定義できます。
手順
openshift-pipelines
namespace で提供されているbuildah
タスクのコピーを作成し、コピーの名前をbuildah-as-user
に変更します。$ oc get task buildah -n openshift-pipelines -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
コピーした
buildah
タスクを編集します。$ oc edit task buildah-as-user
例:
build
ユーザーで変更された Buildah タスクapiVersion: tekton.dev/v1 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: {}
6.2.3. カスタムの config map を使用したタスク実行またはパイプライン実行の開始
カスタム Buildah タスクを定義したら、ユーザー ID が 1000
の build
ユーザーとしてイメージをビルドする TaskRun
オブジェクトを作成できます。さらに、TaskRun
オブジェクトを PipelineRun
オブジェクトの一部として統合できます。
手順
カスタム
ConfigMap
およびDockerfile
オブジェクトを使用してTaskRun
オブジェクトを作成します。例: Buildah をユーザー ID
1000
として実行するタスク実行apiVersion: v1 data: Dockerfile: | ARG BASE_IMG=registry.access.redhat.com/ubi9/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/v1 kind: TaskRun metadata: name: buildah-as-user-1000 spec: taskRunTemplate: 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
(オプション) パイプラインと対応するパイプライン実行を作成します。
例: パイプラインと対応するパイプラインの実行
apiVersion: tekton.dev/v1 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: resolver: cluster params: - name: kind value: task - name: name value: git-clone - name: namespace value: openshift-pipelines workspaces: - name: output workspace: shared-workspace params: - name: URL value: $(params.URL) - name: SUBDIRECTORY value: "" - name: DELETE_EXISTING 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/v1 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
- タスクの実行またはパイプラインの実行を開始します。
6.3. 非特権ビルドの制限
非特権ビルドのプロセスは、ほとんどの Dockerfile
オブジェクトで機能します。ただし、ビルドが失敗する原因となる既知の制限がいくつかあります。
-
--mount=type=cache
オプションの使用は、必要となる権限の問題が原因で失敗する場合があります。詳細は、この記事 を参照してください。 -
--mount=type=secret
オプションの使用は失敗します。リソースのマウントには、カスタム SCC によって提供されない追加の機能が必要になるためです。