AI agents

Service accounts and AI agents, governed like everyone else

The wiki page nobody updates, the token nobody rotates, and what to do about the MCP server your engineering team shipped last quarter.

Someone on your engineering team deployed an MCP server last quarter. It authenticates with a token created by a developer who has since changed teams. It can read your production database and post to Slack. It does not appear in your IdP, it was never offboarded when its author moved on, and it is not in your access review.

Three questions you cannot answer today: who owns it, what can it reach, and what has it done.

You have more of these than you think

Non-human identity is not new. Every company has service accounts. What has changed is the rate at which they get created and who creates them.

The service account wiki page.

Last edited by someone who left. It lists six of the fourteen accounts that exist.

The token in the config.

Created for a migration, never rotated, still valid, still reaching production.

The OAuth grant nobody registered.

An engineer connected a tool to Google Workspace on a Tuesday and it has been reading mail ever since.

Iden's Identities screen: 433 identities tabbed as Human 321 and Non Human 112, with service accounts and an MCP token listed in the same table as employees, each showing team and the apps it can reach.

433 identities. 321 human, 112 not. cc_github and the MCP token sit in the same table as Amy Lee, with the same columns and the same offboarding states.

Human and non-human are two tabs of one list, not two products. That is the entire position in a screenshot: 433 identities, 112 of them not people, in the same table with the same columns and the same offboarding states.

The reason these accumulate is structural rather than careless. A service account is created to unblock something, at the moment somebody is trying to ship. There is no joiner process, no manager, no HR record, and nothing that will ever generate an event saying this should stop.

So the population only grows, and every one of them is a credential that works.

Three things agents changed

The decision moved to runtime. A service account does what it was programmed to do, so the code review was the control. An agent decides what to do when it runs, which means the scope you granted is not a backstop any more. It is the entire boundary.

The action surface got wider. A service account calls one API. An agent holds a set of tools and composes them, and the risk lives in combinations nobody enumerated when each tool was approved separately.

The lifecycle got shorter. Agents get created in an afternoon by whoever needed one. They outlive the project, the sprint, and often the person, because nothing about them expires.

Four things have to be true

1Every agent has an owner

Not a team. A person, by name, who answers for what it does.

Ownership is the control everything else hangs off. An agent with no owner cannot be reviewed, because nobody can say whether its access is still needed, and it cannot be offboarded, because nothing connects it to anybody's departure.

Iden treats ownership as required rather than as a field. An agent whose owner leaves does not quietly become an orphan: it appears in that person's offboarding as an item needing reassignment, and the exit stays open until it is.

That only works because agents and people are in the same system. It is the strongest argument against buying a separate tool for this.

2Scope is enumerated, not implied

A token that can read the production database can read all of it. An agent that needs three tables should reach three tables.

Every grant an agent holds is recorded the way a person's is: what it can reach, which policy allowed it, and who approved it. Which makes review possible, because you can put an agent's actual capabilities in front of its owner rather than the name of a role.

Salesforce accounts inside Iden, listing users with their role, profile, licences and permission sets, with three integration users appearing inline among the people.

One app's accounts. billing@, hs-syn@ and an MCP integration user are in the list with everybody else, carrying the same profiles and permission sets.

Three of those Salesforce accounts are not people. They carry the same profile, the same licence and the same permission sets as everybody above them, which is the only way to answer what an integration user can actually reach without going and reading a config file.

3Credentials expire

The token that never rotates is the most common finding in this category and the one with the longest tail: issued in an afternoon two years ago, still valid, still reaching production.

Short-lived credentials issued per session are the right ceiling. Where an agent has to hold a long-lived one, it carries an expiry and an owner who is told before it lapses.

4The log separates the agent from the person

This is the attribution gap, and it is the part most stacks get wrong.

An agent acts on behalf of a user. In an Okta-style or Entra-style log you see one actor: either the agent, in which case the human vanishes, or the human, in which case the agent does. Neither tells you what happened.

