GitHub: Dependabot で GitHub Secrets にアクセスさせる
August 12, 2022
たとえば npm でプライベートなパッケージを作成していて、他のリポジトリのアプリがそのパッケージを利用しているとします。
プライベートなパッケージにアクセスするにはアクセストークンが必要です。
GitHub Actions を使う場合、トークンを GitHub Secrets に設定しておいて、ワークフローの中でそれを .npmrc
に書き出して使用する、というような仕組みを使っていることが多いと思います。
しかしながら Dependabot がこのワークフローを実行すると失敗してしまいます。
これは Dependabot が Secrets にアクセスできないようになっているからです。
正確にいうと、以前はアクセスできていたようですが、2021 年の 3 月に GitHub Actions に仕様変更があり、現在は上記の仕様になっています。
対応策 #
Dependabot Secrets を使いましょう。
GitHub の Settings > Secrets のところを見ると以下の2つがあります。
- Actions secrets
- Dependabot secrets
このうちの Dependabot secrets が Dependabot がアクセスできるシークレットです。
例えば Actions secrets に ACCESS_TOKEN
という名称でトークンを設定しているのであれば Dependabot secrets のほうにも同じ名前である ACCESS_TOKEN
の名称でトークンを設定します。
こうしておけばワークフロー上で Dependabot 以外のユーザと Dependabot が同じ名称でアクセスできます。
実際は Dependabot 以外のユーザは Actions secrets の ACCESS_TOKEN
を参照しており、他方 Dependabot は Dependabot secrets の ACCESS_TOKEN
を参照しているで別物です。
しかしワークフロー上ではそれを意識する必要がなくなりますので、処理中に if
文を入れたりなどの手を加える必要もありません。
推奨されない対応策 #
ネット上で調べると別の解決策が見つかるかもしれません。
例えばワークフローの on: pull_request
を on: pull_request_target
に変更する、などです。
一時的に上記対応が提案された時期もありましたが、現在は Dependabot Secrets という仕組みが用意されているため、こちらを使いましょう。
推奨されない理由は、セキュリティ上のリスクがあるためです。
経緯 #
事態の発生経緯や一時的に提案された解決策などはすべて以下の ISSUE にまとまっています。
- Dependabot triggered Actions cant access secrets or use a writable token · Issue #3253 · dependabot/dependabot-core
- https://github.com/dependabot/dependabot-core/issues/3253
スレッドが長いですが、最後の方にある次のコメントにすべてがまとめられています。これは Dependabot の PM の方によるコメントです。
https://github.com/dependabot/dependabot-core/issues/3253#issuecomment-852541544
上記コメントを要約すると以下の通りです。
- GitHub Actions のチームが仕様の変更を行い、Dependabot がワークフローを起動したとき(
github.actor == "dependabot[bot]"
)はsecrets
にアクセスできないようにした。 - これはセキュリティ対策のため必要だったこと。
- Dependabot に
secrets
を参照させるには2つの手がある。pull_request_target
を使う方法- ワークフローを2つに分割する方法
- ただし、どちらの対応を行った場合でも同様のセキュリティリスクがあるため、それを受け入れた上で使うほかない。
そして以降の追加コメントで以下の通り説明されています。
https://github.com/dependabot/dependabot-core/issues/3253#issuecomment-940182533
- GitHub Actions のチームが機能を追加した。ワークフロー内で
permissions
を指定することでアクセス許可を明示できる。 - さらに GitHub Actions は Dependabot が再び
secrets
にアクセスできる仕組みを現在開発中である。
コメントはここまでで終わっていますが、最後の「アクセスできる仕組みを現在開発中である」の結果が、冒頭で紹介した Dependabot Secrets です。
- Dependabot に対する暗号化されたシークレットを管理する - GitHub Docs
- https://docs.github.com/ja/code-security/dependabot/working-with-dependabot/managing-encrypted-secrets-for-dependabot
補足 #
紹介した ISSUE 内でも言及されていますが、今回の原因で失敗したワークフローを Re-Run すると、今度は成功します。
それは github.actor == "dependabot[bot]"
ではなくなったためです。