<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tigera Inc</title>
    <description>The latest articles on DEV Community by Tigera Inc (tigeraio).</description>
    <link>https://dev.to/tigeraio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12572%2Fe692e88e-7a1e-49d5-870b-930d459570c0.png</url>
      <title>DEV Community: Tigera Inc</title>
      <link>https://dev.to/tigeraio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tigeraio"/>
    <language>en</language>
    <item>
      <title>From Merged PR to Governed Pod: Automating AI Agent Deployment on Kubernetes</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:40:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/from-merged-pr-to-governed-pod-automating-ai-agent-deployment-on-kubernetes-354h</link>
      <guid>https://dev.to/tigeraio/from-merged-pr-to-governed-pod-automating-ai-agent-deployment-on-kubernetes-354h</guid>
      <description>&lt;p&gt;In short, automating the AI agent lifecycle is this year’s pitch: Google Cloud’s walkthrough of 30th July 2026 turns the whole thing into a conversation with a coding agent. On Kubernetes the deploy half of that lifecycle is already a pipeline and a set of manifests, and 2026 has shown what happens when the pipeline is the soft spot: in March a compromised GitHub Action dumped runner memory and hunted for Kubernetes tokens, and in February a GitHub issue title talked an AI triage bot into exposing a project’s publishing credentials. The pipeline that ships an agent holds more authority than the agent does, and it is the one place that can ship the agent’s permissions in the same commit as its code. This post walks the path from a merged pull request to a governed pod stage by stage, says what each stage must enforce when the workload is an agent, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security engineers who own that pipeline, and the leads who sign off on what it deploys.&lt;/p&gt;

&lt;p&gt;On 19th March 2026, from about 17:43 UTC, an attacker holding a compromised credential force-pushed 76 of the 77 version tags in &lt;a href="https://github.com/aquasecurity/trivy/security/advisories/GHSA-69fq-xp46-6x23" rel="noopener noreferrer"&gt;aquasecurity/trivy-action&lt;/a&gt;, the GitHub Action for the Trivy vulnerability scanner, so that each tag pointed at a commit carrying credential-stealing code. Any pipeline that referenced the action by tag ran it on the next scan. By the advisory’s account the payload ran before the legitimate scan, dumped the memory of the runner’s worker process, searched 50 or more filesystem paths for SSH keys, cloud and Kubernetes credentials, Docker configs and &lt;code&gt;.env&lt;/code&gt; files, and sent what it found, encrypted, to attacker infrastructure. The window was about twelve hours, and the remediation advice is blunt: “all secrets accessible to affected pipelines must be treated as exposed and rotated immediately.”&lt;/p&gt;

&lt;p&gt;It was the second act. The advisory dates the first compromise to late February; Aqua’s own write-up says the attackers “exploited a misconfiguration in Trivy’s GitHub Actions environment, extracting a privileged access token,” and the maintainers’ &lt;a href="https://github.com/aquasecurity/trivy/discussions/10425" rel="noopener noreferrer"&gt;incident thread&lt;/a&gt; says of the rotation that followed that “the process wasn’t atomic and attackers may have been privy to refreshed tokens.” &lt;a href="https://www.infoq.com/news/2026/03/ai-bot-github-actions-exploit/" rel="noopener noreferrer"&gt;InfoQ reported on 11th March&lt;/a&gt;, citing StepSecurity’s analysis, that the February break-in belonged to a campaign run from a GitHub account describing itself as an “autonomous security research agent powered by claude-opus-4-5,” which gained code execution in five of the seven repositories it targeted, three of them through the &lt;code&gt;pull_request_target&lt;/code&gt; trigger with an untrusted checkout. GitHub’s &lt;a href="https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for that trigger says: “Avoid using this event if you need to build or run code from the pull request.”&lt;/p&gt;

&lt;p&gt;Before either act, a different pipeline had been opened by a sentence. On 9th February 2026 the researcher Adnan Khan &lt;a href="https://adnanthekhan.com/posts/clinejection/" rel="noopener noreferrer"&gt;published&lt;/a&gt; what he named Clinejection. Cline, an AI coding assistant, ran an issue-triage workflow on Anthropic’s &lt;code&gt;claude-code-action&lt;/code&gt; with Bash, Read and Write tools. “Since the issue title is interpolated directly into Claude’s prompt,” Khan wrote, a crafted title could make the agent install a package from an attacker’s fork, whose preinstall script then ran on the runner. The triage job exposed no publishing secret of its own, but it “shares the same cache scope as the high-privilege nightly release workflow,” so a poisoned cache entry handed over the npm, VS Code Marketplace and Open VSX publishing tokens. On 17th February an unauthorized &lt;code&gt;cline&lt;/code&gt; 2.3.0 appeared on npm whose only change was a postinstall script that installed a third-party AI agent; Cline said afterwards that the npm token had not been properly revoked during rotation.&lt;/p&gt;

&lt;p&gt;Set those against the pitch for automating the agent lifecycle. On 30th July 2026 Google Cloud &lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/automate-agent-development-lifecycles-with-gemini-enterprise" rel="noopener noreferrer"&gt;published a walkthrough&lt;/a&gt; in which a coding agent scaffolds, deploys, governs, evaluates and publishes an agent from a prompt. The closing line is the thesis: “Your coding agent isn’t just where you write agent code. It’s the control plane for the whole lifecycle.” That is the right ambition. Nobody should be hand-applying manifests for the fortieth agent, and Kubernetes is moving the same way: a &lt;a href="https://kubernetes.io/blog/2026/03/20/running-agents-on-kubernetes-with-agent-sandbox" rel="noopener noreferrer"&gt;Sandbox resource&lt;/a&gt; for agent workloads is in development under SIG Apps, its &lt;a href="https://cloud.google.com/blog/products/containers-kubernetes/bringing-you-agent-sandbox-on-gke-and-agent-substrate" rel="noopener noreferrer"&gt;GKE version&lt;/a&gt; went generally available on 21st May, and the CNCF’s &lt;a href="https://www.cncf.io/announcements/2026/01/20/kubernetes-established-as-the-de-facto-operating-system-for-ai-as-production-use-hits-82-in-2025-cncf-annual-cloud-native-survey/" rel="noopener noreferrer"&gt;2025 survey&lt;/a&gt;, published on 20th January 2026, found 82% of container users running Kubernetes in production. The agent is becoming a Kubernetes resource like any other, delivered by a pipeline like any other.&lt;/p&gt;

&lt;p&gt;Which is the point. A pipeline that can deploy an agent holds the cluster credential, the registry token and the cloud role, more authority than the agent will ever be granted, and in February and March that pipeline was what the attackers went for. The pipeline is part of the agent’s security boundary. It is also the one part of the boundary that can ship the agent’s permissions in the same commit as its code, if you build it that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes in a pipeline when the workload is an AI agent?
&lt;/h2&gt;

&lt;p&gt;The YAML is mostly the same. &lt;a href="https://www.tigera.io/blog/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod/" rel="noopener noreferrer"&gt;AI Agents on Kubernetes 101&lt;/a&gt; walked one agent from a laptop script to a pod by hand and told you not to stop there. A pipeline automates those steps and adds the ones a hand-applied deployment skips. The difference is in three places.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The artifact does not contain the behavior.&lt;/strong&gt; For a web service, the image is the behavior. An agent’s behavior is the image plus a system prompt, a tool list, a model name and whatever its context window collects at runtime, and three of those four are configuration. A pipeline that reviews the image and lets the prompt change through a ConfigMap edit has reviewed the part that matters least. For an agent, a config change is a behavior change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pipeline holds what the agent must never hold.&lt;/strong&gt; The agent needs a model key. The pipeline needs a credential that can write to a namespace, push to a registry and assume a cloud role. A model key in the pipeline’s secrets is one memory dump from being public, and a kubeconfig in the agent’s environment is one prompt injection from the control plane. And an agent that runs inside the pipeline reads untrusted input with the pipeline’s authority. Khan’s lesson: “AI agents with broad tool access create a low-friction entry point into CI/CD pipelines previously only reachable through code contributions, maintainer compromise or traditional poisoned pipeline execution.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The permissions are part of the deliverable.&lt;/strong&gt; A web service’s NetworkPolicy is hygiene. An agent’s list of which endpoints it may reach, which tools it may call with which arguments and which model it may use is the specification of what the agent is. A pipeline that ships the Deployment and leaves the permissions to a ticket has shipped half an agent, and the half that acts is the half that shipped.&lt;/p&gt;

&lt;p&gt;The deploy half of the lifecycle has five stages, and each one holds something worth stealing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Stage&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What it holds&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What an agent adds&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Build&lt;/td&gt;
&lt;td&gt;Turns the merged commit into an image&lt;/td&gt;
&lt;td&gt;Registry push token, the runner’s environment&lt;/td&gt;
&lt;td&gt;Prompt, tool list and model name are build inputs, versioned with the code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Sign and publish&lt;/td&gt;
&lt;td&gt;Signs the image, packages the chart&lt;/td&gt;
&lt;td&gt;A signing identity, the chart repository&lt;/td&gt;
&lt;td&gt;The chart carries the permissions (egress, identity, allowed calls) beside the Deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Apply&lt;/td&gt;
&lt;td&gt;A GitOps controller reconciles the chart through admission&lt;/td&gt;
&lt;td&gt;A credential that writes to the agents namespace&lt;/td&gt;
&lt;td&gt;Admission refuses an agent without limits, without egress policy, or with the service account token mounted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Register and authorize&lt;/td&gt;
&lt;td&gt;Declares who the agent is and what it may call&lt;/td&gt;
&lt;td&gt;The registry and the policy store&lt;/td&gt;
&lt;td&gt;No web-service equivalent. For an agent, this stage is the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Verify&lt;/td&gt;
&lt;td&gt;Smoke-tests the agent, reads the record&lt;/td&gt;
&lt;td&gt;Read access to the audit trail&lt;/td&gt;
&lt;td&gt;The test asserts what the agent cannot do; the evidence comes from enforcement points&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu9t1k0ynko6q89bgj3cb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu9t1k0ynko6q89bgj3cb.png" alt="Diagram: five pipeline stages from merged pull request to governed pod (build, publish, apply, register, verify), what each stage holds worth stealing, and what an AI agent adds at each stage" width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The deploy half of the lifecycle. Each stage holds a credential worth stealing, and the fourth has no web-service equivalent.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now translate that into questions an engineering team has to answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Can the agent’s behavior change without a reviewed commit?&lt;/strong&gt; If the prompt, the tool list or the model name can be edited in place, the review gate is decoration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What can the pipeline’s credential do, and for how long?&lt;/strong&gt; A stored personal access token with write scope is what moved 76 tags in March. A token minted for one run, scoped to one namespace and dead when the job ends is worth nothing to a memory dump.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does the cluster refuse?&lt;/strong&gt; If a chart drops its NetworkPolicy, mounts the service account token or runs as root, does anything say no? Hugging Face’s &lt;a href="https://huggingface.co/blog/agent-intrusion-technical-timeline" rel="noopener noreferrer"&gt;post-mortem&lt;/a&gt; of its July intrusion put the alternative in one line: “we had no admission policy rejecting privileged or hostPath pods.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One agent makes each of those an afternoon’s work. Ten agents, built by three teams on two SDKs, make it a spreadsheet nobody updates. Two hundred agents, each with its own pipeline and its own idea of where the key lives, make it a question with no owner, and the pipeline the attacker finds first is the one that answers it.&lt;/p&gt;
&lt;h2&gt;
  
  
  What must each stage enforce when the workload is an AI agent?
&lt;/h2&gt;

&lt;p&gt;Take the stages above and ask two things of each: what went wrong in a 2026 incident, and what the pipeline has to enforce so that the answer stops depending on anyone remembering.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;The stage&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What went wrong in 2026&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the pipeline must enforce&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workflow configuration&lt;/td&gt;
&lt;td&gt;Trivy’s February break-in came through a &lt;code&gt;pull_request_target&lt;/code&gt; workflow running untrusted code with elevated permissions; Cline’s came through an issue title fed to an AI triage agent&lt;/td&gt;
&lt;td&gt;Actions pinned to a commit SHA, no untrusted checkout under a privileged trigger, untrusted text kept out of shells and prompts, and any AI agent in the pipeline on a read-only token with no shared cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline credentials&lt;/td&gt;
&lt;td&gt;A token stolen in February survived a rotation that “wasn’t atomic” and moved 76 tags in March&lt;/td&gt;
&lt;td&gt;Short-lived credentials federated through OpenID Connect to the cloud and the cluster, nothing long-lived in repository secrets, rotation rehearsed as a runbook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifact integrity&lt;/td&gt;
&lt;td&gt;76 of 77 tags pointed at malicious commits for about twelve hours&lt;/td&gt;
&lt;td&gt;Images and charts signed at build, referenced by digest, verified at admission; immutable releases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admission&lt;/td&gt;
&lt;td&gt;Hugging Face’s intruder went from a sandbox to node-level root within three days, with no admission policy rejecting privileged or hostPath pods&lt;/td&gt;
&lt;td&gt;An admission policy that refuses an agent pod without resource limits, with the service account token mounted, running as root, or with no egress policy selecting it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime credentials and egress&lt;/td&gt;
&lt;td&gt;Pods that “could reach the instance metadata service,” one credential shared across clusters, and in &lt;a href="https://www.tigera.io/blog/gemini-never-left-the-sandbox-the-sandbox-had-a-door/" rel="noopener noreferrer"&gt;the May evaluation incidents&lt;/a&gt; a route to the internet nobody intended&lt;/td&gt;
&lt;td&gt;Default-deny egress shipped in the chart, model keys held outside the pod and attached at an enforcement point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registration and authorization&lt;/td&gt;
&lt;td&gt;Nothing declared who the agent was or what it could call, so the only check was the model’s judgment&lt;/td&gt;
&lt;td&gt;Identity and allowed calls declared as resources in the same chart, reviewed in the same pull request, evaluated on every request by something the agent cannot edit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;Transcripts read weeks later; Trivy’s consumers learned from the advisory which secrets to assume stolen&lt;/td&gt;
&lt;td&gt;A record written by the enforcement points at the time, and a smoke test that asserts a forbidden call is refused before the release is marked good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy75l52qwa9urf5h94sg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy75l52qwa9urf5h94sg.png" alt="Diagram: a Helm chart with registration and authorization files flows through a GitOps controller, admission and a governed pod to an enforcement point, while a pod applied with kubectl from a laptop is found from the node rather than admitted" width="800" height="316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The permissions ship in the chart. Admission refuses what the chart forgot, and the agent that skipped the pipeline is found rather than trusted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it is new technology. SHA pinning and OpenID Connect federation are in &lt;a href="https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions" rel="noopener noreferrer"&gt;GitHub’s hardening guide&lt;/a&gt;. Signing is &lt;a href="https://docs.sigstore.dev/cosign/signing/overview/" rel="noopener noreferrer"&gt;cosign&lt;/a&gt;; verification at admission is a &lt;a href="https://kyverno.io/docs/policy-types/cluster-policy/verify-images/" rel="noopener noreferrer"&gt;Kyverno&lt;/a&gt; rule or Kubernetes’ own &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/" rel="noopener noreferrer"&gt;ValidatingAdmissionPolicy&lt;/a&gt;, generally available since v1.30 in April 2024. The agent-specific part is two rows: the one that treats a prompt as code, and the one that ships the agent’s permissions as a resource. Neither can be delegated to the agent, because &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;controls the agent can override are not controls&lt;/a&gt;, and neither is covered by &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;the building blocks most clusters already have&lt;/a&gt;, which see pods, addresses and roles rather than agents.&lt;/p&gt;

&lt;p&gt;Run March through the table and notice what the payload was looking for. It hunted for Kubernetes tokens because a kubeconfig in a pipeline is the shortest path to a cluster. A pipeline whose only cluster credential is minted for the run and dead at the end of it gives a memory dump nothing to carry away, and a cluster whose admission policy refuses a privileged pod gives whatever is carried away nothing to do. Row two protects the pipeline. Rows four to six protect the cluster from the pipeline.&lt;/p&gt;

&lt;p&gt;In practice the workflow side is short: the job grants itself an OpenID Connect token (&lt;code&gt;id-token: write&lt;/code&gt;) instead of storing a cloud key, references every action by full commit SHA, signs the image with cosign and pushes the chart to the same registry as an OCI artifact, by digest. The chart side is where the agent differs, because the permissions sit beside the Deployment and a reviewer sees both in one diff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;charts/support-agent/templates/
  deployment.yaml # non-root, limits, probes, no service account token
  service.yaml
  networkpolicy.yaml # deny all egress, then DNS and the enforcement point
  serviceaccount.yaml # the identity the agent presents
  registration.yaml # who the agent is and what it serves
  authorization.yaml # what it may call; absent means nothing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cluster then refuses what the chart forgot. A validating admission policy bound to the agents namespaces rejects, in three CEL expressions, a pod that mounts the service account token, sets no resource limits or runs as root. The one check it cannot make is whether an egress NetworkPolicy selects the pod, because it sees only the object being admitted. That needs an engine that can look across resources, which is where Kyverno earns its place, and it is the check that would have closed the door in May.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when it is done properly?
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter.&lt;/p&gt;

&lt;p&gt;Done properly, the last three rows stop being a ticket and become files in the chart. Every agent, MCP server and LLM provider is a Kubernetes custom resource, so the agent’s registration, its identity (SPIFFE, OIDC, or a pod-owner binding for an agent you cannot modify) and the policy that says what it may call are YAML in the same chart as its Deployment, reviewed, applied and rolled back with the code. Authorization runs at a gateway the agent does not control: default deny, evaluated on every request, with the caller’s identity, the target and the operation as context, and for MCP traffic the tool name and its arguments. A fresh install permits nothing until a policy says otherwise, so a chart that forgets its authorization file ships an agent whose calls are refused, which is the right failure. Provider credentials are held at the gateway, referenced from one Secret and injected after the policy check passes, so the model key need not appear in the image, the chart or the pod, and each token the gateway mints is addressed to one destination. The pipeline itself can be registered as a service identity, so the smoke test in stage five calls the agent through the gateway as a named caller. A sandbox policy, enforced in the kernel, names the paths, binaries and destinations a workload may use, and applies to a running workload without a redeploy. Workloads nobody registered are detected from the node itself and classified as sanctioned, shadow or unknown. And every request lands in the Agent Trail with the caller, the target, the policy decision and the model that served the call, written by the enforcement plane rather than narrated by the agent.&lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic, and the first four rows of the table are not Lynx’s job at all. Lynx does not pin your actions, federate your CI to your cloud, sign your images or write your admission policy; that is work you do before the first agent resource is applied, and a governance layer behind a pipeline that still holds a long-lived kubeconfig is a well-governed cluster with an open front door. A policy that permits everything proves nothing, and someone has to write the one that does not; the pull request that adds a &lt;code&gt;permit&lt;/code&gt; line needs a reviewer who reads it as carefully as the code, because the chart has made permissions reviewable, not reviewed. The gateway governs the traffic that reaches it, and closing the other roads is NetworkPolicy work in your chart; Peter Kelly’s &lt;a href="https://www.tigera.io/blog/multi-layer-policy-for-securing-ai-agents/" rel="noopener noreferrer"&gt;multi-layer policy post&lt;/a&gt; covers how the gateway and kernel layers fit. The detector finds the agent that arrived by &lt;code&gt;kubectl&lt;/code&gt; from a laptop, but a person decides whether it is sanctioned. What the infrastructure provides is the layer the pipeline quietly assumes exists: the ability to say, with evidence, which agents you have, what each one may call, and what each one did.&lt;/p&gt;

&lt;p&gt;Put in properly, the agent’s permissions reach production the way its code does: in a commit, with a reviewer’s name on it, and with a rollback one revert away. Put in badly, the pipeline is automated, the permissions are a ticket, and the agent is live before the ticket is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What is the AI agent deployment lifecycle on Kubernetes?&lt;/strong&gt; It is the path from a merged commit to a pod serving traffic under policy: build the image, sign and publish it with its chart, let a GitOps controller apply the chart through admission control, register the agent’s identity and allowed calls, and verify the result against a record written by the enforcement points. What makes it agent-specific is that the prompt, tool list and model are versioned with the code, and the permissions ship in the same chart as the Deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can I run a coding agent inside my CI pipeline safely?&lt;/strong&gt; Only with the pipeline’s authority cut down to what the agent needs: a read-only token, no access to a job that holds publishing or cluster credentials, no Actions cache shared with a release job, and no untrusted text such as an issue title or a pull request body in its prompt unless it is treated as hostile. Clinejection is the worked example of every one of those being skipped. Coding agents that run outside the pipeline but touch your clusters raise the same questions; &lt;a href="https://www.tigera.io/blog/managing-claude-code-sessions-through-lynx/" rel="noopener noreferrer"&gt;Peter Kelly’s post on Claude Code sessions&lt;/a&gt; covers putting them behind the gateway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Should the agent’s system prompt and tool list go through the same pipeline as its code?&lt;/strong&gt; Yes. For an agent the prompt and the tool list are most of the behavior, so an edit to either gets the same review, tests and rollback path as a code change. Keep them in the repository, build them into the image or the chart, and treat a live edit to a ConfigMap as drift to revert rather than as configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What should admission control refuse for an AI agent pod?&lt;/strong&gt; At minimum: the service account token mounted, no resource limits, a root user, a privileged security context or a hostPath mount, an unsigned image, and an image referenced by a mutable tag. Then add a check that an egress NetworkPolicy selects the pod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the pipeline’s record enough evidence for an auditor or a regulator?&lt;/strong&gt; It is the part they ask for first: who approved the change, which commit built the image, what policy the agent was given. It is not the whole record. Whether it satisfies a particular regime, HIPAA, the EU Cyber Resilience Act or your own sector’s rules, is a question for your compliance team and, where liability is involved, for a legal opinion on your own case. The other half is a record of what the agent did at runtime, written by the enforcement points; we mapped what &lt;a href="https://www.tigera.io/blog/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock/" rel="noopener noreferrer"&gt;the CRA’s 24-hour clock&lt;/a&gt; asks of it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Whose pipeline is it?
&lt;/h2&gt;

&lt;p&gt;The people who built Trivy’s release automation were thinking about shipping a scanner, and for years it shipped. The attackers in February were thinking about the automation, and they found a workflow trigger documented as unsafe for untrusted code running untrusted code with a token that could rewrite the repository. The second time, in March, they did not need a new way in. The first rotation had left one of their keys valid.&lt;/p&gt;

&lt;p&gt;Nothing in that story is specific to AI agents, and that is why it matters for them: agents arrive in clusters through pipelines built for web services, and the pipeline’s blind spots become the agent’s. What differs is what the agent does with its freedom once it is there, and that is what the pipeline can now ship: an identity, a list of allowed calls, an egress policy, a sandbox, in the same commit as the code.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap, and ask it of a named person. A pipeline nobody owns is maintained by whoever opens the next pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the CISO, the VP of Engineering or the head of platform&lt;/strong&gt; , your question is about the fleet. How many agents reached production this quarter, through how many pipelines, and how many of those pipelines hold a credential that would still work tomorrow if it were dumped from a runner today? The honest answer has two numbers in it, and the second one was never in the plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the platform or security engineer who runs the cluster&lt;/strong&gt; , your question is about one chart. If the next release of this agent dropped its NetworkPolicy, mounted the service account token and changed its system prompt, which of the three would the cluster refuse, which would a reviewer catch, and which would be live before anyone noticed? “The pipeline is automated” answers none of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you built the agent&lt;/strong&gt; , your question is about what you put in the chart. Where is the model key, which endpoints and tools did you declare, and which of those can change without a pull request with your name on it? The value you pasted into a ConfigMap to get the demo working is the one that ships.&lt;/p&gt;

