[GitHub] きめ細かなアクセス権の制御ができる「Fine-grained personal access tokens (beta)」を使ってみた

2023.01.29

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

こんにちは、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を利用してアクセスできるAccout(OrganizationやUser)およびRepositoryで制限できず、また実行可能なスコープも粒度がとても粗いものでした。

そのため必要以上の権限をアクセストークンに付与することになり、トークン漏洩時の影響範囲が大きくなる可能性がありました。

Fine-grained PATsではAccoutやスコープをきめ細かく制御できるようになっています。

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]でAccout(OrganizationまたはUser)、[Repository access]でRepositoryを指定します。

そして[Repository permissions]でRepositoryに対して実行可能としたいパーミッションを指定します。ActionsごとにNo accessRead-onlyおよびRead and writeから指定可能です。

下記にパーミッションとREST APIエンドポインの対応がまとまっています。

また[Account permissions]ではaccoutに対するパーミッションを設定可能です。

最後に[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と上手く使い分けていこうと思います。

以上