1 ポイント 投稿者 GN⁺ 19 일 전 | 1件のコメント | WhatsAppで共有
  • 世界中の開発者が利用する Ruffuvty などのツールを開発するAstralは、すべての製品において セキュリティと信頼性 を中核的な価値として維持している
  • 近年の サプライチェーン攻撃の増加 に対応し、ビルド・配布・リリースの全工程における セキュリティ強化のための内部手法 を公開した
  • GitHub ActionsベースのCI/CDでは、ハッシュ固定、最小権限、秘密情報の分離 などの多層的な保護体制を適用している
  • リリース段階では、Trusted PublishingSigstore attestationsImmutable Releases などによって 配布の完全性 を確保している
  • Astralはこのようなアプローチを通じて、オープンソースエコシステム全体のセキュリティ水準向上持続可能な防御体制の構築 を目指している

Astralのオープンソースセキュリティへのアプローチ

  • Astralは、世界中の数百万の開発者が利用する Ruffuvty などのツールを開発しており、これらのツールの セキュリティと信頼性 を中核的な価値として維持している
  • 最近では TrivyLiteLLM のハッキング事例など、サプライチェーン攻撃が増加していることを受け、Astralは自社ツールとビルド・配布プロセスの安全性を保証するための内部セキュリティ手法を公開した
  • 利用者、オープンソースメンテナー、CI/CDシステム開発者のいずれも参照できる セキュリティのベストプラクティス を共有している

CI/CDセキュリティ

  • AstralはGitHub Actionsベースの 広範なCI/CDワークフロー を通じて開発と配布を自動化し、それをセキュリティの重要な構成要素として活用している
    • ローカル環境ではなく、制御され観測可能な環境 でビルドとテストが実行されるようにしている
  • GitHub Actionsの デフォルトのセキュリティ設定が脆弱 である点を認識し、次のような強化策を実施している
    • pull_request_targetworkflow_run などの 危険なトリガーを全面的に禁止
    • すべてのアクションを 特定のコミットハッシュ(SHA) に固定し、impostor commit かどうかを相互検証
    • zizmorの unpinned-usesimpostor-commit 監査ツールとGitHubポリシーを併用
    • ハッシュ固定が不可能な間接依存アクションまで含めて、依存グラフ全体をハッシュ固定
  • ハッシュ固定だけでは十分でないため、手動レビューによって不変性の欠陥を検出 し、必要に応じて上流プロジェクトと協力して修正している
    • 例: バイナリのダウンロードURLとハッシュを対応付けて 不変の状態で組み込み
  • ワークフロー権限は デフォルトで読み取り専用 に制限し、各ジョブ単位で必要最小限の権限のみを付与している
  • GitHub Secretsは 環境ごとに分離されたデプロイ環境変数 として管理し、テスト・lintジョブがリリース用秘密情報へアクセスできないようにしている
  • 補助ツールとして zizmor(静的解析)と pinact(自動ハッシュ固定)を使用している

リポジトリおよび組織のセキュリティ

  • Astral組織内では 管理者権限アカウント数を最小限 に抑え、ほとんどのメンバーは必要なリポジトリに対してのみ読み書き権限を持つ
  • すべてのメンバーに 強力な二要素認証(2FA) を要求し、最低でも TOTP相当以上 の認証方式を用いている
    • GitHubがフィッシング耐性のある方式(WebAuthn、Passkeys)のみを許可する場合は、直ちに移行する予定
  • ブランチ保護ルール を組織全体に適用
    • main ブランチでは強制プッシュを禁止し、すべての変更はPR経由でのみ可能
    • advisory-*internal-* など特定のブランチパターンの作成を禁止
  • タグ保護ルール によって、リリース配布成功後にのみタグを作成可能
    • タグの変更・削除は禁止、main ブランチからのみリリース可能
  • リポジトリ管理者であっても保護ルールを回避できず、すべての保護は組織レベルで強制される
  • Astralはこうしたルールセットを gist として公開しており、他プロジェクトでも参考にできる

自動化

  • GitHub Actionsでは、サードパーティPRへのコメント投稿など一部の作業を安全に実行できない
  • Astralはそのために astral-sh-bot GitHub App を用い、Actionsの外部でイベントを安全に処理している
    • GitHub Appは同じイベントデータを受信するが、コードとデータが分離された環境 で実行される
  • ただし、Appも 機密性の高い認証情報を取り除くわけではない
    • SQLi、プロンプトインジェクションなどの脆弱性が存在し得るため、一般的なソフトウェアと同等のセキュリティ水準で開発する必要がある
    • Appを使うことがそのまま 非信頼コード実行の安全性保証 を意味するわけではない
  • GitHub App方式は セキュリティ面では有利だが複雑性が増す
    • Appの開発・ホスティングが必要で、個人開発者や小規模プロジェクトには負担となる
    • Python向けの Gidgethub フレームワークが開発を簡素化する
  • Astralは astral-sh-botをオープンソースとして公開する計画 であり、参考資料として Mariattaのチュートリアル を推奨している