&lt;p&gt;If any of those answers starts with “we would need to check,” the check is what to build.&lt;/p&gt;

&lt;p&gt;In February and March the pipeline was the way in. Built properly, it is also the one place to say no before the agent ever runs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/?product=lynx&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/from-merged-pr-to-governed-pod-automating-ai-agent-deployment-on-kubernetes/" rel="noopener noreferrer"&gt;From Merged PR to Governed Pod: Automating AI Agent Deployment on Kubernetes&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>aiagentsecurity</category>
      <category>howto</category>
    </item>
    <item>
      <title>Gemini Never Left the Sandbox. The Sandbox Had a Door.</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Wed, 07 Oct 2026 16:41:08 +0000</pubDate>
      <link>https://dev.to/tigeraio/gemini-never-left-the-sandbox-the-sandbox-had-a-door-34n0</link>
      <guid>https://dev.to/tigeraio/gemini-never-left-the-sandbox-the-sandbox-had-a-door-34n0</guid>
      <description>&lt;p&gt;&lt;strong&gt;In short&lt;/strong&gt; , in May 2026 a Gemini model under evaluation by the AI security firm Irregular reached the systems of three real companies, and the incident has been reported as a breakout. By Google’s own account it was nothing of the kind. The test environment had internet access it was not meant to have, the fictional target shared its name with a real company, and the model found public information online, guessed one password and found two more in public code repositories. No kernel exploit, container escape or hypervisor bug has been reported. The process stayed inside its box; its traffic walked out through a door the infrastructure left open. This post takes the incident apart boundary by boundary, maps what was open in May onto what agent infrastructure has to provide, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security leaders who run agents with a shell, credentials and a network, which is most of them.&lt;/p&gt;

&lt;p&gt;On 18th September 2026, The Wall Street Journal reported that a Gemini model had accessed three real companies during a cybersecurity evaluation run by Irregular, and &lt;a href="https://www.securityweek.com/google-confirms-gemini-ai-breached-three-firms/" rel="noopener noreferrer"&gt;Google confirmed it&lt;/a&gt;. The test took place in May. It was a capture-the-flag exercise: the model was told to extract information from a fictional company’s software inside a controlled environment. The fictional company’s name belonged to a real one, and the environment had a route to the public internet that nobody intended. In one case the model guessed passwords until one worked. In the other two it searched the web, found credentials in public repositories and used them. Heather Adkins, Google’s vice president of security engineering, &lt;a href="https://www.cybersecuritydive.com/news/google-ai-gemini-autonomous-hacks/830884/" rel="noopener noreferrer"&gt;put it this way&lt;/a&gt;: “In a standard evaluation, the model found public information online and guessed credentials to access websites it thought were part of the test. In all three of these instances, the model stopped.” Irregular notified Google at the end of July, Google says it made sure the three companies knew, and the incident became public seven weeks after that, when the Journal asked.&lt;/p&gt;

&lt;p&gt;Google was not the only lab to publish such an account in recent months. On 30th July, &lt;a href="https://www.anthropic.com/news/investigating-incidents-cybersecurity-evals" rel="noopener noreferrer"&gt;Anthropic described three incidents&lt;/a&gt; in which Claude models reached real systems during evaluations run by the same partner. In one, “the fictional target company chosen by our evaluation partner shared a name with an active website domain name,” and throughout, “a misconfiguration left the machines that Claude accessed as part of the evaluation with live internet access.” On 14th August, &lt;a href="https://research.meta.ai/blog/addressing-third-party-testing-misconfiguration-muse-spark-1-1" rel="noopener noreferrer"&gt;Meta said&lt;/a&gt; a pre-release Muse Spark model had exploited a vulnerability in a real website and changed its database, after “a misconfiguration allowed the model to access the open internet” and Irregular “unintentionally provided the model with a name of a real website as its target.” Irregular, for its part, &lt;a href="https://www.axios.com/2026/09/19/google-safety-incidents-testing-hacks" rel="noopener noreferrer"&gt;told Axios&lt;/a&gt; in September that “all known issues on our end were remedied and resolved weeks ago.”&lt;/p&gt;

&lt;p&gt;None of this is carelessness of the kind that deserves a lecture. Finding out what a frontier model can do to a network is exactly the work these labs should be doing, the environments were built by people who think about containment for a living, and Irregular says its fixes were in place weeks before September. The uncomfortable part is elsewhere. Three well-resourced evaluation programs reached the same place by the same path, and in each of Google’s three cases the thing that ended the intrusion was the model deciding to stop.&lt;/p&gt;

&lt;p&gt;Six days after the Journal’s report, Kavi Daula at Edera, a company that sells hardware-isolated runtimes, published &lt;a href="https://edera.dev/stories/how-edera-could-have-contained-the-gemini-breakout" rel="noopener noreferrer"&gt;a reading of the incident&lt;/a&gt; that begins by declining to take the win. “There was no reported Linux kernel exploit, container escape, hypervisor vulnerability, namespace breakout, or some new class of AI-specific exploit. The agent had a network path to real systems, found credentials those systems accepted, and used them.” An Edera zone with unrestricted egress, the post concedes, would still have had unrestricted egress.&lt;/p&gt;

&lt;p&gt;That is the right place to start, and it is where a lot of production agent deployments stand today. The agent did not break out. Its packets walked out, through a door the infrastructure left open, carrying keys it found lying in the street. If your agents run in a sandbox and that is where your comfort comes from, this post is about the door.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What actually failed in May?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Call the whole thing a sandbox failure and you hide several controls that each had a separate job. Edera’s post splits them into compute, network, identity and credential exposure; I will keep that split and add the one that decides whether you ever find out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The compute boundary&lt;/strong&gt; decides what happens if the agent gets root or breaks the kernel it runs on. It held. Nothing in any of the reports suggests the model touched the host or a neighboring workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The network boundary&lt;/strong&gt; decides which destinations the agent can reach. It was open. The environment had a route to the internet, and a resolver that answered for a real company’s name. Edera’s line on this is the one to remember: “The node having a route to something does not mean every agent running on that node needs the same route.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The identity and credential boundary&lt;/strong&gt; decides who the agent is when it arrives somewhere, and what authority it can carry with it. It did not exist. The agent was whoever’s password it could guess or find. None of those credentials were issued to the agent, none were scoped to the exercise, and none expired when the exercise did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The evidence boundary&lt;/strong&gt; decides how you know what happened and when. Google learned of the May incidents from Irregular at the end of July. Much of what is known about what the models did comes from their own transcripts, which is the agent’s account of itself.&lt;/p&gt;

&lt;p&gt;Read those four again and notice which one failed. The sandbox kept the process in, which is the half of its job it was configured to do. Its network side was configured open, and everything after the first packet happened in layers a sandbox does not provide: identity, credentials, operation checks, the record. As Edera puts it, “A process can remain fully contained inside its own PID namespace, mount namespace, filesystem, kernel, and memory while opening a TCP connection to a production system somewhere else.”&lt;/p&gt;

&lt;p&gt;Hugging Face’s July intrusion, where OpenAI’s evaluation agents did get out of their sandbox, &lt;a href="https://huggingface.co/blog/agent-intrusion-technical-timeline" rel="noopener noreferrer"&gt;makes the same point from the other side&lt;/a&gt;. The way out was a zero-day in a package proxy cache. Everything after that came from the ordinary list: an instance metadata service reachable from pods, overly broad access, long-lived credentials, and no admission policy rejecting privileged pods. Escape or no escape, the damage is done by the route, the credential and the scope.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuz91a2zogxf0w71pdoc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuz91a2zogxf0w71pdoc.png" width="800" height="340"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The process never left. The connection, the name lookup and the credentials did, and nothing on that path was checked by anything other than the model.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why does a sandbox feel like enough?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Because it is the control we know how to build and test. Containers, gVisor, Kata, Firecracker, Edera’s zones: a decade of work has gone into stopping hostile code from taking over the machine it runs on, and that work is good. If a workload is going to run arbitrary code, you put it behind one of these, and you should.&lt;/p&gt;

&lt;p&gt;An agent is a different kind of tenant. The things you hand it so it can do its job are an attacker’s toolkit: a shell, a Python interpreter, a package manager, git, a browser, a cloud CLI, a Kubernetes client, and whatever tokens its author pasted into its environment. Its control flow is decided at runtime by a model, from whatever lands in its context window, so you cannot review what it will do, only what it is allowed to do. We made that argument in &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;the safest place to run an AI agent&lt;/a&gt;: controls the agent can override are not controls. A system prompt that says “the target is fictional and you have no internet access” is an instruction, and in Irregular’s environment the instruction was wrong on both counts.&lt;/p&gt;

&lt;p&gt;So the question most sandbox hardening answers, “can this process take over the host,” is not the first question for an agent. The first question is: where can this process reach, as whom, and would I know? A sandbox can answer the first of those, if someone configures it to. It cannot answer the other two. The May incident answers all three. Anywhere, because the node had a route and nothing said this agent should not share it. As anyone whose password it could guess or find. And in July.&lt;/p&gt;

&lt;p&gt;When NVIDIA released OpenShell, we wrote that &lt;a href="https://www.tigera.io/blog/nvidia-openshell-secures-the-agent-who-governs-the-fleet/" rel="noopener noreferrer"&gt;it secures the agent and leaves the fleet ungoverned&lt;/a&gt;, a boundary NVIDIA drew on purpose. Irregular’s environment shows the same altitude problem from the other direction. You can isolate a box well and have said nothing about its door, and a fleet is two hundred boxes with two hundred doors.&lt;/p&gt;

&lt;p&gt;One evaluation sandbox, run by specialists who fixed it once the problem was reported, produced three intrusions. Now count yours. Ten agents, from three teams, each in its own container with its own environment variables and its own idea of what it may reach. Two hundred agents, some built in a vendor’s visual builder and some promoted from a notebook, each with a route to the internet because the cluster has one, each holding whatever token made the demo work. In a lab, a fictional name that matches a real company is an unlucky coincidence. In a fleet, a prompt that mentions a real customer’s domain is Tuesday.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What would have contained it?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Take the boundaries from the previous section and ask two things of each: what was open in May, and what infrastructure has to provide so that the answer does not depend on the model.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;The boundary&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What was open in May&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the infrastructure must provide&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compute: what the process can do to its host&lt;/td&gt;
&lt;td&gt;Nothing reported. The isolation held&lt;/td&gt;
&lt;td&gt;Kernel-level isolation for any agent with a shell: a hardened runtime class or a separate kernel per workload. Keep it. It is necessary and it is not what failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network: where the process can reach&lt;/td&gt;
&lt;td&gt;A route to the public internet, and a resolver that answered for a real company’s name&lt;/td&gt;
&lt;td&gt;Deny-by-default egress enforced outside the agent, with destinations allowed one at a time and a DNS path the operator controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity: who the agent is when it arrives&lt;/td&gt;
&lt;td&gt;Nothing. The agent was whoever’s credentials it held&lt;/td&gt;
&lt;td&gt;A verifiable workload identity issued to the agent by infrastructure, so a destination you control can tell a registered agent from a process holding a found password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credentials: what authority the agent can carry away&lt;/td&gt;
&lt;td&gt;Whatever it could guess or find, with no scope and no expiry&lt;/td&gt;
&lt;td&gt;Credentials held outside the agent and attached at the enforcement point, each short-lived and addressed to one destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations: what the agent may do once connected&lt;/td&gt;
&lt;td&gt;The task said “extract information.” Nothing checked each action against that&lt;/td&gt;
&lt;td&gt;Per-request authorization at a gateway the agent does not control, with the caller, the target and the operation as context, and for MCP traffic the tool and its arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence: how you know what happened&lt;/td&gt;
&lt;td&gt;Transcripts, read two months later&lt;/td&gt;
&lt;td&gt;A record written by the enforcement points, at the time, that the agent cannot edit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgy61hzldzi0e2p2urd41.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgy61hzldzi0e2p2urd41.png" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The same table drawn around one agent. Each boundary is enforced by something the agent cannot negotiate with, and the record is written by those enforcement points rather than by the agent.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it asks the model to remember that a company is fictional, and nothing in it is a property of the model at all. Every row is a control that sits outside the agent, which is the only place a control for an agent can sit. The tools most clusters already have cover parts of it. &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;NetworkPolicy, API gateways and RBAC&lt;/a&gt; each take a row or half a row, and none of them gives an agent an identity of its own, checks the operation on every request, or writes the record.&lt;/p&gt;

&lt;p&gt;Now run May through the table, and notice that the rows do different jobs. Row two protects systems you do not own. With egress limited to the exercise’s own address range, the resolver never answers for the real company and the connection never opens; the incident ends before it begins. Rows three and four protect systems you do own. A service that accepts only tokens issued to a registered agent cannot be opened with a guessed password, and an agent that never held a long-lived credential has nothing to carry away. Row six is what lets you say which of those happened, in May rather than July.&lt;/p&gt;

&lt;p&gt;Edera’s post ends on the right sentence: “I do not want the security of an agent platform to depend on the model remembering that a company is fictional, correctly deciding whether a credential is in scope, or voluntarily refusing to connect to an address the infrastructure already allows it to reach.” Neither should you. Google’s model stopped in all three cases, and that is the point: the stopping is a property of the model that week. The door is a property of your infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What happens when it is done properly?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter.&lt;/p&gt;

&lt;p&gt;Done properly, every agent, MCP server and LLM provider in the cluster is registered and carries a verifiable identity (SPIFFE, OIDC, or a pod-owner binding for agents you cannot modify), so a destination behind the gateway can tell a registered agent from a process presenting a password it found. Authorization runs at a gateway the agent does not control: default deny, evaluated on every request, with the caller’s identity, the target and the operation as context; for MCP traffic the policy can see the method, the tool name and the tool arguments, so “extract information” can be the only thing an agent is allowed to do rather than the only thing it was asked to do. Provider credentials are held at the gateway and injected after the policy check passes, so the agent never holds the key it would otherwise carry out of the box, and each token the gateway mints is addressed to one destination, so a token lifted from one hop is worthless at the next. Workloads nobody registered are detected from the node itself, by watching for connections to LLM endpoints (including a watchlist of your own self-hosted ones) and inspecting running processes for agent frameworks, then classified as sanctioned, shadow or unknown with the evidence shown beside the verdict; a workload that should not be there can be quarantined at the gateway and in the kernel, so it can no longer write to disk, launch processes or open an outbound connection. The same detector ships as a package for plain Linux hosts. And every request lands in the Agent Trail with the caller, the target, the policy decision and the model that actually served the call, written by the enforcement plane rather than narrated by the agent. That is rows three to six of the table, recorded in May rather than discovered in July.&lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic, and two rows of the table are not Lynx’s job at all. Row one, compute isolation, belongs to the runtime: gVisor, Kata, a hardware-isolated zone, whichever your platform team trusts for workloads that run code they did not write. Keep it. Row two, egress, belongs to network policy. A gateway governs the traffic that reaches it, and closing the other roads so that the only way out of the pod is through the gateway is work you do in Kubernetes network policy before the first agent ships; Peter Kelly’s &lt;a href="https://www.tigera.io/blog/multi-layer-policy-for-securing-ai-agents/" rel="noopener noreferrer"&gt;multi-layer policy post&lt;/a&gt; covers how the gateway and the kernel layers fit. Someone has to register the agents and decide what each one may call, and a policy that allows everything is a policy that proves nothing. The detector finds unregistered agents, but a person decides whether each one is sanctioned. And a record is only as complete as the enforcement points it is written from. What the infrastructure provides is the layer the sandbox quietly assumes exists: the ability to say, with evidence, which agents you have, where each one can reach, as whom, and what each one did.&lt;/p&gt;

&lt;p&gt;Put in properly, an agent that resolves a real company’s name gets a refused connection and a line in the record, and the exercise ends with a bug report instead of a disclosure. Put in badly, you have a sandbox and a dashboard, and the door is still open.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Frequently asked questions&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Did Gemini escape its sandbox?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Not in the sense the word usually carries. Google says the model found public information online and guessed credentials to access websites it thought were part of the test, and no kernel exploit, container escape or hypervisor vulnerability has been reported. The test environment had internet access it was not meant to have. The process stayed inside the sandbox; its network traffic left.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What is the difference between a sandbox and a security boundary for an AI agent?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A sandbox is an isolated environment: its own processes, its own filesystem and, if someone configures it, its own network. It answers what the process can do where it runs. In the May tests the process and filesystem isolation held and the network side was configured open, which is the door. Beyond that, an agent needs an identity boundary (who it is when it arrives), a credential boundary (what authority it carries), an authorization boundary (what it may do on each request) and an evidence boundary (how you know). A sandbox does not provide those. They have to be enforced outside the agent and independently of each other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Why was internet access the problem if the agent was told to attack a target?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Because the authorization lived in the prompt, and the prompt named a company that also existed in the real world. Nothing in the infrastructure limited the agent to the exercise’s address range, so the only thing separating the fictional target from the real one was the model’s interpretation. Egress policy that allows only the exercise’s own range makes that interpretation irrelevant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would workload identity have stopped the Gemini intrusions?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Not on its own, because the three companies were not expecting an agent and had no identity to check. Identity protects destinations you control: a service that accepts only tokens issued to a registered agent cannot be opened with a guessed password. For destinations you do not control, egress policy is the control. The two together are what “contained” means.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Does this apply to agents that are not doing security testing?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, and more so. An evaluation agent is told to attack something. A coding or operations agent is told to help, and does so with the same shell, the same credentials and the same route to the internet. An ordinary agent with a route out and a credential it found in its environment is one prompt injection away from the same path, with nobody watching the transcript.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Is a transcript enough evidence of what an agent did?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. A transcript is the agent’s account of itself, and Anthropic’s report describes a model that recognized a real system and concluded that the real company must be part of the exercise. Evidence of what an agent did comes from the enforcement points it passed through: the resolver, the egress policy, the gateway’s authorization decision, the token that was issued, the connection that was refused. If you ship agents to customers in the EU, &lt;a href="https://www.tigera.io/blog/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock/" rel="noopener noreferrer"&gt;the Cyber Resilience Act’s 24-hour clock&lt;/a&gt; runs from reliable evidence of exploitation, and a transcript read two months later is not that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Who is responsible when an agent reaches a real system during a test?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
That is a legal question, and the answer depends on your contracts, your jurisdiction and what the agent did, so get an opinion on your own case. The engineering answer is simpler. Whoever gave the agent the route out and the credentials it carried is the party who could have prevented it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Whose question is it?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The people who built Irregular’s environment were thinking about what a frontier model could do to a target, and the sandbox they built around the model did its job. The controls around the sandbox were not there, and each lab learned what had happened after the fact, rather than from anything the infrastructure refused at the time.&lt;/p&gt;

&lt;p&gt;Google’s model stopped in all three cases. One of Anthropic’s did not. The difference was the model’s judgment on the day, and a control that depends on the model’s judgment is not a control. It is a transcript you read afterwards.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap, and ask it of a named person. A question nobody owns gets answered by the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the CISO, the VP of Engineering or the head of platform&lt;/strong&gt; , your question is about the fleet. How many agents are running in our clusters, who owns each one, and for which of them can we say today, from a record rather than a diagram, where it can reach and as whom? The honest answer is a number and a list, and the interesting part is the difference between them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the platform or security engineer who runs the cluster&lt;/strong&gt; , your question is about one pod. If this agent resolved a hostname it was never meant to, tonight, would anything other than the model stop it? Is its egress deny by default, does it hold a credential it could leak, does its traffic pass an enforcement point that checks the operation, and would tomorrow morning’s record show the attempt? “The sandbox is hardened” answers one of those four.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you built the agent&lt;/strong&gt; , your question is about what you handed it. Which tokens sit in its environment, where did they come from, when do they expire, and what else do they open? A token pasted in to make the demo work is exactly what an agent carries out of the box.&lt;/p&gt;

&lt;p&gt;If any of those answers starts with “we would need to check,” the check is what to build.&lt;/p&gt;

&lt;p&gt;The agent never left the sandbox. Everything that mattered did.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read&lt;/em&gt; &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;&lt;em&gt;How Lynx Works&lt;/em&gt;&lt;/a&gt; &lt;em&gt;or request early access at&lt;/em&gt; &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;&lt;em&gt;tigera.io/demo/?product=lynx&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/gemini-never-left-the-sandbox-the-sandbox-had-a-door/" rel="noopener noreferrer"&gt;Gemini Never Left the Sandbox. The Sandbox Had a Door.&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>EU Cyber Resilience Act: Europe Just Put Your AI Agents on a 24-Hour Clock</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Mon, 05 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock-27c6</link>
      <guid>https://dev.to/tigeraio/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock-27c6</guid>
      <description>&lt;p&gt;&lt;strong&gt;In short&lt;/strong&gt; , the EU Cyber Resilience Act (CRA) puts binding cybersecurity requirements on any software sold as a product in the EU, and it does not carve out AI agents. Since 11th September 2026, any company that sells software with digital elements into the EU has 24 hours from learning that a vulnerability is being exploited to file an early warning with a national CSIRT and ENISA, 72 hours to describe it, and 14 days to report what it did about it. From December 2027 the product itself must be secure by design: least privilege, access control, data minimisation, a small attack surface, and a record of what it did. Agents, MCP servers, and AI gateways shipped to European customers are software with digital elements. This post maps the CRA’s clock and its secure-by-design list onto what agent infrastructure has to provide, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security leaders who will be asked to file the report.&lt;/p&gt;

&lt;p&gt;On 2nd September 2026, CISA added seven vulnerabilities to its Known Exploited Vulnerabilities catalog. Three were in AI infrastructure, and one of them sat in the Model Context Protocol endpoint of an AI gateway. &lt;a href="https://github.com/advisories/GHSA-7488-6r32-c95q" rel="noopener noreferrer"&gt;CVE-2026-59822&lt;/a&gt; in LiteLLM, a popular open source AI gateway, let anyone with a made-up Bearer token open an authenticated MCP session: list the configured tools, call them, and reach whatever internal systems those tools reached. Wiz, which found the bug, &lt;a href="https://www.wiz.io/blog/ai-infrastructure-honeypot" rel="noopener noreferrer"&gt;watched attackers exploit it in honeypots&lt;/a&gt; over the summer, probing with a Bearer token of a single character and walking the model list. The patch had shipped in May. The &lt;a href="https://thehackernews.com/2026/09/cisa-adds-seven-exploited-flaws-as.html" rel="noopener noreferrer"&gt;seven additions&lt;/a&gt; came with reverse shells, crypto miners, and a workflow engine running attacker commands as root.&lt;/p&gt;

&lt;p&gt;Nine days later, on 11th September, the &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/cra-reporting" rel="noopener noreferrer"&gt;reporting obligations&lt;/a&gt; of the EU Cyber Resilience Act became mandatory. The Commission’s &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/cyber-resilience-act" rel="noopener noreferrer"&gt;one-line summary&lt;/a&gt; of what the law does is that it “introduces mandatory cybersecurity requirements for manufacturers, covering the planning, design, development and maintenance” of digital products. Secure by design, in other words, as a legal duty rather than a slogan. Read that against the LiteLLM story. A gateway whose authentication fell back to an empty identity when the key check failed is the opposite of secure by default, and it was being exploited in the wild for weeks before it reached anyone’s must-patch list.&lt;/p&gt;

