[GitHub] きめ細かなアクセス権の制御ができる「Fine-grained personal access tokens (beta)」を使ってみた
こんにちは、CX事業本部 IoT事業部の若槻です。
GitHubのOAuth Appsの設定を見直そうと久しぶりにDeveloper settingの画面を見ていたところ、Personal access tokensメニューにFine-grained personal access tokensなる項目が追加されていました。
昨年の10/18にBetaリリースされた機能で、従来のPersonal access tokens(classic PATs)に比べてセキュリティレベルが強化されているとのことです。
classic PATsの課題
従来のPATでは、PATを利用してアクセスできるAccount(OrganizationやUser)およびRepositoryで制限できず、また実行可能なスコープも粒度がとても粗いものでした。
そのため必要以上の権限をアクセストークンに付与することになり、トークン漏洩時の影響範囲が大きくなる可能性がありました。
Fine-grained PATsではAccountやスコープをきめ細かく制御できるようになっています。
classic PATsは近い将来使えなくなるかも
また従来のPATsは「(classic)」と付いており、Fine-grained PATsがGAされたら移行期間を設けた後に廃止されそうな雰囲気ですね。
しかし現時点ではclassic PATsを使う必要があるユースケースもあるようです。
There are some cases where it isn’t possible to use a fine-grained PAT – yet. For now, you need to use PATs (classic) for access beyond organizations you’re a member of. That means some open source and innersource contributions cannot yet be managed with a fine-grained PAT. In addition, integrating with the enterprise account APIs also requires a PAT (classic) or oAuth app.
Fine-grained PATsを試してみた
トークン発行
https://github.com/settings/tokens?type=beta にアクセスして、[Generate new token]をクリック。
アクセス対象のRepositoryを指定します。[Resource owner]でAccount(OrganizationまたはUser)、[Repository access]でRepositoryを指定します。
そして[Repository permissions]でRepositoryに対して実行可能としたいパーミッションを指定します。ActionsごとにNo access
、Read-only
およびRead and write
から指定可能です。
下記にパーミッションとREST APIエンドポインの対応がまとまっています。
また[Account permissions]ではaccountに対するパーミッションを設定可能です。
最後に[Generate token]でトークンを発行します。
トークンを発行できました。
トークンを使ってみる
発行したトークンを使ってREST APIへのアクセスを試してみます。
発行したトークンの[Issues]のパーミッションはRead-only
としていました。
権限のあるRepositoryへのIssue一覧取得リクエストは成功します。
curl \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GH_TOKEN}"\
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/${OWNER}/${REPO}/issues"
# -- 取得結果 --
権限のあるRepositoryであっても、Issue作成リクエストは、Writeパーミッションが許可されていないため、PATのパーミッション不足により失敗します。
curl \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GH_TOKEN}"\
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${OWNER}/${REPO}/issues \
-d '{"title":"Found a bug"}'
{
"message": "Resource not accessible by personal access token",
"documentation_url": "https://docs.github.com/rest/reference/issues#create-an-issue"
}
また同じAccountがオーナーであるが権限の無いRepositoryへIssue一覧取得リクエストをすると、リソースを見つけられず失敗します。
curl \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GH_TOKEN}"\
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/${OWNER}/${REPO2}/issues"
{
"message": "Not Found",
"documentation_url": "https://docs.github.com/rest/reference/issues#list-repository-issues"
}
ちゃんときめ細かいアクセス制御ができていますね。
おわりに
GitHubできめ細かなアクセス権の制御ができる「Fine-grained personal access tokens (beta)」を使ってみました。
GitHubのアップデートがしっかりキャッチアップできておらず、昨年10月でのリリースを見逃していたのは痛恨の極みでした。
個人的なトークンの利用で、以前まではきめ細かい権限のアクセストークンの発行にGitHub Appsを使用していました(以下記事参照)が、期限の短い一時トークンしか発行できず頻繁にトークンを発行し直す必要があったため、今後はFine-grained personal access tokensと上手く使い分けていこうと思います。
以上