---
title: "Agent Network Policies and Secrets, Now in Settings"
slug: "virtual-machine-settings-policies-and-secrets"
date: "2026-10-03"
tag: "Application"
summary: "The allowlists and secrets that govern what an agent's virtual machine can reach now have screens: an organization-wide Virtual Machine tab holding the Network Policies and Secrets tables, and a Network Access section on each agent's Sandbox tab that binds them — four egress profiles, up to 100 hosts per policy, and up to 20 secrets per agent."
author: "ibl.ai Engineering"
repo: "iblai/vibe"
linkedin: |
  The controls that decide what our agents' code can touch are no longer API-only — they have screens now.

  Agents on ibl.ai that run code do it in an isolated Linux VM with no network access at all by default. Opening that up has been possible since September. Until this week it meant calling the REST API.

  Two surfaces landed on October 2.

  Organization settings gets a Virtual Machine tab with two tables. Network Policies: reusable named lists of the exact host:port destinations a VM may reach, up to 100 per policy. Secrets: keys a VM can use but never read.

  And each agent's Sandbox tab gets a Network Access section — four egress profiles from No Network through Package Registries and Public Internet to a Custom Allowlist, the policy picker, and the secrets list.

  The secret design is the part worth studying. Inside the machine the environment variable holds a placeholder. The real value is substituted only on TLS requests to that secret's own allowed hosts — so the agent can call your API and still cannot print your key. A secret can also read one field of a saved integration credential, which means rotating it once updates every agent using it.

  Why this matters more than a UI nicety: a control an engineer has to script is a control most organizations never turn on. Moving it to a screen is what makes "deny by default" something a security team can actually operate.

  With ibl.ai you own all the code and the data — self-hosted in your own perimeter, model-agnostic across any LLM, with no per-seat pricing.

  #iblai #AgenticAI #EnterpriseAI #AgentSecurity #ZeroTrust #AIAgents
---

**ibl.ai agents that run code do it in an isolated Linux virtual machine with no network access by default, and the allowlists and keys that open it up now have their own screens — an organization-wide Virtual Machine settings tab and a Network Access section on every agent's Sandbox tab — on a platform where you own all the code and the data.**

The capability itself is not new. VM network policies, credential-backed secrets and runtime billing were documented on **September 23, 2026** and covered in [Agent Sandboxes: A Real Linux VM, Locked to Hosts You Allow](/updates/agent-sandbox-virtual-machines-network-policies).

What landed in `iblai/vibe` on **October 2** is the part an administrator can actually operate: both records, and the controls that bind them to an agent, as interfaces rather than REST calls.

## Where do you manage what an agent's VM can reach?

In organization settings, under a new **Virtual Machine** tab — "Manage the network policies and secrets available to agents' virtual machines." It holds two sub-tabs.

**Network Policies** are reusable, named lists of the `host:port` destinations a VM may reach, with **up to 100 entries each**. One policy is written once and reused across agents.

<a href="/images/updates/vm-network-policies-secrets-policies.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/vm-network-policies-secrets-policies.webp" alt="The Virtual Machine tab in ibl.ai organization settings, on the Network Policies sub-tab: an explanatory banner, a New Policy button, and a table with Name, Allowed Hosts, Description, Updated and Actions columns showing one demo policy named Acme APIs allowing a single host-and-port destination." width="1440" height="610" loading="lazy" decoding="async" style="display:block; max-width:1440px; width:100%; height:auto; margin:1.5rem auto;" /></a>

**Secrets** are keys a VM can use but never read. Both record types are organization-wide and shared by every agent, so the same allowlist does not get re-typed per agent.

<a href="/images/updates/vm-network-policies-secrets-secrets.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/vm-network-policies-secrets-secrets.webp" alt="The same Virtual Machine settings tab on the Secrets sub-tab, with a New Secret button and a table of Name, Variable, Allowed Hosts, Source, Updated and Actions, showing one demo secret called Acme API Key bound to the variable ACME_KEY, scoped to a single host, with a stored value." width="1440" height="610" loading="lazy" decoding="async" style="display:block; max-width:1440px; width:100%; height:auto; margin:1.5rem auto;" /></a>

## How do you limit one agent without limiting the rest?

On that agent's **Sandbox** tab. While Virtual Machine Shell is the selected sandbox kind, a **Network Access** section appears — "Decide what this agent's virtual machine can reach and which credentials it can use."

It opens with four egress profiles, in the order the screen lists them:

<table style="width:100%; border-collapse:collapse; margin:1.5rem 0; font-size:0.95rem;">
  <thead>
    <tr style="background:#f5f5f0; border-bottom:2px solid #2175C5;">
      <th style="text-align:left; padding:0.75rem; color:#5f6368;">Egress profile</th>
      <th style="text-align:left; padding:0.75rem; color:#5f6368;">What the VM gets</th>
    </tr>
  </thead>
  <tbody>
    <tr style="background:#f0f9ff; border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>No Network</strong> <span style="color:#5f6368;">(default)</span></td>
      <td style="padding:0.75rem;">The VM cannot reach anything</td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Package Registries</strong></td>
      <td style="padding:0.75rem;">PyPI, npm, apt and apk only, for installing packages</td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Public Internet</strong></td>
      <td style="padding:0.75rem;">Any public host; private networks, localhost and cloud metadata stay blocked</td>
    </tr>
    <tr style="border-bottom:1px solid #e5e7eb;">
      <td style="padding:0.75rem;"><strong>Custom Allowlist</strong></td>
      <td style="padding:0.75rem;">Only the hosts in the network policy you pick</td>
    </tr>
  </tbody>