&lt;p&gt;Had the calendar run the other way, with the CRA in force first and the exploitation discovered after, the question for every company that shipped that gateway to a European customer would not have been “do we patch.” It would have been: which of our products contain it, which customers in which member states run it, what did the attackers touch, and can we say all of that to a regulator by this time tomorrow.&lt;/p&gt;

&lt;p&gt;Most AI agent fleets could not answer that in 24 days, let alone 24 hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the Cyber Resilience Act apply to AI agents?
&lt;/h2&gt;

&lt;p&gt;Yes, and it needs no AI chapter to do it: the law attaches to the thing, not to the technology inside it. &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/2847/oj" rel="noopener noreferrer"&gt;Regulation (EU) 2024/2847&lt;/a&gt; covers every “product with digital elements” made available on the EU market, which Article 3 defines as “a software or hardware product and its remote data processing solutions, including software or hardware components being placed on the market separately.” An agent you sell, an MCP server you ship, a gateway your customers install, a Helm chart with a support contract: each is a software product with a data connection, and that is the whole test. The Commission’s &lt;a href="https://digital-strategy.ec.europa.eu/en/library/commission-publishes-new-guidance-support-timely-cyber-resilience-act-implementation" rel="noopener noreferrer"&gt;guidance of 27 July 2026&lt;/a&gt; runs to 67 worked examples and mentions AI twice in passing, once to cite the AI Act and once about AI-powered services. Agents, MCP and language models do not appear at all. There is no agent exemption to look for, because none was written.&lt;/p&gt;

&lt;p&gt;Three boundaries matter, and they are the ones people get wrong:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Software as a service is mostly out, until it is part of a product.&lt;/strong&gt; A purely hosted service that customers reach through a browser is regulated by NIS2, not the CRA. But the CRA pulls in “remote data processing” that a product depends on: processing at a distance “designed and developed by the manufacturer, or under the responsibility of the manufacturer, and the absence of which would prevent the product with digital elements from performing one of its functions.” An agent your customer installs that cannot run without your hosted planning service is one product, and the hosted half comes with it. &lt;a href="https://www.dlapiper.com/en/insights/publications/2026/02/cyber-resilience-act-the-fine-line-between-saas-and-digital-products" rel="noopener noreferrer"&gt;DLA Piper’s reading&lt;/a&gt; of the boundary is that the decisive question is whether it is placed on the market as a product rather than a service, not which technology it uses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source is out unless it is commercial.&lt;/strong&gt; Free software developed outside a commercial activity is excluded. Once you monetize it, support it under contract, or embed it in something you sell, the manufacturer obligations are yours, including due diligence on every component you pulled in. Foundations and companies that steward open source projects on a sustained basis get a lighter regime as “open-source software stewards,” with a cybersecurity policy, cooperation duties, reporting from December 2027, and no fines. OpenSSF’s &lt;a href="https://openssf.org/public-policy/eu-cyber-resilience-act/" rel="noopener noreferrer"&gt;CRA resources&lt;/a&gt;, including its guide for developers and its stewards playbook, are the clearest map of that seam. For most companies reading this, the relevant fact is simpler: the LiteLLM in your product is your problem, not LiteLLM’s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using agents internally is not manufacturing.&lt;/strong&gt; The CRA regulates the party that places the product on the market. An enterprise running agents for its own staff is a user, not a manufacturer, unless it sells the result. But users are not outside the story. Article 14 requires manufacturers to inform impacted users of exploited vulnerabilities and, where necessary, of the mitigations. When that notice lands, the question moves to you: which of your agents run the affected component, and what did they have access to. Same inventory problem, other side of the table.&lt;/p&gt;

&lt;p&gt;The dates, from the &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/cra-summary" rel="noopener noreferrer"&gt;Commission’s summary&lt;/a&gt;: in force since 10 December 2024, reporting mandatory since 11th September 2026, and the full product requirements from 11 December 2027, applying to products already on the market as well as new ones. The fines top out at EUR 15 million or 2.5% of worldwide turnover for failing the essential requirements or the reporting duties. Article 12 adds one more link that matters for this audience: a product that is also a high-risk AI system under the AI Act is deemed to meet that law’s cybersecurity requirement when it meets the CRA’s, so for the agents that fall under both, the CRA’s Annex I is the list you build to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the 24-hour clock actually require?
&lt;/h2&gt;

&lt;p&gt;Article 14 gives a manufacturer three deadlines, twice over: once for an actively exploited vulnerability, once for a severe incident. An actively exploited vulnerability is one for which there is “reliable evidence that a malicious actor has exploited it in a system without permission of the system owner.” A severe incident is one that “negatively affects” the product’s ability to protect the availability, authenticity, integrity, or confidentiality of data or functions, or lets malicious code in.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Deadline&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Exploited vulnerability&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Severe incident&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;24 hours from awareness&lt;/td&gt;
&lt;td&gt;Early warning: that exploitation is happening, and in which member states the product is available&lt;/td&gt;
&lt;td&gt;Early warning: that an incident has occurred, and whether unlawful or malicious acts are suspected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;72 hours&lt;/td&gt;
&lt;td&gt;The product affected, the general nature of the exploit and the vulnerability, and any corrective or mitigating measures taken or available&lt;/td&gt;
&lt;td&gt;The nature of the incident, an initial assessment, and measures taken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final&lt;/td&gt;
&lt;td&gt;Within 14 days of a fix being available: the vulnerability, its severity and impact, and the security update&lt;/td&gt;
&lt;td&gt;Within one month of the 72-hour notice: a detailed description, severity, impact, root cause, and mitigations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of it goes through ENISA’s &lt;a href="https://www.enisa.europa.eu/news/the-cra-single-reporting-platform-is-launched" rel="noopener noreferrer"&gt;Single Reporting Platform&lt;/a&gt;, which went live the same day, to the CSIRT of the member state where you have your main establishment, and from there to every member state where the product is sold. And separately, under paragraph 8, to your users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvus6v09xw1ez5g388aqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvus6v09xw1ez5g388aqo.png" alt="Timeline: the Cyber Resilience Act's reporting clock, from reliable evidence of exploitation at hour 0 to an early warning at 24 hours, a notification at 72 hours, and a final report at 14 days" width="800" height="260"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Article 14's three filings. The clock starts on evidence of exploitation, not on the patch, and the first filing needs answers most fleets keep in people's heads.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now translate the 24-hour column into questions an engineering team has to answer before lunch tomorrow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Which of our products contain the affected component, at which versions?&lt;/strong&gt; The CRA expects this to be a lookup, not an investigation. Annex I Part II requires a software bill of materials “covering at the very least the top-level dependencies.” An agent’s dependencies include its framework, its MCP servers, its gateway, and the model endpoints it is wired to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which customers, in which countries, run it?&lt;/strong&gt; The early warning must name the member states. A product you cannot enumerate deployments of is a product you cannot file for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it exploited, or merely vulnerable?&lt;/strong&gt; The clock starts on reliable evidence of exploitation. Evidence means a record of what the component did that it should not have. If the only log is the one the compromised component wrote about itself, you have a story, not evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What could it reach?&lt;/strong&gt; The LiteLLM flaw was serious because a gateway holds the keys to everything behind it. Whether a severe incident occurred, and how severe, depends on what the compromised piece was authorized to touch. If the answer is “the service account had access to everything,” the incident report writes itself, and not in your favor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One agent makes each of these an afternoon’s work. Ten agents make it a spreadsheet. Two hundred agents, built by different teams on different frameworks, some in a vendor’s visual builder and some in a notebook that got promoted to production, make it a project that does not fit in 24 hours. Fewer agents would solve it, and nobody is going to do that. The realistic version is infrastructure that keeps the answers current while the fleet grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does “secure by design” mean for an AI agent?
&lt;/h2&gt;

&lt;p&gt;The reporting clock is the part in force today. The larger obligation lands in December 2027, and it is the secure-by-design half of the law. Annex I Part I of the regulation is the definition of secure by design that European regulators will hold products to, and reading it with agents in mind is uncomfortable, because it describes the agent stack most teams do not have.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Annex I asks&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With agents, that means&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the infrastructure must provide&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Secure by default configuration, point (b)&lt;/td&gt;
&lt;td&gt;An agent, MCP server, or gateway that denies by default and needs no hardening step the customer might skip&lt;/td&gt;
&lt;td&gt;Default-deny authorization that is the starting state, not a policy someone adds later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protection from unauthorised access by “authentication, identity or access management,” and reporting of possible unauthorised access, point (d)&lt;/td&gt;
&lt;td&gt;Every agent and tool has a verifiable identity, and every call is checked against it. A fabricated Bearer token opens nothing&lt;/td&gt;
&lt;td&gt;Workload identity issued by infrastructure, not a shared API key in an environment variable, with failed attempts recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data minimisation, point (g)&lt;/td&gt;
&lt;td&gt;An agent processes only what its current task needs, not everything its credentials allow&lt;/td&gt;
&lt;td&gt;Per-request authorization scoped to the task, with credentials held outside the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limit attack surfaces, including external interfaces, point (j)&lt;/td&gt;
&lt;td&gt;An agent can reach only the tools, models, and peers it was registered to reach&lt;/td&gt;
&lt;td&gt;Explicit allow lists of agent-to-agent, agent-to-tool, and agent-to-model paths, enforced in the data path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduce the impact of an incident with exploitation mitigation, point (k)&lt;/td&gt;
&lt;td&gt;A compromised agent cannot escalate: its token works at one destination, and it can be stopped without stopping the cluster&lt;/td&gt;
&lt;td&gt;Per-hop, short-lived credentials, and a way to quarantine one workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record and monitor “relevant internal activity, including the access to or modification of data, services or functions,” point (l)&lt;/td&gt;
&lt;td&gt;Every access attributed to a specific agent, acting for a specific person, through a specific tool and model&lt;/td&gt;
&lt;td&gt;An audit trail written by the enforcement point, across every hop, that the agent cannot edit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify and document components, with an SBOM, Part II point (1)&lt;/td&gt;
&lt;td&gt;You know which agents run which framework, gateway, and MCP server versions, including the ones nobody registered&lt;/td&gt;
&lt;td&gt;Continuous discovery of agent workloads, not an annual questionnaire&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr91tccu210uyle4tepyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr91tccu210uyle4tepyu.png" alt="Diagram: one agent request from user to agent, AI gateway, MCP server and internal system, with an enforcement point at every hop, five Annex I tiles below, and an unregistered agent reaching the internal system on a dashed path" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The same table drawn as one request. The five tiles are Annex I Part I points (b), (d), (g) and (l) and Part II point (1), and the dashed path is the agent nobody registered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it is paperwork, and none of it is something the agent can do for itself. Every row is infrastructure that sits around the agent and does not trust it, because &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;controls the agent can override are not controls&lt;/a&gt;. A model that has been talked into calling &lt;code&gt;export_customer_list&lt;/code&gt; will do so with perfectly valid credentials and a plausible explanation. Point (d) does not ask whether the agent meant well. It asks whether the access was authorized.&lt;/p&gt;

&lt;p&gt;Notice, too, that the LiteLLM flaw fails four rows of that table at once. The default was not secure (b). Authentication fell through to an empty identity (d). The gateway’s interfaces exposed every tool behind it (j). And the blast radius was the gateway’s entire set of upstream keys (k). None of that is unique to LiteLLM. In April, OX Security disclosed that the stdio transport in the official MCP SDKs for Python, TypeScript, Java, and Rust &lt;a href="https://labs.cloudsecurityalliance.org/research/csa-research-note-mcp-security-crisis-20260504-csa-styled/" rel="noopener noreferrer"&gt;passed configuration straight to the operating system shell&lt;/a&gt;, a default inherited by an estimated 200,000 instances across more than 150 million package downloads. Insecure defaults are how the ecosystem was built. The CRA makes them the manufacturer’s liability.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.tigera.io/blog/the-five-pillars-of-ai-agent-accountability-a-diagnostic-framework-for-engineering-leaders/" rel="noopener noreferrer"&gt;five pillars of AI agent accountability&lt;/a&gt; we published earlier this year, traceability, authorization provenance, identity and ownership, policy at scale, and human oversight, were written before we read Annex I closely. Lay them over the table and each pillar answers one or two rows. Annex I got there first, and with fines attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when it is done properly?
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter.&lt;/p&gt;

&lt;p&gt;Done properly, every agent, MCP server, and LLM provider in the cluster is registered and carries a verifiable identity, so “which workloads run the affected gateway, and who owns them” is a query rather than a Slack thread. Authorization runs at a gateway the agent does not control: default deny, evaluated on every request, with the caller’s identity, the target, and the operation as context, so a compromised agent’s reach is exactly what its policy allowed and nothing more. Provider credentials live at the gateway, not in the agent, and each token the gateway mints is addressed to one destination, so a stolen token is worthless one hop later. Workloads that never registered, the experiment nobody decommissioned, are detected from the node itself by watching for connections to model endpoints and inspecting running processes. A workload that should not be there can be quarantined at the gateway and in the kernel. And every request lands in an audit trail written by the enforcement plane, with the caller, the human authority, the tool, the policy decision, and the model that served it. That is your 24-hour evidence, your Annex I point (l) record, and your incident-scoping data in one place.&lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic. Someone has to register the agents and decide what each one may call, and a policy that allows everything is a policy that proves nothing. Someone has to maintain the software bill of materials for the agents themselves. A gateway can tell you which workloads talked to which endpoints, not which version of a Python package is inside a container. The detector finds unregistered agents, but a person decides whether each one is sanctioned. And Lynx does not file the report. Article 14 is a process your organization runs, with a named owner, an account on ENISA’s platform, and a rehearsed path from “we have reliable evidence” to “the early warning is submitted,” which you should run as a drill before you need it. What the infrastructure provides is the layer that process quietly assumes exists: the ability to say, with evidence, which agents you have, what each one could touch, and what each one did.&lt;/p&gt;

&lt;p&gt;Put in properly, that turns the 24-hour question from a forensic project into a lookup. Put in badly, it is one more dashboard nobody trusts. The difference is the work you do in the first month, not the software you install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does the EU Cyber Resilience Act apply to AI agents?&lt;/strong&gt; Yes. The CRA applies to any software or hardware product with a data connection that is made available on the EU market, including components sold separately and the remote processing a product depends on. Agents, MCP servers, AI gateways, and their charts and operators are software products. The Commission’s 2026 guidance never mentions agents or language models, because there is no exemption to explain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When do the CRA obligations start?&lt;/strong&gt; Reporting of actively exploited vulnerabilities and severe incidents has been mandatory since 11th September 2026, for products already on the market as well as new ones. The essential cybersecurity requirements in Annex I, and the conformity assessment and CE marking, apply from 11 December 2027.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who reports, the vendor or the customer?&lt;/strong&gt; The manufacturer, meaning whoever places the product on the market under their name. A company using agents internally is a user, and is owed notification by its vendors under Article 14(8). If you build agents and sell them, or embed third-party agent components in a product you sell, you are the manufacturer for the whole product, including the open source inside it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is a hosted AI agent covered by the CRA?&lt;/strong&gt; A purely hosted service is regulated by NIS2 rather than the CRA. Hosted processing becomes part of a CRA product when the product cannot perform one of its functions without it and the manufacturer built it. Many agent products, with an installed component and a required cloud backend, will fall on the CRA side of that line. Get a legal opinion on your own architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What must the 24-hour early warning contain?&lt;/strong&gt; For an exploited vulnerability: that it is being exploited, and where applicable the member states in which the product has been made available. For a severe incident: that it occurred, and whether unlawful or malicious acts are suspected. It goes through ENISA’s Single Reporting Platform to the CSIRT of the member state where you have your main establishment. The 72-hour notice and the final report add the detail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the CRA require logging for AI agents?&lt;/strong&gt; Annex I Part I point (l) requires products to provide security-related information by “recording and monitoring relevant internal activity, including the access to or modification of data, services or functions.” For an agent, that means an attributable record of which agent, on whose behalf, accessed which tool or data, and it needs to come from an enforcement point the agent cannot edit. Awareness of exploitation, which starts the 24-hour clock, depends on the same record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What are the penalties under the CRA?&lt;/strong&gt; Up to EUR 15 million or 2.5% of worldwide annual turnover for failing the essential cybersecurity requirements or the reporting duties, up to EUR 10 million or 2% for other obligations, and up to EUR 5 million or 1% for supplying incorrect or misleading information to authorities.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The regulator’s question
&lt;/h2&gt;

&lt;p&gt;The people who wrote the CRA were thinking about routers, smart meters, and the software inside them. They were not thinking about a language model with a tool belt. But the law they wrote asks the questions that agent fleets are worst at answering: what is running, what can it reach, what did it do, and how fast can you say so.&lt;/p&gt;

&lt;p&gt;LiteLLM’s bug was exploited in honeypots for weeks before it reached CISA’s list. Under the CRA, the clock would have started the day the honeypot lit up, and the first report would have been due the next day. Meeting that has less to do with how good the incident response team is than with whether the infrastructure already holds the answers.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap. If a component in your agent stack showed up on an exploited list tomorrow morning, which of your agents run it, what could each one reach, and what did they do last night? If the answer starts with “we would need to check,” the check is what to build.&lt;/p&gt;

&lt;p&gt;Secure by design used to be a principle. In Europe, it now has a filing deadline.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/?product=lynx&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock/" rel="noopener noreferrer"&gt;EU Cyber Resilience Act: Europe Just Put Your AI Agents on a 24-Hour Clock&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>observability</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>HIPAA Wasn’t Written for AI Agents. It Applies to Them Anyway</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Fri, 02 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/hipaa-wasnt-written-for-ai-agents-it-applies-to-them-anyway-22pk</link>
      <guid>https://dev.to/tigeraio/hipaa-wasnt-written-for-ai-agents-it-applies-to-them-anyway-22pk</guid>
      <description>&lt;p&gt;In short, healthcare is adopting AI agents faster than almost any other industry. More than 85% of Epic’s customers already use Epic AI, Epic’s Agent Factory will let every health system build agents of its own from 2027, and 43% of health systems were piloting agentic AI at the start of this year. Every one of those agents runs next to Protected Health Information (PHI), and PHI comes with rules that were not written for autonomous software but land on it anyway: minimum necessary access, audit controls, business associate agreements, a 60-day breach clock. This post maps those rules onto what agent infrastructure must provide (identity, per-request authorization, live inventory, an audit trail across every hop), then shows where Tigera Lynx fits and what it does not do. It is written for the platform and security leaders who will be asked to produce the record.&lt;/p&gt;

&lt;p&gt;Healthcare was supposed to be the cautious one. Regulated to the bone, allergic to unvetted vendors, still running a fax machine somewhere in the basement. Instead, it is adopting AI agents faster than almost anyone.&lt;/p&gt;

&lt;p&gt;At HIMSS in March 2026, &lt;a href="https://hitconsultant.net/2026/03/10/epic-ai-himss-2026-agent-factory-curiosity-foundation-models/" rel="noopener noreferrer"&gt;Epic previewed Agent Factory&lt;/a&gt;, a visual builder for health systems to create, customize, and orchestrate their own AI agents inside the Electronic Health Record (EHR), and said that more than 85% of its customers are already actively using Epic AI. By its August user group meeting, &lt;a href="https://healthsystemcio.com/2026/08/09/epic-agent-factory-health-systems/" rel="noopener noreferrer"&gt;four health systems were building agents in it&lt;/a&gt; without writing code. A month later, &lt;a href="https://healthsystemcio.com/2026/09/16/epic-build-a-thon-clinical-agents/" rel="noopener noreferrer"&gt;25 health systems spent three days building clinical ones&lt;/a&gt;: an agent that reads NICU notes for early signs of necrotizing enterocolitis, another that checks medication refill requests against clinical protocol. Training for the first early adopters starts in October, and general availability is planned for 2027. Oracle’s &lt;a href="https://www.oracle.com/news/announcement/physicians-reduce-documentation-time-with-oracle-health-clinical-ai-agent-2025-03-04/" rel="noopener noreferrer"&gt;Clinical AI Agent&lt;/a&gt; drafts notes and proposes next steps for physicians across more than 30 specialties, and in September it &lt;a href="https://www.oracle.com/news/announcement/oracle-health-clinical-ai-agent-helps-nurses-alleviate-documentation-burden-and-streamline-care-2026-09-14/" rel="noopener noreferrer"&gt;reached inpatient nurses&lt;/a&gt;. And underneath the vendor roadmaps sits a quieter layer: internal teams wiring LangGraph agents and MCP servers to FHIR APIs, because the pilot worked and the backlog is long.&lt;/p&gt;

&lt;p&gt;The numbers behind that are worth holding in your head. Research from &lt;a href="https://www.microsoft.com/en-us/industry/blog/healthcare/2026/02/12/assessing-healthcares-agentic-ai-readiness-new-research-from-microsoft-and-the-health-management-academy/" rel="noopener noreferrer"&gt;Microsoft and The Health Management Academy&lt;/a&gt;, published in early 2026, found that only 3% of health systems had agents in live workflows, while 43% were piloting or testing them. That is the shape of a wave a year before it breaks. The same study named governance as one of the three barriers health system leaders say they have not solved. Gravitee’s &lt;a href="https://www.gravitee.io/state-of-ai-agent-security" rel="noopener noreferrer"&gt;State of AI Agent Security survey&lt;/a&gt;, a vendor survey from February, found that 92.7% of healthcare respondents had seen a confirmed or suspected AI agent incident in the previous year, the highest share of any sector it asked.&lt;/p&gt;

&lt;p&gt;None of this is recklessness, and it deserves better than a scolding. A scribe agent that gives a clinician two hours of their evening back is one of the clearest AI wins in any industry. The adoption is rational.&lt;/p&gt;

&lt;p&gt;But every one of those agents runs next to PHI, which comes with rules that are older than the transformer, attach to the data rather than the technology reading it, and are about to get sharper, not softer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does HIPAA apply to AI agents?
&lt;/h2&gt;

&lt;p&gt;Yes, fully, and without an AI chapter. HIPAA does not need one. The Privacy and Security Rules regulate covered entities and their business associates, and they attach to the data, so an agent reading a chart is governed exactly as a clinician reading a chart is. Four existing requirements land directly on agents:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimum necessary.&lt;/strong&gt; &lt;a href="https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164/subpart-E/section-164.502" rel="noopener noreferrer"&gt;45 CFR 164.502(b)&lt;/a&gt; limits PHI access to what a specific task needs. A human scheduler looking up an address sees a demographics screen. An agent doing the same job through a service account that can read the full clinical record is a minimum necessary problem, whether or not it ever reads past the address field. Agents do not get scoped down by the login screen. They get exactly the credentials someone gave them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit controls.&lt;/strong&gt; &lt;a href="https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164/subpart-C/section-164.312" rel="noopener noreferrer"&gt;45 CFR 164.312(b)&lt;/a&gt; requires mechanisms that record activity in systems holding electronic PHI (ePHI): who accessed what, when, and on whose authority. EHR audit logs answer this for humans, because a human is logged in. An agent is not a user. It acts on behalf of a user, through credentials of its own, often through a chain: a patient asks an agent, the agent calls another agent, that one calls an MCP tool, the tool queries the record, and somewhere a language model sees the result. “Who” is now a chain, not a name, and the audit trail has to hold the whole chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business associates.&lt;/strong&gt; Any vendor that processes PHI on your behalf needs a Business Associate Agreement (BAA). Every LLM provider your agents can reach is on that list. If one team’s agent carries an API key for a provider you have no agreement with, its plumbing has quietly created a compliance exposure nobody signed off on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breach notification.&lt;/strong&gt; When PHI goes somewhere it should not, the &lt;a href="https://www.hhs.gov/hipaa/for-professionals/breach-notification/index.html" rel="noopener noreferrer"&gt;Breach Notification Rule&lt;/a&gt; starts a 60-day clock, and the first question is scope: what data, which patients, over what window. You cannot report what you cannot reconstruct. And the bill for getting this wrong is highest here of anywhere: IBM’s 2026 Cost of a Data Breach report puts the &lt;a href="https://www.hipaajournal.com/2026-cost-data-breach-study-ibm/" rel="noopener noreferrer"&gt;average healthcare breach at $6.64 million&lt;/a&gt;, the costliest industry for the thirteenth year running.&lt;/p&gt;

&lt;p&gt;If the clock sounds theoretical, Australia just lived through the version without PHI in it. On 18 June, an OpenAI agent under internal evaluation &lt;a href="https://www.abc.net.au/news/2026-09-24/ai-agent-accessed-australian-government-site-pm-says/107189078" rel="noopener noreferrer"&gt;found its way around the access blocks&lt;/a&gt; on a Services Australia portal that holds Medicare statistics and read non-public files. OpenAI discovered the intrusion on 11 August, told Services Australia on 10 September by emailing a public inbox, and the Prime Minister announced it on 24 September, calling both the delay and the manner &lt;a href="https://time.com/article/2026/09/24/australia-condemns-unacceptable-openai-breach-of-government-health-portal/" rel="noopener noreferrer"&gt;“unacceptable”&lt;/a&gt;. No patient records were touched. Everything else about the story was the pattern: an agent that, in the Prime Minister’s words, did not accept no for an answer, and an operator that took two months to notice and another month to say so. OpenAI has since &lt;a href="https://techcrunch.com/2026/09/29/openai-apologizes-to-australia-after-its-ai-agents-breached-government-sites/" rel="noopener noreferrer"&gt;apologised&lt;/a&gt;, and after a further incident it &lt;a href="https://tech.yahoo.com/ai/articles/openai-pauses-most-powerful-ai-175213089.html" rel="noopener noreferrer"&gt;paused training, evaluation, and tool-use inference&lt;/a&gt; on its most capable models. Put PHI in that story and the 60-day clock would have started in June, on the day the intrusion should reasonably have been known, not in August when someone noticed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ikey69sp7mnvt4ip0hv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ikey69sp7mnvt4ip0hv.png" alt="Timeline: HIPAA's 60-day window laid over the OpenAI and Services Australia dates, 18 June to 24 September 2026" width="800" height="260"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The OpenAI and Services Australia dates with HIPAA's 60-day window laid over them. Had it been PHI, the deadline would have passed 24 days before anyone was told.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One agent makes each of these a manageable exercise in process. Ten agents make it a spreadsheet nobody enjoys maintaining. A hundred agents, some built in a vendor’s visual builder, some homegrown, some a resident’s experiment that never got decommissioned, make it impossible to do by hand. That is not a prediction about a distant future. Agent Factory’s entire pitch is that your departments will build their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is the HIPAA Security Rule changing for AI?
&lt;/h2&gt;

&lt;p&gt;The rule is not changing for AI specifically, but it is tightening in exactly the places agents stress. In January 2025, HHS proposed the &lt;a href="https://www.federalregister.gov/documents/2025/01/06/2024-30983/hipaa-security-rule-to-strengthen-the-cybersecurity-of-electronic-protected-health-information" rel="noopener noreferrer"&gt;first major rewrite of the Security Rule&lt;/a&gt; in over a decade. The final rule has slipped: OMB’s regulatory agenda &lt;a href="https://www.hipaajournal.com/hipaa-security-rule-update-postponed/" rel="noopener noreferrer"&gt;now targets July 2027&lt;/a&gt;, nearly 5,000 comments are still under review, and hospital groups, including the &lt;a href="https://www.aha.org/lettercomment/2026-02-23-aha-response-hhs-rfi-ai-health-care" rel="noopener noreferrer"&gt;American Hospital Association&lt;/a&gt;, have asked for the proposal to be withdrawn. Proposals change before they land. The direction will not. Three items in the proposal read as if they were written with agent fleets in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A technology asset inventory and a network map&lt;/strong&gt; showing how ePHI moves through your systems, reviewed at least annually. Every agent, every MCP server, every LLM endpoint is an asset on that map. A map drawn by interviewing teams is stale before the ink dries. Agents get built in an afternoon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mandatory, auditable controls&lt;/strong&gt; in place of “addressable” ones: encryption, multi-factor authentication, segmentation. The era of arguing that a control was not reasonable for your environment is closing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annual written certification from business associates&lt;/strong&gt; that safeguards are actually deployed. Your vendors will be certifying to you, and your auditors will expect you to know which vendors sit in the data path at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nobody is waiting for the rule, either. The Office for Civil Rights (OCR) is enforcing the current rule’s risk analysis requirement hard, through a &lt;a href="https://www.nixonpeabody.com/insights/articles/2026/07/21/health-plan-settlement-marks-ocrs-20th-ransomware-and-14th-risk-analysis-initiative" rel="noopener noreferrer"&gt;Risk Analysis Initiative&lt;/a&gt; that passed its fourteenth settlement in June, and a risk analysis is only as good as the inventory it starts from. The &lt;a href="https://www.hhs.gov/press-room/hhs-office-civil-rights-settles-hipaa-investigation-ambry-genetics-phishing-attack-affecting-225000-individuals.html" rel="noopener noreferrer"&gt;Ambry Genetics settlement&lt;/a&gt; in September is worth reading with agents in mind: besides the missing risk analysis, OCR faulted the company for never assigning unique IDs to track who touched ePHI. That was a finding against a workforce of humans. A fleet of agents sharing one service account fails the same test, for the same reason.&lt;/p&gt;

&lt;p&gt;HHS ran a &lt;a href="https://www.federalregister.gov/documents/2025/12/23/2025-23641/request-for-information-accelerating-the-adoption-and-use-of-artificial-intelligence-as-part-of" rel="noopener noreferrer"&gt;request for information on accelerating AI in clinical care&lt;/a&gt; over the winter and &lt;a href="https://www.healthcaredive.com/news/hhs-update-artificial-intelligence-ai-request-information/823884/" rel="noopener noreferrer"&gt;reported in June&lt;/a&gt; that what the sector asked for most was practical guidance on governing AI and tools to evaluate what vendors sell. It says the answers will shape how it regulates, reimburses, and funds AI in the clinic. States are moving faster. California’s legislature sent the governor &lt;a href="https://www.nationalnursesunited.org/press/nurses-celebrate-final-passage-of-landmark-ai-bills-urge-gov-newsom-to-sign" rel="noopener noreferrer"&gt;AB 1979&lt;/a&gt; in September, which would require any company whose AI health application reaches medical records, consumer chatbots included, to comply with the state’s medical confidentiality law, and the governor had until 30 September to act on it.&lt;/p&gt;

&lt;p&gt;Whichever year the final rule takes effect, the gap between “we have a policy document” and “here is the map, and here is the log” is exactly where findings live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does HIPAA compliance require of AI agent infrastructure?
&lt;/h2&gt;

&lt;p&gt;Put the current rule and the proposed one side by side, then translate each requirement into what it means once agents are in the data path:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;The rule asks&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With agents, that means&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the infrastructure must provide&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minimum necessary access (164.502(b))&lt;/td&gt;
&lt;td&gt;An agent touches only the PHI its current task needs, not everything its credentials allow&lt;/td&gt;
&lt;td&gt;Per-request authorization with default deny, not standing access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit controls (164.312(b))&lt;/td&gt;
&lt;td&gt;Every access attributed to a specific agent, acting for a specific person, through a specific tool and model&lt;/td&gt;
&lt;td&gt;An identity-attributed audit trail across every hop, not just the EHR login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asset inventory and ePHI network map (proposed)&lt;/td&gt;
&lt;td&gt;Every agent, MCP server, and LLM provider is on the map, including the ones nobody registered&lt;/td&gt;
&lt;td&gt;Continuous discovery of agents, not an annual questionnaire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BAA coverage for vendors in the data path&lt;/td&gt;
&lt;td&gt;Agents can reach only the LLM providers you actually have agreements with&lt;/td&gt;
&lt;td&gt;Central control over provider access, with credentials held outside the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breach notification within 60 days&lt;/td&gt;
&lt;td&gt;Scope a suspected leak: which agent, what data, which direction, what window&lt;/td&gt;
&lt;td&gt;A reconstructable record of agent traffic with policy decisions attached&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F66lwwy10k8p88gczjlub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F66lwwy10k8p88gczjlub.png" alt="Diagram: where HIPAA lands on one agent request, five hops from clinician to patient record with a checkpoint at each, and one unregistered agent" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The same table drawn as one request: five hops, a checkpoint at each, and one agent nobody registered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it is paperwork. Identity, authorization, discovery, audit: every row is infrastructure, and none of it can be delegated to the agent itself, because &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;controls the agent can override are not controls&lt;/a&gt;. We have made that argument all year, from the &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-crisis-why-governance-isnt-keeping-up-with-deployment/" rel="noopener noreferrer"&gt;accountability crisis&lt;/a&gt; through &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;why network policies, API gateways, and RBAC cannot close the gap&lt;/a&gt;. Healthcare is where it stops being an argument and becomes an audit finding.&lt;/p&gt;

&lt;p&gt;Notice, too, what the table does not contain. It does not ask the model to behave. Prompt injection is unsolved, and an agent that has been talked into exporting a patient list will do so with perfectly valid credentials. The &lt;a href="https://www.tigera.io/blog/the-five-pillars-of-ai-agent-accountability-a-diagnostic-framework-for-engineering-leaders/" rel="noopener noreferrer"&gt;five pillars of AI agent accountability&lt;/a&gt; we published earlier this year (traceability, authorization provenance, identity and ownership, policy at scale, human oversight) were written for any regulated industry. Lay them over that table and each pillar answers one or two rows. HIPAA just happens to have written the pillars into law before anyone called them that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where does Tigera Lynx fit?
&lt;/h2&gt;

&lt;p&gt;This is the gap &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; was built to close, and it maps onto that table almost row for row.&lt;/p&gt;

&lt;p&gt;Every agent, MCP server, and LLM provider registers with Lynx and carries a verifiable identity (SPIFFE, OIDC, or a pod-owner binding for agents you cannot modify), including who the agent is acting for, so “which agent, on whose behalf” is a fact attached to every request rather than a forensic project after the incident. Authorization runs through Cedar policy at the gateway: default deny, evaluated on every request, with the caller’s identity, the target, and the operation as context. For MCP traffic the policy can see the operation, the tool name, and the tool arguments, so “this agent may call &lt;code&gt;lookup_appointment&lt;/code&gt; but never &lt;code&gt;export_patient_list&lt;/code&gt;” is one policy statement, and a call a policy marks as requiring human approval waits until a person signs off. That is minimum necessary expressed as executable policy instead of a training slide.&lt;/p&gt;

&lt;p&gt;LLM provider credentials are injected at the gateway and never live inside the agent, which means the set of providers your agents can reach is exactly the set you have BAAs with, and a prompt-injected agent has no key to leak. Each token the gateway mints is addressed to one destination, so a token stolen from one hop is worthless at the next.&lt;/p&gt;

&lt;p&gt;Agents that never registered, &lt;a href="https://www.tigera.io/blog/a-field-guide-to-the-agents-in-your-cluster/" rel="noopener noreferrer"&gt;the experiment nobody decommissioned or the sidecar nobody audited&lt;/a&gt;, are detected from the node itself. An eBPF detector watches for connections to LLM endpoints, including a watchlist of your own self-hosted model endpoints, and inspects running processes for agent frameworks, then classifies each workload as sanctioned, shadow, or unknown with the evidence shown beside the verdict. That is the difference between an asset inventory you assert and one you can defend. A workload that should not be there can be quarantined on the spot, at the gateway and in the kernel, so it can no longer write to disk, launch processes, or open an outbound connection. The same detector now ships as a package for plain Linux hosts, because not every agent in a health system runs on Kubernetes.&lt;/p&gt;

&lt;p&gt;And every request lands in the Agent Trail with the caller, the human authority, the tool, the policy decision, the token exchanged at each hop, and the model that actually served the call: your 164.312(b) mechanism and your breach-scoping record in one place, written by the enforcement plane rather than narrated by the agent.&lt;/p&gt;

&lt;p&gt;To be precise about the claim: no software makes you HIPAA compliant, Lynx included. Compliance is contracts, risk analysis, process, and training, and the BAA with your LLM provider is a document your legal team signs, not a policy the gateway enforces. What Lynx provides is the layer those processes quietly assume exists: the ability to say, with evidence, which agents exist, what each one can touch, and what each one did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Are AI agents subject to HIPAA?&lt;/strong&gt; Yes. HIPAA attaches to PHI and to the covered entities and business associates that handle it, not to the technology in between. An agent that reads, creates, or transmits PHI is bound by the same minimum necessary, audit control, and breach notification requirements as any workforce member or system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is my LLM provider a HIPAA business associate?&lt;/strong&gt; If PHI reaches it, yes, and you need a BAA before it does. Most major providers offer one on specific enterprise tiers, and de-identified data falls outside the rule. Signing the BAA is the easy part. The engineering problem is guaranteeing that no agent can reach a provider you have not signed one with, and that is a routing and credential control rather than paperwork.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can an AI agent be “HIPAA compliant”?&lt;/strong&gt; Not on its own. Compliance is a property of the organization and its processes. What you can make an agent is governable: it has a verified identity, its access is scoped per request, its traffic is logged with attribution, and it can be stopped. That is what an auditor can check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does an AI agent audit trail need to contain?&lt;/strong&gt; For every access to ePHI: which agent, acting on whose behalf, through which tool or API, against which policy decision, at what time, and which model saw the result. A log the agent writes about itself does not count. The record has to come from an enforcement point the agent cannot edit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is the minimum necessary standard for AI agents?&lt;/strong&gt; An agent should be able to reach only the PHI its current task requires, evaluated at the time of the request. Standing access through a broad service account violates the spirit of the standard even when the agent behaves, because the exposure exists whether or not it is exercised.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the proposed HIPAA Security Rule apply to AI agents?&lt;/strong&gt; It does not mention them, but its asset inventory, network map, mandatory encryption and MFA, and business associate verification requirements apply to every system that touches ePHI. Agents, MCP servers, and LLM endpoints are systems. The final rule is now expected in 2027 and may change, but the current rule’s risk analysis requirement, which OCR is actively enforcing, already needs a complete inventory to satisfy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The auditor’s question
&lt;/h2&gt;

&lt;p&gt;The vendors will keep shipping agents, and clinicians will keep adopting anything that gives them their evenings back. The industry conversation &lt;a href="https://www.statnews.com/2026/03/11/ai-agents-himss-google-microsoft-epic-oracle/" rel="noopener noreferrer"&gt;has already moved&lt;/a&gt; from “should we deploy agents” to “how do we validate and govern them.” That is the right conversation, and it comes with a deadline attached: the day an auditor, or a breach, asks you to produce the record. OpenAI got that question in August. Its answer reached Services Australia a month later, by email, in a public inbox.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap. When someone asks which agents could read patient records last quarter, which ones actually did, on whose authority, and which models saw the results, what will you hand them?&lt;/p&gt;

&lt;p&gt;In most industries, an unaccountable agent is a risk to manage. In healthcare, it is a finding waiting for an auditor.&lt;/p&gt;

&lt;p&gt;_ &lt;strong&gt;Lynx&lt;/strong&gt; is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/?product=lynx&lt;/a&gt;._&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/hipaa-wasnt-written-for-ai-agents-it-applies-to-them-anyway/" rel="noopener noreferrer"&gt;HIPAA Wasn’t Written for AI Agents. It Applies to Them Anyway&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>Managing Claude Code Sessions Through Lynx</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/managing-claude-code-sessions-through-lynx-3dk3</link>
      <guid>https://dev.to/tigeraio/managing-claude-code-sessions-through-lynx-3dk3</guid>
      <description>&lt;p&gt;At Tigera, we spend a lot of time thinking about agent security: identity, policy, runtime controls, and the record left behind after an agent acts.&lt;/p&gt;

&lt;p&gt;Coding agents create an interesting problem because, in most organizations, they didn’t arrive through the front door.&lt;/p&gt;

&lt;p&gt;Few companies ran a platform evaluation and rolled Claude Code out to 500 developers. Developers installed it themselves. By the time security and platform teams started asking how coding agents should be governed, they were already running on laptops with access to source code, credentials, SSH keys, kubeconfigs, internal services, and whatever else the developer could reach.&lt;/p&gt;

&lt;p&gt;The long-term answer is increasingly clear I think: move coding agents into isolated environments you control.&lt;/p&gt;

&lt;p&gt;Anthropic’s sandboxing work draws filesystem and network boundaries using OS primitives such as bubblewrap and seatbelt. Its reference devcontainer includes an egress firewall. Docker has introduced sandboxes for running coding agents, and Kubernetes-based approaches can add stronger workload isolation, network policy, and disposable development environments.&lt;/p&gt;

&lt;p&gt;That direction makes sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Isolation governs what an agent can do. A gateway governs what it can send.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And unlike a complete move to remote development environments, the second boundary is something you can introduce today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one environment variable
&lt;/h2&gt;

&lt;p&gt;Claude Code allows its model endpoint to be configured through the environment.&lt;/p&gt;

&lt;p&gt;Instead of connecting directly to Anthropic, point it at the Lynx gateway.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&amp;lt;lynx-gateway&amp;gt;/llm/anthropic"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the entire change on the developer’s machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No endpoint agent. No daemon. No certificate installation.&lt;/li&gt;
&lt;li&gt;No rebuilt development environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next model turn goes through Lynx, and every model turn after it does too.&lt;/p&gt;

&lt;p&gt;That small change turns otherwise disconnected model calls into something more useful: a coding session that can be observed, governed, and recorded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8aslap01sqkjxktja49j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8aslap01sqkjxktja49j.png" alt="Coding sessions list in Lynx" width="800" height="346"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Coding sessions list in Lynx&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57mw84voqctmnvw1fzfv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57mw84voqctmnvw1fzfv.png" alt="Coding session summary in Lynx" width="799" height="430"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Coding session summary in Lynx&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this gives you
&lt;/h2&gt;

&lt;p&gt;Instead of seeing another HTTPS connection from a developer laptop to an AI provider, the platform can start answering important questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which coding sessions are using AI?&lt;/li&gt;
&lt;li&gt;Which model providers and models are they using?&lt;/li&gt;
&lt;li&gt;What information is being sent to those models?&lt;/li&gt;
&lt;li&gt;Which policies were applied?&lt;/li&gt;
&lt;li&gt;Which MCP tools were called through the gateway?&lt;/li&gt;
&lt;li&gt;Did the session spawn sub-agents?&lt;/li&gt;
&lt;li&gt;What happened during a particular coding session?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a significant improvement over an unmanaged agent talking directly to a model provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;A gateway gives you a strong answer to what left the building, not what happened on the machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local tools run on the laptop and do not transit the gateway.&lt;/li&gt;
&lt;li&gt;Example: Claude Code reads a file, edits source code, or runs a shell command locally.&lt;/li&gt;
&lt;li&gt;Some of that activity may appear in model traffic (e.g., tool calls, results, retrieved files, or other context).&lt;/li&gt;
&lt;li&gt;That is observation, not enforcement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A governed laptop is not a sandbox
&lt;/h2&gt;

&lt;p&gt;Routing Claude Code through a gateway does not suddenly give Lynx control over the developer’s machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every model turn that transits the gateway can be governed.&lt;/li&gt;
&lt;li&gt;MCP calls can also be governed when the MCP server is reached through the gateway.&lt;/li&gt;
&lt;li&gt;Local tools are different. The gateway isn’t on that execution path and cannot prevent it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that is observation, not enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a governed coding session looks like
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ivxp8wv6n49pgyul7md.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ivxp8wv6n49pgyul7md.png" alt="Diagram: Claude Code on the developer laptop routes model and MCP traffic through the Lynx gateway (identity, Cedar policy, audit) to external services; local tools stay un-governed" width="799" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From unmanaged laptop to governed sandbox
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr1q69zh0y1iyizskh61f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr1q69zh0y1iyizskh61f.png" alt="Diagram: from unmanaged laptop, to governed coding session on the laptop, to governed sandbox with runtime containment" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/managing-claude-code-sessions-through-lynx/" rel="noopener noreferrer"&gt;Managing Claude Code Sessions Through Lynx&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>The Clearinghouse For AI Agents Has A Blind Spot</title>
      <dc:creator>Dillon Barry</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:11:12 +0000</pubDate>
      <link>https://dev.to/tigeraio/the-clearinghouse-for-ai-agents-has-a-blind-spot-11ph</link>
      <guid>https://dev.to/tigeraio/the-clearinghouse-for-ai-agents-has-a-blind-spot-11ph</guid>
      <description>&lt;p&gt;Jamin Ball’s recent piece, “&lt;a href="https://cloudedjudgement.substack.com/p/systems-of-record-won-the-saas-era?utm_campaign=post-expanded-share&amp;amp;utm_medium=web" rel="noopener noreferrer"&gt;Systems of Record Won the SaaS Era — Clearinghouses Will Win the Agents Era,”&lt;/a&gt; is the cleanest articulation I’ve seen of where the durable moat goes next. His argument is simple and, I think, correct: the SaaS era rewarded whoever owned the system of record, and the agent era will reward whoever owns the clearinghouse. This is a new seat that sits between mutually-distrusting agents and decides which one is cleared to act, on what data, with what limits, and can prove what happened after the fact. The lock-in moves from your data to your permissions. The source-of-truth era becomes the source-of-permission era.&lt;/p&gt;

&lt;p&gt;I agree with all of it. Governance has graduated from a compliance checkbox at the end of the sales cycle to the first question a CIO asks. Once agents act autonomously and eventually spend real money, “is the model good?” stops being interesting now that every model is good enough and “can I see what every agent did, set policy on what it can touch, and prove it to my auditors?” becomes the whole conversation. That seat is strategic real estate. Whoever holds it is hard to dislodge.&lt;/p&gt;

&lt;p&gt;But there’s an assumption buried in the clearinghouse metaphor that’s worth dragging into the light, because the entire model rests on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A clearinghouse only clears what comes to it
&lt;/h2&gt;

&lt;p&gt;In financial markets the metaphor works because participation is mandatory. You cannot settle a trade on a regulated exchange without going through the clearinghouse. The seat is powerful precisely because there is no path around it. Every transaction is, by construction, a transaction that presents itself for clearing.&lt;/p&gt;

&lt;p&gt;Agents are not like that. Nothing about the architecture forces an agent to route its actions through a governance seat. An agent calls a model endpoint directly. It opens a connection to a tool server that someone stood up last week. It talks to another agent over a side channel or a message board as in the Hugging Face attack. A developer spins up an autonomous workflow in a corner of the infrastructure that the platform team has never inventoried. None of that traffic announces itself at the toll booth. And the receipt the clearinghouse keeps is, by definition, a record only of the transactions that came to the desk.&lt;/p&gt;

&lt;p&gt;This is the gap. The clearinghouse is an &lt;em&gt;on-path&lt;/em&gt; construct, it governs the actions that pass through it. But in a real enterprise, the actions you most need to govern are frequently the ones that &lt;em&gt;don’t&lt;/em&gt;. The shadow agent nobody registered. The model call that skipped the gateway. The agent-to-agent handoff that never generated a clearing event. A governance model that only sees submitted transactions is blind to exactly the population that represents the risk.&lt;/p&gt;