Three cases that look identical in that log and are not:

  1. The user asked for exactly this action.
  2. The user asked for something broader and the agent chose this as a step.
  3. The agent did it on a schedule and the user was not involved at all.

Closing that gap needs the agent identity, the human it acted for, the session that connects them, and what the agent was asked to do. Iden records all four, so an incident review can reconstruct the chain rather than guess at it.

An Iden access review for Retool under a SOC 2 campaign, 57 pending and 43 done, listing each user with employment status, department, role and groups, with approve and revoke on every row.

A SOC 2 review of one app. Two rows are flagged because the employee is Inactive in HR and still holds access, and three of the rows are not people.

And they get reviewed like everybody else. Three rows in that campaign are not people, and they are in it because a service account holding access nobody has looked at in two years is the oldest and broadest grant in most estates.

Agents calling Iden, not just Iden governing agents

Everything above is one half of the problem: your agents are identities and they need governing.

The other half runs the opposite way. Your agents can call Iden, and for routine identity work that is where the work should happen.

An engineer in a coding session needs a teammate added to a service. They do not open an identity console or a ticket form. They say it in the session they are already in. Their agent resolves the identity, checks which policy applies, and files the request, and the engineer never left what they were doing.

Three constraints make that safe rather than reckless.

Access is delegated, never held. An agent calling Iden carries the identity of whoever invoked it: the admin running the action, or the end user asking for access. It has no standing of its own, which is the same rule this page argues for everywhere else. It would be strange to demand ownership and attribution of your agents and then let ours act anonymously.

It files, it does not grant. The model works out what is being asked for, who owns it and which policy applies, then creates an access ticket that follows the approval workflow your admins defined. The intelligence is in getting the request right. The decision stays where it was.

Every surface is the same policy engine. A coding agent, Slack, the console and the API are different doors into one record. Which door the work came through is a field in the log, not a different set of rules.

That is covered properly on agentic IGA, including how it differs from an assistant living inside a vendor's product.

What actually changes

A wiki pageWith Iden
OwnershipWhoever created itA named person, required
Credential lifetimeUntil something breaksShort-lived, or an expiry with an owner
ScopeWhatever was easiestEnumerated, and reviewable
When the owner leavesIt becomes an orphanIt appears in their offboarding
Audit trailThe agent, or the humanThe agent, the human, and the session

What this does not do

It does not stop an agent doing something stupid inside its scope. Governance decides what it can reach, not whether each action was wise. That is a different control and mostly lives in the runtime.

It does not discover what you never connected. An agent authenticating with a static key against an app Iden has no connector for is invisible, same as any other access in an unconnected app.

And it does not settle the standards question. SPIFFE, workload identity federation and the MCP authorisation spec are all moving, and anybody claiming this is a solved layer is selling something. What is stable is the part above the substrate: ownership, scope, expiry and attribution are required whichever way the plumbing lands.

Frequently asked questions

A service account does what it was programmed to do, so the code review was the control. An agent decides what to do at runtime, which makes the scope you granted the entire boundary rather than a backstop, and it means the audit log has to record intent as well as action.

An agent acting for a user shows up in most audit logs as either the agent or the user, never both. So you cannot separate an action the user asked for from one the agent chose. Iden records the agent, the human and the session that connects them.

Yes. An MCP server is a delegated-authority boundary and is governed as one: it gets an identity, an owner and a scope, and the tools it exposes are entitlements rather than one undifferentiated grant.

Look for OAuth grants nobody registered, API tokens created by an engineer who has since changed teams, and service accounts with no owner. That is where they show up first, usually well before anybody calls them agents.

Yes, and that is half the point. An agent calling Iden acts as the person who invoked it and can file access tickets that follow your approval workflows. It cannot grant access on its own authority, because it does not have any.

No, and separating it is the mistake. An agent whose owner leaves has to appear inside that person's offboarding, which only works if agents and people live in the same system.