Hiratake Web ロゴ

npmのバージョン一覧に認証済みバッジを付けてみる

投稿した日
更新した日
書いたひと
icon
ひらたけ

私のウェブサイト Hiratake Web でも使用している Nuxt のパッケージを npmjs.com で見た際に バージョン一覧のところに認証済みバッジ的なものが付いている ことに気づきました。他のパッケージを見てみると、Vue.jsNext.js などでも同様のバッジが付いています。

私も公開しているパッケージがあるので「私もこの認証済みバッジみたいなの欲しい!」ということで、付けてみたときの内容を備忘録的な感じで書いていこうと思います。

nuxtパッケージのバージョン一覧に認証済みバッジのようなものが付いている様子の画像

この認証済みバッジのようなものはプロベナンスというものが付いていることを示すもののようで、パッケージがどこでどのようにビルドされて公開されたかなどを確認できるようになり、サプライチェーンセキュリティを向上させることができるとのこと。

先日も eslint-config-prettiereslint-plugin-prettier などに悪意のあるコードが含まれたバージョンが公開されていた問題 が話題となっていましたし、パッケージを公開している身としてはこのようなサプライチェーン攻撃に対してできることはやっておきたいところ。

プロベナンスをつける

今回は、私がコードを書いたり管理をしたりしている こちらのパッケージ で認証済みバッジのようなもの改めプロベナンスを付けてみました。以下の記事を参考にさせていただいたのですが、私のリポジトリでは semantic-releasepnpm を利用しており、微妙に対応が違ったのでその辺りや詰まったところなどを書いていきます。

パッケージの公開には既に GitHub Actions を利用していたため、基本的にはワークフローをちょこっと書き換えるだけでプロベナンスを付けることができました。

シンプルに npm publish コマンドを用いてパッケージを公開している場合には、上記の記事のように id-token: write の権限を付与して、npm publish コマンドを npm publish --provenance に変更するだけで対応が可能。あとは npm や GitHub がいい感じにやってくれます。

semantic-releasepnpm を使用している場合でも対応は複雑ではなく、npm のドキュメントにある「Using third-party package publishing tools」の通り、id-token: write の権限を付与するのに加えて、環境変数 NPM_CONFIG_PROVENANCEtrue を設定してあげるだけ。対応した際のプルリクエストは以下です。

最初、NPM_CONFIG_PROVENANCE: true を追加するだけではうまくいかなかったのですが、エラーを見てみると package.jsonrepository.url に GitHub のリポジトリの URL が指定されていないという内容が出力されていました。package.json の記述、ちょいちょい何かしら漏れがち。

npmjs.comのProvenanceが付いている様子の画像

ワークフローを書き換えたら、あとはその書き換えたパッケージ公開のワークフローを実行するだけ。試しに新しいバージョンをリリースしてみると、ちゃんと欲しかった認証済みバッジみたいなやつがバージョン横に付いており、README の下には新たに「Provenance」という項目が増えていました。

GitHub Actions でパッケージを公開しているパッケージはたくさんあると思うので、たった数行ワークフローに追加するだけで付けられるならやっておいたほうが良さそう。複雑な仕組みを理解して実装して…ということをしなくても導入できるのが素晴らしいですね。