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
手順を参照してください。