4.15. git シークレットを使用したパイプラインの認証
Git シークレットは、Git リポジトリーと安全に対話するための認証情報で設定されており、認証の自動化に使用されることが多いです。Red Hat OpenShift Pipelines では、Git シークレットを使用して、実行時に Git リポジトリーと対話するパイプライン実行およびタスク実行を認証できます。
パイプライン実行またはタスク実行は、関連付けられたサービスアカウントを介してシークレットにアクセスできます。Pipeline は、Git シークレットの Basic 認証および SSH ベースの認証のアノテーション (キーと値のペア) としての使用をサポートします。
4.15.1. 認証情報の選択
パイプライン実行またはタスク実行には、異なる Git リポジトリーにアクセスするために複数の認証が必要になる場合があります。Pipeline がその認証情報を使用できるドメインで各シークレットにアノテーションを付けます。
Git シークレットの認証情報アノテーションキーは tekton.dev/git-
で開始する必要があり、その値は Pipeline がその認証情報を使用するホストの URL になります。
以下の例では、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
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
- 1
- SSH 秘密鍵ファイルの内容。
4.15.2. Git の Basic 認証の設定
パイプラインが、パスワードで保護されたリポジトリーからリソースを取得するには、そのパイプラインの Basic 認証を設定する必要があります。
パイプラインの Basic 認証を設定するには、secret.yaml
、serviceaccount.yaml
、および run.yaml
ファイルを指定されたリポジトリーの Git シークレットからの認証情報で更新します。このプロセスが完了すると、Pipeline はその情報を使用して指定されたパイプラインリソースを取得できます。
GitHub では、プレーンパスワードを使用した認証は非推奨になりました。代わりに、パーソナルアクセストークン を使用します。
手順
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
serviceaccount.yaml
ファイルで、シークレットを適切なサービスアカウントに関連付けます。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: basic-user-pass 2
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
サービスアカウントを
PipelineRun
リソースに関連付けます。apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
変更を適用します。
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
4.15.3. Git の SSH 認証の設定
パイプラインが SSH キーで設定されたリポジトリーからリソースを取得するには、そのパイプラインの SSH ベースの認証を設定する必要があります。
パイプラインの SSH ベースの認証を設定するには、secret.yaml
、serviceaccount.yaml
、および run.yaml
ファイルを、指定されたリポジトリーの SSH 秘密鍵からの認証情報を使用して更新します。このプロセスが完了すると、Pipeline はその情報を使用して指定されたパイプラインリソースを取得できます。
Basic 認証ではなく SSH ベースの認証を使用することを検討してください。
手順
-
SSH 秘密鍵 を生成するか、既存の秘密鍵をコピーします。これは通常
~/.ssh/id_rsa
ファイルで入手できます。 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
注意秘密鍵を省略すると、Pipelines は任意のサーバーの公開鍵を受け入れます。
-
オプション: カスタム SSH ポートを指定するには、
annotation
値の最後に:<port number>
を追加します。たとえば、tekton.dev/git-0: github.com:2222
などです。 serviceaccount.yaml
ファイルで、ssh-key
シークレットをbuild-bot
サービスアカウントに関連付けます。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: ssh-key 2
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
サービスアカウントをパイプライン実行に関連付けます。
apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
変更を適用します。
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
4.15.4. git タイプのタスクでの SSH 認証の使用
Git コマンドを呼び出す際には、タスクの手順で直接 SSH 認証を使用できます。SSH 認証は $HOME
変数を無視し、/etc/passwd
ファイルで指定されたユーザーのホームディレクトリーのみを使用します。そのため、タスクの各手順では、/tekton/home/.ssh
ディレクトリーを、関連付けられたユーザーのホームディレクトリーにシンボリックリンクする必要があります
ただし、git
タイプのパイプラインリソースまたは Tekton カタログで利用可能な git-clone
タスクを使用する場合は、明示的なシンボリックリンクは必要ありません。
git
タイプのタスクで SSH 認証を使用する例は、authenticating-git-commands.yaml を参照してください。
4.15.5. root 以外のユーザーとしてのシークレットの使用
以下のような特定のシナリオでは、root 以外のユーザーとしてシークレットを使用する必要がある場合があります。
- コンテナーが実行するために使用するユーザーとグループは、プラットフォームによってランダム化されます。
- タスクの手順では、root 以外のセキュリティーコンテキストを定義します。
- タスクは、root 以外のグローバルセキュリティーコンテキストを指定します。これは、タスクのすべての手順に適用されます。
このようなシナリオでは、root 以外のユーザーとしてタスク実行とパイプライン実行を実行する際の次の側面を考慮してください。
-
Git の SSH 認証では、ユーザーが
/etc/passwd
ディレクトリーに有効なホームディレクトリーを設定している必要があります。有効なホームディレクトリーのない UID を指定すると、認証に失敗します。 -
SSH 認証は
$HOME
環境変数を無視します。そのため、Pipelines (/tekton/home
) で定義される$HOME
ディレクトリーから、root 以外のユーザーの有効なホームディレクトリーに、適切なシークレットファイルをシンボリックリンクする必要があります。
さらに、root 以外のセキュリティーコンテキストで SSH 認証を設定するには、git コマンドを認証する例 を参照してください。
4.15.6. 特定の手順へのシークレットアクセスの制限
デフォルトで、Pipeline のシークレットは $HOME/tekton/home
ディレクトリーに保存され、タスクのすべての手順で利用できます。
シークレットを特定の手順に制限するには、シークレット定義を使用してボリュームを指定し、特定の手順でボリュームをマウントします。