1Password CLI × GitHub CLI × Fine-grained PATで認証スコープを絞ってgitを利用する

1Password CLI × GitHub CLI × Fine-grained PATで認証スコープを絞ってgitを利用する

2025.11.29

はじめに

1Passwordにトークンや秘密鍵を保存していても、セッションの中で一度許可した状態でツールを導入した際に、攻撃を受ける可能性があります。例えば以下の例です。

gh-user.sh
#!/bin/bash

op plugin run -- gh api user --jq '.login'
$ ./gh-user.sh # 認証されていないのでエラー
[ERROR] 2025/11/29 06:54:28 authorization prompt dismissed, please try again

$ op plugin init gh # 1Passwordのpopupが表示され→許可
(中略)

$ ./gh-user.sh # 認証されているため実行可能
shuntaka9576

GitHubのOrganizationやUserに対して横断で権限がある場合、その全てに攻撃を受ける可能があります。今回は被害を局所化するために1Password CLI × GitHub CLI × Fine-grained PATを使って上記のような場合でも被害を局所化する構成を紹介します。

構成は以下の通りです。

  • 1Password CLI(op)
  • GitHub CLI
  • Fine-grained PAT
  • Git

設定の全体感がわからなくなった場合、以下をご参照ください。

https://github.com/shuntaka9576/dotfiles

1Password CLIの設定

1Password CLIの導入は以下の記事を参考にしてください。

https://developer.1password.com/docs/cli/get-started/

1Passwordのアカウントが複数ある場合、登録対象の1Passwordにログインします。

# アカウントのリストを表示するコマンド
# op account list --format=json | jq -r '.[] | "\(.url) - \(.email)"'

# アカウントを指定してサインイン
op signin --account hoge.1password.com

1Passwordのアカウント切り替えることも考慮して、以下のようなaliasも用意すると便利です。opsコマンドで、アカウントを切り替えることが可能です。

~/.zshrc
function ops() {
  local selected=$(op account list --format=json | jq -r '.[] | "\(.url) - \(.email)"' | fzf-tmux --reverse)

  if [ -n "$selected" ]; then
    local account=$(echo "$selected" | cut -d'.' -f1)
    op signin --account "$account"
  fi
}

GitHub CLIの設定

1Password CLI(op)と連携設定

以下のドキュメントを参考に進めます。

https://developer.1password.com/docs/cli/shell-plugins/github/

GitHub CLIプラグインと連携を開始します。まずImport int 1Passwordを選択します

$ op plugin init gh

GitHub CLI
Authenticate with GitHub Personal Access Token.

? Locate your GitHub Personal Access Token:  [Use arrows to move, type to filter, ? for more help]
> Import into 1Password...
  Search in 1Password...

GitHubのNew fine-grained personal access tokenを開き、Fine-grained personal access tokenを発行します。

CleanShot 2025-11-28 at 21.02.10@2x

トークンは1Passwordのitemとして登録が開始されます。まず前項でGitHubから発行されたトークンを入力します。

$ op plugin init gh

GitHub CLI
Authenticate with GitHub Personal Access Token.

? Locate your GitHub Personal Access Token: Import into 1Password...

? Enter or paste in the value of the Token: [? for help] *********************************************************************************************

1Passwordのitemの名前を設定します。

$ op plugin init gh

GitHub CLI
Authenticate with GitHub Personal Access Token.

? Locate your GitHub Personal Access Token: Import into 1Password...

? Enter or paste in the value of the Token: [? for help] *********************************************************************************************
? Enter a name to save it in 1Password [default: "GitHub Personal Access Token"]:  20251118

最後にVaultを選択します。

$ op plugin init gh

GitHub CLI
Authenticate with GitHub Personal Access Token.

? Locate your GitHub Personal Access Token: Import into 1Password...

? Enter or paste in the value of the Token: [? for help] *********************************************************************************************
? Enter a name to save it in 1Password [default: "GitHub Personal Access Token"]:  20251118

? Select the vault to save the Personal Access Token in:  [Use arrows to move, type to filter]
> HogeVault

作成が完了します。

? Select the vault to save the Personal Access Token in: HogeVault

✔ Securely saved "20251118" in 1Password!

? Configure when the chosen credential(s) will be used to authenticate: Prompt me for each new terminal session

Successfully set up authentication for GitHub CLI.
Run any gh command to see it action!

1Passwordで指定のValutを見ると1Password CLI経由で作成されたことがわかります。
CleanShot 2025-11-29 at 06.19.20@2x

現在のターミナルセッションを超えてプラグインを永続化するために、RCファイルまたはシェルプロファイルに source コマンドを追加します

~/.zshrc
source ~/.config/op/plugins.sh

アクセスができることを確認します。

$ op plugin init gh

GitHub CLI
Authenticate with GitHub Personal Access Token.

? Locate your GitHub Personal Access Token: 20251118 (Hoge)

? Configure when the chosen credential(s) will be used to authenticate: Prompt me for each new terminal session

Successfully set up authentication for GitHub CLI.
Run any gh command to see it action!

状態を確認します。gh auth token でトークン全体を出力することも可能ですが、基本以下のコマンドでどのトークンを利用しているかは判断がつきます。

$ gh auth status
github.com
  ✓ Logged in to github.com account shuntaka9576 (GITHUB_TOKEN)
  - Active account: true
  - Git operations protocol: https
  - Token: [後ろ数文字がマスクされたトークン]

Gitの設定

ここまでの作業でGitHub CLIから、GitHubの情報を取得することができました。GitからGitHubの権限を取得したいです。Git Credential Helperが必要です。GitHub CLIにはGit Credential Helperの機能があるのでそちらを利用します。

gitの設定に以下の設定を書き込みます。

設定内容としましては、GitHub CLIを1Password経由で呼び出す形となります。

~/.config/git/config
(中略)

[credential]
        helper = ""
        helper = "!/opt/homebrew/bin/op plugin run -- gh auth git-credential"

(中略)

実際にうまく設定されているか確認します。

tokenで未指定のorgに対してのcloneは失敗する
$ git clone https://github.com/shuntaka-hoge/private-repo.git
Cloning into 'private-repo'...
remote: Write access to repository not granted.
fatal: unable to access 'https://github.com/shuntaka-hoge/private-repo.git/': The requested URL returned error: 403
tokenで指定したuserに対してのcloneは成功する
$ git clone https://github.com/shuntaka9576/private-repo.git
Cloning into 'private-repo'...
remote: Enumerating objects: 45, done.
remote: Counting objects: 100% (45/45), done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 45 (delta 15), reused 40 (delta 10), pack-reused 0 (from 0)
Receiving objects: 100% (45/45), 116.80 KiB | 9.73 MiB/s, done.
Resolving deltas: 100% (15/15), done.

よく使うコマンド

この設定でよく使うコマンドを最後に紹介します。以下のコマンドFine-grained tokenを切り替えて、作業が可能です。

# Fine-grained token(item)の切り替え
op plugin init gh
# 現在設定しているitemの確認
op plugin inspect gh
# 現在設定しているitemのセッション削除
op plugin clear gh

最後に

Fine-grained personal access tokensを利用した1Password CLIとGitHub CLIの連携について紹介しました。SSHキーを利用した認証と比較すると多少不便ですが、人によってこちらの方が被害を最小化できて、メリットがある方もいるのではないでしょうか。

自分はlazygitをかなり使うので悩み中です。1PasswordとSSH Agentで期間を短めにするなど別方法も考えてみようと思います。

この記事をシェアする

FacebookHatena blogX

関連記事