tech.guitarrapc.cóm

Technical updates

1PasswordのシークレットをGitHub Actionsで利用する

GitHub Actionsで1Passwordのシークレットを利用するのがとても便利なので、その方法を紹介します。

GitHub Actionsのシークレット管理の難しさ

GitHub Actionsのシークレットはオーガニゼーション、リポジトリ単位のいずれかで管理できます。 同じシークレットを複数リポジトリで設定するのは手間ですし管理が困難なため、オーガニゼーション単位で管理することが多いでしょう。

さてGitHub Actionsの厳しいところは、個人や組織がパスワード管理ツールでパスワード制御しているときに「GitHub Actionsは別途シークレット設定」しないといけないことです。 例えば1Passwordを使っているなら1Password上でシークレット更新すればよいのに「1Password」「GitHub Actions」の両方を更新する必要があります。

1PasswordのシークレットをGitHub Actionsで利用する

1Passwordのシークレットを更新したらGitHub Actionsでも自動的にそれを使わせたい。これを実現するのが1password/load-secrets-actionです。 1password/load-secrets-actionを使うと、1Passwordのシークレットをstep outputとして利用できます。

例えば次のようなActions Secretを使ったGitHub Actionsの設定を考えます。

jobs:
  sample:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - name: Hello world action
        with:
          super_secret: ${{ secrets.SuperSecret }}

1password/load-secrets-actionを使って1Passwordのシークレットを使うように変更すると次のようになります。 1つのワークフローだとそれほどメリットを感じませんが、複数リポジトリ・複数ワークフローと数が増えれば増えるほど便利さが増します。 また、GitHub ActionsのOrganization Secretを使うにはOrganization Adminで操作する必要がありますが、1PasswordのシークレットとActionsワークフローで完結するのは権限的にも扱いやすいでしょう。

jobs:
  sample:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - name: Load secrets
        id: op-load-secret
        uses: 1password/load-secrets-action@581a835fb51b8e7ec56b71cf2ffddd7e68bb25e0 # v2.0.0
        with:
          export-env: false
        env:
          OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
          SUPER_SECRET: "op://GITHUB_ACTIONS_VAULT/SUPER_SECRET/password"
      - name: Hello world action
        with:
          super_secret: ${{ steps.op-load-secret.outputs.SUPER_SECRET }}

1password/load-secrets-actionを使えるようにする

1password/load-secrets-actionは、1PasswordのサービスアカウントというGitHub Actionsなど外部サービスで利用するための仕組みを使っています。

alt text

1PasswordのサービスアカウントをGitHub Actionsで利用してみましょう。ドキュメントに沿って次の設定をします。

  1. (1Pasword) サービスアカウント用の保管庫(VAULT)を用意する
  2. (1Pasword) サービスアカウント用のトークンを発行 & サービスアカウント用の保管庫を紐づける
  3. (GitHub Actions) シークレットに1Passwordのサービスアカウントトークンを設定する
  4. (1Pasword) サービスアカウント用の保管庫にGitHub Actionsで使うシークレットを登録する
  5. (GitHub Actions) 1password/load-secrets-actionを使って4で登録したシークレットを指定する

一度1-3を設定すれば、4,5を行うだけでGitHub Actionsで1Passwordのシークレットを利用できます。

1password/load-secrets-actionのシークレットシンタックス

先の例でSUPER_SECRET: "op://GITHUB_ACTIONS_VAULT/SUPER_SECRET/password"の部分で1Passwordに登録したシークレットを取得します。op://....は1Passwordのunique identidiers構文で、1Password上から取得できます。

1Passwordシークレットを取得する場合の例です。

  • (1) Vault: app-cicd
  • (2) Item: aws
  • (3) Field: secret-access-key
op://(1)app-cicd/(2)aws/(3)secret-access-key

alt text

ファイアウォールとサービスアカウントに注意

1PasswordにはBusinessプラン以上で利用できるファイアウォール機能があります。ファイアウォールを使うとアクセス元のIPを制限できるのですが、サービスアカウントもファイアウォールの対象です。

残念ながらファイアウォールをサービスアカウントに対して設定するしないを選べません。このためファイアウォールを使っていてサービスアカウントをGitHub OSSで利用する際はIPを固定できる方法が必要になるでしょう。

  • Large Hosted Runner
  • Self-Hosted Runner

まとめ

シークレットはパスワード管理ツールでまとめるというのはもはやデファクトスタンダードといえます。この対象をGitHub ActionsのようなCI/CDに拡大するのもまた自然な流れだと感じます。

ただファイアウォールのように、シークレットにパブリックな環境からアクセスさせるのも難しい判断だと感じます。この辺りはGHEのようにプライベートな環境だとより安心できますね。

参考