GitHub CLIの資格情報を1Passwordで管理し、バイオメトリクス認証で取得するようにしてみた

2023.02.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 Delivery部の若槻です。

1Password GitHubシェルプラグインを使用すると、GitHub CLIの資格情報をローカル端末にプレーンテキストで保存するのではなく、1Passwordを使用してバイオメトリクスまたはシステム認証でGitHub CLIを安全に認証することができます。

今回は、GitHub CLIの資格情報を1Passwordで管理し、指紋認証で取得するようにしてみました。

やってみた

要件

使用するための要件は以下となります。

私の環境では1Password CLIのバージョンが低かったためアップグレードが必要でした。

$ op --version
2.4.1

Homebrewでアップグレードします。

brew upgrade --cask 1password-cli

アップグレードできました。

op --version                     
2.13.1

参考:Update to the latest version of 1Password CLI | 1Password Developer

Personal access tokensの用意

GitHubで適切な権限を持ったPAT(Personal access tokens)を生成しておきます。

この時の注意点として、Fine-grained PATではなく、classic PATを使用する必要があります。

資格情報の構成

op plugin init ghコマンドを実行して対話式で資格情報を構成していきます。

$ 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"]:  

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

 Securely saved "GitHub Personal Access Token" in 1Password!

? Configure when "GitHub Personal Access Token" will be used to authenticate: Use automatically when in this directory or subdirectories

The last step is to set up an alias for gh.
You can do so by running the following command:

  echo "source /Users/wakatsuki.ryuta/.config/op/plugins.sh" >> ~/.zshrc && source ~/.zshrc

Afterwards, run any gh command to see it in action!
  • Locate your GitHub Personal Access Tokenでは、既存のPATを使用するか1Passwordに新規インポートするかを指定します。
  • Enter or paste in the value of the Tokenでは、インポートするPATのトークン値を指定します。
  • Configure when "GitHub Personal Access Token" will be used to authenticate:では、資格情報を適用する範囲を指定します。
    • Prompt me for each new terminal session:現在のターミナル セッションの間だけ資格情報を構成し、ターミナルを終了すると削除される。
    • Use automatically when in this directory or subdirectories:資格情報を現在のディレクトリとそのすべてのサブディレクトリのデフォルトに設定する。
    • Use as global default on my system:すべての端末セッションとディレクトリで認証情報をデフォルトとして設定する。

これによりGitHubのPATが1Passwordに管理され、GitHub CLI時に使用されるようになりました。

最後に表示されたコマンドを実行してplugins.shのPATHを通しておきます。

資格情報を使ってGitHub CLIの認証をする

構成した資格情報を使ってGitHub CLIの認証をしてみます。

gh repo list -L 1

1Passwordの指紋認証が求められました。

指紋認証が成功すると、コマンドを実行することができました。

注意点

GitHub CLIではFine-grained PATは使えない

Fine-grained personal access tokensを使用すると、従来のPersonal access tokens(classic PATs)に比べてきめ細かいアクセス権限をトークン設定することができます。

よって今回のGitHubシェルプラグインでもFine-grained PATを使いたいところでしたが、そもそもGitHub CLIではFine-grained PATは使えませんでした。内部的に使われているGraphQL APIでサポートされていないようです。

$ gh repo list
HTTP 401: Personal access tokens with fine grained access do not support the GraphQL API (https://api.github.com/graphql)
Try authenticating with:  gh auth login

アクセス権限やアクセス対象のアカウントおよびリポジトリを絞れると良かったのですが、できないようです。

gitコマンドではgh auth loginの認証が使われる

GitHubシェルプラグインで構成した資格情報はgit pullgit pushなどでも使用できると思っていたのですが、gitコマンドではもともとgh auth loginにより構成していた資格情報が使われる動作となりました。

gh auth loginを使用する場合は資格情報をgitコマンドとghコマンド(GitHub CLI)で統一できていたので、GitHubシェルプラグインでこれができないのは少し不便ですね。

GitHubシェルプラグインの削除

最後に、GitHubシェルプラグインを削除して、元のgh auth loginにより構成した資格情報を使えるように戻してみます。

資格情報をリセットするためには次のop plugin clear ghを実行せよとのことなのでやってみます。

$ op plugin clear gh
? Stop automatically using "GitHub Personal Access Token" (vault: "Private") when in directory "/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/devio"? Yes

 Successfully cleared!

GitHub CLI is now no longer using "GitHub Personal Access Token" to authenticate under the "/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/devio" directory.

When you now run the next gh command, you'll be prompted again to select which Personal Access Token to use.

次回にghコマンドを実行する際にどのPATを使用するか再度プロンプトで選択するようになるとのことです。

ghコマンドを実行してみると、確かにそのようになりました。

$ gh repo list -L 1 
? Locate your GitHub Personal Access Token:  [Use arrows to move, type to filter, ? for more help]
> GitHub Personal Access Token (Private)
  GitHub Personal Access Token (Private)
  Import into 1Password...
  Search in 1Password..

plugins.shへのPATHを通すコマンドを~/.zshrcから削除します。

ターミナルを再起動すると、元のgh auth loginにより構成した資格情報でアクセスできるようになりました。

最後に1Passwordに格納されたPATをアプリから手動削除します。

おわりに

GitHub CLIの資格情報を1Passwordで管理し、指紋認証で取得するようにしてみました。

gitコマンドとの資格情報の共通化もできないため使い所が難しいと感じたのですが、ghコマンドだけを多用する使い方であればセキュリティ強化に一役買うのではないでしょうか。

以上