npmのセキュリティ機能をさらに強化

Image of Monish Mohan
   
Image of Myles Borins

npm CLIを使用したログインおよびパブリッシュの改善、GitHubアカウントとTwitterアカウントの接続、npmでのパッケージの整合性を検証する新しいCLIコマンドなど、npmのセキュリティを強化しました。

JavaScriptコミュニティでは毎日50億個以上のパッケージがnpmからダウンロードされており、私たちは開発者の皆さんが安心してダウンロードできることが、いかに重要であるかを認識しています。また、npmレジストリの管理者として、私たちが開発者の皆さんからさらに信頼してもらい、レジストリ全体のセキュリティを向上させるために、改善への投資を継続的に実施することが重要であると考えています。
本日は、強化されたnpmの2FAエクスペリエンスが一般提供されることをお知らせするとともに、アカウントとパッケージの検証プロセスに対して実施された追加投資についてご紹介します。

今回、npmに以下のような改善を実施しました。

  • npm CLIによる、ログインおよびパブリッシュエクスペリエンスの効率化
  • GitHubアカウントとTwitterアカウントのnpmへの接続
  • npmのすべてのパッケージへの再署名の完了、およびパッケージの整合性を監査する新しいnpm CLIコマンドの追加
  • ログインおよびパブリッシュの効率化

2FAの導入により、アカウントのセキュリティは大幅に向上しますが、ユーザーエクスペリエンスはあまり良くないものであるため、利用しないユーザーも多く存在します。そこで、GitHubは最近、エンジニアが2FAを容易に導入できるようにするための、npmレジストリに対するさまざまな機能強化パブリックベータ版としてリリースしました。新しい2FAエクスペリエンスを早期に導入したユーザーから、npm CLIを使用したログインおよびパブリッシュのプロセスに関するフィードバックが寄せられ、より多くの改善が必要だとわかりました。当初の設計では、npm 6やその他のクライアントとの下位互換性を持つようにしただけでなく、Yarnプロジェクトでは、新しいエクスペリエンスのサポートを10行未満のコードでYarn1にバックポートすることができました。
これらフィードバックに基づき、さらに改善したログインおよびパブリッシュ機能をnpm8.15.0で利用できるようになりました。機能改善によるメリットは以下のとおりです。

  • ログインおよびパブリッシュの認証をブラウザ上で管理。
  • 既存セッションを使用してログイン。新しいセッションを作成する時にだけ、2番目の要素またはメールOTP検証が求められる。
  • パブリッシュでは"remember me for 5 minutes (5分間記憶しておく)"機能がサポートされるようになり、同じIPとアクセストークンからの後続のパブリッシュについては、2FAプロンプトを5分間回避することができる。これは、npmワークスペースからパブリッシュする場合に特に便利です。現在は –auth-type=web フラグを使用してオプトインされており、npm 9ではデフォルトのエクスペリエンスになります。

npm login –auth-type=web
npm publish –auth-type=web

こうした改善により、ユーザーは自分のアカウントをより簡単に保護できるようになります。安全なアカウントは、安全なエコシステムを実現するための第一歩です。npmでの2FAの詳細については、こちらのドキュメントをご確認ください。

GitHubアカウントとTwitterアカウントのnpmへの接続

npmアカウントが利用可能な状態であれば、ほとんどの場合、GitHubのハンドルとTwitterのハンドルをnpmプロファイルに含めることができていました。これは、npmアカウントのIDを他のプラットフォームのIDに接続する際に役立っていましたが、このデータは従来、認証も検証もされていない自由形式のテキストフィールドでした。

そのため、npmのアカウントをGitHubアカウントやTwitterアカウントにリンクさせる機能の提供を開始しました。これらのアカウントとのリンクは、GitHubとTwitterの両方と公式に統合することで実行され、統合後は検証済みアカウントデータがnpmプロファイルに必ず含まれるようになります。それ以前の未検証のGitHubデータまたはTwitterデータはパブリックユーザープロフィールに表示されなくなりますが、開発者はIDを監査して、アカウントが本人であると信頼できるようにすることが可能です。プラットフォーム全体でID間のリンクを検証済みにすることで、アカウントリカバリ機能が大幅に向上します。この新しい検証済みデータは、アカウントリカバリの一部としてID検証を自動化するための基盤となっています。これまでのレガシーデータは徐々に廃止していく予定ですが、ユーザーのアカウントがロックされないように、当面の間は引き続きこのデータを使用することができます。

npm audit signatures npm audit signatures を使用して、パッケージをローカルで検証可能

今日まで、npmユーザーがnpmパッケージの署名を検証するために、多段階のプロセスが必要でした。このPGPベースのプロセスは複雑であるだけでなく、暗号化ツールに関する知識が必要であったため、開発者エクスペリエンスの低下につながっていました。この従来型のプロセスを利用している場合は、すぐに新しい“audit signatures”コマンドを使い始めることをおすすめします。PGPキーは2023年初めに期限が切れることになっています。詳細は後日お知らせします。

GitHubでは最近、安全なECDSAアルゴリズムを利用し、HSMでキーを管理する新しい署名で、すべてのnpmパッケージを再署名する作業を開始しました。これにより、この署名を利用して、npmからインストールするパッケージの整合性を検証できるようになりました。

npm CLIバージョン8.13.0以降で新しいaudit signaturesコマンドを導入しました。

audit signatureによる検証の成功例

audit signature を実行したGitHub Actionsワークフローのサンプルを下に示します。

今後の展望

私たちの主な目標は、引き続きnpmレジストリを保護することです。次の主要なマイルストーンは、影響力の大きいすべてのアカウント(例:毎週のダウンロード数が100万回を超えるか、500以上の依存関係を持つパッケージを管理するアカウント)に対して2FAを適用し、2番目の要素の導入を求めるアカウント数を3倍に増やすことです。2FAの適用に先立って、
追加のID検証形式を導入したり、プロセスを可能な限り自動化するなど、アカウントリカバリプロセスをさらに改善していく予定です。

これらの機能の詳細については、次のドキュメントでご確認いただけます.

質問やコメントについては、フィードバックリポジトリでディスカッションを開いてお知せください。