GitHub Actionsのworkflowsファイルに自動的にpermissionsを追加する@pkgdeps/update-github-actions-permissions v2をリリースしました。

update-github-actions-permissionsは .github/workflow/*.ymlのWorkflowファイルに対して、利用してるActionから最小限のpermissionsを自動的に設定するツールです。 GitHub Actionsのデフォルトパーミッションはwrite-allです。 つまり、GitHub Actionsから対象のリポジトリの読み書き、IssueやPRの読み書きなど全部の権限がデフォルトでついています。そのため、uses: actions/checkout@v3 のようにread onlyでよいGitHub Actionsも、実際にはリポジトリやIssueへの書き込みできる権限も持ってしまっています。

この問題に最小権限の原則を使って修正するには、次の2つのステップが必要です。

  • Workflow(yamlファイル)ごとに必要なpermissionsを設定する
  • リポジトリ or Organizationのデフォルトパーミッションを “Read repository contents permission” にする

追記(2023-02-03): GitHub側で“Read repository contents permission”がデフォルトとなるようです

詳しくは次の記事で解説しています。

使い方

update-github-actions-permissionsの使い方は単純です。 次のコマンドで、.github/workflows/*.ymlのWorkflowファイルに対して、利用してるActionから最小限のpermissionsを自動的に設定します。

npx @pkgdeps/update-github-actions-permissions ".github/workflows/*.{yaml,yml}"

未知のワークフローがある場合は、--defaultPermissionsで指定したデフォルト値が設定されます。

@pkgdeps/update-github-actions-permissions v2では500種類のActionのpermissionsをサポート

actions/checkoutのようなActionsには明示的に必要なpermissionsが設定されていないことが多いです。 そのため、update-github-actions-permissionsはActionごとに必要なpermissionsの定義リストを持っています。

update-github-actions-permissions v1では、50種類ほどのGitHub Actionsのpermissionsをサポートしていました。 update-github-actions-permissions v2では、500種類以上のGitHub Actionsのpermissionsをサポートしています。

どうやって増やしたかというと、step-security/secure-workflowsという類似するオープンソースの定義ファイルを利用しています。 Secure Workflowsは、継続的なCI/CDのセキュリティを向上させるためのサービスです。 permissionsの自動設定や、GitHub Actionsのバージョン固定など色々な機能を持っています。

一方で、update-github-actions-permissionsはシンプルにpermissionsを自動で設定するだけのツールです。 そのため、Secure Workflowsのように色々な機能は持っていません。 どちらかというと、“Read repository contents permission”をデフォルトにするために、移行するツールという位置付けです。

また、Secure WorkflowsはAGPLなので、update-github-actions-permissionsもライセンスはAGPLに変更しています。

おわりに

update-github-actions-permissions v2ではSecure Workflowsの定義ファイルを取り込むことで、500種類以上のActionのpermissionsをサポートできるようになりました。

GitHub Actionsを狙ったサプライチェーン攻撃はまだ知らないですが、Codecovのような問題は今後も起こりうると思います。

そういった問題が起きた時に影響範囲が小さくなるようにpermissionsを設定することは重要だと思います。 まずは、RepositoryやOrganizationレベルで”Read repository contents permission”をデフォルトにすることから始めてみてください。 Codecovのような無差別のサプライチェーン攻撃ならpermissionsを設定するだけで、影響範囲が小さくなります。

GitHub Actionsの継続的なチェックは、OSSFのScoorecardなど色々なツールが出てきています。