日曜日, 8月 3, 2025
日曜日, 8月 3, 2025
- Advertisment -
ホームニューステックニュースcrates.ioにトークンレスでpublish可能になったTrusted Publish

crates.ioにトークンレスでpublish可能になったTrusted Publish


以前にjsr.ioにpublishする方法の記事で、jsr.ioは特に従来のパッケージマネージャとは異なりトークンを使わずに公開できるという点が素晴らしい体験だと紹介したことがありました。

https://zenn.dev/kesin11/articles/20240530_publish_jsr

特にここ数年はあらゆるプログラミング言語のOSSを狙ったサプライチェーン攻撃が多発しており、著名なOSS開発者のトークン漏洩に端を発したセキュリティインシデントが増えてきています。

という昨今のぶっそうな情勢の中、Rust好きの同僚からRustのパッケージレジストリであるcrates.ioでもjsr.io同様のトークンレスでpublishできるTrusted Publishという機能が追加されたと教えてもらいました。

https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/

この記事は7/11に公開されていたようなのですが、既に3週間ほど経過しているのにこのTrusted Publishについての話題を聞いたことがなかったので、少しでも多くの人に認知してもらいたいという気持ちから自分のOSSで対応したときの記録を元に紹介したいと思います。

Trusted Publishとは

https://crates.io/docs/trusted-publishing

公式ドキュメントはこちらです。仕組みとしては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の仕組みを使う方がメジャーになってきているので、その設定をした経験がある方も増えているのではないでしょうか。

https://jsr.io/docs/publishing-packages#publishing-from-github-actions

https://docs.github.com/en/actions/how-tos/secure-your-work/security-harden-deployments/oidc-in-aws

https://docs.github.com/en/actions/how-tos/secure-your-work/security-harden-deployments/oidc-in-google-cloud-platform

crates.io側でのTrusted Publishの設定

特に難しい設定はないのですが、公式ドキュメントでは文章で簡単にしか説明されていないので自分が実際に設定したときのスクショを元に説明します。
まず自分が管理しているcrates.ioのパッケージのページを開きます。自分は公開している https://crates.io/crates/junit2json を開き、Settingsタブを開きます。

Settingsタブ

Trusted Publishingという項目があるので Add ボタンから設定画面に行きます。

Trusted Publishing設定画面

ここでGitHubのリポジトリ、GitHub Actionsのワークフロー、environment(optional)を設定します。自分は Kesin11/junit2json-rs というリポジトリで開発しているのでそれを指定し、ワークフローは元々リリース作業に使用していた release.yml を指定しました。environmentも元々トークンを設定するために指定していた prod を指定しました。

alt text

設定が完了すると、Trusted Publishingの設定が追加されました。

GitHub Actions側の設定

GitHub Actions側の設定は先ほどのドキュメントGitHub Actions Setup のセクションに書かれている通りにするだけです。重要なのは permissionsid-token: write と、以下の rust-lang/crates-io-auth-actionCARGO_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がこちらです。

https://github.com/Kesin11/junit2json-rs/pull/109

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 でした。

alt text

まとめ

ということで、簡単にですがcrates.ioでもトークンレスでpublishできるTrusted Publishの設定方法を紹介しました。
公式ドキュメントもペライチ程度の内容しか書かれていないですが、実際に設定してみるとそれだけでも十分なくらい簡単です。

トークンレスでpublishできることはセキュリティの観点からも重要なことなので、Rust製のOSSを公開している方はTrusted Publishに移行して今まで使っていたトークンは削除していきましょう。



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -