I spent three weeks in July running a hard test against an internal agent fleet: treating a multi-agent system the same way I would treat a Kubernetes cluster that holds production secrets. The result was a 23-page gap analysis that I have since pushed back into the team's security posture doc. The interesting result is not what the gap analysis found — it is that every gap the agent fleet had was a gap that the cluster it ran on had already solved. The agent fleet was running on top of platform primitives that did not extend to the agent layer. The platform team had built isolation, identity, supply chain, and audit. The agent team had built none of those for the agents themselves.
AI agent security posture is the discipline of bringing those platform primitives down to the agent layer. It is not a CSPM problem. It is not a prompt injection problem. It is the four-control problem at the intersection of identity, isolation, supply chain, and audit, with a fifth control — observability — that makes the other four auditable. This guide walks the framework, the four controls, the artifact layout that makes an agent fleet auditable, and the practical starting point for a team that is starting from zero.
Why agent security is not a CSPM problem
The natural temptation is to bolt AI agent security onto Cloud Security Posture Management. It is the wrong drawer. CSPM is built around the inventory of cloud resources — which VMs, which S3 buckets, which IAM roles, which firewall rules — and the posturing questions that follow: is this bucket public, is this role over-scoped, is this security group misconfigured. The unit of audit is a long-lived cloud resource. The data model is cloud-native. The remediation loop is GitOps-driven.
Agents do not fit that model. An agent is a transient, ephemeral composite — a model call, a tool dispatch, a multi-step reasoning trace, a sub-spawned child agent. The unit of audit is a parent→child invocation chain that lives for seconds, not a load balancer that lives for months. The data model is event-native, not resource-native. The remediation loop is not GitOps — you cannot "GitOps" a tensor that the model emitted in a single inference. The threats are different: prompt injection rather than SQL injection, model SBOM swap rather than image CVE, agent identity theft rather than service account compromise.
This is why the major product category that has emerged in the second half of 2026 is "agent security posture" rather than "cloud security posture for agents." The category exists because the underlying primitives are different. Call it whatever the marketing team eventually calls it — Agent Security Posture Management, Agent Trust Fabric, Agent Runtime Security, take your pick — the content is the same four controls plus an observability layer that ties them together.
The four controls every agent fleet needs
After running the gap analysis against three separate agent fleets, the gaps collapse into four control layers. The names will vary by vendor, but every mature fleet I have seen has had to address all four:
- Agent identity and credential scoping. Every agent and every tool the agent can call has a distinct identity. The identity is scoped to the user that invoked the agent (or to a service identity if the agent runs unattended). The token the agent carries is not the user's session token — it is a delegated token that the runtime can revoke at any time and that the agent cannot exfiltrate upward. The pattern is the same as OAuth 2.0 token exchange at the API layer, applied to the agent as the subject.
- Runtime isolation between agents and between tools. The agent process and the tools it calls run in distinct sandboxes. The agent does not have filesystem access to the tool's secrets and the tool does not have filesystem access to the agent's context. The isolation is enforced at the runtime layer, not by convention — the same way container isolation is enforced by the kernel, not by the application code. Sub-spawned child agents run in their own isolated sandbox by default, not by opt-in.
- Prompt supply chain and tool provenance. Every system prompt the agent ships with is signed. Every tool the agent can call has a verifiable provenance — the catalog that defines the tool has a version, the catalog version is bound to the agent invocation, and the agent refuses to call a tool whose catalog version predates the policy floor. This is the SBOM (Software Bill of Materials) concept applied to the agent's prompt and tool surface. The supply chain layer is where the agent SBOM lives — the signed manifest that an auditor can later verify.
- Audit and traceability of every agent action. Every agent invocation produces a trace. The trace captures the parent agent, the subagents it spawned, the tools it called, the prompts it received, the responses it generated, the tokens it consumed, and the user it acted on behalf of. The trace is durable — it survives the agent's lifecycle, lives in a separate audit store, and is queryable by the security team without going through the agent's own logs. The trace is the evidence chain that an EU AI Act Article 12 audit will eventually require.
Three of the four controls are direct analogues of controls that the platform team already runs. Identity is OAuth-scoped tokens. Isolation is the container / sandbox primitive. Supply chain is the cosign-signed image / SBOM layer that the platform's CI already enforces. The novelty is the audit layer — the trace-as-evidence-chain model — and the fact that the controls have to compose at the agent layer, not just the resource layer. The work is not to invent new primitives; it is to wire the existing primitives together at the agent's resolution.
What the agent SBOM looks like
The agent SBOM is the durable artifact that lets a security team answer "what is in this agent" without trusting the agent. It is signed at build time, verified at deploy time, and queryable at audit time. The minimum fields:
- Agent identity. A unique agent identifier (URI, UUID, or content hash). The identifier is stable across deploys — a model upgrade does not change the agent identity, only the model version field.
- Model version. The exact model version, pinned by digest. For a closed model, the model version is the upstream API version. For an open-weight model, the digest is the SHA-256 of the weights blob. The model version is the field that lets a security team answer "which model was running when this incident happened."
- System prompt hash. The SHA-256 of the exact system prompt the agent ships with. Live mutation of the system prompt at runtime is a separate problem (and a red flag — see the observability section below). The hash is the field that lets an auditor compare the deployed prompt against the policy-approved version.
- Tool catalog version. The version of the tool catalog that the agent was built against. The catalog carries the tool's identity, its scope, its expected inputs, and the policy floor on the inputs. The version is the field that lets a security team revoke a tool from a fleet without redeploying the agents — bump the catalog floor, the agent refuses to call the now-disallowed tool.
- Identity model. The identity protocol the agent uses — which OAuth flows, which token format, which delegation rules. The identity model is the field that lets an SSO team verify the agent's tokens against the same IdP that handles human users.
- Isolation profile. The runtime isolation the agent requires — which sandbox, which network namespace, which file system view. The isolation profile is the field that lets a platform team enforce the agent's request against the resource controls it actually needs.
- Signer. The cryptographic identity that signed the SBOM. The same key and the same verification pattern the cosign-signed image pipeline uses. The signer is the field that lets the deployment gate refuse to run an unsigned agent.
The agent SBOM is not a separate tool. It is a YAML or JSON file that ships with the agent, the same way the SBOM ships with a container image. The tools that consume it (the deployment gate, the audit store, the runtime) already exist; the SBOM is the contract that lets them consume an agent the same way they consume a container.
Why prompt injection is the prompt supply chain problem in disguise
The way most teams frame prompt injection — "a user types something that subverts the system prompt" — is the wrong frame. The interesting injection vector is not the user input. It is the tool output. An agent that calls a tool gets a string back. The string is treated as model input. If the string contains an instruction that the model then interprets, the tool output has just performed an injection. The model cannot tell the difference between a tool output and a user prompt. The trust boundary is the same.
This is why the prompt supply chain problem is not a "wrap the user input in a sanitiser" problem. It is a problem about the trust boundary between the agent and the tools it calls. The tools are the supply chain. The agent's contract with the tools has to include a trust model: this tool's output is data, not instruction; this tool's output is data until the agent has independently verified it. The agent SBOM is the place where that trust model is declared. The catalog is the place where the trust model is enforced.
For the deeper walk through the detection patterns, the prompt injection detection guide covers the structural detection stack — separate-token-context, tool-output-as-data markers, and the LLM-as-judge layer that catches what the structural layer misses. The synthesis with the supply chain framing above is what makes the detection stack auditable rather than best-effort.
Isolation: the runtime primitive most fleets skip
Identity, supply chain, and audit are the easy three. They have analogues in the platform layer that the team can copy. Isolation is the hard one, because the agent runtime is a different shape than the container runtime.
A container is a long-lived process with a stable filesystem and a stable network namespace. The agent is the opposite: a transient invocation with a per-call filesystem and a per-call network namespace. The runtime that hosts the agent has to spin up the isolation on demand, tear it down on completion, and verify that the isolation was effective at the end of the call. The pattern is closer to a function-as-a-service isolation model than a container isolation model — the anonymous-function primitive, applied to the agent call.
The things that have to be isolated separately at the agent layer are different from the things that have to be isolated at the container layer. The agent has:
- The model context window. Every agent invocation has a list of messages, attachments, tool results, and prior turn pairs. The context window is the agent's working memory. It must be isolated across agents (no agent can read another agent's context), and it must be isolated from the tool's filesystem (a tool cannot persist the agent's context beyond the call).
- The tool sandbox. Every tool the agent calls runs in its own sandbox. The tool cannot read the agent's context, the tool's filesystem is ephemeral, and the tool's network egress is policy-controlled. The pattern is the same as AWS Lambda's execution environment, but applied to a tool invocation rather than a function invocation.
- The sub-agent boundary. When an agent spawns a child agent, the child runs in a separate sandbox. The child cannot write to the parent's filesystem, the parent's audit trace sees the child as a distinct subject, and the parent's revocation propagates to the child. The pattern is the same as the Kubernetes pod-with-pod isolation, but applied to the agent overlay.
For teams that are building the runtime from scratch, the practical starting point is to treat the agent runtime as a function-as-a-service runtime with a per-call ephemeral filesystem, a per-call ephemeral network namespace, and a per-call token that the runtime issues rather than the agent carries. The teams that have shipped this in 2026 are the ones that have built the runtime on top of the existing platform primitives rather than reinventing them — the agent runtime is a thin layer on top of the platform's existing isolation, not a separate runtime in its own right.
Audit: the durable evidence chain
The audit store is the part of the agent security posture that makes the other three controls measurable. Without an audit store, the identity layer is just a token that might be revoked; the isolation layer is just a sandbox that might be effective; the supply chain layer is just an SBOM that might be signed. The audit store is the source of truth that the other three controls actually delivered.
For an agent call, the audit record has to capture:
- The agent identity (from the SBOM).
- The model version (from the SBOM).
- The system prompt hash — and the system prompt itself, captured at audit time so a later auditor can verify the hash.
- The user identity the agent acted on behalf of — the same identity that the human SSO would resolve, not a synthetic agent identity.
- The tool calls the agent made — by tool identity, by catalog version, by input, by output, by duration.
- The sub-agents the agent spawned — by identity, by the user that spawned them, by the tool calls they in turn made.
- The tokens the agent consumed — input and output, by model version, by token type (system, user, tool, response).
- The duration of every step — by tool call, by sub-agent, by the whole agent invocation.
The audit record is the thing that gets stored in the audit store. It is not the agent's own logs — the agent's own logs are the transient log the agent writes during its own lifecycle. The audit record is the post-completion, security-team-facing record. The two are different: the agent's logs are the agent's view of what it did; the audit record is the runtime's view of what the agent did. The runtime view is the one the security team trusts.
For the worked-example triage workflow that uses the audit store, the agentic incident harness article walks the investigation pattern. The pattern only works when the audit store is built first; the investigation is the consumer of the audit store, not the producer.
Where observability slots in
Observability is the fifth control, but it is the one that the other four controls depend on for tunability. The agent's identity, isolation, supply chain, and audit each produce metrics: token-revocation success rate, sandbox-breach attempts, SBOM-verification failures, audit-record coverage percentage. Those metrics are the operator's tuning surface. Without them, the security posture is "set and forget" — and the agent landscape has shifted enough in the last 18 months that anything set and forget is already behind.
The observability stack for the agent layer is the same OTel GenAI semantic conventions that the OpenTelemetry AI Inference Tracing guide covers — the gen_ai.* attributes plus the agent-specific extensions. The agent SBOM is the source of the model version, the tool catalog version, and the agent identity that the spans carry. The audit store is the source of the parent→child trace tree that the spans roll into. The LLM monitoring stack tutorial is the worked-example path through the instrumented agent.
Starting from zero: the practical 90-day path
For teams that have not yet started, the 90-day path that has worked most reliably across the three fleets I have helped is:
- Days 1–14: SBOM the agents that exist today. Pick the top five agents by traffic. Capture the seven SBOM fields above. Sign each SBOM with the same key the platform's CI uses. The artifact is initially a YAML file checked into the agent's repo. This is the cheap step that makes the rest of the framework auditable.
- Days 15–30: Identity the agents that exist today. Every agent gets a distinct identity. The token the agent carries is no longer the user's session token — it is a delegated token that the runtime can revoke. The token format is OAuth 2.0 token exchange, with the agent as the subject. The MCP authorization pattern that the MCP enterprise authorization guide covers is the closest existing reference for the delegation pattern.
- Days 31–60: Isolate the tools the agents call. Every tool the agent calls runs in a sandbox. The sandbox has an ephemeral filesystem, an ephemeral network namespace, an ephemeral process tree, and a per-call token. The runtime layer is the same function-as-a-service primitive the platform team already uses; the agent layer is the policy that pins the sandbox to the tool call.
- Days 61–90: Audit the agents that exist today. The runtime emits the audit record on every agent call. The audit record lands in a separate audit store, queryable by the security team. The OTel GenAI semantic conventions are the record format. The storage layer is the same Prometheus + Loki + Tempo stack the rest of the platform uses; the audit store is a separate namespace with different retention and different access controls.
After 90 days, the team has a posture that addresses all four controls. The next 90 days is hardening: wire the SBOM into the deployment gate, wire the catalog version into the revocation path, wire the audit store into the SIEM, and run the first EU AI Act Article 12 audit against the audit store. The first audit is the moment the posture goes from "framework" to "controlled."
What the framework does not solve
There are two things the framework deliberately does not solve. The first is the malicious-insider problem: a developer who has legitimate access to the agent's system prompt can mutate the prompt, deploy the mutation, and the SBOM hash will reflect the mutated prompt. The audit record will show the mutation, but only if the audit store is the runtime's view, not the developer's view. The framework assumes the runtime is the trusted witness — if the runtime is itself compromised, no posture framework can recover. The architectural integrity of the runtime is the floor below which the posture stops being meaningful.
The second is the upstream-model problem. The agent SBOM pins the model version, but the model is trained by an upstream provider. If the upstream provider's weights change without a version bump, the agent's behaviour can change without the SBOM reflecting it. The remediation is the model-side SBOM and the upstream-provider's attestation, which is still an open problem. The framework above does not solve it; it just makes the model version a first-class field that a future audit can probe.
For the broader category posture — the cross-team, cross-vendor, cross-cloud view — the framework is the floor. The next layer is Agent Security Posture Management as a product category, which is the vendor space that has emerged in the second half of 2026 and which I will cover in a separate article. The floor is the four controls plus the observability layer; the ceiling is the product category that aggregates the four controls into a posture score.
Open questions I am still tracking
Three open questions that will shape the next 12 months of agent security posture. I do not have answers for them yet — these are the questions I am probing with the agents I help run, and I will write the answer when the evidence is in.
- What is the right retention window for the audit store? EU AI Act Article 12 requires logs that are "sufficient to reconstruct the system's behaviour" for high-risk systems. The retention window is operationally unspecified. The frameworks I have seen so far land on 6 months for the audit records and 18 months for the system prompts, but the operational cost of 18 months of system prompts at fleet scale is non-trivial. The honest answer is that the right window is workload-specific and that the framework above has not yet collected enough data to converge on a default.
- How do I reconcile the agent SBOM with the model SBOM? The agent SBOM pins the model version. The model SBOM (the upstream provider's attestation about what is in the model) is a separate artifact. The mapping between the two — "an agent that pins gpt-5 is, by inference, using the model that the OpenAI model card describes as gpt-5" — is a trust assumption, not a verification. The trustworthy path is for the upstream provider to sign the model digest at build time and for the agent runtime to verify the digest at load time. The framework above carries the digest field; the trust chain between the digest and the model card is the part that the upstream provider has not yet delivered.
- What is the right posture for personal-data agents? An agent that handles PII is a special case. The audit store has to keep the PII out of the audit record (the audit record is the agent's view of what it did, not the agent's data), but the audit record has to be sufficient to prove that the PII was handled. The pattern that I have seen work is to keep the PII in a separate, encrypted blob referenced by the audit record, and to revoke the encryption key on user-deletion. The pattern is still young; the framework above carries the field but does not yet specify the key-revocation policy.
The agent security posture discipline is a year old. The framework above is the floor I have converged on across three fleets. The ceiling is still moving. The thing that is stable across the moving ceiling is the four controls and the audit store. The rest is the product category working out how to package the four controls into a score.