</table>

Under **Custom Allowlist** a network policy is required, and the picker lists the hosts that policy allows directly beneath it.

**Create Policy** and **Edit Policy** open the policy dialog in place. **Manage Policies** — and **Manage Secrets** below it — open the whole organization surface in a popup, rather than navigating away mid-edit.

The **Secrets** list appears under Public Internet or Custom Allowlist, as a checkbox list capped at **20 per agent**.

<a href="/images/updates/vm-network-policies-secrets-agent-network-access.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/vm-network-policies-secrets-agent-network-access.webp" alt="The Network Access section of an ibl.ai agent's Sandbox tab with Custom Allowlist selected: the four egress profile options with descriptions, a Network Policy picker set to the demo policy Acme APIs with its allowed host listed beneath, Create Policy, Edit Policy and Manage Policies buttons, and a Secrets checkbox list showing one available secret." width="1440" height="1218" loading="lazy" decoding="async" style="display:block; max-width:1440px; width:100%; height:auto; margin:1.5rem auto;" /></a>

In that screenshot the secret is listed and available to tick, not yet bound — binding is the checkbox, and the panel's own note reads "Keys the VM can use but never read."

The section also refuses to let you save something incoherent, which is the part that makes a narrow policy survive contact with real editing.

Narrowing an agent to **No Network** or **Package Registries** while secrets are still bound raises an **Unbind Secrets?** dialog rather than silently dropping them.

If a bound secret needs a host the chosen policy does not allow, an amber panel lists each environment variable against its missing hosts, with a one-click **Add Hosts to {policy} and Save**.

And deleting a policy an agent still uses is refused outright — the dialog names the agents blocking it and hides the Delete button until they are moved off. So a secret can never open a path the policy does not.

## How does a secret stay usable but unreadable?

By never being readable from inside the machine. The environment variable holds a placeholder, and the real value is substituted only on TLS requests to that secret's own allowed hosts.

So an agent can call your API with your key and still cannot print it, log it, or send it somewhere else. The dialog states the consequence plainly: **"Only these hosts receive the real key, so keep it to the narrowest host that needs it."**

A secret takes its value from one of two sources, and the second is the one worth using:

<a href="/images/updates/vm-network-policies-secrets-new-secret.webp" target="_blank" rel="nofollow noopener noreferrer"><img src="/images/updates/vm-network-policies-secrets-new-secret.webp" alt="The New VM Secret dialog in ibl.ai, with empty placeholder fields for Name, Environment Variable and Allowed Hosts, a Value Source choice between Enter a Value (stored encrypted and never shown again) and Use an Integration Credential (reads one field of a saved credential and follows rotations automatically), and a Value field requiring at least 8 characters." width="1016" height="1392" loading="lazy" decoding="async" style="display:block; max-width:1016px; width:100%; height:auto; margin:1.5rem auto;" /></a>

**Enter a Value** stores the key encrypted, and the dialog is explicit that it is never shown again after saving.

**Use an Integration Credential** reads one field of a credential the organization already saved — and follows rotations automatically, so rotating once updates every agent that uses it.

The variable name accepts letters, digits and underscores and cannot start with a digit; a pasted value must be at least 8 characters, and a masked-looking value such as `sk-****` is refused outright.

The host rules are where deny-by-default stops being a slogan. Entries are `host:port` with no scheme, path or wildcard, and `localhost`, `metadata*`, `instance-data*` and the `.local`, `.internal` and `.localhost` suffixes are all refused, as are reserved IP ranges.

Policies may name an IP address; secrets may not. The environment variable cannot be renamed after creation, and no endpoint ever returns a stored value — the table shows only where it came from.

## Who can see and change these?

Only people granted it, and the two record types are governed separately. The organization tab needs list, write and delete permissions on both network policies and VM secrets. Organization admins hold them by default; ordinary users do not.

The agent-side pickers show on the two list permissions alone, and each hides independently if its list is refused. The save is checked separately, and binding a secret to an agent additionally needs the secret-write permission.

When both lists are forbidden, the organization tab renders a single permission notice instead of two empty tables.

## What does this change in practice?

It changes who can turn the control on.

Deny-by-default egress is only useful if somebody actually configures the exceptions, and a control that requires writing REST calls is one most organizations leave at its default forever — which, here, means agents that cannot reach anything.

Moving both records onto screens, with the bindings next to the agent they apply to, is what makes a narrow allowlist an ordinary administrative act rather than an engineering project.

The underlying runtime is unchanged and documented in the [agent sandbox update](/updates/agent-sandbox-virtual-machines-network-policies), including per-second VM billing.

Both surfaces are documented as skills in [`iblai/vibe`](https://github.com/iblai/vibe), read from the SDK source, so apps built with [Agentic Vibe](/product/agentic-vibe) pick them up as the published SDK catches up. [Agentic OS](/product/agentic-os) runs them today.

1.6M+ users across 400+ organizations run the platform this way, including NVIDIA, MIT, and Syracuse University.

## Want to see agent egress control on your own stack?

We can walk your security team through deny-by-default agent sandboxes, policies and secrets on infrastructure you own. [Book a 30-minute demo](https://cal.com/iblai/30min) or [talk to the ibl.ai team](/contact) — ibl.ai is family-owned and operated from New York, NY.
