LiteLLMのリリースノートを眺めていたら、v1.82.3.dev.9のページに気になる記述があった。「すべてのDockerイメージはcosignで署名されている」という一文だ。
これ、自分のプロジェクトで普通に`docker pull`してるだけだと、署名の検証なんてやってないよな。個人開発ならまだしも、スタートアップのプロダクトに組み込んでいる場合はちょっと考えさせられる。
リリースページによると、署名はcommit `0112e53`で導入された鍵を全リリースで使い回している。検証方法は2種類あって、コミットハッシュを使う方法とリリースタグを使う方法がある。
コミットハッシュを使う方法が「推奨」とされているのは理由がある。タグは後から書き換えられる可能性があるけど、コミットハッシュは暗号的に不変だからだ。つまりこっちのほうが強い保証になる。
成功すると「cosign claimsが検証された」「指定した公開鍵でシグネチャが検証された」という出力が返ってくる。実際に手元で試したら30秒もかからなかった。
これを見て、まず自分のデプロイフローを振り返った。GitHub ActionsでLiteLLMのイメージをpullして使っているんだけど、検証ステップは入れていなかった。pull→run、それだけ。
サプライチェーン攻撃の話は去年あたりからXでよく流れてくるようになったし、「外部イメージをそのまま信頼する」というのは正直リスクだと薄々わかっていた。でも「まあLiteLLMだし大丈夫でしょ」という空気感でスルーしていた。
GitHub Actionsに組み込むなら、cosignのインストールステップを追加してから検証を挟めばいい。手順としてはざっくりこんな感じになる。
これを入れておけば、万が一イメージが改ざんされていた場合にCIが落ちてくれる。デプロイが止まるのは困るけど、汚染されたイメージがそのまま本番に流れるよりはずっとマシだ。
こういうセキュリティ周りの対応をちゃんとやっているかどうかって、ライブラリを選ぶときの地味な評価ポイントになると思う。LiteLLMはGitHubのスター数が42.9kまで伸びていて、フォークも7.1k超えている。使っている人が多いからこそ、署名検証の仕組みをちゃんと整備しているのは評価できる。
逆に言うと、よく使われているイメージほど攻撃対象になりやすい。人気があることとセキュアであることはイコールじゃないので、自分でちゃんと検証するクセをつけておくべきだなと改めて思った。
自分は来週、LiteLLMを使っているリポジトリのCIに検証ステップを追加するつもりだ。5分もかからない作業だし、「やっておけばよかった」という後悔だけは避けたい。
これ、自分のプロジェクトで普通に`docker pull`してるだけだと、署名の検証なんてやってないよな。個人開発ならまだしも、スタートアップのプロダクトに組み込んでいる場合はちょっと考えさせられる。
cosign検証、実際どうやるのか
リリースページによると、署名はcommit `0112e53`で導入された鍵を全リリースで使い回している。検証方法は2種類あって、コミットハッシュを使う方法とリリースタグを使う方法がある。
コミットハッシュを使う方法が「推奨」とされているのは理由がある。タグは後から書き換えられる可能性があるけど、コミットハッシュは暗号的に不変だからだ。つまりこっちのほうが強い保証になる。
cosign verify \
--key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
ghcr.io/berriai/litellm:v1.82.3.dev.9成功すると「cosign claimsが検証された」「指定した公開鍵でシグネチャが検証された」という出力が返ってくる。実際に手元で試したら30秒もかからなかった。
自分のCI/CDをどう直すか
これを見て、まず自分のデプロイフローを振り返った。GitHub ActionsでLiteLLMのイメージをpullして使っているんだけど、検証ステップは入れていなかった。pull→run、それだけ。
サプライチェーン攻撃の話は去年あたりからXでよく流れてくるようになったし、「外部イメージをそのまま信頼する」というのは正直リスクだと薄々わかっていた。でも「まあLiteLLMだし大丈夫でしょ」という空気感でスルーしていた。
GitHub Actionsに組み込むなら、cosignのインストールステップを追加してから検証を挟めばいい。手順としてはざっくりこんな感じになる。
- name: Install cosign
uses: sigstore/cosign-installer@v3
- name: Verify LiteLLM image
run: |
cosign verify \
--key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
ghcr.io/berriai/litellm:v1.82.3.dev.9これを入れておけば、万が一イメージが改ざんされていた場合にCIが落ちてくれる。デプロイが止まるのは困るけど、汚染されたイメージがそのまま本番に流れるよりはずっとマシだ。
ライブラリ選定の判断材料にもなる
こういうセキュリティ周りの対応をちゃんとやっているかどうかって、ライブラリを選ぶときの地味な評価ポイントになると思う。LiteLLMはGitHubのスター数が42.9kまで伸びていて、フォークも7.1k超えている。使っている人が多いからこそ、署名検証の仕組みをちゃんと整備しているのは評価できる。
逆に言うと、よく使われているイメージほど攻撃対象になりやすい。人気があることとセキュアであることはイコールじゃないので、自分でちゃんと検証するクセをつけておくべきだなと改めて思った。
自分は来週、LiteLLMを使っているリポジトリのCIに検証ステップを追加するつもりだ。5分もかからない作業だし、「やっておけばよかった」という後悔だけは避けたい。