GitHub Actionsの`permissions`を自動で設定するツールを書いた
GitHub Actionsにはpermissions
というフィールドがあり、それぞれのWorkflow/Jobでのsecrets.GITHUB_TOKEN
の権限を設定できるようになっています。
secrets.GITHUB_TOKEN
はGitHub Actionsの実行ごとに発行されるGitHubのTokenで、多くのGitHub Actionsはこのトークンを使ってリポジトリをgit cloneしたり、Issueにコメントを書いたりしています。
- GitHub Actions: Control permissions for GITHUB_TOKEN | GitHub Changelog
- Workflow syntax for GitHub Actions - GitHub Docs
このpermissions
をちゃんと設定することでサプライチェーン攻撃などの影響を軽減することができます。
たとえば、次のpermissions
は、このWorkflowにおける secrets.GITHUB_TOKEN
は リポジトリの読み取りを許可するという意味になります。
name: test
on: [ push, pull_request ]
permissions:
contents: read
jobs:
test:
name: "Test on Node.js"
runs-on: ubuntu-18.04
steps:
- name: checkout
uses: actions/checkout@v2
- name: setup Node.js
uses: actions/setup-node@v2
with:
node-version: 14
- name: Install
run: yarn install
- name: Test
run: yarn test
GitHub Actionsのデフォルトパーミッションはwrite-all
です。
つまり、リポジトリの読み書き、IssueやPRの読み書きなど全部の権限がデフォルトでついています。
そのため、uses: actions/checkout@v2
のようにread onlyでよいGitHub Actionsも、実際にはリポジトリやIssueへの書き込みできる権限も持ってしまっています。
このパーミッションのデフォルト値は、リポジトリごと または Organization単位で、“Read repository contents permission” へと変更もできます。 “Read repository contents permission” は次のパーミッションと同じ意味なので、リポジトリのコンテンツを読み取りのみできるというパーミッションです。
permissions:
contents: read
contents: read
があれば、リポジトリをcloneしてテストをするには十分です。
この場合は、それ以外の権限をyamlファイルにpermissions
として付け足していくという形になります。
- Disabling or limiting GitHub Actions for a repository - GitHub Docs
- Security hardening for GitHub Actions - GitHub Docs
つまり、GitHub ActionsのWorkflowのパーミッションを必要最小限にするには次のステップが必要です。
- Workflow(yamlファイル)ごとに
permissions
を設定する - リポジトリ or Organizationのデフォルトパーミッションを “Read repository contents permission” にする
しかし、必要なpermissions
をREADMEに書いてるActionはとても少ないので、Workflowファイルにpermissions
を定義するのはかなり面倒です。
そのため、permissions
の設定を自動的に追加ツールを書きました。
@pkgdeps/update-github-actions-permissions
@pkgdeps/update-github-actions-permissionsは、GitHub Actionsのyamlファイルに自動的にpermissions
を付け足してくれます。
yamlファイルで使っているActionから必要なpermissions
を推定して設定してくれます。
Requirements: Node.js 14+
次のようにnpx
コマンドなどで、permissions
を更新したいyamlファイルのパスを指定します。
npx @pkgdeps/update-github-actions-permissions ".github/workflows/*.{yaml,yml}"
実行すると自動的にpermissions
フィールドを追加します。
40種類以上のactionsのpermissions
の定義リストから、自動的に必要なpermissions
を合成して設定するという形になっています。
定義リストにないActionを見つけた場合は、write-all
を設定します。
もし、未定義のActionを見つけた場合は、Pull Requestを送ってください。
全てのWorkflowファイルのpermissions
が設定できたら、リポジトリのデフォルトパーミッションを”Read repository contents permission”にできます。
- Workflow(yamlファイル)ごとに
permissions
を設定する → @pkgdeps/update-github-actions-permissions - リポジトリ or Organizationのデフォルトパーミッションを “Read repository contents permission” にする → 手動で設定
将来的には、GitHub ActionsもGitHub Appのように、Actionを提供する側で必要なpermissions
のリストを定義するようになるんじゃないかなと思います。(今はソースコードを読んだりしないと必要なpermissions
がわからない状態になっている)
Related
contents: read
のパーミッションでも問題あるケースは、リポジトリに機密情報がコミットされている状態だと思います。
そのようなケースはシークレットスキャンニングやsecretlintなどを使って、そもそも機密情報をコミットしない状態を目指すのが良さそうです。
Edit(2022-08-19): 類似ツール
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。