IBM CloudのTektonにおけるプライベートリポジトリーの認証情報を秘匿したgit clone


課題: 認証情報をsecretマニフェストにて管理した場合、そのsecretマニフェストをどのように秘匿するか。

ここでは、IBM CloudのTektonにおける「環境プロパティー」の「セキュアな値」タイプを使用してマニフェストから認証情報を秘匿し、プライベートgitリポジトリーのgit cloneを行なう。

なお、IBM Cloud側の設定は以下の設定内容を継続して使用している。
https://qiita.com/hiroyuki_onodera/items/b842b351747508641cc3

ローカル環境

  • Fedora Linux 35 (Workstation Edition)

Gitプラットフォーム上プライベートリポジトリーに接続する為の認証情報

以下のスクリプトのHost, User, IdentityFile箇所を書き換えて実行。
得られる出力の内容をIBM Cloud上のセキュアな値として設定する。

param.sh
#! /bin/bash

Host="github.com"                # Gitプラットフォーム
User="USER"                      # Gitプラットフォームに対するユーザー
IdentityFile="~/.ssh/id_rsa"     # Gitプラットフォームに対するユーザーのsshプライベートキー

echo id_rsa: $(eval cat ${IdentityFile}| base64 -w0)
echo
echo config: $(cat << __EOC__ | base64 -w0
Host ${Host}
  User ${User}
__EOC__
)
echo
echo known_hosts: $(ssh-keyscan ${Host} 2>/dev/null| base64 -w0)
$ bash param.sh
id_rsa: ls0tls0crudjtibpuevou0niifbssvzbveug...

config: sg0zdcbnaxrodwiuy00tciagvxnlcibiaxjv...

known_hosts: z0l0ahvilmnvbsbzc0gtcnnhiefbquf...

特にid_rsaは長い。

IBM Cloud上での変数設定

セキュアな値として上の値を設定する

ツールチェーンの画面で、左サイドメニューから環境プロパティを選択

「追加」をクリックすると現れる「セキュアな値」を選択

右の「プロパティの追加」において、名前(id_rsa)と値を設定し、右下の「追加」をクリック

以下のように追加される。

同様に「config」、「known_hosts」を追加

これらの値は一旦設定するとGUI上ではもう確認できない。
削除、新規追加、名前のリネームは可能。

マニフェスト側での値の利用

これらの値は、Tekton TriggerTemplateリソース定義において、$(params.PROPERTY_NAME)を使用して参照可能。

EventListenerとTriggerTemplateのマニュフェスト

eventlistener.yaml
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: listener1
spec:
  triggers:
    - bindings:
        - name: message
          value: Hello from the Triggers EventListener!
      template:
        ref: pipelinerun
---
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: pipelinerun
spec:
  resourcetemplates:
    -
      apiVersion: v1
      kind: Secret
      metadata:
        name: git-ssh
      data:
        id_rsa: $(params.id_rsa)            # IBM Cloudの「セキュアな値」環境プロパティーで指定した値
        config: $(params.config)            # 同上
        known_hosts: $(params.known_hosts)  # 同上
    -
      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: secure-git-clone-
      spec:
        pipelineRef:
          name: secure-git-clone
        workspaces:
          - name: ssh-directory             # gitに接続する.ssh下の情報を持つworkspace
            secret:
              secretName: git-ssh           # 上で動的に作成したsecret
          - name: shared-workspace          # git-clone先workspace。task間で共有可能。
            volumeClaimTemplate:
              spec:
                accessModes:
                  - ReadWriteOnce
                resources:
                  requests:
                    storage: 1Mi
        params:
          - name: url
            value: [email protected]:aaaa/bbbb.git

listener1が呼ばれるとpipelinerun TriggerTemplateが呼ばれ、git-ssh Secretが作成され、secure-git-cloneに対するPipelineRunが行われる。

Pipelineのマニュフェスト

pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: secure-git-clone
spec:

  workspaces:
    - name: ssh-directory
    - name: shared-workspace

  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: ''

  tasks:

    - name: clone-private-repo
      taskRef:
        kind: Task
        name: git-clone                 
          # Tekton Hubから以下によりgit-clone.yamlを入手し、.tektonディレクトリーにおいておく
          # curl -OL https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.5/git-clone.yaml
      workspaces:
        - name: ssh-directory           # git-cloneにより指定
          workspace: ssh-directory
        - name: output                  # git-cloneにより指定。git-clone先。
          workspace: shared-workspace
      params:
        - name: url                     # git-cloneにより指定 
          value: $(params.url)
        - name: revision                # git-cloneにより指定
          value: $(params.revision)

    - name: check-cloned-repo
      taskRef:
        kind: Task
        name: check-cloned-repo
      runAfter:
        - clone-private-repo
      workspaces:
        - name: source                  # git-clone先を/workspace/sourceとしてmount
          workspace: shared-workspace

Pipelineは2つのTaskを実行。

git-cloneタスク(Tekton Hub)

1つ目のTaskはTekton Hubのgit-clone

必要なworkspaceやparamの詳細は上を参照。
ここでは以下を使用している。

  • Workspaces
    • output
    • ssh-directory
  • Parameters
    • url
    • revision

入手するには、

$ curl -OL https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.5/git-clone.yaml

もしくはtknコマンドを導入しているならば

$ tkn hub get task git-clone --version 0.5  > git-clone.yaml

git cloneされた内容を表示するタスク

task.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: check-cloned-repo
spec:
  workspaces:
  - name: source
  steps:
  - name: check-cloned-repo
    image: registry.access.redhat.com/ubi8:8.5-236.1647448331
    script: |
      #! /usr/bin/env bash
      set -ex
      ls -l /workspace/source

これらを.tekton下においてgit add, git commit, git pushすれば、この環境ではPipelineが実行される。
https://qiita.com/hiroyuki_onodera/items/b842b351747508641cc3

手動での実行なども可能。
https://qiita.com/hiroyuki_onodera/items/b842b351747508641cc3

実行結果

ツールチェーンの画面で、左サイドメニューからPipelineRunsを選択

今回の実行結果であるsecure-git-clone-4b64qの詳細を確認する。
secure-git-clone-4b64qのlinkをクリック。

git-cloneタスク

shared-workspaceである/workspace/outputにgit cloneされている。

内容確認タスク

shared-workspaceを/workspace/sourceにマウントしているので、そこにgit cloneされた内容が展開されている。

参考