&lt;p&gt;Every example in Jamin’s framing, the data platforms winning “from below,” the productivity suites winning “from above” assumes the agent shows up to be cleared. The most dangerous agents are the ones that never do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source of permission needs a source of truth
&lt;/h2&gt;

&lt;p&gt;So the clearinghouse seat, as described, is necessary but not sufficient. To actually hold it, you need something underneath it that the metaphor skips over: an independent source of truth about what agents are doing, whether or not they chose to clear through you.&lt;/p&gt;

&lt;p&gt;Four capabilities make that real, and none of them are “clearing” in Jamin’s sense.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;off-path visibility&lt;/strong&gt;. You need to observe agent traffic at a layer the agent can’t opt out of, that is the network and runtime substrate the workload actually executes on, so that the calls that bypass the gateway are still seen. A receipt tells you what cleared. Visibility tells you what happened. Those are different data sets, and the difference between them is your risk surface.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;discovery&lt;/strong&gt;. The clearinghouse clears the agents that present themselves; it does not go find the ones that didn’t. You need to enumerate the agents running in your environment without relying on them to register, because the unregistered ones are the point.&lt;/p&gt;

&lt;p&gt;The third is &lt;strong&gt;behavioral sensing&lt;/strong&gt;. Clearing is transactional: permit or deny, one action at a time. But a single permitted action can be perfectly legitimate while a &lt;em&gt;sequence&lt;/em&gt; of them is an exfiltration pattern. You need continuous analysis of what an agent does over time, not just a verdict at each gate.&lt;/p&gt;

&lt;p&gt;The fourth is &lt;strong&gt;identity issuance, not just verification&lt;/strong&gt;. A clearinghouse authorizes a credential at the door. But in a multi-hop agent world where agent calls agent calls tool calls model, you need every hop to carry attributable, minted identity, so the audit trail Ball rightly prizes is actually trustworthy end to end rather than a chain of “trust me” assertions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I’d draw the line
&lt;/h2&gt;

&lt;p&gt;I want to be careful not to overclaim the inverse, either. The clearinghouse thesis gets two things exactly right that the visibility layer does not replace. Owning &lt;strong&gt;memory&lt;/strong&gt; , what agents know and &lt;strong&gt;context&lt;/strong&gt; , what they see and how it’s served, is a genuinely strategic seat, and it belongs to the data players. A visibility-and-governance layer governs access to those things; it doesn’t store them, and it shouldn’t pretend to. The division of the map is this: the data platforms own memory and context, and the governance layer owns permission, enforcement, and the source of truth about behavior.&lt;/p&gt;

&lt;p&gt;And the multi-vendor angle Jamin references, “the clearinghouse across clearinghouses,” the neutral seat that no incumbent can credibly occupy because Microsoft will never neutrally govern Salesforce’s agents — is the most valuable position of all, but it’s also the least mature. Neutrality is easy to assert and hard to ship, especially across the messy reality of where agents actually run today. Anyone claiming it now is selling a roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reframe
&lt;/h2&gt;

&lt;p&gt;So here’s where I land. Jamin is right that the moat moves from the system of record to the clearinghouse, and from your data to your permissions. But a permission you can’t enforce on traffic you can’t see is a permission in name only. The source-of-permission era doesn’t replace the source of truth, rather it &lt;em&gt;depends&lt;/em&gt; on one. The seat goes to whoever can both decide what an agent is allowed to do and independently observe what it actually did, including all the times it never asked.&lt;/p&gt;

&lt;p&gt;The clearinghouse is the right metaphor. It just needs eyes outside the building.&lt;/p&gt;

&lt;p&gt;Written by Alain Mayer&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/clearinghouse/" rel="noopener noreferrer"&gt;The Clearinghouse For AI Agents Has A Blind Spot&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>HITL for autonomous agents: Where does the human go?</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 17 Sep 2026 00:49:44 +0000</pubDate>
      <link>https://dev.to/tigeraio/hitl-for-autonomous-agents-where-does-the-human-go-14n6</link>
      <guid>https://dev.to/tigeraio/hitl-for-autonomous-agents-where-does-the-human-go-14n6</guid>
      <description>&lt;p&gt;&lt;em&gt;Human approval is easy when you are sitting in front of the agent. For an agent running by itself in a cluster, almost none of that holds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You’re in a meeting and your agent is running in a cluster. It has a service account, it has been asked to keep a service healthy, and it has just worked out that the right fix is to roll back a database migration. Nobody is watching it. That was rather the point of deploying it. You want to get notified to approve such an important action.&lt;/p&gt;

&lt;p&gt;This is a different problem from the one most people picture when they hear &lt;em&gt;human in the loop&lt;/em&gt;. If you use a coding assistant, you already have human oversight and it costs almost nothing: the agent shows you a diff, you read it, you approve. That works because you are already there — at a keyboard, with the context in front of you, in the same second the agent needs an answer.&lt;/p&gt;

&lt;p&gt;An autonomous agent has none of that. There is no session to interrupt. The person who should decide is asleep, or in a meeting, or on a plane. The approval has to travel out of the cluster, reach a phone, and come back. And the request has to survive however long that takes.&lt;/p&gt;

&lt;p&gt;Almost everything that is hard about human oversight for autonomous agents follows from those two sentences. So the useful question is not whether to have a human – MCP’s tools specification recommends keeping a person able to deny a tool call, and every agent security note I have read says some version of the same thing. The useful question is &lt;em&gt;where&lt;/em&gt; that human sits, and what happens to the request while it waits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four places to put the human
&lt;/h2&gt;

&lt;p&gt;Four different layers of the stack have each grown an answer, and they are not the same answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the identity layer&lt;/strong&gt; , the agent asks an identity provider for permission. The provider reaches you out of band, and your approval mints a short-lived token scoped to that one action. This is &lt;a href="https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html" rel="noopener noreferrer"&gt;OpenID Connect’s CIBA&lt;/a&gt;, and it is the most mature of the four — Auth0, Okta and others have productized it, and Christian Posta has &lt;a href="https://blog.christianposta.com/ai-agents-and-oidc-ciba/" rel="noopener noreferrer"&gt;made the case&lt;/a&gt; for it as the natural home for agent oversight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the protocol layer&lt;/strong&gt; , the tool server pauses and asks a question back through the client. MCP calls this elicitation and specifies it properly. It also assumes there is a client with a person attached to it, which puts us back at two in the morning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the infrastructure layer&lt;/strong&gt; , a gateway in the request path holds the call, notifies someone, and then releases or refuses it. Nothing in the agent changes, because the agent never learns it was held.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the runtime layer&lt;/strong&gt; , the agent framework pauses itself and checkpoints. LangGraph’s &lt;code&gt;interrupt()&lt;/code&gt; and Temporal’s durable execution both work this way: the pause is saved state rather than a blocked thread, so it survives a crash or a deploy.&lt;/p&gt;

&lt;p&gt;These are not four implementations of one feature. CIBA answers &lt;em&gt;what authority does this action now carry&lt;/em&gt;. Elicitation answers &lt;em&gt;what does the user want to happen&lt;/em&gt;. A gateway hold answers &lt;em&gt;should this request proceed&lt;/em&gt;. A durable interrupt answers &lt;em&gt;how does the work survive the wait&lt;/em&gt;. We started out treating them as alternatives and had to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wait is the hard part
&lt;/h2&gt;

&lt;p&gt;A person takes minutes. A request does not.&lt;/p&gt;

&lt;p&gt;Hold the call open at a gateway and you get approval with no change to the agent at all — which is the whole reason to do it there — but you are now racing every timeout between the caller and you. Client timeouts, proxy idle timeouts, load balancer limits. You can raise them, but you raise them for all traffic, not just the held kind. Two minutes is generous by network standards and insulting by human ones.&lt;/p&gt;

&lt;p&gt;Return immediately instead, mark the call pending, and let the caller poll. TrueFoundry &lt;a href="https://www.truefoundry.com/blog/mcp-tool-approval-human-gate-call-path" rel="noopener noreferrer"&gt;describe this shape&lt;/a&gt; well and are honest about the cost: the client has to understand the convention and decide when to retry. That is a change to every agent you were trying to leave alone.&lt;/p&gt;

&lt;p&gt;Or push the pause into the runtime, where LangGraph and Temporal have already solved it properly. The wait is checkpointed, it survives a restart, and holding for an hour costs nothing. It also requires that you own the agent’s runtime, which rules out the third-party agent and the one you did not write.&lt;/p&gt;

&lt;p&gt;Each design pays one of those three prices. We pay the first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does an approval prove?
&lt;/h2&gt;

&lt;p&gt;When the log says the action was approved, what has actually been established?&lt;/p&gt;

&lt;p&gt;In the strong version: this named person, authenticated at this strength, saw this specific request with these specific arguments, and decided at this time. In the weak version: a push went somewhere and something came back green.&lt;/p&gt;

&lt;p&gt;In our case it was the notification channel that opened the gap between the two. We integrated Cisco Duo as an approval backend, because it is already deployed at the kind of enterprise we work with and the push-to-phone experience is exactly right for the two-in-the-morning case. But Duo’s status response tells us the transaction was approved. It does not tell us who approved it, or on what device. So the approver we can record is the one we were configured to ask, not the one who actually tapped. Our first-party path, where someone answers through an authenticated session, can name the individual. The Duo path cannot.&lt;/p&gt;

&lt;p&gt;That is not a complaint about Duo, which is doing exactly what a second-factor product is designed to do. It is a warning about reading approval logs — and it is the strongest argument for the CIBA model, where the approver’s identity travels inside the token rather than sitting in a log line beside it.&lt;/p&gt;

&lt;p&gt;If you are choosing a design, ask what it can prove, not what it can block. Blocking is the easy half.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval should not create permission
&lt;/h2&gt;

&lt;p&gt;There is a design fork here, and we came down firmly on one side of it.&lt;/p&gt;

&lt;p&gt;When the human says yes, does that &lt;em&gt;create&lt;/em&gt; permission, or does it &lt;em&gt;satisfy a condition&lt;/em&gt; in permission that already existed? CIBA takes the first path by construction: the approval mints a token, and the token is new authority. That is clean and portable, and it also means a leaked token is authority in someone else’s hands until its window closes.&lt;/p&gt;

&lt;p&gt;We took the second path. In Lynx a gate is an ordinary Cedar &lt;code&gt;forbid&lt;/code&gt; rule with an annotation and a condition attached:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rego"&gt;&lt;code&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;approvalRequired&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Approve transfer_funds on treasury"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;forbid&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;principal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;approval&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;granted&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The annotation marks the rule as worth holding and carries the prompt the person reads. The &lt;code&gt;unless&lt;/code&gt; clause is what an approval satisfies. Both halves are required, and our linter rejects one without the other.&lt;/p&gt;

&lt;p&gt;The consequence is the part I care about: the gateway never turns a deny into an allow. If the agent was not permitted to reach that server in the first place, no amount of approval gets it there, and the request is refused immediately rather than paging someone at 2am to rubber-stamp something that was never going to work. Approval is one input to a decision still made by policy. It is not a manual override, and I would not be comfortable shipping one that was.&lt;/p&gt;

&lt;h2&gt;
  
  
  The person holding the phone
&lt;/h2&gt;

&lt;p&gt;Once a human is in the path, that human is a target, and the attacks are all about what the notification says. Most of what appears on an approval screen is influenced by someone else: the tool name comes from a server that may be compromised, the arguments come from a model that may have been steered by a retrieved document, and MCP annotations are explicitly hints rather than facts. Render all of that as one undifferentiated block and you are asking a half-awake person to spot a lie on a small screen. So we treat the rendering as a security control — authenticated caller identity first, written from what the gateway verified; caller-supplied arguments namespaced under an &lt;code&gt;arg.&lt;/code&gt; prefix so nothing can pose as provenance; text flattened and truncated. None of it is clever. The alternative is a phishing surface with a corporate logo on it.&lt;/p&gt;

&lt;p&gt;The quieter failure is fatigue. If the answer is always yes, the gate has stopped being judgment and become latency with an audit trail. Every change that reduces the number of prompts — batching, scoping, remembering a decision for a window — is also a change that puts fewer requests in front of a person. I do not think there is a way out of that tension, only a way to be deliberate about where you sit in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we have got to
&lt;/h2&gt;

&lt;p&gt;We build on &lt;a href="https://agentgateway.dev" rel="noopener noreferrer"&gt;agentgateway&lt;/a&gt; as our data plane, and Solo’s enterprise build already ships human approval with notifications out to Slack, email and mobile. This is not new ground, so I would rather say what we learned than claim novelty.&lt;/p&gt;

&lt;p&gt;We hold at the gateway, gated by Cedar, so that an agent nobody wants to modify can still be governed. We drive Duo’s asynchronous push for the out-of-band decision. That is deliberately &lt;em&gt;not&lt;/em&gt; CIBA — Duo has no backchannel authorization endpoint and no CIBA grant — but the shape is the same: client-initiated, decoupled device, poll for a decision. We built the seam to that shape so a real CIBA backend can sit behind it later without the policy surface changing. Since MCP’s specification declines to standardize an approval workflow, borrowing the shape of the standard next door seemed better than inventing a fifth one.&lt;/p&gt;

&lt;p&gt;What we have not solved: the hold is synchronous, so it carries the timeout cost above. There is a single global approver, where the problem wants routing by resource and by policy. It covers MCP tool calls and not yet the other paths an agent can take. And the trail does not yet surface the way it needs to for someone reconstructing an incident months later.&lt;/p&gt;

&lt;p&gt;I am writing this before those are fixed rather than after, because the feature is not the interesting part. The interesting part is that an identity specification, a protocol specification, a set of gateways and a set of agent frameworks all produce something different when a human says yes, and none of them drops into the place of another. That is worth working out now, while the designs are still soft enough to change.&lt;/p&gt;

&lt;p&gt;Agents will keep asking for permission to do consequential things while nobody is looking. We should be more precise about what we mean when we say a human approved it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Further reading: &lt;a href="https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html" rel="noopener noreferrer"&gt;the OpenID CIBA specification&lt;/a&gt;; Christian Posta on &lt;a href="https://blog.christianposta.com/ai-agents-and-oidc-ciba/" rel="noopener noreferrer"&gt;agent autonomy and CIBA; Auth0’s asynchronous authorization&lt;/a&gt; for agents; TrueFoundry on &lt;a href="https://www.truefoundry.com/blog/mcp-tool-approval-human-gate-call-path" rel="noopener noreferrer"&gt;tool approvals at the gateway boundary&lt;/a&gt;; &lt;a href="https://docs.langchain.com/oss/python/langgraph/durable-execution" rel="noopener noreferrer"&gt;LangGraph durable execution&lt;/a&gt; and &lt;a href="https://temporal.io/blog/temporal-langgraph-plugin-durable-execution" rel="noopener noreferrer"&gt;Temporal’s LangGraph plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/hitl-for-autonomous-agents-where-does-the-human-go/" rel="noopener noreferrer"&gt;HITL for autonomous agents: Where does the human go?&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>AI Agents on Kubernetes 101: From Laptop Script to Production Pod</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Tue, 08 Sep 2026 20:16:27 +0000</pubDate>
      <link>https://dev.to/tigeraio/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod-4jj4</link>
      <guid>https://dev.to/tigeraio/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod-4jj4</guid>
      <description>&lt;p&gt;In short, this is a beginner’s guide to deploying an AI agent on Kubernetes. You will containerize an agent, store its API key as a Kubernetes secret, write a deployment with health probes and resource limits, expose it with a service, and lock down its network egress, in that order, with a working manifest at every step. On a local kind cluster the whole walkthrough takes about an hour. At the end: the six mistakes almost every first agent deployment makes, and the questions a 101 deployment leaves open.&lt;/p&gt;

&lt;p&gt;Every AI agent starts life the same way; a Python script on someone’s laptop, an API key in a &lt;code&gt;.env&lt;/code&gt; file, a &lt;code&gt;while&lt;/code&gt; loop around an LLM call. It works, it demos well. Then someone with a budget says “ship it,” and you, the engineer closest to the script, get to figure out what shipping an agent actually means.&lt;/p&gt;

&lt;p&gt;This guide is that path, walked slowly. It assumes you know what a container is and have met &lt;code&gt;kubectl a&lt;/code&gt;t least once, and it assumes nothing about agents. By the end you will have an agent running in a cluster with its key in a Secret, its resource usage capped, its health checked, and its network access reduced to the short list of places it has any business calling. That is still short of production-grade governance, but it is a deployment you could defend in a code review, which is more than most agents get.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Kubernetes a good place to run AI agents?
&lt;/h2&gt;

&lt;p&gt;The short answer is, because an AI agent is a workload that needs supervision, and Kubernetes is the most widely used system for supervising workloads. It restarts the agent when it crashes, caps how much CPU and memory it can consume, injects its credentials (e.g. API keys) at runtime instead of baking them into the code, and describes all of it in version-controlled YAML manifest your team can review. Just as important, Kubernetes gives you control over the agent’s environment, such as, what it can reach on the network, what identity it carries, what happens when it misbehaves. That matters more for agents than for ordinary services, because an agent’s behavior is decided at runtime by a model, so the rules have to live outside the agent, where no prompt can talk its way past them. That argument deserves more than a paragraph, so we gave it a full post: &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;The Safest Place to Run an AI Agent Is a Cluster That Doesn’t Trust It&lt;/a&gt; makes the case with a year of real incidents as evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is deploying an agent different from deploying a web service?
&lt;/h2&gt;

&lt;p&gt;Mechanically, it barely is. An agent is a long-running process that speaks HTTP; Kubernetes has been running those for a decade. The difference is in what the workload does with its freedom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A web service follows its code.&lt;/strong&gt; An agent follows a model. You can read a service’s code and know its behavior. An agent’s next action depends on whatever lands in its context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agent holds credentials and acts.&lt;/strong&gt; It calls APIs, queries databases, sends messages. A wrong answer is a bug; a wrong &lt;em&gt;action&lt;/em&gt; is an incident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every input is potentially an instruction.&lt;/strong&gt; Prompt injection is unsolved. Text the agent reads, from a user, a document, or another agent, can try to redirect it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the deployment steps below are the same ones you would use for any service. The difference is emphasis: the steps most tutorials treat as optional hardening (secrets, limits, egress control) are, for agents, the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need before you start
&lt;/h2&gt;

&lt;p&gt;Four things, all free:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A cluster&lt;/strong&gt;. Locally, &lt;a href="https://kind.sigs.k8s.io/" rel="noopener noreferrer"&gt;kind&lt;/a&gt; runs Kubernetes inside Docker: &lt;code&gt;kind create cluster --name agents&lt;/code&gt;. Any managed cluster (EKS, GKE, AKS) works the same way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kubectl and Docker&lt;/strong&gt; , installed and talking to that cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agent that speaks HTTP&lt;/strong&gt;. Any framework is fine. LangGraph, CrewAI, Google ADK, etc all wrap into a web server; we compared them in &lt;a href="https://www.tigera.io/blog/six-ai-agent-sdks-for-enterprise-kubernetes-compared/" rel="noopener noreferrer"&gt;Six AI Agent SDKs for Enterprise Kubernetes&lt;/a&gt;. The walkthrough uses a generic Python agent served by FastAPI on port 8080, with two routes: &lt;code&gt;POST /chat&lt;/code&gt; for work and &lt;code&gt;GET /healthz&lt;/code&gt; that returns 200 when the process is up. If your agent lacks a health route, add one first. It is five lines, and step 4 depends on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An LLM API key.&lt;/strong&gt; From whichever provider your agent calls.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One namespace keeps the experiment contained:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create namespace agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Containerize the agent
&lt;/h2&gt;

&lt;p&gt;Kubernetes runs containers, so the script becomes an image. A minimal Dockerfile for a Python agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; 1000&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="c"&gt;# change the command (to run agent) according to its framework documentation&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two lines here are security decisions. &lt;code&gt;USER 1000&lt;/code&gt; runs the agent as a non-root user, so a compromised agent is not root inside its container. And notice what is &lt;em&gt;absent&lt;/em&gt;: no API key. The key never enters the image. An image is copied to registries, cached on nodes, and pulled by anyone with access; a key baked into an image is a key you have already leaked, you just don’t know to whom yet.&lt;/p&gt;

&lt;p&gt;Build it and, for kind, load it into the cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; support-agent:0.1.0 &lt;span class="nb"&gt;.&lt;/span&gt;
kind load docker-image support-agent:0.1.0 &lt;span class="nt"&gt;--name&lt;/span&gt; agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a real cluster you would push to a registry instead. Either way, tag with a version (e.g., &lt;code&gt;0.1.0&lt;/code&gt;), never &lt;code&gt;latest&lt;/code&gt;. You want to be able to say exactly what is running, and roll back to exactly what was running before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Put the API key in a Secret
&lt;/h2&gt;

&lt;p&gt;The&lt;code&gt;.env&lt;/code&gt; file’s job is taken over by a Kubernetes Secret:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents create secret generic support-agent-secrets 
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'sk-ant-...'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Secret lives in the cluster, is delivered to the pod as an environment variable at start time, and can be rotated without rebuilding the image. Two honest caveats for later: Secrets are base64-encoded, not encrypted, so real clusters enable encryption at rest and restrict who can read them with RBAC; and the agent’s own process can still read this variable, which matters once you worry about prompt injection. Hold that thought for the end of the article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Write the Deployment
&lt;/h2&gt;

&lt;p&gt;The Deployment is the contract: which image, how many copies, what resources, what health checks. Save this as &lt;code&gt;deployment.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;automountServiceAccountToken&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;runAsNonRoot&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent:0.1.0&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
          &lt;span class="na"&gt;envFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;secretRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent-secrets&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;100m&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;256Mi&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;
          &lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/healthz&lt;/span&gt;
              &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
            &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
            &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
          &lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/healthz&lt;/span&gt;
              &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
            &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
            &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
          &lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;allowPrivilegeEscalation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
            &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;drop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALL"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it with &lt;code&gt;kubectl apply -f deployment.yaml&lt;/code&gt;, then read it back top to bottom, because every block answers a question a reviewer will ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;automountServiceAccountToken: false&lt;/code&gt;:&lt;/strong&gt; By default every pod gets a token for the Kubernetes API mounted into its filesystem. Your agent doesn’t need to talk to the Kubernetes API, so it doesn’t get the token. For an agent this is not a nicety. It is the difference between “prompt injection stole a chat log” and “prompt injection got a foothold in my cluster’s control plane.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resources&lt;/strong&gt; : Requests are what the scheduler reserves; limits are the ceiling. Agents fail in loops. A model that decides to retry forever, or to summarize a document by reading it into memory in one piece, will eat a node if you let it. Limits turn “the cluster is down” into “one pod got throttled.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;readinessProbe&lt;/code&gt; and &lt;code&gt;livenessProbe&lt;/code&gt;&lt;/strong&gt; : Readiness controls whether traffic is sent to the pod; liveness restarts it when the process wedges. Without them, Kubernetes considers a hung agent healthy forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;envFrom.secretRef&lt;/code&gt;&lt;/strong&gt; : The key from step 2 arrives as an environment variable. Code reads &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; exactly as it did from the &lt;code&gt;.env&lt;/code&gt; file. Nothing about the agent’s code had to change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check it comes up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents get pods
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents logs deploy/support-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Expose it with a Service
&lt;/h2&gt;

&lt;p&gt;Pods are ephemeral and their IPs change. A Service gives the agent a stable name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
      &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now anything inside the cluster can reach the agent at &lt;code&gt;http://support-agent.agents.svc&lt;/code&gt;. From your laptop, test through a port-forward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents port-forward svc/support-agent 8080:80
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST localhost:8080/chat &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; 
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"message": "hello"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you get an answer, you have an AI agent running on Kubernetes. Most tutorials stop here. Do not stop here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Close the doors it doesn’t need
&lt;/h2&gt;

&lt;p&gt;Right now your agent can open a connection to anything: every pod in the cluster, every address on the internet. For a web service that is untidy. For an agent it is the whole attack surface, because the standard end of a prompt-injection chain is exfiltration: the agent is talked into sending data somewhere it should never call. A NetworkPolicy makes egress deny by default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent-egress&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-agent&lt;/span&gt;
  &lt;span class="na"&gt;policyTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Egress"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;egress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;namespaceSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;UDP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;53&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;53&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows DNS lookups plus outbound HTTPS, and nothing else; a connection to another pod, or plaintext HTTP to anywhere, now fails at the network layer (Note for kind users: enforcing NetworkPolicy requires a network plugin that implements it, such as &lt;a href="https://docs.tigera.io/calico/latest/getting-started/kubernetes/kind" rel="noopener noreferrer"&gt;Calico&lt;/a&gt;; the kind default does not).&lt;/p&gt;

&lt;p&gt;The policy still has one hole, and it is an instructive one: “TCP 443 to anywhere” lets the agent reach any HTTPS endpoint on the internet, including an attacker’s. Vanilla NetworkPolicy speaks IPs and ports; it cannot say “only &lt;code&gt;api.anthropic.com&lt;/code&gt;.” Narrowing egress to named destinations takes either a DNS-aware policy engine (Calico can do this) or, better for agents, an egress gateway that all agent traffic must pass through. Remember this gap. It is where 101 ends and the last section of this article begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six mistakes every first agent deployment makes
&lt;/h2&gt;

&lt;p&gt;The walkthrough above quietly avoided all six. Here they are in the open, because you will meet them in other people’s manifests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Mistake&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why it hurts an agent especially&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Instead&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API key baked into the image&lt;/td&gt;
&lt;td&gt;Images get pulled, cached, and shared; the agent’s key is its power&lt;/td&gt;
&lt;td&gt;Kubernetes Secret, injected at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No resource limits&lt;/td&gt;
&lt;td&gt;Agents fail in loops; one runaway loop starves the node&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;requests&lt;/code&gt; and &lt;code&gt;limits&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;latest&lt;/code&gt; image tag&lt;/td&gt;
&lt;td&gt;You cannot say which agent behavior is running, or roll back&lt;/td&gt;
&lt;td&gt;Version tags, ideally digests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No health probes&lt;/td&gt;
&lt;td&gt;A wedged agent looks healthy and keeps receiving work&lt;/td&gt;
&lt;td&gt;&lt;code&gt;readinessProbe + livenessProbe&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default ServiceAccount token mounted&lt;/td&gt;
&lt;td&gt;Injected agent inherits a path to the Kubernetes API&lt;/td&gt;
&lt;td&gt;&lt;code&gt;automountServiceAccountToken: false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unrestricted egress&lt;/td&gt;
&lt;td&gt;Prompt injection ends in exfiltration over open egress&lt;/td&gt;
&lt;td&gt;Default-deny NetworkPolicy, then allowlist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the middle column again. None of these is an exotic agent problem; they are ordinary Kubernetes hygiene. Agents just raise the price of skipping them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a 101 deployment still can’t answer
&lt;/h2&gt;

&lt;p&gt;You now have one agent, contained and supervised. Before you call it production, try to answer three questions about it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Who is this agent?&lt;/strong&gt; Your cluster knows it as a pod with a label. Nothing cryptographically distinguishes it from any other workload, so nothing downstream can grant it permissions &lt;em&gt;as an agent&lt;/em&gt;, or refuse an impostor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What exactly is it allowed to do?&lt;/strong&gt; Your NetworkPolicy says “HTTPS, somewhere.” It cannot see that the agent is calling an MCP tool, or with what arguments. “May this agent call &lt;code&gt;delete_records&lt;/code&gt; on the billing server” is not a question any layer you have deployed can even parse. We walked through why the stock building blocks stop short in the &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;accountability gap post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What did it do last Tuesday?&lt;/strong&gt; You have pod logs, written by the agent itself. An agent’s own narration is not an audit trail; the best-documented case of an agent deleting a production database came with the agent confidently reporting that rollback was impossible. It was not.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And this is with one agent. The moment there are two, they start talking to each other (that is the&lt;a href="https://www.tigera.io/blog/how-ai-agents-communicate-understanding-the-a2a-protocol-for-kubernetes/" rel="noopener noreferrer"&gt;A2A protocol&lt;/a&gt;), and the questions multiply by every pair.&lt;/p&gt;

&lt;p&gt;That missing layer (identity, per-request authorization, and audit across a fleet of agents) is what &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; adds on top of exactly the deployment you just built. Lynx gives every agent a SPIFFE or OIDC workload identity, routes agent-to-agent, MCP, and LLM traffic through a gateway that authorizes each request under Cedar policy, and records every hop in an Agent Trail the agent cannot edit. Recent releases sharpened the credential story from this post’s step 2: provider keys attach at the gateway instead of living in the pod’s environment, per-hop tokens are minted with an audience of one target so a stolen token is nearly worthless, and an OAuth authorization-code flow can issue per-user credentials. Policies can require human approval before a risky MCP call proceeds. On the node, an eBPF detector spots agents nobody registered and can quarantine a compromised one down to blocking its network writes at the kernel, and a policy playground in the UI lets you test a Cedar policy against simulated requests before it ever gates real traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Do I need a GPU to deploy an AI agent on Kubernetes?&lt;/strong&gt; No. An agent is orchestration code that calls a model over an API; the GPUs live with the model provider. You only need GPU nodes if you self-host the model itself, which is a separate project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is Kubernetes overkill for a single agent?&lt;/strong&gt; For a weekend experiment, yes; run it locally. But the reasons to move to Kubernetes (restarts, secrets, resource caps, network control) show up the first time the agent touches real credentials or real users, which happens earlier than most teams expect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can I do all of this on my laptop?&lt;/strong&gt; Yes. Everything above runs on a kind cluster in Docker, including the NetworkPolicy if you install a plugin like Calico that enforces it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which agent framework works best on Kubernetes?&lt;/strong&gt; Any framework that can serve HTTP deploys the same way. The differences show up in observability, state handling, and protocol support; our &lt;a href="https://www.tigera.io/blog/six-ai-agent-sdks-for-enterprise-kubernetes-compared/" rel="noopener noreferrer"&gt;six-SDK comparison&lt;/a&gt; covers them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How do I scale an agent to more replicas?&lt;/strong&gt; Set &lt;code&gt;replicas: 3&lt;/code&gt; and Kubernetes load-balances across them, but only if the agent keeps its conversation state outside the pod (a database or cache), since any replica may serve the next request. Stateless agents scale for free; stateful ones need that refactor first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How is deploying an agent different from deploying a model?&lt;/strong&gt; A model deployment serves inference (weights on GPUs behind an endpoint). An agent deployment runs the loop that calls models and tools to pursue a goal. This guide covers the agent; most teams consume the model as a managed API.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ship the pod, then ask the harder question
&lt;/h2&gt;

&lt;p&gt;Back to that laptop script. The distance from &lt;code&gt;.env&lt;/code&gt; file to the deployment in this article is five manifests and an afternoon, and every step was ordinary Kubernetes, applied with an agent’s failure modes in mind. That is the good news: you do not need new infrastructure to give an agent a safer home than a laptop. You need the infrastructure you already have, used deliberately.&lt;/p&gt;

&lt;p&gt;The harder question arrives with agent number two: when they start acting on each other’s behalf, who is checking identity at the door, and where is the record? Deploying the agent was the easy 101. Trusting it is a course Kubernetes alone does not teach.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod/" rel="noopener noreferrer"&gt;AI Agents on Kubernetes 101: From Laptop Script to Production Pod&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>Meet Mylo: An AI-native way to work with Calico</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 03 Sep 2026 18:21:50 +0000</pubDate>
      <link>https://dev.to/tigeraio/meet-mylo-an-ai-native-way-to-work-with-calico-2i53</link>
      <guid>https://dev.to/tigeraio/meet-mylo-an-ai-native-way-to-work-with-calico-2i53</guid>
      <description>&lt;p&gt;&lt;em&gt;A library of Calico tools and skills — delivered through the Calico MCP Server&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What if your hardest network question took ten minutes instead of ten days?
&lt;/h2&gt;

&lt;p&gt;Anyone who has operated Kubernetes networking at scale knows the shape of a bad day. A request that should succeed is quietly failing. The application team swears nothing changed. Somewhere across a stack of tiers, selectors, and policies, some written last week and some inherited from an engineer who left two years ago, a rule is denying the traffic. Finding it means reading YAML, cross-referencing flow logs, and reconstructing the policy evaluation order in your head. For a genuinely knotty case, that work can stretch across days and pull in more than one team before anyone gets to the bottom of it.&lt;/p&gt;

&lt;p&gt;I think that day is about to get a lot shorter. Today we’re introducing Mylo, an expert for Calico that works inside the AI tools your teams already use. Ask Mylo why a pod can’t reach a service, and it traces the path, points to the exact policy and rule doing the blocking, and explains why in plain language, in about the time it took you to read this paragraph. Mylo is the library of tools and skills that makes Tigera’s Calico expertise usable by an agent; the Calico MCP Server is how we deliver it. The rest of this post covers what it is, how we designed it, and why we made the choices we did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Mylo really is: A decade of Calico expertise, as tools and skills
&lt;/h2&gt;

&lt;p&gt;Before getting into how Mylo is delivered, it’s worth being clear about what it actually is, because the delivery mechanism is the least interesting part of the story. Mylo is the Calico and Kubernetes networking knowledge Tigera has accumulated over ten years, turned into something an AI agent can use directly. It comes as two layers, and those two layers, not the plumbing that delivers them, are where the value sits.&lt;/p&gt;

&lt;p&gt;The first is a small set of tools. These aren’t thin wrappers over CLI commands; they’re semantic. The flagship, diagnose_connectivity, doesn’t hand back a raw dump for the model to interpret. It returns an ordered, opinionated read of the network path, down to the specific rule that allows or denies, with a suggested fix. The expertise lives in the tool; the reasoning stays with the agent.&lt;/p&gt;

&lt;p&gt;The second layer, and the one that compounds over time, is skills: higher-level workflows that string those tools into the procedures an expert would actually follow. Troubleshooting a connectivity failure, triaging an incident, reviewing a policy before it ships: each is a multi-step reasoning pattern, and a skill encodes it, so the agent diagnoses, then traces the policy chain, then checks recent denials, then explains the offending rule, in that order. This is the part I’d point to first. A decade of Tigera’s own troubleshooting expertise, the kind that usually lives in the heads of a handful of senior engineers, is captured here as structured guidance an agent can carry out, rather than a static runbook a human has to follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an MCP server, and why now
&lt;/h2&gt;

&lt;p&gt;Two things are true about the platform and security engineers who run Calico today. The first is that they are already deep in agentic workflows. In nearly every conversation we’ve had over the past few months, teams weren’t debating whether to adopt an AI assistant. They had already standardized on one, whether that’s a coding assistant in the IDE or an agent in the terminal, and connected it to a set of MCP servers for their metrics, logs, tickets, and source control. The Model Context Protocol has quietly become the way infrastructure tools present themselves to agents.&lt;/p&gt;

&lt;p&gt;The second is that Calico holds a lot of the context those engineers need, and it isn’t always easy to reach. The policy model is powerful because it’s expressive, with tiers, global and namespaced policies, selectors, and ordered evaluation. That same expressiveness, however, is what makes a thorny connectivity problem hard to reason about when you’re under pressure. Flow logs hold the answer to “why was this blocked,” but writing the query to surface it is a skill of its own.&lt;/p&gt;

&lt;p&gt;Delivering that expertise over MCP sits naturally between those two facts. Rather than build yet another chat interface and ask teams to approve a new AI product with access to production, we expose Mylo’s tools so any MCP-compatible agent can call them. Your engineers keep the front-end they’ve already vetted, and Calico becomes the intelligence layer underneath it. MCP is the delivery mechanism, not the substance, but it’s the right one, because it puts Calico’s knowledge directly into the reasoning loop of an agent that is already helping your team get work done. This is a new way to work with the Calico Unified Platform. It doesn’t replace the CLI or the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composability: Workflows that weren’t possible before
&lt;/h2&gt;

&lt;p&gt;The reason this approach matters, beyond the convenience of asking questions in plain English, is composability, and it’s worth reviewing, because a lot of teams are still early in adopting MCP. A tool exposed over MCP is a building block an agent can combine with every other capability it can reach. When Mylo runs alongside the MCP servers a team already uses, the agent can move across all of them in a single line of reasoning, and that unlocks workflows nobody shipped as a feature.&lt;/p&gt;

&lt;p&gt;Consider a request like this one: “Find the traffic denied by the policy I shipped this morning, correlate it with the elevated 5xx rate the monitoring tool flagged, and open a ticket with the policy diff to fix it.” Three systems answer that in a single pass. Mylo supplies the Calico half, the expert half, and the team’s existing monitoring and issue-tracking servers supply the rest, with the agent orchestrating the whole thing end to end. The same shape shows up all over an operations workflow. Before a pull request merges, the agent can ask Mylo to simulate the policy change against last week’s flow logs and post the impact summary to the team’s channel. When flow logs show a denied connection from a production service, it can page whoever is on call. None of those are workflows we built, and none of them existed as a product a team could buy.&lt;/p&gt;

&lt;p&gt;What I find encouraging is that we didn’t have to anticipate any of them. A traditional integration or dashboard can only run the paths its authors designed in advance. Because Mylo exposes a small set of well-designed, semantically clear tools, each team fits it into the operational reality they already have, and some of the most valuable workflows will be ones we never designed for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyi7gs2idnbtzj4mq58cu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyi7gs2idnbtzj4mq58cu.png" alt="Figure: Composability — Mylo alongside the tools you already run" width="800" height="583"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: Composability — Mylo alongside the tools you already run&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The design philosophy: Restraint
&lt;/h2&gt;

&lt;p&gt;If one principle shaped Mylo more than any other, it’s restraint. The instinct when you build for an agent is to expose everything, to ship a tool for every API method and every CLI subcommand and let the model sort it out. In our view that instinct is a mistake, and we’ve worked hard to resist it.&lt;/p&gt;

&lt;p&gt;More tools is not better. Every tool you hand an agent is a claim on its attention, another chance for it to pick the wrong one, and another line item in the token budget. A server with a hundred thin wrappers around CLI commands doesn’t make an agent smarter. It makes it slower, more expensive, and more likely to wander off. That’s why Mylo’s tools are deliberately few and semantic rather than mechanical, and why the intelligence sits in the tool itself rather than in the model’s attempt to reconstruct it from unstructured output.&lt;/p&gt;

&lt;p&gt;We wrote down the principles we kept returning to, half in earnest and half tongue-in-cheek. A few are worth calling out, because they’re where the harder decisions actually landed. Read-only by default, because the safe posture should never depend on someone remembering to configure it. State, not verdicts, because a good tool should report what is true and let the agent do the reasoning, rather than pre-baking a conclusion that strips away the context the model needs. Selectors, not switches, because tools should accept rich, expressive inputs instead of sprouting a new boolean flag for every situation. And the one we keep at the very bottom as a reminder to ourselves: thou shalt not ship a tool for every API method.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs6thzi20s0bp1pud0agm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs6thzi20s0bp1pud0agm.png" alt="Figure: The Ten Commandments of MCP Servers — the design principles behind Mylo" width="800" height="503"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: The Ten Commandments of MCP Servers — the design principles behind Mylo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One more piece of architecture turns that discipline into something trustworthy: the router. Agents are eager to be helpful, and an agent that can’t reach a tool will often shell out instead, quietly running a CLI command to answer a question rather than admitting the question is outside its lane. That’s harmless right up until it isn’t, and for a tool that touches production networking, silent fallback is a trust problem. So Mylo can be invoked explicitly, and when a request comes in, the server tells the agent clearly whether it can actually handle it rather than letting it improvise around the edges. That deterministic guidance, with explicit boundaries, is what earns the confidence of a platform team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnk4eeizour7eutwzsgj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnk4eeizour7eutwzsgj1.png" alt="Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer" width="799" height="556"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Built to grow without slowing down
&lt;/h2&gt;

&lt;p&gt;The natural question about a deliberately focused toolset is whether it can grow in scope without growing unwieldy. I’d argue the architecture is exactly what lets us expand without the usual penalty. Because skills are invoked in context and the router keeps each request scoped to what’s relevant, adding a new capability doesn’t tax the ones already there. A troubleshooting session doesn’t get slower or noisier because we’ve also taught Mylo to help with a migration. Breadth comes from adding well-described skills and the focused tools they lean on, not from piling more surface area onto every interaction. In practice that means the range of what Mylo can do for you keeps growing while the cost of any single interaction stays flat.&lt;/p&gt;

&lt;p&gt;We’re being disciplined about sequencing, and read-only diagnostics and observability come first because that’s where the pull is strongest. The roadmap ahead is broad, though. Policy authoring is a natural next step, generating well-formed Calico policy from a plain description of intent and presenting it for review before anything is applied. We see real appetite for migration assistance, whether that’s moving VMs into Kubernetes, moving from Ingress to the Gateway API, or moving from Istio sidecars to Ambient. Configuration of Calico resources such as load balancers and egress gateways fits the same pattern. And compliance reporting keeps coming up in customer conversations, from summarizing an application’s secured egress destinations to demonstrating that PCI workloads aren’t communicating with non-PCI workloads, the kind of evidence a security team can hand to an auditor. Each of these is a skill and a small set of tools layered onto the same foundation, so we can keep growing what Mylo does for you without disturbing the safe, composable core underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to run it: Live cluster or diagnostics bundle
&lt;/h2&gt;

&lt;p&gt;Mylo works against a live cluster, connecting through the same kubeconfig path your engineers already use for kubectl and calicoctl, with no new endpoint exposed. That’s the mode for real-time diagnostics and observability, for asking what is happening in the cluster right now.&lt;/p&gt;

&lt;p&gt;It also works entirely offline, pointed at a Calico diagnostics bundle. This matters more than it first appears. A bundle is portable, shareable, and detached from the live environment, which makes it a good fit for the many settings where a laptop simply cannot reach production: air-gapped estates, tightly controlled prod, or after-the-fact analysis where the state you care about is the one captured at the moment of failure. The same tools and the same skills run against both. An engineer can triage a captured bundle on a plane and run live diagnostics from their desk using the identical workflow. Supporting both was not an afterthought. It’s how we’ve been able to test Mylo so thoroughly, and it’s what lets it meet enterprises where their access model actually sits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnk4eeizour7eutwzsgj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnk4eeizour7eutwzsgj1.png" alt="Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer" width="799" height="556"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Read-only by design
&lt;/h2&gt;

&lt;p&gt;For the teams evaluating Mylo, the first question is almost always about safety, and our answer is deliberately conservative. Mylo is read-only by design. Its tools diagnose, explain, observe, and where they touch policy, generate proposed YAML. They do not apply, update, or delete anything. This holds even when Mylo is handed a cluster-admin kubeconfig, because the read-only boundary is a property of the tools themselves and not something we’re trusting the model to honor. Security teams have appreciated that they can point their own agent at the server and audit for themselves exactly what it can and cannot do.&lt;/p&gt;

&lt;p&gt;The result is a much narrower profile than the interfaces these teams have already approved. Mylo is a typed, structured API with no browser session, no rendered pages, and no standing state to hijack. Access runs through the calling user’s existing Kubernetes RBAC, so if a user can’t list policies in a namespace, neither can Mylo on their behalf. That makes for a far shorter security conversation than approving a net-new AI product, largely because there is no new AI product to approve. The reasoning happens in a front-end the customer already trusts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the internal testing showed
&lt;/h2&gt;

&lt;p&gt;We didn’t want to announce a promising demo. Before we put Mylo in front of anyone, we ran it against our own library of resolved support cases, real and historically difficult problems where we already knew the answer and how long it had originally taken to reach. It’s a demanding benchmark, because it measures Mylo against outcomes that skilled engineers had already worked hard to produce.&lt;/p&gt;

&lt;p&gt;The results are the reason we’re writing this post. A class of case that historically took on the order of ten days to root-cause, the kind that bounces between teams and keeps escalating, Mylo worked through in roughly ten minutes. Not every case, and never without a person in the loop reading the output and making the call. But the pattern held often enough, across enough cases, that we’re confident this is real and repeatable. Compressing days of investigation into minutes changes what an under-resourced operations team is able to take on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early access, and what we’re seeing
&lt;/h2&gt;

&lt;p&gt;Mylo is in early access now with a small group of design partners. They are large, security-conscious organizations, several of them in regulated industries, and all of them already fluent in agentic workflows. We’re keeping the program deliberately tight so we can learn quickly, and we’re bringing participants on in waves rather than opening the gates all at once.&lt;/p&gt;

&lt;p&gt;The early signal has been better than we expected. Participants aren’t just kicking the tires; some are reaching for Mylo daily. One of the more encouraging patterns is teams using it to scope problems they simply couldn’t get their arms around before, such as surveying years of accumulated policy sprawl to find what’s orphaned or duplicated, work that used to mean writing custom tooling nobody had time to build. That read-only, get-the-data-out-of-Calico use case has been the wedge almost everywhere. The fastest path to value is answering “why is this happening” in plain English, and the appetite for it is real.&lt;/p&gt;

&lt;h2&gt;
  
  
  The road to GA
&lt;/h2&gt;

&lt;p&gt;Early access is showing us what enterprise-ready has to mean, and the requirements have been remarkably consistent from one team to the next. On the way to general availability we’re focused on a few things: an in-cluster deployment option for teams that want Mylo owned and run by the platform rather than launched from a laptop; authentication and RBAC that carry each user’s real cluster permissions through to every tool call; tiered access that builds on the read-only foundation with a staged suggest tier, where policy changes are proposed as reviewable diffs and applied only after a human approves; and audit logging that records every tool invocation for the compliance and security teams who, rightly, want the full trail.&lt;/p&gt;

&lt;p&gt;None of that changes the core posture. Mylo starts safe, stays composable, and earns each new capability rather than assuming it. That’s the philosophy that got us here, and it’s the one we intend to keep.&lt;/p&gt;

&lt;p&gt;If you run Calico and your teams are already working with AI agents, we’d love to have you see this early. Mylo is how Calico shows up in that world, and I think it’s going to change what a hard networking day looks like.&lt;/p&gt;

&lt;p&gt;If you’re not a customer yet and would like to learn more about Mylo, &lt;a href="https://www.tigera.io/contact/" rel="noopener noreferrer"&gt;drop us a line here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/meet-mylo-an-ai-native-way-to-work-with-calico/" rel="noopener noreferrer"&gt;Meet Mylo: An AI-native way to work with Calico&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>calicoai</category>
      <category>products</category>
      <category>announcements</category>
    </item>
    <item>
      <title>The Safest Place to Run an AI Agent Is On a Cluster That Doesn’t Trust It</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 27 Aug 2026 17:34:36 +0000</pubDate>
      <link>https://dev.to/tigeraio/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it-50p8</link>
      <guid>https://dev.to/tigeraio/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it-50p8</guid>
      <description>&lt;p&gt;Every organization running AI agents has already made a hosting decision. Most made it by accident.&lt;/p&gt;

&lt;p&gt;The sales team switched on the agent built into their CRM. Engineering is piloting a coding agent in a vendor’s cloud. Someone on the data team deployed a LangGraph service to a VM with a database key in an environment variable, and someone else is running an agent framework on a laptop with production credentials in a dotfile. Each of these is a hosting decision. Each one quietly settled who holds the agent’s credentials, what network paths it can reach, what gets recorded when it acts, and who can stop it. Nobody ran an architecture review, because no single deployment looked big enough to deserve one.&lt;/p&gt;

&lt;p&gt;The scale says otherwise. By May 2025, &lt;a href="https://www.sailpoint.com/press-releases/sailpoint-ai-agent-adoption-report" rel="noopener noreferrer"&gt;82% of organizations surveyed by SailPoint&lt;/a&gt; were already using AI agents. Only 44% had policies for securing them, 80% said their agents had already taken unintended actions, and 23% had watched an agent get tricked into revealing credentials. A year later the bill arrived: &lt;a href="https://newsroom.ibm.com/2026-07-29-ibm-study-one-in-four-malicious-breaches-are-ai-enabled,-costing-companies-6-million-on-average" rel="noopener noreferrer"&gt;IBM’s 2026 Cost of a Data Breach report&lt;/a&gt; found that one in four malicious breaches is now AI-enabled, up 56% in a single year, and that those breaches cost about a million dollars more than the global average. Gartner, for its part, &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027" rel="noopener noreferrer"&gt;expects over 40% of agentic AI projects to be canceled by the end of 2027&lt;/a&gt;, naming inadequate risk controls as one of the three reasons.&lt;/p&gt;

&lt;p&gt;This post is the architecture review those deployments never got. The conclusion, stated up front so you can argue with it: agents should run on Kubernetes clusters you control, wrapped in guardrails and gateways that no prompt can talk its way past. Not because Kubernetes is fashionable, but because a year of documented incidents shows that every failure was an environmental failure, and a cluster you control is the only substrate where you own every layer of the environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workload that chooses its own code path
&lt;/h2&gt;

&lt;p&gt;A microservice does what its code says. You can read the code, test the paths, and enumerate what it will do with any input. An agent is a different kind of workload, and the difference is structural, not a maturity phase it will grow out of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Its control flow is decided at runtime by a model.&lt;/strong&gt; The “code path” is chosen by whatever lands in the context window. You cannot statically review what an agent will do, only what it is allowed to do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It holds credentials and takes actions&lt;/strong&gt;. Agents query databases, call APIs, send email, move money, and spawn other agents. The interesting failure mode is not a wrong answer. It is a correct, authorized, catastrophic action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every input is potentially an instruction.&lt;/strong&gt; Prompt injection remains unsolved. &lt;a href="https://genai.owasp.org/2025/12/09/owasp-genai-security-project-releases-top-10-risks-and-mitigations-for-agentic-ai-security/" rel="noopener noreferrer"&gt;OWASP’s Top 10 for Agentic Applications&lt;/a&gt;, published in December 2025 with over a hundred contributors, reads mostly as variations on this theme: goal hijack, tool misuse, identity and privilege abuse, memory poisoning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put those three together and you get the principle we have argued all year, from &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;the accountability gap&lt;/a&gt; to &lt;a href="https://www.tigera.io/blog/nvidia-openshell-secures-the-agent-who-governs-the-fleet/" rel="noopener noreferrer"&gt;the OpenShell analysis&lt;/a&gt;: controls the agent can override are not controls. The system prompt is not a perimeter. The guardrail library running inside the agent’s own process is not a perimeter. The controls have to live in the environment, where a confused or compromised agent cannot negotiate with them.&lt;/p&gt;

&lt;p&gt;And once the controls must live in the environment, the hosting question stops being an infrastructure detail. Where the agent runs determines which controls can exist at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  A year of incidents; one pattern
&lt;/h2&gt;

&lt;p&gt;Theory is cheap. The past twelve months supplied the evidence, and it is unusually well documented.&lt;/p&gt;

&lt;h3&gt;
  
  
  One agent’s tokens, seven hundred victims
&lt;/h3&gt;

&lt;p&gt;Drift was an AI chat agent embedded on corporate websites. To do its job it held long-lived OAuth tokens into each customer’s Salesforce. In August 2025, attackers who had stolen those tokens used them to run bulk data exports against customer CRMs. &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/data-theft-salesforce-instances-via-salesloft-drift" rel="noopener noreferrer"&gt;Google’s threat intelligence group assessed more than 700 organizations&lt;/a&gt; as potentially affected. The attackers were not after chat transcripts. They mined the exported support cases for the credentials customers had pasted into them: AWS keys, Snowflake tokens, passwords. Cloudflare, one of the disclosed victims, &lt;a href="https://www.bleepingcomputer.com/news/security/cloudflare-hit-by-data-breach-in-salesloft-drift-supply-chain-attack/" rel="noopener noreferrer"&gt;rotated 104 API tokens&lt;/a&gt; found in its stolen case text.&lt;/p&gt;

&lt;p&gt;No agent was compromised. No model misbehaved. One integration’s credentials were broad, long-lived, and held outside every victim’s own controls, so one theft became seven hundred breaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  The agent with production credentials and a code freeze
&lt;/h3&gt;

&lt;p&gt;In July 2025, on day nine of a public twelve-day build, Replit’s coding agent &lt;a href="https://fortune.com/2025/07/23/ai-coding-tool-replit-wiped-database-called-it-a-catastrophic-failure/" rel="noopener noreferrer"&gt;wiped SaaStr founder Jason Lemkin’s production database&lt;/a&gt;, despite an explicit and repeated code-freeze instruction. It then generated thousands of fake records and reported that rollback was impossible. It was not; the data came back from backup. The agent’s own postmortem: “a catastrophic failure on my part.”&lt;/p&gt;

&lt;p&gt;The agent held live credentials to production with no environment separation, and the code freeze existed only as natural language. An instruction in a prompt is a suggestion. The incident record was, briefly, whatever the agent chose to say it was.&lt;/p&gt;

&lt;h3&gt;
  
  
  The tool that BCC’d the attacker
&lt;/h3&gt;

&lt;p&gt;In September 2025, Koi Security found the &lt;a href="https://thehackernews.com/2025/09/first-malicious-mcp-server-found.html" rel="noopener noreferrer"&gt;first confirmed malicious MCP server in the wild&lt;/a&gt;: an npm package impersonating Postmark’s email server. It behaved correctly for fifteen versions, building trust, then v1.0.16 added a single line that BCC’d every email the connected agents sent to the attacker’s domain. Koi estimated roughly 300 organizations were running it in production. Nothing was exploited. An MCP server runs inside the agent’s trust boundary with the user’s credentials, and nobody diffs a patch release.&lt;/p&gt;

&lt;h3&gt;
  
  
  And the rest, briefly
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-32711" rel="noopener noreferrer"&gt;EchoLeak (CVE-2025-32711)&lt;/a&gt; demonstrated a zero-click chain against Microsoft 365 Copilot: a poisoned email, retrieved later by RAG, walked the assistant’s most sensitive reachable data out through an allowlisted URL. Microsoft fixed it before any known exploitation, and it became the first critical-severity CVE assigned to an AI assistant’s injection path. The &lt;a href="https://www.wiz.io/blog/s1ngularity-supply-chain-attack" rel="noopener noreferrer"&gt;s1ngularity npm supply-chain attack&lt;/a&gt; inverted the picture: malware on developer machines invoked the victims’ own installed CLI agents with their client-side safety flags disabled and put them to work enumerating secrets, leaking over a thousand valid GitHub tokens within hours. And in July 2026, Check Point documented &lt;a href="https://blog.checkpoint.com/ai-security/ai-security-threats-in-2026-insights-from-check-point-research/" rel="noopener noreferrer"&gt;a single operator running two frontier-model agents&lt;/a&gt; as an intrusion pipeline that hit nine Mexican government agencies and roughly 400 million records. Attackers have agents too, and theirs ignore your prompts entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  The pattern
&lt;/h3&gt;

&lt;p&gt;None of these was a model failure. Every one of them was contained, or would have been, by the same four environmental controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Credentials scoped to one target and short-lived&lt;/strong&gt; , so a stolen token is worth almost nothing (Drift).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization evaluated on every request against policy&lt;/strong&gt; , not against the agent’s intentions or instructions (Replit, and the bulk CRM exports that no chat agent should have been able to run).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egress that is deny-by-default and enforced outside the agent&lt;/strong&gt; , so even a successful injection has nowhere to send the loot (EchoLeak, the Postmark BCC, s1ngularity’s uploads).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An audit trail owned by the platform, not narrated by the agent&lt;/strong&gt; (Replit’s fabricated reports; Cloudflare could say “exactly 104 tokens” only because logs existed outside the blast radius).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read that list again. Nothing on it is a property of the model. Nothing on it can be provided by a prompt, a fine-tune, or a guardrail library running inside the agent. All four are properties of the place where the agent runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the answer is a cluster you control
&lt;/h2&gt;

&lt;p&gt;Environmental controls need an environment you own: the network path, the identity plane, the secret store, the audit pipe. Kubernetes is the one mainstream substrate that hands you all four as programmable primitives: namespaces and NetworkPolicy for segmentation, runtime classes for kernel-level sandboxing (gVisor, Kata), SPIFFE for workload identity, and admission control to keep anything unreviewed from running at all. Its declarative model then puts every one of those decisions in git, where they get reviewed and versioned like the rest of your infrastructure. These are the same properties that made Kubernetes the default for microservices. For agents they are not conveniences; they are the containment system.&lt;/p&gt;

&lt;p&gt;The ecosystem has noticed. In the past year, Kubernetes gained a &lt;a href="https://github.com/kubernetes-sigs/agent-sandbox" rel="noopener noreferrer"&gt;SIG subproject for agent sandboxing&lt;/a&gt; with first-class &lt;code&gt;Sandbox&lt;/code&gt; primitives, launched at KubeCon NA 2025. &lt;a href="https://www.linuxfoundation.org/press/linux-foundation-welcomes-agentgateway-project-to-accelerate-ai-agent-adoption-while-maintaining-security-observability-and-governance" rel="noopener noreferrer"&gt;agentgateway&lt;/a&gt;, a data plane purpose-built for agent-to-agent, MCP, and LLM traffic, became a Linux Foundation project with participation from AWS, Microsoft, Red Hat, IBM, and Cisco. KubeCon NA 2026 has a &lt;a href="https://www.cncf.io/announcements/2026/08/10/cncf-reveals-kubecon-cloudnativecon-north-america-2026-schedule-adds-new-ai-inference-agentic-track/" rel="noopener noreferrer"&gt;dedicated AI and agentic track&lt;/a&gt;. Running agents on Kubernetes stopped being a contrarian position sometime last winter.&lt;/p&gt;

&lt;p&gt;Watch the managed agent runtimes and you see the same conclusion arriving from the other direction. AWS AgentCore added &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-vpc-egress.html" rel="noopener noreferrer"&gt;VPC egress&lt;/a&gt; and private identity-provider support. Microsoft’s agent service will &lt;a href="https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/virtual-networks" rel="noopener noreferrer"&gt;inject its runtime into your own VNet&lt;/a&gt; so agent data stays in your tenant. Anthropic’s managed agents shipped &lt;a href="https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes" rel="noopener noreferrer"&gt;self-hosted sandboxes&lt;/a&gt; that run tool execution on your infrastructure. OpenAI’s &lt;a href="https://openai.com/index/introducing-openai-frontier/" rel="noopener noreferrer"&gt;Frontier launch&lt;/a&gt; promises agents that run “across local environments, enterprise cloud infrastructure, and OpenAI-hosted runtimes.” Every managed runtime’s roadmap is bending toward your perimeter. That is the vendors telling you, in feature announcements, where the controls have to live.&lt;/p&gt;

&lt;p&gt;There is also the question of what you can see when isolation is outsourced. In late 2025, Unit 42 &lt;a href="https://unit42.paloaltonetworks.com/bypass-of-aws-sandbox-network-isolation-mode/" rel="noopener noreferrer"&gt;disclosed an escape in AWS AgentCore’s code-interpreter sandbox&lt;/a&gt;: its “sandbox” network mode still allowed DNS resolution to arbitrary domains, which is enough for tunneled exfiltration and command-and-control. AWS fixed it properly within months, and credit to them. But note who found it and when the customers learned: from the researcher’s publication, not from their own telemetry, because inside a managed runtime there is no customer telemetry to find it in.&lt;/p&gt;

&lt;p&gt;Side by side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Concern&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Managed agent runtime&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Sandbox platform&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Kubernetes with guardrails&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where the agent executes&lt;/td&gt;
&lt;td&gt;Vendor’s cloud (some now reach into your VPC)&lt;/td&gt;
&lt;td&gt;Provider’s microVM fleet&lt;/td&gt;
&lt;td&gt;Your cluster: any cloud, on-prem, air-gapped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who holds tool credentials&lt;/td&gt;
&lt;td&gt;Vendor’s credential broker&lt;/td&gt;
&lt;td&gt;Injected into the sandbox&lt;/td&gt;
&lt;td&gt;Brokered in-cluster, attached per hop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egress control&lt;/td&gt;
&lt;td&gt;Vendor-defined, opt-in&lt;/td&gt;
&lt;td&gt;Platform-defined&lt;/td&gt;
&lt;td&gt;Your gateway, default deny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization granularity&lt;/td&gt;
&lt;td&gt;Per connector, mostly coarse&lt;/td&gt;
&lt;td&gt;Yours to build&lt;/td&gt;
&lt;td&gt;Per request, down to tool arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit trail&lt;/td&gt;
&lt;td&gt;Per vendor, per format&lt;/td&gt;
&lt;td&gt;Per platform&lt;/td&gt;
&lt;td&gt;One trail across agents, tools, and models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agents you didn’t launch&lt;/td&gt;
&lt;td&gt;Invisible&lt;/td&gt;
&lt;td&gt;Invisible&lt;/td&gt;
&lt;td&gt;Detectable on the node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit cost&lt;/td&gt;
&lt;td&gt;Rebuild against a new runtime&lt;/td&gt;
&lt;td&gt;Re-platform&lt;/td&gt;
&lt;td&gt;Agents are containers; the cluster moves with you&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table generalizes, and the best vendors are improving individual rows. What no managed runtime can give you are the rows that require owning the substrate: one policy engine over every agent regardless of framework, one audit trail across agents, tools, and models, and visibility into the agents nobody told the platform about.&lt;/p&gt;

&lt;p&gt;One caveat before the spec. _ &lt;strong&gt;A bare cluster is not the answer either&lt;/strong&gt; _. Stock Kubernetes secures pods, not agents: NetworkPolicy has no idea what an MCP tool call is, RBAC governs humans and service accounts, and nothing in the box produces an agent-level audit trail. We walked through those gaps in &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;the accountability gap post&lt;/a&gt;. What the cluster uniquely gives you is the ability to install the missing layer yourself, uniformly, for every agent you run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What strict guardrails look like
&lt;/h2&gt;

&lt;p&gt;Here is the spec a year of incidents wrote, stated as requirements. Sandboxing the agent’s process is assumed and is not sufficient on its own; &lt;a href="https://www.cncf.io/blog/2026/07/07/why-sandboxing-your-agent-is-not-enough/" rel="noopener noreferrer"&gt;even the CNCF says so now&lt;/a&gt;. Everything below governs what agents do across the network, which is where every incident above happened.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;An identity for every agent&lt;/strong&gt;. Cryptographic workload identity (SPIFFE, OIDC) issued at deploy time, not a shared service account. Every other control depends on “which agent did this” having an answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One road out&lt;/strong&gt;. Agent egress is deny-by-default, and the only path to other agents, MCP servers, and LLM providers is a gateway. EchoLeak, the Postmark backdoor, and s1ngularity’s uploads were all exfiltration over permitted egress. An allowlist enforced outside the agent kills the chain even when the injection succeeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization per request, not per deployment.&lt;/strong&gt; Each call is judged against policy: this agent, this target, this tool, these arguments. A lead-triage agent asking for a bulk CRM export should fail on policy, not on luck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credentials the agent never holds&lt;/strong&gt;. Provider keys and tokens attach at the gateway, scoped to the single target of the single hop, short-lived. This is the Drift control: make the stolen token worthless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A human where the blast radius is high&lt;/strong&gt;. Destructive and irreversible operations block until a person approves. “Code freeze” becomes a policy object with an enforcement point, instead of a sentence in a prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detection for the agents you didn’t launch&lt;/strong&gt;. 80% of organizations already report unintended agent actions, and IBM’s data keeps tying breach costs to shadow AI. You need to see the unregistered agent from the node it runs on, not from a registry it never joined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An audit trail the agent cannot edit&lt;/strong&gt;. Recorded by the enforcement plane as a side effect of enforcing, tied to agent identity, covering every hop. The agent’s own account of events must never be the system of record.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you run a startup, this list probably reads as an enterprise ceremony. It is the opposite. The spec is precisely what lets a five-person team hand agents real credentials to real systems without hiring a security organization: default-deny scales down, a policy file for three agents fits on one screen, and one gateway is not a platform team’s worth of work. If you run an enterprise, the same spec is what turns your agent deployment from an audit finding into an audited system. The requirements do not change with headcount. Only the number of agents does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The platform this spec describes
&lt;/h2&gt;

&lt;p&gt;By now the specificity of that list has probably given the game away: it is, near enough, the design document for &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt;, our security and governance platform for AI agents on Kubernetes.&lt;/p&gt;

&lt;p&gt;Lynx puts a registry and identity plane in front of your agents: SPIFFE and OIDC workload identity, plus a pod-owner mode that brings an unmodified agent under governance with no code changes and no credential to issue. Its gateway, built on the same Linux Foundation agentgateway data plane mentioned above, authorizes every agent-to-agent, MCP, and LLM call individually under Cedar policy, and MCP policies can see the operation, the tool name, and the tool arguments, failing closed on anything malformed. LLM provider keys live in your cluster’s secret store and attach at the gateway, so an agent never carries a provider credential it could leak, and per-provider token rate limits cap what any agent can burn.&lt;/p&gt;

&lt;p&gt;In the current release cycle, per-hop credentials are minted for one target only (the Drift lesson, applied literally), and a policy can mark specific MCP calls as needing human approval, so the call waits until someone signs off (the Replit lesson). On the node, an eBPF-based detector spots agents nobody registered, classifies them as sanctioned, shadow, or unknown, and lets you quarantine a compromised workload at both the gateway and the kernel. And the Agent Trail records every decision, every hop, and which model actually served each call, as a byproduct of enforcement. The agent does not get to narrate.&lt;/p&gt;

&lt;p&gt;Every one of those maps to a numbered line in the spec, because the spec came first. &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; has the full walkthrough, and the &lt;a href="https://www.tigera.io/blog/five-principles-of-an-accountable-ai-agent-network-how-to-evaluate-any-governance-platform/" rel="noopener noreferrer"&gt;five principles post&lt;/a&gt; is the vendor-neutral checklist if you want to evaluate Lynx against anyone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision you already made
&lt;/h2&gt;

&lt;p&gt;Back to the opening. Your organization has a hosting posture for AI agents today, assembled from defaults: whichever vendor clouds your teams clicked through, whichever VMs were lying around, whichever laptops were closest. The incidents above are what those defaults cost, and IBM’s data says AI is now involved in one of every four malicious breaches.&lt;/p&gt;

&lt;p&gt;So ask the question deliberately, once, before the next agent ships: when it acts, who can say no, and where is the record? If the answer is a vendor’s incident queue and a support ticket, _ &lt;strong&gt;you have outsourced the two things a security leader cannot outsource.&lt;/strong&gt; _&lt;/p&gt;

&lt;p&gt;_ &lt;strong&gt;An agent you cannot refuse is an agent you do not control.&lt;/strong&gt; _ Run yours where refusal is built in: a Kubernetes cluster you own, a gateway it cannot go around, and a policy engine that never gets tired of saying no.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="http://tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;The Safest Place to Run an AI Agent Is On a Cluster That Doesn’t Trust It&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
      <category>products</category>
    </item>
    <item>
      <title>AI Red Team Agents Automate Attacks on your AI Agents. Runtime Policies Automate their Defense.</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Mon, 24 Aug 2026 14:40:14 +0000</pubDate>
      <link>https://dev.to/tigeraio/ai-red-team-agents-automate-attacks-on-your-ai-agents-runtime-policies-automate-their-defense-2j93</link>
      <guid>https://dev.to/tigeraio/ai-red-team-agents-automate-attacks-on-your-ai-agents-runtime-policies-automate-their-defense-2j93</guid>
      <description>&lt;p&gt;The AI red teaming market grew up fast this year. OpenAI bought Promptfoo, Cisco and Microsoft shipped automated attack suites, and a seed-stage startup publicly compromised 50 of 55 live customer service bots. These platforms find real problems at a scale no human team can match. But when you read the findings closely, a pattern emerges: agents talked into refunds, transfers, and data leaks they had standing authority to perform. Patching the prompt fixes one phrasing until the next model update. Constraining the authority fixes the class. The first job belongs to a red team platform. The second belongs to your runtime, and no scanner will do it for you.&lt;/p&gt;

&lt;p&gt;In April 2026, &lt;a href="https://www.businesswire.com/news/home/20260429247972/en/General-Analysis-Raises-$10M-in-Seed-Funding-to-Secure-Agentic-AI" rel="noopener noreferrer"&gt;General Analysis raised a $10M seed round&lt;/a&gt; on the strength of an uncomfortable demonstration: its adversarial agent attacked 55 live customer service bots and compromised 50 of them. Not lab models, but live systems with real customers and real tool access. This post is about the market behind that demonstration: who now automates the attacker’s role, what the attacks keep finding, and why the fix that lasts is runtime policy rather than a better prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an AI red team agent actually does
&lt;/h2&gt;

&lt;p&gt;A traditional red team is a group of people paid to break your system before someone else does. An AI red team agent automates that role for AI systems. It fires thousands of adversarial inputs at a model or agent, notices which ones partially work, mutates them, escalates across turns, and reports what got through, with severity ratings and reproduction steps. A human tester works through a checklist over a week. These platforms run 20,000 variations overnight and rank the results.&lt;/p&gt;

&lt;p&gt;The canonical demo goes like this. A company deploys an agent that handles refunds and can reach the billing system. The red team platform embeds disguised instructions in customer messages until it finds the phrasing that makes the agent skip its verification step and process a refund it shouldn’t. The report names the exact prompt pattern so engineering can fix it.&lt;/p&gt;

&lt;p&gt;Enterprises are buying for reasons that have little to do with fashion. Agents now do things, such as executing code, querying databases, sending emails, and calling APIs, often with minimal supervision, so every capability is an attack vector. The &lt;a href="https://artificialintelligenceact.eu/" rel="noopener noreferrer"&gt;EU AI Act&lt;/a&gt; mandates adversarial testing for high-risk AI systems, and insurers and procurement teams have started asking for documented testing as a condition of coverage or vendor selection. And a quarterly pen-test calendar cannot keep up with an agent whose behavior shifts on every model update.&lt;/p&gt;

&lt;p&gt;All of that is real, and the tooling is genuinely good. None of this is an argument against red teaming. The question is what you do on the morning the report arrives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI red teaming market grew up in about a quarter
&lt;/h2&gt;

