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など外部サービスで利用するための仕組みを使っています。
1PasswordのサービスアカウントをGitHub Actionsで利用してみましょう。ドキュメントに沿って次の設定をします。
- (1Pasword) サービスアカウント用の保管庫(VAULT)を用意する
- (1Pasword) サービスアカウント用のトークンを発行 & サービスアカウント用の保管庫を紐づける
- (GitHub Actions) シークレットに1Passwordのサービスアカウントトークンを設定する
- (1Pasword) サービスアカウント用の保管庫にGitHub Actionsで使うシークレットを登録する
- (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
ファイアウォールとサービスアカウントに注意
1PasswordにはBusinessプラン以上で利用できるファイアウォール機能があります。ファイアウォールを使うとアクセス元のIPを制限できるのですが、サービスアカウントもファイアウォールの対象です。
残念ながらファイアウォールをサービスアカウントに対して設定するしないを選べません。このためファイアウォールを使っていてサービスアカウントをGitHub OSSで利用する際はIPを固定できる方法が必要になるでしょう。
- Large Hosted Runner
- Self-Hosted Runner
まとめ
シークレットはパスワード管理ツールでまとめるというのはもはやデファクトスタンダードといえます。この対象をGitHub ActionsのようなCI/CDに拡大するのもまた自然な流れだと感じます。
ただファイアウォールのように、シークレットにパブリックな環境からアクセスさせるのも難しい判断だと感じます。この辺りはGHEのようにプライベートな環境だとより安心できますね。
参考
- GitHub Actions でのシークレットの使用 - GitHub Docs
- 1Password Service Accounts | 1Password Developer
- Load secrets from 1Password into GitHub Actions | 1Password Developer
- Create firewall rules in 1Password Business | 1Password Support
- About larger runners - GitHub Docs
- 1Password/load-secrets-action: Load secrets from 1Password into your GitHub Actions jobs