以前にjsr.ioにpublishする方法の記事で、jsr.ioは特に従来のパッケージマネージャとは異なりトークンを使わずに公開できるという点が素晴らしい体験だと紹介したことがありました。
特にここ数年はあらゆるプログラミング言語のOSSを狙ったサプライチェーン攻撃が多発しており、著名なOSS開発者のトークン漏洩に端を発したセキュリティインシデントが増えてきています。
という昨今のぶっそうな情勢の中、Rust好きの同僚からRustのパッケージレジストリであるcrates.ioでもjsr.io同様のトークンレスでpublishできるTrusted Publishという機能が追加されたと教えてもらいました。
この記事は7/11に公開されていたようなのですが、既に3週間ほど経過しているのにこのTrusted Publishについての話題を聞いたことがなかったので、少しでも多くの人に認知してもらいたいという気持ちから自分のOSSで対応したときの記録を元に紹介したいと思います。
Trusted Publishとは
公式ドキュメントはこちらです。仕組みとしてはGitHub ActionsとのOIDCによって短命なトークンを発行することで、従来の永続的なトークンを使わずpublishできるようにするものです。
crates.io側でパッケージごとに信頼できるGitHubのリポジトリ、GitHub Actionsのワークフロー、environment(optional)を事前に設定しておくことで、その組み合わせのGitHub Actionsからのみトークンレスでpublishできるようになります。
ドキュメントを読んだ自分の理解としては、裏の仕組みや設定方法はjsr.ioや、AWS, Google CloudなどのOIDCを使ったトークンレスな認証と同じという認識です。特に最近ではGitHub ActionsからAWSやGoogle Cloudの認証のためにOIDCの仕組みを使う方がメジャーになってきているので、その設定をした経験がある方も増えているのではないでしょうか。
crates.io側でのTrusted Publishの設定
特に難しい設定はないのですが、公式ドキュメントでは文章で簡単にしか説明されていないので自分が実際に設定したときのスクショを元に説明します。
まず自分が管理しているcrates.ioのパッケージのページを開きます。自分は公開している https://crates.io/crates/junit2json を開き、Settingsタブを開きます。
Trusted Publishingという項目があるので Add
ボタンから設定画面に行きます。
ここでGitHubのリポジトリ、GitHub Actionsのワークフロー、environment(optional)を設定します。自分は Kesin11/junit2json-rs
というリポジトリで開発しているのでそれを指定し、ワークフローは元々リリース作業に使用していた release.yml
を指定しました。environmentも元々トークンを設定するために指定していた prod
を指定しました。
設定が完了すると、Trusted Publishingの設定が追加されました。
GitHub Actions側の設定
GitHub Actions側の設定は先ほどのドキュメントの GitHub Actions Setup
のセクションに書かれている通りにするだけです。重要なのは permissions
の id-token: write
と、以下の rust-lang/crates-io-auth-action
と CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
です。
- uses: rust-lang/crates-io-auth-action@v1
id: auth
- run: cargo publish
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
元々リリース作業をGitHub Actionsで自動化している場合は、この設定を組み込むだけです。実際に自分が作業したときのpull-requestがこちらです。
junit2json-rsでは cargo publish
ではなく cargo release
を使っていたのですが、CARGO_REGISTRY_TOKEN
を置き換えるだけで問題なく動作しました。
実際にpublishしたときのGitHub Actionsのログはこちら。
crates.io側でバージョン一覧を確認するとちゃんとpublishされていました。VIA GITHUBと表示されるようになったのは今回からなので、おそらくこれがTrusted Publishの証です。さらに、このVIA GITHUBをクリックするとpublishに使用したGitHub Actionsのワークフローに飛ぶことができました。今回はhttps://github.com/Kesin11/junit2json-rs/actions/runs/16693339313
でした。
まとめ
ということで、簡単にですがcrates.ioでもトークンレスでpublishできるTrusted Publishの設定方法を紹介しました。
公式ドキュメントもペライチ程度の内容しか書かれていないですが、実際に設定してみるとそれだけでも十分なくらい簡単です。
トークンレスでpublishできることはセキュリティの観点からも重要なことなので、Rust製のOSSを公開している方はTrusted Publishに移行して今まで使っていたトークンは削除していきましょう。
Views: 0