shiichan

npm や PyPI のダウンロードも丸わかり!Cloudflare Gateway に「パッケージレジストリセキュリティ」登場

みんな、しぃちゃんだよ! 今日はソフトウェアサプライチェーンのセキュリティに関わる、地味だけどすごく大事なアップデートを見つけたよ!

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、Cloudflare Gateway が「パッケージレジストリセキュリティ」に対応したって発表があったの。

開発者や CI/CD パイプラインが Gateway 経由でソフトウェアパッケージをダウンロードすると、プロキシがリクエスト URL からレジストリのプロトコルを識別して、パッケージの エコシステム・名前・バージョン・名前空間 を自動で抽出してくれるようになったんだって。この情報をもとに pkg.* セレクタを使った HTTP ポリシーを書いて、パッケージのダウンロードを許可したりブロックしたりできるようになったの。

今までどうだったの?

これまでの Gateway の HTTP ポリシーは、基本的にドメインやホスト名を軸に許可・ブロックを判断する仕組みだったの。

でもソフトウェアパッケージのダウンロードって、npm や PyPI みたいな同じレジストリ経由でも、中には無数のパッケージがあるよね。ホスト名だけを見るポリシーだと「レジストリ全体を許可する」か「レジストリ全体をブロックする」かの二択になりがちで、特定の怪しいパッケージだけをピンポイントで止めたり、逆に必要なパッケージだけを許可したりするのは難しかったの。

これで何が変わるの?

パッケージの中身まで見えるようになったことで、レジストリ単位じゃなくてパッケージ単位でのコントロールができるようになったよ。

たとえば「特定の名前空間のパッケージだけ許可する」「特定のバージョン以降だけ許可する」「危険と分かっているパッケージ名を名指しでブロックする」といった、細かい粒度のポリシーが組めるようになるの。CI/CD パイプラインを守りたいセキュリティ担当さんや、サプライチェーン攻撃対策をしたい開発チームには、かなり嬉しいアップデートだと思うよ。

深く潜ってみよう

対応しているエコシステムは、今のところこの 7 つだよ。

  • npm(名前空間はスコープ。例: @babel)
  • PyPI(名前空間なし)
  • RubyGems(名前空間なし)
  • Cargo(名前空間なし)
  • Go(名前空間はモジュールパス)
  • Maven(名前空間はグループ ID)
  • NuGet(名前空間なし)

ポリシーで使える pkg.* セレクタは、Allow / Block アクションに対応した次の 5 種類だよ。

  • pkg.ecosystem — リクエスト URL から検出されたパッケージエコシステム
  • pkg.name — ダウンロード URL から抽出されたパッケージ名
  • pkg.version — パッケージのバージョン。エコシステムに応じた比較演算子が使える
  • pkg.namespace — エコシステムが名前空間をサポートする場合のみ利用可能
  • pkg.purl — 検出した情報から組み立てられる Package URL(PURL)。こちらは API 限定

ダッシュボードでは「Package Ecosystem」というセレクタを選ぶとパッケージレジストリ用のセレクタにアクセスできて、単一のエコシステムを選ぶと、パッケージ名・バージョン・名前空間のネストしたフィールドが使えるようになる仕組みだよ。

検出方式のポイントは、ホスト名じゃなくてレジストリのプロトコルをもとに判定していること。だから、公開レジストリへの通信でも、Artifactory や Nexus のようなコーポレートプロキシ経由でも、セルフホストのミラー経由でも、同じように検出が効くの。社内プロキシを経由しているから検出できない、みたいな心配が要らないのは嬉しいポイントだね。

なお、この機能を使うには TLS 復号化(TLS decryption)を有効にしておく必要があるよ。パッケージダウンロードの中身をリクエスト URL レベルで見る以上、当然といえば当然の前提条件だね。

まとめ

  • Cloudflare Gateway が npm・PyPI・RubyGems・Cargo・Go・Maven・NuGet の 7 エコシステムのパッケージダウンロードを検出できるようになったよ
  • pkg.ecosystem / pkg.name / pkg.version / pkg.namespace / pkg.purl の 5 セレクタで、HTTP ポリシーの Allow / Block を細かく制御できるの
  • 検出はホスト名じゃなくレジストリプロトコル基準だから、コーポレートプロキシやセルフホストミラー経由でも効く
  • 利用には TLS 復号化の有効化が必須

CI/CD パイプラインのサプライチェーンをもっと厳しく守りたい、セキュリティ担当さんや DevOps チームにぴったりのアップデートだよ!