リリースセキュリティ

  • AstralのツールはGitHubのほか、PyPIHomebrewDockerイメージ など多様なチャネルで配布されている
  • サプライチェーン攻撃を防ぐため、次のような対策を実施している
    • Trusted Publishing を使用してレジストリ認証情報を排除
    • Sigstoreベースのattestations を生成し、ビルド成果物とワークフロー間の 暗号学的な結び付きを保証
      • GitHubの Immutable Releases 機能によって公開後の改変を防止
      • ビルドキャッシュを使用しない ことでキャッシュ汚染攻撃を遮断
      • リリース工程は 専用のデプロイ環境(deployment environment) で分離
      • リリース環境の有効化時には 別のチームメンバーの承認が必要 であり、単一アカウント侵害による悪意あるリリースを防止
      • release-gate 環境と GitHub Appベースの承認中継 により多段階承認を維持
      • タグはリリース成功後にのみ作成可能
      • スタンドアロンインストーラー(standalone installer) は内蔵チェックサムでバイナリ完全性を検証
      • リリース後のドキュメント、バージョンマニフェスト、pre-commitフック更新などは 専用ボットアカウントと細分化されたPAT で実施
      • 今後は macOS・Windows向けコード署名 の追加を予定

依存関係のセキュリティ

  • Astralは DependabotRenovate を使って依存関係の更新と脆弱性通知を管理している
  • クールダウン(cooldown) 期間を設け、新規リリース直後の更新を遅らせることで、一時的なサプライチェーン攻撃リスクを緩和している
    • Renovateはグループごとのクールダウン設定をサポートしており、自社依存関係には緩和を適用
  • 主要な上流プロジェクトと 継続的な協力およびセキュリティ貢献 を行っている
  • Python Packaging AuthorityPython Security Response Team などと協力し、セキュリティ情報を共有している
  • 新しい依存関係の追加は慎重に検討 し、不要な依存関係の削減を進めている
    • 特に バイナリブロブを含む依存関係を避け、不要な機能を無効化
  • OSS Fund を通じて中核的なオープンソースプロジェクトへ資金提供している

結論と重要な教訓

  • オープンソースセキュリティは 技術的問題と社会的問題が複合したもの であり、継続的な対応が必要
  • Astralが強調する主要原則
    • CI/CDの限界を認識 し、避けられない場合はGitHub Appなど外部隔離方式を使う
    • 長期認証情報の排除と最小化、Trusted PublishingとOIDC認証の活用
    • リリースプロセスの強化、承認・タグ・ブランチルールおよびImmutable Releaseの適用
    • 依存関係への認識を維持 し、ツールと協力を通じて上流プロジェクトのセキュリティもともに強化
  • Astralはこれらの手法を継続的に評価・改善し、攻撃者の行動変化に合わせて防御体制を進化 させていく予定

脚注の要約

  • PyPIの PEP 740 はattestationsのアップロードを許可しているが、現在のAstralのTrusted Publishing実装とは互換性がなく、適用は保留中
  • インストールスクリプト内のチェックサムは curl ... | bash で直接実行する場合には効果が限定的だが、CI/CD内でのベンダリング時には有用

