EgressViewは、収集、SQLite、browser、REST、MCPのdomain logicを特定cloudから 分離します。AWS、他CSP、オンプレミスでも同じapplicationとDB schemaを使用します。 Load balancer、公開DNS、WAF、IdPはruntime必須要素ではなく、交換可能なdeployment adapterとして扱います。
| Profile | 公開範囲 | MCP transport | 認証 | TLS | IdP | 想定outbound |
|---|---|---|---|---|---|---|
local-stdio |
local process/private API | stdio | scoped EgressView API identity | stdioには不要。API経路を保護 | なし | private EgressView API、任意の内部DNS |
private-http |
LAN/VPN/private subnet限定 | HTTP | 専用MCP token + scoped API identity | loopback以外は必須 | なし | private EgressView API、任意の内部DNS |
private-oauth |
LAN/VPN/private subnet限定 | HTTP | OAuth/OIDC scope + scoped service identity | 必須。内部CAを利用可能 | 内部OIDC provider | 内部issuer/JWKS、EgressView API |
public-oauth |
審査済みproxy経由のInternet | HTTP | OAuth/OIDC scope + scoped service identity | public trust TLS必須 | OIDC provider | issuer/JWKS、EgressView API |
MCP processのEGRESSVIEW_DEPLOYMENT_PROFILEへ上記4値のいずれかを設定します。
未設定時は互換性のため、stdioをlocal-stdio、HTTP token modeを
private-http、HTTP OAuth modeをpublic-oauthと推定します。明示profileが
MCP_PORTまたはMCP_AUTH_MODEと矛盾する場合、MCP endpoint起動前に停止します。
Phase 1でprivate HTTPのcontrolを強制します。HTTPは既定で127.0.0.1へbind
します。非loopbackのMCP_BIND_ADDRESSは、deployment profileを明示し、かつ
MCP_ALLOW_NON_LOOPBACK=trueを設定した場合だけ許可します。名前解決によって
公開範囲が変わることを避けるためhostnameは拒否します。全HTTP profileで、
network.readとnotes.writeだけを持つ専用MCP_SERVICE_TOKEN、append-only
監査、rate・同時実行上限、body上限、request/API timeoutを使用します。
endpoint token、service identity、監査鍵、管理tokenは別々の値にします。
Application自体は平文HTTPを提供するため、非loopback経路はTLS reverse proxy または同等の信頼できるprivate transportと、firewall、security group、 network policyで保護します。bindの明示承認はnetworkの安全性を保証しません。 offline modeとfrontend assetのself-hostは、後述の必須portability gateで検証します。
内部CAを使う場合、保護したPEM trust bundleをNODE_EXTRA_CA_CERTSへ指定して
Nodeを起動し、各MCP clientのtrust storeにも同じCAを登録します。CA配布の代わりに
TLS certificate検証を無効化しません。
| Boundary | 主な脅威 | 必須control |
|---|---|---|
| Local stdio | 悪意あるlocal process、API identity漏洩 | OS account分離、mode 0600のclient設定、scoped identity、rotation |
| Private network | LAN侵害、token盗聴、意図しないroute公開 | loopback外のTLS、firewall/VPN、専用credential、最小権限、監査、rate/timeout上限 |
| Private OAuth | 内部IdP侵害、内部CA誤用、stale token | PKCE S256、issuer/audience/resource完全一致、内部CAの安全な配布、短命access token、refresh replay対策 |
| Public OAuth | Internet scan、credential replay、DoS、proxy迂回 | 公開gate、public TLS、OAuth、WAF/proxy上限、application direct ingress禁止、append-only監査、rollback |
| Offline runtime | CDN、enrichment、cloud AI、updateからの隠れたegress | asset同梱、outbound deny、local agent/model、egress遮断integration test |
Private networkも既定では信頼しません。private HTTPでbrowser管理tokenを流用せず、
平文LANへBearer tokenを送信しません。0.0.0.0へのbindはprivateである証拠に
ならないため、firewall、security group、network policy、proxy境界も検証します。
| 機能 | 現在のInternet依存 | Private代替 | Offline目標 |
|---|---|---|---|
| Router収集とSQLite | なし | 同じruntime | 対応 |
| MCP stdio/private HTTP | install後はなし | private API、任意の内部TLS | local MCP clientで対応 |
| Browser graph library/world map | runtime依存なし | self-host asset | 対応 |
| Reverse DNS | resolver依存 | 内部DNS | 任意 |
| RDAP、threat feed、OUI更新 | public service | 必要なら管理mirror | 状態を表示して無効化 |
| Browser OIDC | 現行の任意機能はGoogle | local管理者、将来の汎用内部OIDC | local管理者 |
| MCP OAuth | issuer依存でCSP非依存 | self-host OIDC + 内部CA | issuer/JWKSが全て内部ならprivate OAuth |
| AI Insights | Ollamaまたはcloud provider | Ollama/private互換endpoint | local modelのみ |
| Package更新 | install/upgrade時のnpm registry | 内部npm mirror | 署名済みsource bundle。lock済み依存のinstall後はoffline稼働 |
Claude CodeやGitHub Copilot等のcloud agentは、MCP endpointがprivateでもagent自身の Internet接続を必要とします。完全閉域ではMCP対応local agentとOllama等のlocal modelを使用します。
週末に予定しているAWS構成はpublic-oauth profileの実装であり、別editionでは
ありません。
www、mcp、authを管理同じapplicationをオンプレミスのreverse proxy・内部Keycloak、または他CSPの同等
serviceでも利用できます。AWS構築はMCP protocol/publication gate完了まで
publishDns=falseを維持します。
エアギャップ環境や外向き通信を遮断した環境では EGRESSVIEW_OFFLINE_MODE=true を設定します。有効化されるのは正確に true の場合だけです。綴り間違いで「隔離されているつもり」の状態が生まれないようにしています。
保証するのは「外向きリクエストを試行しない」ことであり、「失敗する」ことではありません。実行してタイムアウトさせる方式では、パケットは出てしまい、EgressViewの稼働が外部に伝わり、タイムアウト分だけ起動も遅れます。そのため各機能は、通信を行うモジュールが組み立てられる前に判定されます。クラウドプロバイダのSDK clientも生成しないので、認証情報の解決も接続の確立も発生しません。
RDAP、GeoIP、脅威フィード、WiresharkのOUIベンダーデータベース、手動脅威調査、Google OIDC、Anthropic / OpenAI / Bedrock の各AIプロバイダ。
ルーターのSSH収集、SQLiteの保存とmigration、Web UI、stdio および private HTTP のMCP。いずれも定義上ローカルで完結します。
| 機能 | 有効化する変数 |
|---|---|
| 内部DNS / PTR | EGRESSVIEW_INTERNAL_DNS |
| 自己ホストのOllama | EGRESSVIEW_OLLAMA_URL |
これらは隔離網の内部で到達可能な場合がありますが、loopbackまたはprivate IPの接続先を指定するまでは無効のままです。offline modeでは、DNSによって許可済み接続先が隔離網外へ向けられることを防ぐためhostnameを拒否します。MCPのprivate OAuthはMCP設定ガイドに記載したMCP OAuth設定で別途構成します。
通信先の組織名・国・座標が表示されず、脅威判定は既にキャッシュ済みの情報だけで行われ、未知のMACプレフィックスにはベンダー名が付きません。既存のキャッシュはそのまま利用でき、更新が止まるだけです。
起動ログに無効化した機能が列挙されます。GET /api/status も同じ状態を返すため、UIは空欄を放置せず「オフラインモードのため無効」と説明できます。
D3、TopoJSON、world atlasは固定版を同一オリジンから配信し、CSPは外部オリジンを一切許可しません。オフラインモードでのページ読み込みで外部リクエストは発生しません。
Install/upgradeとruntime隔離は別の境界です。署名付きportable source bundleは、 native依存を導入先OS/CPUへ合わせるため、一時的にnpm registryへ接続します。 署名付きdistribution guideを参照してください。 Install完了後、service起動前にoffline modeを有効化して外向き接続を遮断します。
各release candidateでnpm run test:portabilityを実行します。同じapplication
artifactを、外向きDNSと非loopback socketを拒否した状態で起動し、次を検証します。
CIではLinux hostと、--network noneで起動した汎用Debian containerの両方で
実行します。このcontainerをAWS外の基準runtimeとし、AWS credentialとmetadata
serviceを与えません。別audit fileを使った正の対照で、遮断したDNS試行が実際に
記録されることも必須にするため、検出器の配線漏れによる偽の0件では合格しません。
このgateはfirewallを開かず、DNSを公開せず、cloud infrastructureも作成しません。 また、運用環境の周辺networkがprivateであることまでは証明しないため、そこは deployment側のcontrolとして別途確認します。