Skip to main content
Glama

agent-sandbox

AIコーディングエージェントが、実際のKubernetesクラスターに対して実際のインフラストラクチャコマンドを実行できるようにするためにこれを構築しました。ただし、常時有効な認証情報を保持することはなく、監視なしで何かを破壊することもできません。

3つのMCPツール。各呼び出しは、gVisorでサンドボックス化されたKubernetes Job内で実行され、その単一のアクションのためにVaultが発行する短命で狭いスコープの認証情報を使用します。破壊的な操作はすべて、人間の承認ゲートで停止します。

AI Agent (Claude Desktop / Cursor)
        │  MCP protocol (stdio)
        ▼
┌──────────────────────────────────────────┐
│  MCP Server            src/agent_sandbox │
│    3 tools -> guardrails -> broker ->    │
│    sandbox -> audit                      │
└───────┬──────────────────────┬───────────┘
        │                      │
        ▼                      ▼
┌────────────────┐   ┌──────────────────────────┐
│ Credential     │   │ Sandbox Runner           │
│ Broker (Vault) │   │ K8s Job + gVisor         │
│ 10-min leases  │   │ restricted PSS           │
│ per-action     │   │ default-deny NetworkPolicy│
│ scope          │   │ cpu/mem limits, deadline │
└────────────────┘   └──────────────────────────┘
        │                      │
        └──────────┬───────────┘
                   ▼
        ┌──────────────────────┐
        │ Guardrails + Approval│
        │ policy.yaml, SQLite, │
        │ agent-sandbox CLI    │
        └──────────────────────┘

なぜこれを構築したのか

私が使用していたAIツールが、本番インフラストラクチャに対して、稼働中のリソースの置き換えを強制するTerraformの変更を提案したことがありました。そのプランは一見普通に見えました。失敗の原因はモデルが間違っていたことではなく、もっともらしいプランと破壊的なapplyの間に何も介在していなかったことでした。

このプロジェクトを、欠けていたレイヤーとして、動作するコードで構築しました:

  • エージェントは再利用可能な認証情報を決して保持しない

  • すべてがホストに害を及ぼせない場所で実行される

  • 破壊的な変更は停止して人間を待つ

  • すべてのアクションが記録に残る

make demo は、私が遭遇したまさにそのシナリオを再現します。1行のラベル編集で実行中のDeploymentの置き換えが強制され、ゲートがそれを検出します。

Related MCP server: Emisar

クイックスタート

Docker、kindkubectlvaultterraform、Python 3.11+ が必要です。

brew install kind kubectl hashicorp/tap/vault terraform
make up      # ~5 minutes from cold: cluster, CNI, gVisor, Vault, image, verify
make demo    # the forces-replacement guardrail demo
make down    # tear it all down

make up は冪等です。最後に make verify を実行して終了します。これは分離の主張を 証明 するもので、単に主張するだけではありません(下記参照)。

エージェントをそれに向ける

cp examples/claude_desktop_config.json \
   ~/Library/Application\ Support/Claude/claude_desktop_config.json

Cursor: examples/cursor_mcp.json.cursor/mcp.json にコピーします。次に、エージェントに "demo-app のポッドステータスを確認" または "k8s-demo terraform をプラン" と依頼します。

3つのツール

ツール

リスク

動作

k8s_get_pod_status(namespace)

即座に実行。認証情報は1つのネームスペース内の get/list/watch pods にスコープされます。

terraform_plan(working_dir)

即座に実行。プランを保存し、後続のapplyがレビューされた差分を 正確に 実行するようにします。

terraform_apply(working_dir, approval_id?)

approval_id なし:プランを計算し、保留中の承認を記録し、何も適用しません。あり:承認を使用して保存されたプランを適用します。

4つのコンポーネント

1. サンドボックス実行 — src/agent_sandbox/sandbox.py

ツール呼び出しごとに使い捨てのJobを1つ作成します。すべての制御には特定の理由があります:

制御

防止するもの

runtimeClassName: gvisor

システムコールはgVisorセントリーに到達し、ホストカーネルには到達しない

PSS restricted、APIサーバーによって強制

root、権限昇格、ケーパビリティ、書き込み可能なrootfs

automountServiceAccountToken: false

サンドボックス内の任意の周囲のクラスターID

デフォルト拒否の NetworkPolicy + APIサーバー許可リスト

インターネットへの送信、横移動、メタデータエンドポイント

resources.limitsactiveDeadlineSeconds

暴走したジョブがノードを枯渇させたり、永久にハングしたりするのを防ぐ

backoffLimit: 0

失敗した破壊的なアクションが静かに再試行されるのを防ぐ

認証情報は ファイル としてマウントされ、環境変数としては決してマウントされません。環境変数は kubectl describe/proc、クラッシュダンプを通じて漏洩します。

2. 認証情報ブローカー — src/agent_sandbox/broker.py

cred = broker.issue_scoped_credential("k8s_get_pod_status")
# -> Vault mints a ServiceAccount + Role + RoleBinding, 10-minute lease
# -> revoked immediately after the Job finishes
  • エージェントは自分でスコープを選択できません。 スコープはアクションから導出されます。

  • デフォルトで拒否。 マッピングされたスコープがないアクションには認証情報が付与されません。

  • 爆発半径が強制されます。 ターゲット以外のネームスペースを要求すると拒否されます。

  • トークンはモジュールから決して出ません。 Credential.__repr__token=<redacted> を出力するため、偶発的なログでも漏洩しません。

これを手動で検証しました:pod-reader トークンは demo-app 内のポッドを一覧表示でき、kube-system では 拒否 され、シークレットでは 拒否 され、リースが失効した瞬間に動作を停止し、ServiceAccountを残しません。

3. ガードレール — policy/policy.yamlsrc/agent_sandbox/guardrails.py

デフォルトで拒否:MCPツールを登録するだけでは、呼び出し可能にはなりません。 ポリシーに存在しないツールは拒否されるため、機能を追加するには意図的なリスク層の決定が必要です。

承認は明らかな攻撃に対して強化されています:

  • 単回使用 — 1つのSQLiteトランザクション内で消費されるため、2つの同時applyが同じ承認を使用できません

  • パラメータバインド — 正確なツール+パラメータのハッシュにバインドされるため、k8s-demo の承認を prod-cluster に対して再生できません

  • 期限付き — デフォルトで30分

  • 帯域外 — 別のCLIプロセスを介して付与されます。承認するMCPツールはありません。エージェントには自分の要求を承認するコードパスがありません。

4. MCPサーバー — src/agent_sandbox/server.py

公式Python SDK(mcp 2.0、MCPServer)に基づいています。トランスポート層は意図的に薄く、それ自体には権限がありません。そこにバグがあっても、エージェントができることを広げることはできません。ポリシーとAPIサーバーのPod Securityアドミッションが実際の制御だからです。

監査ログ

すべての呼び出しは、相関されたイベントトレイルを var/audit.jsonl に出力します:

tool.request -> guardrail.decision -> credential.issued -> sandbox.started
   -> sandbox.completed -> credential.revoked -> tool.result
make audit
./.venv/bin/agent-sandbox audit --request-id req-4239b8bb5459 --json

認証情報の値は書き込み前に再帰的にスクラブされます。スコープ、リースID、TTLは保持されます。テストでは、JWT形式の文字列がログに到達しないことをアサートします。

検証済み、想定ではない

このプロジェクトには、主張 するのは簡単で、実際には持っていないことが2つあります。そのため、それらを信頼しませんでした。make verify は両方をライブクラスターに対してテストします:

== 1. gVisor kernel check ==
     kernel reported: Linux version 4.19.0-gvisor
  PASS: sandbox runs on the gVisor sentry kernel