1件のコメント

 
GN⁺ 19 일 전
Hacker Newsのコメント
  • GitHubのCIを安全に使うには、あまりに多くの手順を踏まなければならないように思う
    こういう構造では、セキュアに運用するのは不可能だと思う
    権限分離や隔離といった基本原則すら守られていないシステムの上にサプライチェーンセキュリティを積み上げるのは無理があるという印象

    • 私もほぼ同感。最近GitHub Actionsでエージェントが書いたコードを安全に実行する方法を研究していて、sandbox-actionである程度うまくいった
      ただ、設定があまりに繊細で、スケーラブルなアプローチには見えない。デフォルトがもう少し安全寄りになれば、かなり良くなると思う
    • こうした複雑なGitHub CIの代わりに使える、まともな代替ビルドシステムを見たことがある人はいるだろうか
      記事を読み終えると、この複雑さ自体がこの領域の本質的な問題なのかもしれないとも感じる
    • 実際、これはパッケージレジストリ全般の問題と変わらない
      ほとんどは不変リリースをサポートしておらず、サポートしていても新しいバージョンを自動で引っ張ってくる構造なので攻撃に弱い
      本当に安全にするには、検証済みの依存関係を固定バージョンで自前のレジストリに管理する必要があるが、それはGoogleクラスでないと難しい
  • 私たちのチームが作った stagex のuvバイナリは、世界で唯一、完全なソースブートストラップと複数署名された決定論的アーティファクトでビルドされている
    25年もののWeb of Trustと、5000個以上の鍵で結ばれたスマートカードベースの署名体系を使っている
    それなのに、こうしたサプライチェーンセキュリティをボランティアのほうが熱心にやっているのはもどかしい

    • 市場はすでに答えを出している。人々はセキュリティより利便性を求めている
      OpenClawのようなツールが鍵や秘密を漏えいさせる作りでも、ユーザーはそれを使い続ける
      あなたは攻撃面を減らそうとしているが、市場はむしろ広げている
    • 正直、いら立つような話でもない。あなたは再現可能なLinuxディストリビューションを作っていて、その上でパートナーがサポートサービスを売っている
      ボランティアがいなければDebianのようなプロジェクトも存在しない。不満を言うより、より良い結果で競争すべきだ
    • (TFAの筆者です)鍵の数や古さは信頼の尺度ではない
      結局のところ第三者がビルドした成果物を提供しているわけで、脅威モデルが何なのか明確ではない
      uvのすべてのビルドは固定された解決結果から行われ、署名付きアーティファクトを提供している。別のアイデンティティ集合で署名されたコミットの価値は不明瞭だ
    • オープンソースライセンス自体が、企業が無料で使えるよう設計されている
      OpenAIがわざわざ費用をかけてサプライチェーンセキュリティを強化する理由はない
    • 買収されてからまだ数週間しか経っていないのに、OpenAIがビルドプロセスを変えていたら、むしろそのほうが不自然だっただろう
      技術的な批判は理解できるが、このタイミングでOpenAIの責任にするのは無理があると思う
  • 参考までに、PyPIのTrusted PublishingはWilliam WoodruffとTrail of Bitsのチームが一緒に実装したもの

  • Astralのチームに聞いてみたい。ここまで努力しながら、なおGitHub自体に大きく依存している状況をどう管理しているのだろうか
    GitHubが侵害されたり、バグで設定が変わったりしたらどう対応するのか?

    • 私たちもGitHubと直接やり取りしている。彼らは中核インフラなので、プラットフォームの変更を綿密に監視している
    • GitHubは本当にバグが多い。ワークフローが自分のリポジトリのブランチをクローンしようとして失敗することさえよくある
  • オープンソースエコシステムは回復力が高いが、サードパーティコードのサンドボックス化は依然として不十分だ
    uvを使うたびに、複数のPythonバージョンを簡単に管理できる利点が強調されるが、そのぶんホストマシン上で隔離なしに実行されることを意味するので不安になる

    • 私はuvを常にDockerの中で使っている。そういう使い方ならかなり便利だ
  • 現在のサプライチェーンの大きな問題は、多くのツールや依存関係が出所の検証なしにダウンロードされていることだ
    そこで私は、オープンソースのマルチシグファイル認証ソリューションである asfaload を開発中だ
    axiosのような事故を防げる構造になっている

    • それこそ**リリース証明書(release attestations)**の目的ではないか? 関連ドキュメント 参照
    • アプローチの方向性は正しそうだ。ただ、コードや製品がまだ公開されていないので判断しづらい
    • 特定の作者の検証より、自動コード監査ツールですべてのコードを点検するほうが良いと思う
  • GitHub ActionsをコミットSHAで固定しても、そのアクションが別の依存関係を引っ張ってくるなら依然として危険だ
    本当の解決策は、CIパイプラインでコードを直接所有するか、フォークして自前で保守することだ

    • 記事でも触れている。私たちは**多層防御(defense in depth)**のアプローチを取っている
      すべてのアクションを監査し、可変の依存関係があれば修正または置き換える(Astral所属です)
    • セキュリティは常にトレードオフ
      スタック全体を自前で管理するのが最も安全だが、現実的ではない
      ハッシュ固定は、ほとんど無償で得られるセキュリティ強化策だ
      結局は、どこまで信頼するのかを明確に認識することが重要だ
    • どうせサードパーティのアクションを使うなら、コードを自分で読んで検証する必要がある。単にフォークするだけでは解決しない
  • 最近のTrivyやlitellmの件を見ると、リリースプロセスのセキュリティガイドは本当に必要だ
    この記事の助言は実践的で、すぐ適用できる
    サプライチェーンセキュリティの核心は、私たちが依存するプラットフォームのデフォルト設定がどれだけ安全かにかかっている

  • 素晴らしい概要だ。他のオープンソースプロジェクトにとっても有用な参考資料になりそうだ

  • 私はPython CLI兼再利用可能なワークフローツールである repomatic をメンテナンスしている
    この記事のセキュリティ慣行の大半をデフォルトで含めている
    目標は、セキュリティがデフォルトになる環境を作ることだ
    この記事を読んで、フォークPRの承認ポリシー検査を追加した
    詳しくは GitHubリポジトリ を参照