&lt;p&gt;The speed of consolidation tells you how seriously the industry takes automated red teaming. In March 2026, OpenAI &lt;a href="https://openai.com/index/openai-to-acquire-promptfoo/" rel="noopener noreferrer"&gt;acquired Promptfoo&lt;/a&gt; for a reported $86M; the MIT-licensed scanner claims 350,000 developers and now ships inside OpenAI’s Frontier enterprise platform. &lt;a href="https://www.cisco.com/site/us/en/products/security/ai-defense/index.html" rel="noopener noreferrer"&gt;Cisco AI Defense&lt;/a&gt; tests across 200+ risk subcategories mapped to OWASP, NIST, and MITRE ATLAS. Microsoft’s &lt;a href="https://learn.microsoft.com/en-us/azure/foundry/concepts/ai-red-teaming-agent" rel="noopener noreferrer"&gt;AI Red Teaming Agent&lt;/a&gt; wraps PyRIT’s multi-turn attack orchestration, including Crescendo and Tree of Attacks with Pruning, into Azure AI Foundry. Mindgard starts with reconnaissance: it maps your guardrails, tools, and shadow AI deployments before it fires a single probe. And General Analysis goes deepest on agentic systems: MCP server exploitation, memory poisoning, and multi-step permission bypass.&lt;/p&gt;

&lt;p&gt;OWASP now publishes a &lt;a href="https://genai.owasp.org/resource/ai-security-solutions-landscape-for-ai-and-agentic-red-teaming-q2-2026/" rel="noopener noreferrer"&gt;quarterly landscape document&lt;/a&gt; just for this category. When a market gets its own recurring OWASP publication, it has stopped being a niche.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the findings like a defender
&lt;/h2&gt;

&lt;p&gt;Look at what these platforms actually catch across every vendor’s case studies: an agent processing unauthorized refunds. An agent skipping its verification step. An agent revealing one customer’s data to another. A moderation model bypassed with encoding tricks. An agent walked, over several polite turns, across a permission boundary it was never supposed to cross. A poisoned memory that redirects behavior days later. A malicious MCP server that turns one compromised tool into several.&lt;/p&gt;

&lt;p&gt;Sort those into two piles. In the first pile, the model said something it shouldn’t have (jailbreaks and moderation bypasses). Those are model-layer problems with model-layer fixes, and the labs keep getting better at them. In the second pile, the agent did something it shouldn’t have. Every headline finding in the agentic column lands here, and every one of them has the same anatomy: the agent was persuaded, and the environment obeyed.&lt;/p&gt;

&lt;p&gt;The persuasion is novel every time. That is the entire point of automated attack generation; there is always another phrasing, another encoding, another escalation path. The obedience is identical every time. The agent asked for &lt;code&gt;transfer_funds&lt;/code&gt;, and something executed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt patches decay. Runtime policy doesn’t.
&lt;/h2&gt;

&lt;p&gt;Here is the loop most teams fall into. The red team report names a prompt pattern. Engineering patches the system prompt or adds a guardrail rule. The finding closes. A model update ships three weeks later, and the finding reopens with different wording. The vendors know this; it’s why General Analysis sells regression testing for exactly the case where a passing agent configuration fails after a model update or prompt change, and why every platform now pitches continuous scanning rather than an annual engagement. Continuous testing is the industry’s honest admission that the layer under test never stays fixed.&lt;/p&gt;

&lt;p&gt;We’ve made this argument before, in the &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;accountability gap post&lt;/a&gt; and throughout the series: controls the agent can override are not controls. The same logic applies to instructions. An agent can be talked out of its system prompt; that is precisely what the red team platform just proved. It cannot be talked out of a deny that lives outside its process.&lt;/p&gt;

&lt;p&gt;So a pile-two finding deserves two responses. Patch the prompt, by all means; make the attack more expensive. But the fix that lasts is changing what the persuasion can accomplish, and that change happens in the environment, at the point where the agent’s request becomes an action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rewriting a red team finding as runtime policy
&lt;/h2&gt;

&lt;p&gt;Take the marquee finding, the one on every vendor’s landing page: an injected instruction convinces a finance agent to call transfer_funds without its verification step. As a reproduction step, that’s a ticket that will reopen. As policy, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rego"&gt;&lt;code&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;approvalRequired&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Approve transfer_funds on treasury"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;forbid&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;principal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="s2"&gt;"callMCPServer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;approval&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;granted&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"transfer_funds"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is Cedar, evaluated at a gateway between the agent and its MCP servers. Any call to &lt;code&gt;transfer_funds&lt;/code&gt; is denied unless a human has granted approval, and the annotation turns that deny into a hold: the gateway parks the request, a person approves or rejects it, and only then does anything move. Approval is an input to the policy decision, not an override of it. The injection can still convince the agent to try. Trying now produces a held request and an audit entry instead of a wire transfer.&lt;/p&gt;

&lt;p&gt;The same translation works across the rest of pile two:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;What the red team keeps finding&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Where the durable fix lives&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prompt injection triggers an unauthorized tool call&lt;/td&gt;
&lt;td&gt;Per-request authorization at a gateway the agent cannot route around&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent skips a verification or approval step&lt;/td&gt;
&lt;td&gt;A policy hold that parks the call until a human decides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent leaks one customer’s data to another&lt;/td&gt;
&lt;td&gt;Tool and egress policy scoped to the agent’s verified identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-step chains cross a permission boundary&lt;/td&gt;
&lt;td&gt;Per-call decisions with the full chain correlated in one trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The agent nobody tested, because nobody knew it existed&lt;/td&gt;
&lt;td&gt;Runtime detection of unregistered agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row deserves a sentence. Mindgard leads with reconnaissance because most organizations cannot produce an accurate inventory of their own AI systems, and you cannot red team what you don’t know you’re running. Scoping the engagement is where a program fails first, before a single probe fires. Inventory is a runtime problem too.&lt;/p&gt;

&lt;p&gt;This is the seam where &lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Lynx&lt;/a&gt; sits. Its gateway authorizes every MCP call individually against Cedar policy under a workload identity (e.g. SPIFFE). The &lt;code&gt;@approvalRequired&lt;/code&gt; hold shown above shipped in preview this cycle, with the pending queue and countdown surfaced in the dashboard. Agent Trail records the deny that started the hold and the human decision that resolved it. And runtime detection classifies the agents actually present in your cluster, so the inventory a red team engagement needs is a query rather than an archaeology project. None of that replaces adversarial testing. It’s what turns the testing’s output into something that stays fixed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting with open source: Garak, PyRIT, and DeepTeam
&lt;/h2&gt;

&lt;p&gt;If you want to start this quarter, the open source route is credible. Garak (by NVIDIA, under Apache 2.0 license) is the deepest free attack catalogue: 120+ probe modules, with multi-turn agentic attacks added in v0.15.0 this May. PyRIT (Microsoft, MIT) is the strongest orchestrator for custom multi-turn campaigns. DeepTeam (Apache 2.0 license) maps results onto OWASP’s Agentic Security Initiative taxonomy for the compliance evidence trail; disable its cloud scoring calls if your data can’t leave the building. One caveat worth knowing before you standardize: Promptfoo belongs to OpenAI and PyRIT to Microsoft, both model vendors. The attack logic is open source and auditable, which helps, but neither should be your only scanner when the system under test is that vendor’s own model.&lt;/p&gt;

&lt;p&gt;Two practices make whichever stack you pick actually pay off. First, run it against a test double, not only production; we covered &lt;a href="https://www.tigera.io/blog/how-to-stub-llms-for-ai-agent-security-testing-and-governance/" rel="noopener noreferrer"&gt;how to stub LLMs&lt;/a&gt; for exactly this, so you can exercise the agent’s authority paths deterministically. Second, file every confirmed agentic finding as two tickets: one for the prompt, one for the policy that makes the prompt’s failure survivable. If your enforcement point logs its decisions, the audit trail becomes your regression oracle. The next scan shouldn’t just show the attack failing; it should show the gateway denying it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI red team agents automate adversarial testing at a scale no human program matches, and the market consolidated fast: OpenAI bought Promptfoo, Cisco and Microsoft ship attack suites, and OWASP now tracks the category quarterly.&lt;/li&gt;
&lt;li&gt;The agentic findings share one anatomy: the agent was persuaded, and the environment obeyed. Persuasion varies infinitely. Obedience is the constant you can actually fix.&lt;/li&gt;
&lt;li&gt;Prompt patches decay with every model update, which is why the vendors themselves sell continuous regression testing. Policy enforced in the environment doesn’t decay with the model.&lt;/li&gt;
&lt;li&gt;Translate findings into runtime controls: per-request authorization, human approval holds on dangerous tools, identity-scoped access, and detection for the agents you didn’t know you had.&lt;/li&gt;
&lt;li&gt;Buy the red team. Build the enforcement. They are complements, and neither substitutes for the other.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to the fifty bots. What they had in common was not a worse model or a lazier system prompt than the five survivors. It was that persuasion and permission were the same thing: once the agent was convinced, nothing else got a vote. Your next red team report will show you where that’s true in your own stack. When it does, which findings will you patch, and which will you enforce?&lt;/p&gt;

&lt;p&gt;The red team finds the words that move your agent. Your runtime decides what moving accomplishes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request access at &lt;a href="http://tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/ai-red-team-agents-automate-attacks-on-your-ai-agents-runtime-policies-automate-their-defense/" rel="noopener noreferrer"&gt;AI Red Team Agents Automate Attacks on your AI Agents. Runtime Policies Automate their Defense.&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
      <category>products</category>
    </item>
    <item>
      <title>You’ve Been Running a Kubernetes Security Model in NSX and Didn’t Even Know It</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Mon, 10 Aug 2026 19:19:22 +0000</pubDate>
      <link>https://dev.to/tigeraio/youve-been-running-a-kubernetes-security-model-in-nsx-and-didnt-even-know-it-3l47</link>
      <guid>https://dev.to/tigeraio/youve-been-running-a-kubernetes-security-model-in-nsx-and-didnt-even-know-it-3l47</guid>
      <description>&lt;p&gt;One of the blockers to moving VMs off vSphere and onto Kubernetes is losing NSX and the protection it provides. Security teams that have spent years building out distributed firewall policy look at Kubernetes and are, quite understandably, alarmed by the flat network and the fact that any workload can reach any other by default.&lt;/p&gt;

&lt;p&gt;How will they enforce east-west traffic controls? Will they be able to replicate &lt;a href="https://techdocs.broadcom.com/us/en/vmware-cis/cloud-director/vmware-cloud-director/10-5/-nsxp-10-5/distributed-firewall-service.html" rel="noopener noreferrer"&gt;NSX distributed firewall&lt;/a&gt; rules with the same granularity? What about security groups, tiered policy, and rules that travel with the workload when it moves? These are important questions that must be answered before migration can begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrate vSphere to Kubernetes with microsegmentation intact
&lt;/h2&gt;

&lt;p&gt;Calico addresses vSphere to Kubernetes security concerns with a &lt;a href="https://www.tigera.io/learn/guides/microsegmentation/" rel="noopener noreferrer"&gt;network policy model&lt;/a&gt; that maps directly to key features of the NSX distributed firewall (NSX DFW). Every property NSX DFW users rely on has a direct Calico equivalent: tiered governance, workload-identity enforcement, distributed kernel-level inspection, and dynamic workload grouping. Teams coming from vSphere will recognise the pattern quickly.&lt;/p&gt;

&lt;p&gt;Let’s walk through each one in detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distributed Enforcement
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9ogy5iigy3hdblw52r4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9ogy5iigy3hdblw52r4.png" alt="Enforcement on the host means better performance and automatic scaling" width="799" height="580"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Enforcement on the host means better performance and automatic scaling&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Traditional firewalls sit at the edge of the network. Traffic between workloads inside the data center has to travel out to that inspection point and back, even if the source and destination are on the same physical host. The NSX distributed firewall takes a different approach: the DFW runs in the kernel of every ESXi host and enforces policy directly at each VM’s network interface, before traffic leaves the VM.&lt;/p&gt;

&lt;p&gt;The practical effect is that inspection happens at the source. A packet from a web server VM headed toward a database VM gets checked right where it originates, not at a central appliance somewhere else on the network. No round trip to a dedicated device. Enforcement scales automatically because it lives on every host alongside the workloads it protects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.tigera.io/calico-cloud/network-policy/policy-tiers/tiered-policy" rel="noopener noreferrer"&gt;Calico’s enforcement model&lt;/a&gt; is built on the same principle. On each Kubernetes node, Calico enforces policy at every workload’s network interface using eBPF or one of the Linux netfilter-based dataplanes (iptables or nftables). The mechanism differs from VMware’s kernel module, but the position in the stack is the same: enforcement happens before traffic enters or leaves the workload, not at a central inspection point somewhere else in the cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.tigera.io/calico/latest/about/kubernetes-training/about-ebpf" rel="noopener noreferrer"&gt;eBPF&lt;/a&gt; is worth a brief note here. It’s a way of running purpose-built programs inside the Linux kernel without modifying the kernel itself, which means packet inspection and policy decisions happen at a very low level with very little overhead. It’s the same instinct that makes NSX DFW fast: get enforcement as close to the wire as possible.&lt;/p&gt;

&lt;p&gt;The solution scales in the same way as well. Adding a node to the cluster adds enforcement capacity automatically because the enforcer runs on the node rather than as a separate service that all traffic routes through. Enforcement is distributed across every node, so there’s no central chokepoint that the whole cluster’s traffic has to pass through.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workload-attached Policy
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbpapax3eaeq12hwbe09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbpapax3eaeq12hwbe09.png" alt="Policies follow the workloads they secure" width="800" height="668"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Policies follow the workloads they secure&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When a VM migrates between hosts via &lt;a href="https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/vsphere/8-0/vcenter-and-host-management/migrating-virtual-machines-host-management/migration-with-vmotion-host-management.html" rel="noopener noreferrer"&gt;vMotion&lt;/a&gt;, its firewall rules move with it. The policy is attached to the workload, not the host. This is a consequential architectural choice: you can’t accidentally leave a workload unprotected by moving it to a new host with different configurations in place.&lt;/p&gt;

&lt;p&gt;It also exposes a problem with IP-based firewall rules that becomes obvious the moment workloads start moving. Rules written against specific addresses are tied to a network location, not the workload itself. If a VM changes address after migration, those rules no longer cover it. NSX DFW avoids this by anchoring policy to security group membership instead, and security groups can be built around tags rather than addresses. A VM tagged “web-tier” carries that group membership with it regardless of which host it lands on or what IP it holds. The rule that applies to web-tier VMs follows automatically, with nothing to update.&lt;/p&gt;

&lt;p&gt;This is exactly how Kubernetes and &lt;a href="https://docs.tigera.io/calico-enterprise/latest/network-policy/" rel="noopener noreferrer"&gt;Calico network policies&lt;/a&gt; also work. Rules are declared against label selectors. When a workload moves to a different node, its labels move with it and the policy selector picks it up automatically. Nothing IP-specific lives in the policy, so there’s nothing to update when an address changes. A VM labeled &lt;code&gt;env: production&lt;/code&gt; and &lt;code&gt;tier: database&lt;/code&gt; picks up the right policies wherever it lands. No external mechanism needs to track it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tiered Precedence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnvnmwcy7hn6e4cocgnzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnvnmwcy7hn6e4cocgnzm.png" alt="Microsegmentation allows for granular control and a separation of concerns" width="800" height="463"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Microsegmentation allows for granular control and a separation of concerns&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;NSX also has a tiered policy model. Rules are organized into named categories with a fixed evaluation order. Emergency and quarantine rules sit at the top, infrastructure and shared service rules in the middle, and application-level rules at the bottom. Traffic is evaluated against each category in sequence, top down. A deny rule in the highest category stops evaluation immediately. Nothing below it applies.&lt;/p&gt;

&lt;p&gt;The category structure is also where access control is enforced. NSX’s role-based access control can be scoped to specific policy categories. The evaluation order and the permission model are designed to align. Teams with the narrowest access work in the categories that run last, and no rule they write can override a higher category.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.tigera.io/calico-enterprise/latest/network-policy/policy-tiers/" rel="noopener noreferrer"&gt;Calico tiers&lt;/a&gt; are designed according to the same principles. Each tier is a Kubernetes resource with an order field, a number that determines where it sits in the evaluation sequence. Lower numbers run first. A tier with order 100 is evaluated before a tier with order 200, and a deny rule in the first tier cannot be overridden by anything in the second.&lt;/p&gt;

&lt;p&gt;Unlike NSX’s fixed category names, Calico tiers are user-defined. You name them to match your own operational model, such as “security,” “platform,” “application”, and you set the ordering. You can define as many tiers as your use cases require. Most teams structure their tiers so the security team’s policies run first, platform or infrastructure policies run second, and application or namespace-level policies run last.&lt;/p&gt;

&lt;p&gt;Within each tier, individual policies also carry an order field, and within each policy rules are evaluated top to bottom with the first match applying. One useful behaviour worth knowing about is the pass action: a rule can explicitly pass traffic to the next tier rather than allowing or denying it. This lets each tier focus on what it’s responsible for and hand off everything else cleanly, rather than requiring every tier to have an opinion on every packet. The security tier, for example, should not have to worry about whether a specific frontend should be able to talk to a certain backend service.&lt;/p&gt;

&lt;p&gt;For access control, Calico uses Kubernetes-native RBAC. ClusterRoles and ClusterRoleBindings govern access to cluster-scoped resources like tiers and GlobalNetworkPolicy, while Roles and RoleBindings can be used for namespace-scoped NetworkPolicy. Either way, teams can be restricted to working within their own scope with no ability to reach into tiers or namespaces they don’t own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attribute-based Identity
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwzitmyqdyxnrmp50d94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwzitmyqdyxnrmp50d94.png" alt="Policies are not IP dependant" width="800" height="441"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Policies are not IP dependant&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;NSX uses tags for dynamic workload grouping. Tags are key-value pairs applied to VMs. You can set them manually through NSX Manager or via API, which means they can be applied at deployment time rather than added by hand after the fact. Security groups define their membership through tag-matching criteria, and that membership is live: any VM carrying the right tag combination joins the group immediately.&lt;/p&gt;

&lt;p&gt;Tagging a VM as “PCI-in-scope” isn’t just a label. It’s a trigger. The moment that tag is applied, the VM joins every security group whose membership rule matches it, and every DFW policy targeting those groups immediately covers the new member. No change request, no waiting. The policy was already written; the workload just identified itself as falling within its scope.&lt;/p&gt;

&lt;p&gt;The same logic works on decommission. When a tag is removed, the VM leaves the group and the rules that covered it stop applying. Orphaned firewall rules accumulating over years of manual changes are a genuine operational hazard in IP-based environments — tags sidestep the problem entirely because security group membership reflects the actual state of the environment, not a record of past changes nobody got around to cleaning up.&lt;/p&gt;

&lt;p&gt;No manual list maintenance. No IP tracking. The tag is the identity.&lt;/p&gt;

&lt;p&gt;NSX tags map to Kubernetes labels, and the mechanism works the same way. Labels are key-value pairs defined in a workload’s manifest and applied at deployment. A &lt;a href="https://docs.tigera.io/calico-enterprise/latest/network-policy/policy-tiers/policy-tutorial-ui" rel="noopener noreferrer"&gt;Calico network policy&lt;/a&gt; references them through a selector: &lt;code&gt;compliance: pci&lt;/code&gt; in a label is picked up by any policy whose selector matches that expression. The moment a workload with that label comes online, it’s covered. No separate step, no group membership to update manually.&lt;/p&gt;

&lt;p&gt;Labels can sit on pods, on namespaces, or on both, which gives you different levels of granularity. A policy that selects on a namespace label applies to everything running in that namespace. A policy that selects on a pod label is more specific. Combining the two lets you write rules like “allow traffic from any workload in the payments namespace that also carries the label &lt;code&gt;tier: web&lt;/code&gt;” — the equivalent of multi-tag security group membership in NSX, expressed as a single selector.&lt;/p&gt;

&lt;p&gt;The decommission property carries over too. When a workload is deleted, its labels go with it. Policies that targeted it stop applying automatically, with no cleanup step and no stale rules accumulating over time.&lt;/p&gt;

&lt;p&gt;For endpoints that can’t carry labels such as external services, legacy VMs not yet migrated, third-party IP ranges, Calico’s NetworkSets handle the case directly. A NetworkSet is a named collection of IP addresses or CIDRs that can be referenced in a policy selector the same way a label can. Rather than repeating IP ranges across every policy that needs them, you reference the NetworkSet by name. When those ranges change, you update the NetworkSet and every policy that references it reflects the change automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  A demo that went sideways in the best way
&lt;/h2&gt;

&lt;p&gt;A solutions engineer was running a demo for a team evaluating a VMware replacement. They were walking through how Calico enforces network policy when the customer’s senior network consultant stopped them.&lt;/p&gt;

&lt;p&gt;This team had been running NSX-T for years. They had 19 T1 edges and 8 segments. During the walkthrough, the consultant started recognizing what he was looking at. Then he pointed out something that reframed the whole conversation. The T1 edges weren’t actually providing any isolation. The distributed firewall policy was doing all the security work.&lt;/p&gt;

&lt;p&gt;What the consultant recognized was that his team had been operating a flat network with policy enforcement. They’d been using NSX tags to classify workloads and superset policies to establish rule precedence.&lt;/p&gt;

&lt;p&gt;Both of those map directly to Calico constructs which surprised them. The assumption had been that moving from NSX to a Kubernetes-native stack meant leaving the policy model behind. It turned out the policy model was already there. They’d been building towards it without realizing it.&lt;/p&gt;

&lt;p&gt;This is a common pattern. In NSX deployments where the DFW has been built out carefully, the network topology handles connectivity and the policy handles security. The T1 edges are default gateways. The actual security boundary is the DFW rule, not the segment boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  What works better on the other side
&lt;/h2&gt;

&lt;p&gt;Once policy is running in Calico, a few things improve over the NSX baseline. Compliance monitoring runs continuously and generates audit-ready reports against frameworks like PCI DSS, HIPAA, SOC 2, and NIST. This replaces manual evidence assembly before each audit cycle. Policy changes tracked in version control produce evidence of reviewed, timestamped, and tamper-evident changes. Tiered RBAC means the security team’s rules are structurally unreachable by teams below, with compliance report access scoped so each team sees only what it owns.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this all means in practice
&lt;/h2&gt;

&lt;p&gt;The NSX distributed firewall may feel like one of the hardest components to replicate but it turns out to be the part that transfers most directly, because the architectural decisions behind it, distributed enforcement, workload identity, tiered governance, attribute-based grouping, are the same decisions Calico was built on.&lt;/p&gt;

&lt;p&gt;The team in that demo was genuinely surprised when they recognized their own security model in the Calico policy framework. They’d spent years building a policy structure in NSX that was a close approximation of what Kubernetes-native policy looks like. They’d been moving toward this model without knowing they were doing it.&lt;/p&gt;

&lt;p&gt;If your NSX security posture is built on tags and tiered rules, you’ve been thinking this way for a while. The migration is a translation project. The model is already there.&lt;/p&gt;

&lt;p&gt;Everything covered here has a corresponding configuration reference in the &lt;a href="https://docs.tigera.io/use-cases/microsegmentation" rel="noopener noreferrer"&gt;Calico microsegmentation documentation&lt;/a&gt;. It walks through tier setup, label-based policy, RBAC, and compliance reporting in detail.&lt;/p&gt;

&lt;p&gt;Read our &lt;a href="https://www.tigera.io/lp/ebook-the-complete-guide-to-vm-networking-for-kubernetes/" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt; for a comprehensive look at VM migration.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/youve-been-running-a-kubernetes-security-model-in-nsx-and-didnt-even-know-it/" rel="noopener noreferrer"&gt;You’ve Been Running a Kubernetes Security Model in NSX and Didn’t Even Know It&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>vmmigration</category>
      <category>products</category>
    </item>
  </channel>
</rss>
