CIにおけるegressフィルタリングとは何か? buildの接続先を制御する
egressフィルタリングは、CIジョブがデータを送信できる先を制限します。これによりbuildは必要なサービスに到達できますが、secretを攻撃者に流出させることはできません。
ほとんどのセキュリティはbuildに何が入るかに焦点を当てます。egressフィルタリングは何が出ていくかに焦点を当てます。secretを盗む侵害された依存関係も、それをどこかに送信しなければなりません。egressフィルタリングはその最終ステップを失敗させます。既知の安全な宛先への接続のみを許可することで、成功した窃盗を無意味なものに変えます。
流出の問題
悪意のあるパッケージは、あなたのsecretをミリ秒単位で読み取れます。被害が生じるのは、それを外部へ、攻撃者のURLやIPへ送り出したときだけです。buildがその宛先に到達できなければ、secretは決して出ていかず、攻撃は最後のステップで無力化されます。
egressフィルタリングの仕組み
- buildが正当に必要とする宛先のallowlistを定義する。
- それ以外のすべての送信接続をデフォルトでブロックする。
- リスト外への到達の試みをログ記録またはアラートする。
- 正当な依存関係が判明するにつれてallowlistを調整する。
allowlist対blocklist
blocklistは、攻撃者が新しい宛先を使うため失敗します。default-denyのallowlistが堅牢なアプローチです。buildはあなたのregistry、cloud、パッケージミラーとは通信できますが、それ以外とはできません。予期しないものはすべてブロックされ、表面化します。
攻撃を現行犯で捕らえる
ブロックすることに加えて、egressフィルタリングは検知シグナルです。あるbuildステップが突然未知のホストに到達しようとするのは、侵害の強い兆候であり、流出の最中にある汚染された依存関係です。そのアラートは、次のbuildが実行される前に調査を引き起こせます。
ランナーでのegress制御
egressフィルタリングはランナーまたはネットワーク境界に存在する必要があり、寄せ集めのself-hostedフリートに後付けするのは困難です。管理された分離済みランナーは、堅牢化された環境の一部としてjobごとにネットワークポリシーを強制できるので、各チームがfirewallを配線しなくても流出がブロックされます。
重要なポイント
- egressフィルタリングはCIジョブがデータを送信できる先を制御し、流出をブロックします。
- default-denyのallowlistは、攻撃者の新しい宛先に対してblocklistより優れています。
- ブロックされたegressの試みは、侵害の検知シグナルとしても機能します。