== 2. NetworkPolicy egress enforcement check ==
  PASS: baseline connectivity works (got PONG)
  PASS: default-deny egress enforced (traffic blocked)

これは構築中に実際の問題を検出しました。 kindのデフォルトCNI(kindnet)は NetworkPolicy オブジェクトを受け入れ、静かに無視します。デフォルト拒否の送信ポリシーを適用しましたが、ポッド間トラフィックは依然として通過しました。サンドボックスはロックダウンされているように見えながら、完全なネットワークアクセスを持っていたでしょう。kindnetを無効にしてCalicoをインストールすることで修正しました。Calicoは実際に強制します。scripts/install-calico.sh を参照してください。

APIサーバーの許可リストに関連する罠にも遭遇しました:ClusterIP は機能しません。kube-proxyがCalicoが送信を評価する前に実際のエンドポイントにDNATするためです。症状は、ポリシー拒否イベントなしにサンドボックスがハングするだけでした。scripts/apply-sandbox-policy.sh に文書化されています。

正直な制限

  • gVisorは実行されますが、これは依然としてkindです。 kindノード(Docker DesktopのLinux VM内のコンテナ)に runsc をインストールし、アクティブであることを確認しました。これは本物のgVisorサンドボックスですが、本番用に強化されたノードではありません。

  • AWS/STSパスは条件付きです。 scripts/vault-setup.sh は、実際のAWS認証情報が存在する場合にのみVaultのAWSシークレットエンジンを設定します。存在しない場合はスキップされ、その旨が表示されます。デモを完全に見せるためにそのパスを偽装したくありませんでした。ライブで実証可能な 認証情報パスはKubernetesのもので、完全に本物です:動的ServiceAccount、実際のRBAC、実際のリース、実際の失効。

  • Vaultは開発モードで実行されます — インメモリ、ルートトークン root、シールなし。ローカルプロジェクトには問題ありませんが、そのままデプロイするものではありません。

  • 破壊的シグナル検出はプラン出力の文字列マッチングです。 これは人間のための 表面化 支援であり、セキュリティ境界ではありません。terraform_apply はすでに高リスク層であり、スキャンが何を見つけてもゲートされます。

  • シングルノードクラスター のため、Terraform状態を保持するPVCは1つのノード上の ReadWriteOnce です。

レイアウト

cluster/      kind config, RuntimeClass, namespaces, RBAC, network policy
images/       sandbox runner image (terraform + kubectl, providers vendored)
policy/       guardrail policy: risk tiers and destructive signals
scripts/      up/down, gVisor + Calico install, verification, demo
src/          the package: broker, sandbox, guardrails, approvals, audit, MCP
terraform/    demo module managed by the agent
tests/        56 unit tests + a real-stdio MCP integration check

テスト

make test       # 56 unit tests, no cluster required
make test-mcp   # drives the server over real MCP stdio (needs the stack up)
make verify     # proves gVisor + NetworkPolicy enforcement on the live cluster
F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to securely perform privileged actions like creating GitHub issues by minting short-lived, single-purpose tokens on demand, with policy enforcement and audit logging.
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Give AI agents Zero-Trust access to production infrastructure without the risks of granting them shell access. Actions are bounded by policy and an on-host runner.
    409
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding agents to evaluate actions against team-defined policies, record decisions, and obtain human approvals for potentially risky operations.
    165
    1
  • A
    license
    C
    quality
    B
    maintenance
    A policy-aware MCP server for GitHub and GitHub Actions that enables safe AI-assisted infrastructure workflows—inspecting repositories, preparing branches and pull requests, and constrained remote mutations behind explicit preview-bound approval tokens.
    18
    MIT

View all related MCP servers

Related MCP Connectors

  • Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.

  • Runtime permission, approval, and audit layer for AI agent tool execution.

  • The bridge from K2 agents through Wrangler to your master AI - safe, approval-gated Cloudflare ops.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mustafa12z/agent-mcp-sandbox'

If you have feedback or need assistance with the MCP directory API, please join our Discord server