外向きの通信を制御する
ワークスペースからインターネットへの通信を観測し、許可リストを育て、許可した宛先だけに絞れるようになります。 判定は forward proxy が宛先の名前(CONNECT と SNI)で行い、TLS は復号しません。操作できるのは配備管理者(super_admin)だけです。
| あなたがやること | Agent Fleet がやること |
|---|---|
| log-only のまま、しばらく観測する | 通信は止めずに、宛先ごとの件数を「観測された宛先」に積む |
| 正当な宛先を許可リストに足す | 許可リストを版で管理し、ワークスペースの proxy に配る |
| メンバーの申請を承認・却下する | MCP サーバーの登録で届かない宛先を、申請として「提案中(要承認)」に出す |
| enforce に切り替える | 許可リストにない宛先を止める |
段階を踏むのがこの仕組みの要です。 いきなり enforce にすると、エージェントの更新や MCP の接続先など、必要な通信まで止まります。
管理 → 配備全体 → 通信 を開きます。上から、モード、提案中(要承認)、許可リスト(追加分)、観測された宛先が並びます。
1. log-only で観測する
Section titled “1. log-only で観測する”既定のモードは log-only です。通信を止めずに宛先を記録し、「観測された宛先」にホストごとの「許可」と「遮断候補」の件数を出します。 まずここで、何がどこへ出ているかをつかみます。期間は 1 日・7 日・30 日から選べます。
件数は目安です。
- タイムアウトのあとに送り直された報告は、二重に数えられることがあります
- Control Plane に届かない間、proxy が持てるのは 5000 宛先までです。あふれた分は監査ログの
egress.droppedに出ます - proxy を再起動すると、メモリの上の分は消えます
一覧にないホストは「見ていない」だけで、「使われていない」ではありません。 enforce にする前に、監査ログに egress.dropped がないか確かめてください。
2. 許可リストを固める
Section titled “2. 許可リストを固める”観測を見ながら、正当な宛先を「許可リスト(追加分)」に足していきます。
- HTTP(S) ホスト を選び、
hostか.suffix.example.comの形で入力します - 必要なら理由を書き、追加 を押します
- 要らなくなったエントリは 取消 で外します
許可リストは版で管理され、状態は active・proposed・retired のどれかです。AI は提案するだけで、承認するのは人です。
はじめから許可されている宛先
Section titled “はじめから許可されている宛先”| 宛先 | 扱い |
|---|---|
| 製品の既定 | ワークスペース自身のインストーラ(JDK・Node.js・Go・gcloud・MySQL・Postgres・Chromium)と、起動時に入れて更新するエージェントの CLI(Claude・Cursor・Kiro・muse・Antigravity)の取得元。追加分がなくても有効なので、enforce でも 設定 › ツールチェーン と起動時の導入は動きます |
| この配備の Control Plane | 公開 URL と、設定していれば内部 URL のホスト。「組み込み」として出て、取り消せません。ワークスペースは egress の経路を通って Control Plane に届くためです |
storage.googleapis.comは既定に入っていません。誰でもアップロードできる汎用のストレージだからです。Antigravity を使うワークスペース(初回の導入と更新のたびにここから取る)や、x64 で Chromium を導入するワークスペースがあるときに足してください- 組み込みのエントリはホスト全体(どのポート・パスも)を許します。Control Plane には、ほかのサービスと共有しないホスト名を付けてください
- 組み込みでも、gateway のほかの拒否(ほかのポート、内部アドレス)は外れません
Control Plane の URL が IPv6 のアドレスのとき(https://[2001:db8::5])は、次のとおりです。
- 小文字・省略形のアドレスとして、角括弧ありとなしの両方で gateway に渡ります
- ゾーン ID 付き、IPv4 射影・IPv4 互換、ループバック・リンクローカル・マルチキャストのアドレスは許可されず、Control Plane が起動時に警告をログに出します
- IPv6 で実際に Control Plane まで届くかは、まだ確かめていません。ワークスペースから届くことを確かめてください
- 自分で足すエントリはホスト名と
.suffixだけで、IPv6 のアドレスは手では足せません
HTTP 以外の宛先を許可する(AWS の egress ゲートウェイだけ)
Section titled “HTTP 以外の宛先を許可する(AWS の egress ゲートウェイだけ)”SSH の git やデータベースは HTTP ではないので、ホストのエントリでは通りません。TCP ポート を選び、ホストとポートを入れます。
| 入力 | 例 |
|---|---|
| ホスト | 完全なホスト名か、公開の IPv4 アドレス 1 つ(git.example.com・203.0.113.7)。ワイルドカードと .suffix は使えません |
| ポート | 1 つ(22)か範囲(11000-11999)。範囲は 2048 ポートまで。53・80・443・853・3128 は使えません |
- enforce では、TCP のエントリにない宛先は止まります。log-only では通して、遮断候補として記録します
- 承認すると、すべてのワークスペースからそのホストのそのポートへ、HTTP 以外のアクセスが開きます。ゲートウェイは、そのホストが解決されるアドレスのそのポートだけを通します
- 宛先側のファイアウォールで、ゲートウェイの egress アドレスを通しておきます
設定と制約は ECS の手順書 の「Egress gateway」にあります。
メンバーの申請を承認する
Section titled “メンバーの申請を承認する”メンバーが 設定 > 接続 > MCP サーバー(セッションで使う) で登録したサーバーの宛先が許可リストにないと、メンバーはその場で許可を申請できます。
- 申請は「提案中(要承認)」に、宛先・理由・申請した人の順で並びます
- 承認 で許可リストに入り、却下 で退けます
- あなたが決めるまで、メンバーの画面には「管理者の承認待ち」と出ます
- TCP の申請には、承認したら何が開くかの注意が添えて出ます
3. enforce に切り替える
Section titled “3. enforce に切り替える”許可リストが固まったら、モードを enforce にします。以降、許可リストにない宛先は止まります。
- log-only のうちに、「観測された宛先」の遮断候補をなくしておくと、切り替えが穏やかに済みます
- 切り替える前に、監査ログの
egress.droppedを確かめます(1. log-only で観測する)
Control Plane に AF_EGRESS_PROXY_ADDR を設定すると、すべてのワークスペースに http_proxy・https_proxy・no_proxy(と大文字の同じ名前)が渡ります。既定はオフです。
変数に従うプログラムは proxy を通りますが、変数を無視するプロセスはそのまま外へ出ます。
| 配備 | enforce が効くか |
|---|---|
AWS(ecs・ecs-ec2)で 00-network の EgressRoute=gateway |
効きます。ワークスペースのルートテーブルが egress ゲートウェイを通り、ほかの出口がありません |
| それ以外 | 縛れません。proxy だけを出口に残すネットワークやセキュリティグループの規則は、まだ用意していません。観測して許可リストを育てる段階まで使えます |
- egress ゲートウェイは新しく、テスト用の配備でだけ確かめています。本番ではまだ使っていません(デプロイ先を選ぶ)
- ゲートウェイの判定は、クライアントが送る名前(HTTP の Host、TLS の SNI)で行います。そのほかの制約は
SECURITY.mdにあります - Control Plane の内部アドレス(
AF_CP_INTERNAL_URL)は、docker・Kubernetes・ecs・ecs-ec2 で proxy の対象から外れます - ecs・ecs-ec2 では proxy がリンクローカル宛てを拒むので、タスクとインスタンスのメタデータのアドレス(
169.254.170.2・169.254.169.254)も対象から外れます
egress ゲートウェイが接続を記録する構成(AWS で EgressRoute=gateway)では、接続ごとにワークスペースと結び付けた記録も残ります。
画面に出るのはホストごとの件数だけで、接続ごとの記録は GET /api/admin/egress/events(super_admin)で読めます。
| 設定 | 効果 |
|---|---|
AF_EGRESS_EVENT_RETENTION_DAYS |
接続ごとの記録を残す日数。既定は 30 日で、0 にすると消しません。ホストごとの件数は残ります |
AF_EGRESS_ARCHIVE_URL |
消す前に、過ぎた日(UTC)ごとに保存する先。s3://bucket/prefix・gs://bucket/prefix・file:///dir のどれかで、既定は空(保存しない)です |
保存先の用意は形態ごとに違います。
- AWS: データスタックの
EgressArchiveパラメータを使います - GKE:
deploy/gcp/gkeのegress_archive = trueで非公開のバケットを作ります(既存のバケットならegress_archive_existing_bucket)。cp.envに入れる行は Terraform の出力egress_archive_envにあり、追記ではなく既存の行を置き換えます - Control Plane の Google サービスアカウントには、そのバケットだけに
roles/storage.objectCreatorとroles/storage.objectViewerを付けます。viewer がないと、書いた日を Control Plane が確かめられず、削除がその日で止まります - GKE のバケットの中身は、
egress_archive_retention_daysを指定しない限り期限切れになりません
- MCP と外部接続のサインインを運用する:MCP サーバーの登録と許可リストの関係
- MCP サーバーを全員に配る:テナント管理者の側
- デプロイ先を選ぶ:AWS の出口の経路
- ECS の手順書:egress ゲートウェイの設定
エージェント向け
この指示をエージェントに送ると、このページを読ませられます。
https://agent-fleet.org/docs/ja/operate/secure/egress/index.md を読んで