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

1
リポジトリーのユーザー名
2
リポジトリーのパスワードまたは Personal Access Token

次の例のように、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

1
レジストリーのユーザー名
2
レジストリーのパスワードまたは Personal Access Token

次の例のように、既存の設定ファイルから 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

1
レジストリーのメールアドレス
2
レジストリーのユーザー名
3
レジストリーのパスワードまたは Personal Access Token
4
レジストリーのホスト名とポート

5.2.2. サービスアカウントを使用した Git の Basic 認証の設定

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

注記

Basic 認証ではなく SSH ベースの認証を使用することを検討してください。

パイプラインの Basic 認証を設定するには、Basic 認証シークレットを作成し、このシークレットをサービスアカウントに関連付け、このサービスアカウントを TaskRun または PipelineRun リソースに関連付けます。

注記

GitHub では、プレーンパスワードを使用した認証は非推奨になりました。代わりに、Personal Access Token を使用します。

手順

  1. 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
    1
    シークレットの名前。この例では、basic-user-pass です。
    2
    Git リポジトリーのユーザー名。
    3
    Git リポジトリーのパスワードまたは Personal Access Token
  2. サービスアカウントの YAML マニフェストを serviceaccount.yaml ファイルに作成します。このマニフェストで、シークレットをサービスアカウントに関連付けます。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: basic-user-pass 2
    1
    サービスアカウントの名前。この例では、build-bot です。
    2
    シークレットの名前。この例では、basic-user-pass です。
  3. 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
      1
      タスク実行の名前。この例では、build-push-task-run-2 です。
      2
      サービスアカウントの名前。この例では、build-bot です。
      3
      タスクの名前。この例では、build-push です。
    • サービスアカウントを 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
      1
      パイプライン実行の名前。この例では、demo-pipeline です。
      2
      サービスアカウントの名前。この例では、build-bot です。
      3
      パイプラインの名前。この例では、demo-pipeline です。
  4. 次のコマンドを入力して、作成した YAML マニフェストを適用します。

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml

5.2.3. サービスアカウントを使用した Git の SSH 認証の設定

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

パイプラインの SSH ベースの認証を設定するには、SSH 秘密鍵を使用して認証シークレットを作成し、このシークレットをサービスアカウントに関連付け、このサービスアカウントを TaskRun または PipelineRun リソースに関連付けます。

手順

  1. SSH 秘密鍵 を生成するか、既存の秘密鍵をコピーします。これは通常 ~/.ssh/id_rsa ファイルで入手できます。
  2. 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
    1
    SSH 秘密鍵が含まれるシークレットの名前。この例では、ssh-key です。
    2
    SSH 秘密鍵ファイルの内容。
    3
    既知のホストファイルの内容。
    重要

    既知のホストファイルを省略すると、OpenShift Pipelines は任意のサーバーの公開鍵を受け入れます。

  3. オプション: アノテーション値の末尾に :<port_number> を追加して、カスタム SSH ポートを指定します。たとえば、tekton.dev/git-0: github.com:2222 などです。
  4. サービスアカウントの YAML マニフェストを serviceaccount.yaml ファイルに作成します。このマニフェストで、シークレットをサービスアカウントに関連付けます。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: ssh-key 2
    1
    サービスアカウントの名前。この例では、build-bot です。
    2
    SSH 秘密鍵が含まれるシークレットの名前。この例では、ssh-key です。
  5. 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
      1
      タスク実行の名前。この例では、build-push-task-run-2 です。
      2
      サービスアカウントの名前。この例では、build-bot です。
      3
      タスクの名前。この例では、build-push です。
    • サービスアカウントをパイプライン実行に関連付けます。

      apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        taskRunTemplate:
          serviceAccountName: build-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      パイプライン実行の名前。この例では、demo-pipeline です。
      2
      サービスアカウントの名前。この例では、build-bot です。
      3
      パイプラインの名前。この例では、demo-pipeline です。
  6. 変更を適用します。

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml

5.2.4. サービスアカウントを使用したコンテナーレジストリー認証の設定

パイプラインがレジストリーからコンテナーイメージを取得したり、コンテナーイメージをレジストリーにプッシュしたりするには、そのレジストリーの認証を設定する必要があります。

パイプラインのレジストリー認証を設定するには、Docker 設定ファイルを使用して認証シークレットを作成し、このシークレットをサービスアカウントに関連付け、このサービスアカウントを TaskRun または PipelineRun リソースに関連付けます。

手順

  1. 次のコマンドを入力して、認証情報を含めて、既存の config.json ファイルからコンテナーレジストリー認証シークレットを作成します。

    $ oc create secret generic my-registry-credentials \ 1
      --from-file=config.json=/home/user/credentials/config.json 2
    1
    シークレットの名前。この例では、my-registry-credentials です。
    2
    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
    1
    サービスアカウントの名前。この例では、container-bot です。
    2
    SSH 秘密鍵が含まれるシークレットの名前。この例では、my-registry-credentials です。
  3. タスク実行またはパイプライン実行の 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
      1
      タスク実行の名前。この例では、build-container-task-run-2 です。
      2
      サービスアカウントの名前。この例では、container-bot です。
      3
      タスクの名前。この例では、build-container です。
    • サービスアカウントをパイプライン実行に関連付けます。

      apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        taskRunTemplate:
          serviceAccountName: container-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      パイプライン実行の名前。この例では、demo-pipeline です。
      2
      サービスアカウントの名前。この例では、container-bot です。
      3
      パイプラインの名前。この例では、demo-pipeline です。
  4. 次のコマンドを入力して変更を適用します。

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

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

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

会社概要

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

© 2024 Red Hat, Inc.