1Password と GitHub Actions を連携して安全にシークレットを管理する方法


はじめに

GitHub Actions を利用して CI/CD パイプラインを構築する際、シークレット情報(API キー、パスワードなど)を安全に管理することが重要です。通常、GitHub にはシークレット管理機能がありますが、1Password を利用することで、より高度なセキュリティと利便性を実現できます。本記事では、1Password と GitHub Actions を連携させてシークレットを安全に管理する方法を解説します。

仕組み

1Password が持つシークレットを GitHub Actions から取得するには、以下のドキュメントにある Secrets Automation 機能を利用します。

Get started with 1Password Service Accounts | 1Password Developer

Learn how to use service accounts with 1Password.

これにより、1password に保存されたシークレットを GitHub Actions ワークフロー内で安全に取得できます。方式としては、1password の Service Account を作成し、その認証情報を GitHub Actions に設定する形になります。

1Password Service Account の作成

基本的にはドキュメント通りに進めれば問題ありませんが、ポイントをいくつか解説します。

  1. GitHub Actions がアクセスしたいシークレットを保存する 1Password Vault を事前に作成します。
  2. Service Account を作成する際、1 で作成した Vault へのアクセス権限 (読み取り権限) を付与します。
  3. Service Account を作成すると表示されるサービスアカウントトークンを控えておきます。(私は1で作成した 1Password Vault のなかに保管してあります。)

重要: このトークンは一度だけ表示されるため、安全な場所(1Password など)に必ず保管してください。

例えばですが、私はこのブログを Cloudflare Pages にデプロイするための API トークンを Credentials という Vault に Cloudflare という項目を作成し、BLOG というセクションの中に ACCOUNT_API_TOKEN という名前で保存しています。

1Password CLI を利用して確認すると以下のようになります。

% op read "op://Credentials/Cloudflare/BLOG/ACCOUNT_API_TOKEN"

GitHub Actions ワークフローの設定

GitHub リポジトリの Settings > Secrets and variables > Actions に移動し、以下のシークレットを追加します。

  • OP_SERVICE_ACCOUNT_TOKEN: 先ほど控えた Service Account トークン

次に、GitHub Actions ワークフローを作成または編集し、GitHub Actions から 1Password シークレットを取得するワークフローを用意します。下記の公式開発者ドキュメントを参考にしてください。

Load secrets from 1Password into GitHub Actions | 1Password Developer

With the Load secrets from 1Password GitHub Action , you can securely load secrets from 1Password into GitHub Actions using secret references. Secret references sync automatically with 1Password and remove the risk of exposing plaintext secrets in code.

シンプルに https://github.com/marketplace/actions/load-secrets-from-1password を利用する例を以下に示します。

on: push
jobs:
  hello-world:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      # 1Password からシークレットを取得
      - name: Load secrets from 1password
        id: credentials
        uses: 1password/load-secrets-action@v3
        env:
          OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
          # 下記2つを 1Password から取得しこのステップの出力として利用可能にする
          CLOUDFLARE_ACCOUNT_ID: op://Credentials/Cloudflare/Credentials/ACCOUNT_ID
          CLOUDFLARE_API_TOKEN: op://Credentials/Cloudflare/BLOG/ACCOUNT_API_TOKEN
      # 例として、Cloudflare Pages へデプロイするステップ
      - name: Deploy to Cloudflare Pages
        uses: cloudflare/wrangler-action@v3
        id: deploy
        with:
          # このステップで利用する値を 1Password から取得したシークレットで指定できる
          apiToken: ${{ steps.credentials.outputs.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ steps.credentials.outputs.CLOUDFLARE_ACCOUNT_ID }}
          gitHubToken: ${{ secrets.GITHUB_TOKEN }}

実際にワークフローで動作させたログが以下で、シークレットはマスクされていることがわかります。

GitHub Actions で 1Password シークレットを取得するログ

制限

Service account rate limits | 1Password Developer

Learn how to manage 1Password service accounts.

1Password のサービスアカウントにはレート制限があります(例:1時間あたり読み取りは1000リクエスト)。詳細は上記ドキュメントを参照してください。私は 1Password Family プランを使用していますが、個人利用の範囲であれば特に問題になることはないレベルでの制限となってはいますが、プロダクトの規模感によっては注意が必要で、場合によっては AWS Secrets Manager や HashiCorp Vault などの他のシークレット管理ソリューションを検討する必要があるかもしれません。

おわりに

1Password と GitHub Actions を連携させることで、シークレット情報を安全に管理しつつ、CI/CD パイプラインの自動化を実現できます。 正直個人開発レベルでは GitHub のシークレット管理機能で十分な場合も多いですが、1Password の Secrets Automation 機能を活用することで、セキュリティリスクを低減し、開発プロセスの効率化が図れます。ぜひ、皆さんも試してみてください。