Security

Writing the Service Account Inventory Your Auditor Will Ask For

Antonio Evans10 min read

A split-view scene: on the left, a security engineer at a laptop updating a service account inventory spreadsheet with columns for owner, purpose, last used, and exception status; on the right.
Key points

Key points

  1. 1A service account inventory becomes audit evidence when every row names a human owner, a business purpose and a last-used date a reviewer can trace to a named log.
  2. 2Twelve columns cover the minimum: identifier, system, owner and team, purpose, authentication method, privilege level, creation date, last used, last reviewed, next review due, rotation date and exception status.
  3. 3Tie review cadence to risk tier: quarterly for privileged or internet-facing accounts, semiannual for internal production, annual for low-risk batch jobs.
  4. 4Orphans and exceptions belong in the same workbook as normal accounts, each with a dated decision and a named decision maker so a reviewer never has to ask a follow-up question.

Start from the auditor's evidence model, not from your tooling

Auditors do not accept a screenshot of a console. They gather substantive evidence in specific forms: original source documents, physical observation, third-party confirmations, comparisons against external market data, and independent recalculation of your own schedules (GBQ). The PCAOB's inventory standard shows the same logic in a different domain: when perpetual records are checked periodically against counts, the auditor can shift from full observation to testing the reliability of the counting procedure itself (AS 2510). That distinction matters for you. A one-off inventory is a photograph. An inventory with a documented cadence, a stated owner for each row and a record of when it was last tested is a control the reviewer can rely on.

So the question to ask while you build the sheet is not "what do I need to trace this account?" but "what would someone outside my team need to conclude that this account is justified, owned and monitored?" That reframing changes almost every column.

Two ideas from the service account literature do most of the work. The first is that a non-human identity can be assessed on four axes: owner, purpose, path (where the credential is accepted) and proof (recent activity tied to that path) (Windows Active Directory). The second is that you cannot revoke what you cannot see, which is why the inventory must exist before the offboarding runbook, not after (MavenHandle). An inventory built around those two ideas answers the security team's questions and the auditor's questions at the same time.

The columns, and what each one is really proving

Every column exists to answer a specific reviewer question. If a column answers none, drop it; a wide sheet nobody updates is weaker evidence than a narrow one that is current.

ColumnReviewer question it answersEvidence standard
Account identifierWhat exactly is this identity called in the system?Exact value matchable in the source system, including realm or namespace
System or applicationWhere does this identity authenticate?Named system, not a team name
Owner: named personWho will attest this is needed now?A current employee with a manager on record
Owning teamWho staffs and funds maintenance?Team with a manager on record
Business purposeWhat breaks if this is disabled?One sentence readable by a non-engineer
Authentication methodPassword, key, certificate, managed identity?Matches a known, allowed method list
Privilege levelRead, write, admin, or the actual role name?The assigned role, not an estimate
Creation dateHow old is this, and who asked for it?System timestamp
Last used dateIs it still doing work?Timestamp from a log, with the log source named
Last reviewed dateWhen did a person last look at this?Date plus reviewer name
Next review dueWhen is the next attestation?Derived from the risk tier
Rotation dateWhen was the secret last changed?Date, plus where the current secret lives
Exception statusIs this a known deviation with a decision?Approved, pending or none, with a decision reference

The authentication method column deserves care because it decides what "rotation" even means. A long-lived API key sitting on a laptop is a different animal from a token issued on request. Google Cloud lets you create short-lived credentials for a service account directly, which removes the standing secret altogether (Google Cloud IAM). OpenShift bound service account tokens are audience and time-bound, so a token stolen from a pod has a narrow window (Red Hat). Kubernetes service accounts exist as objects in the API server and are namespaced, so they need inventorying per namespace, not per cluster (Kubernetes). When your sheet records "managed identity, one hour token", a rotation date of "not applicable, short-lived" is stronger evidence than a date nobody dares change.

On Windows the same distinction applies. Microsoft recommends group managed service accounts whenever possible, because they give one identity for services across a server farm, and it warns that service accounts should not sit in privileged groups, with each service having its own account for auditing purposes (Microsoft Learn). If the method column says gMSA, the rotation column can say "automatic, platform-managed", and the reviewer stops asking about password age.

One column stays out on purpose: the secret value. Record a secret's name, type, location and permission, never its value, or the inventory becomes the next breach (MavenHandle). The same discipline applies to application passwords, which belong only in the client's configuration file and never in screenshots, chat messages, tickets or repositories (UiChemy).

Naming the human owner is the hard column

The most common failure in a service account inventory is a row where the owner is a team alias. Ask who would notice if the account were disabled on a Friday. If the answer is "the team", nobody has attested to it.

Google Cloud's guidance treats service accounts as resources with a naming and documentation convention, created single-purpose, and disabled before deletion when they appear unused (Google Cloud IAM best practices). Every one of those recommendations assumes a human can be found to confirm. Mapping each non-human identity back to a human owner is now an explicit product category, which tells you how routinely this is skipped (Entro). Non-human identities are reported to outnumber human users 17 to 1 in surveyed organizations, and most are created automatically by cloud platforms and orchestration tools rather than deliberately by a person (Veza). At that ratio, "ask around" is not an ownership method.

A decision rule that holds up: the owner must be a person who can answer three questions without research. What does this account do? What breaks if it stops? When was it last changed? If they cannot answer the third, the row is listed, not owned.

Naming conventions do real audit work here. A prefix that encodes environment, system and function (for example prod-billing-reporting-reader) lets a reviewer spot a misconfiguration by eye before reading the purpose column, and it prevents collisions where two accounts in different regions share a name.

Orphans: how to present an account nobody will claim

An orphaned service account is one with no accountable owner on record; a stale one is an enabled non-human identity with no legitimate usage inside a defined window. The two overlap but are not identical, and an account can be quiet in the directory while still accepted by a third-party system through cached credentials (Windows Active Directory). This is the part of the sheet a reviewer tests hardest, because it is where the risk sits.

Three presentation rules make orphans actionable.

First, never delete the row and never leave the owner blank. Move orphans to a dedicated tab with the same columns plus four more: date discovered, checks performed before calling it orphaned, intended disposition, and the date the disposition was carried out. A blank owner in the main tab reads as an oversight rather than a finding.

Second, do not purge on a short inactivity window. An account running a quarterly job looks dead at 30 days and is very much alive at 90, so the detection window has to reflect workload cadence; 90 to 180 days is the range suggested depending on cadence (Windows Active Directory).

Third, give every orphan a dated decision rather than a status of "unknown". Keep the vocabulary small: retained with a named owner assigned, retained under exception, disabled pending deletion, or deleted. Disabling before deleting is the safer order because it is reversible and produces a clean record of what breaks (Google Cloud IAM best practices).

A worked example. Suppose discovery finds 40 accounts with no sign-in for 120 days. Do not disable all 40 on one day. Accounts with a readable purpose tied to a live system get an owner assigned and 30 days of observation. Accounts with no readable purpose get disabled, with the team owning the surrounding infrastructure notified. Accounts with a valid purpose but no available owner go to the exception register with a decision date. You end up with three lists a reviewer can sample. One list of 40 with a status column is evidence only that you noticed.

Exceptions and AI agent credentials

An exception is a documented departure from your own standard, and it belongs in the inventory rather than a separate document. A reviewer reading a row that breaks the rules needs to see, in place, that the break was approved, by whom and until when. If the approval lives in a ticket thread, you will spend a day collecting it.

The exception fields that work: type (long-lived credential, shared credential, privilege beyond need, undocumented purpose), one-sentence justification, approver, approval date, expiry date and the compensating control. Expiry is the field teams forget. An exception without an expiry is a permanent waiver with a nicer name.

AI agent credentials are the fastest-growing category in that register, and they break the usual assumptions twice. The first is that the credential often belongs to a person's tool rather than to a system. When a developer connects an AI coding tool to internal systems through MCP servers, the resulting API keys are often generated directly from each service, stored locally and invisible to centralized identity infrastructure, so disabling the person's SSO account does not revoke them (Scalekit). The contractor version is worse: there is often no laptop to collect and the contract can end with a day's notice (Scalekit).

The second is that an agent acts on behalf of someone, so two identities need recording. A workable set of rules: give every agent its own identity separate from the user it serves, exchange the user's token for a new narrower one rather than passing it through, log both identities and the decision for every action, check authorization on every tool call, require out-of-band approval for irreversible or external actions, and make revocation instant and cascading, tested before you need it (WorkOS). Each rule assumes a place where "every agent" is listed. Your inventory can be that place: add an agent flag and a delegation column naming the human the agent acts for.

Token-based methods add a layer a password-based sheet misses. Provider documentation describes introspection and revocation endpoints, automatic rotation on expiry, and a default token lifetime that can be configured at creation (authentik). Teams often want shorter token lifetimes for service accounts than for human users and find that realm-wide settings apply to both, which is a constraint worth recording on the row rather than rediscovering at review (Stack Overflow).

A review cadence you can defend

Cadence is where an inventory becomes a control. Pick tiers by blast radius and exposure, write the tier into the sheet, and derive the next review due date from it so nobody has to remember.

TierQualifying accountsReviewAttestation required
1Privileged roles, internet-facing endpoints, credentials usable against customer dataQuarterlyNamed owner confirms purpose and access in writing
2Internal production workloadsSemiannualOwner confirms; reviewer spot-checks activity logs
3Low-risk batch jobs on internal schedules, read-only reportingAnnualOwner confirms; activity check only

Two adjustments matter in practice. An ownerless account moves to tier 1 regardless of its permissions, because the risk is the missing sponsor, not the size of the grant. And an account whose last-used date is older than two review cycles is a removal candidate rather than a renewal candidate, since renewal without evidence is the rubber-stamping auditors look for.

Rotation is a separate clock from review, and conflating them is a common mistake. Rotation shortens the life of a credential; review confirms the identity is still needed. Rotation at scale is genuinely hard: manual processes, fear of downtime and growing complexity all get in the way (Doppler). Automate where the platform allows it (managed identities, group managed service accounts, short-lived tokens) and record a rotation date only for the residue that needs a manual change. That residue is the honest exception list.

Keeping it current, and what a reviewer samples

An inventory is stale the moment it is finished unless something writes to it continuously. The cheapest sustainable pattern is to generate the skeleton from systems of record, then add the human columns by attestation.

source systems                ->  skeleton rows
  identity provider           ->  identifier, owner, team, creation date
  cloud IAM / AD / K8s        ->  system, authentication method, privilege
  secret manager              ->  rotation date, secret location
  logs / activity export      ->  last used date, source of that date

human attestation             ->  purpose, review dates, exception status
quarterly for tier 1,        ->  next review due recalculated
semiannual for tier 2,
annual for tier 3

The last-used column should name its source, because a reviewer will ask whether it came from authentication logs, application logs or someone's memory. Writing "app logs, 03:00 UTC export" beside a timestamp turns a claim into evidence, the same way a confirmation letter turns a balance into evidence (GBQ).

Sample rather than read everything. Ten tier-1 rows with their purpose sentences and activity timestamps tell a reviewer more about your process than a full read of 900 rows. The PCAOB is moving toward risk-based, technology-aware procedures rather than one uniform approach (Rehmann), and your tiering is that idea applied to identities.

Treat the inventory as a living deliverable with a named maintainer, not a project. The tell is whether it has been updated since the last person left. A departing employee's API keys that were never in any registry are the classic gap, and the only defense is an offboarding line item that removes the person from the owner column and reassigns their rows (Scalekit). When a reviewer asks how you know the list is complete, the answer is a discovery method, a reconciliation date and a count of what discovery found that the sheet did not have.

FAQ

FAQ

How many columns does a service account inventory need at minimum?

Twelve cover the requirements: identifier, system or application, named owner plus team, business purpose, authentication method, privilege level, creation date, last used date, last reviewed date, next review due, rotation date and exception status. Add fields only when they answer a question a reviewer will ask. A wide sheet nobody keeps current is weaker evidence than a narrow one attested on schedule.

Should orphaned accounts stay in the main inventory?

Keep them in the same workbook on a dedicated tab with the same columns plus discovery date, checks performed before declaring them orphaned, disposition and completion date. Blank owner fields in the main tab read as oversight rather than as a finding. Every orphan needs a dated decision and a named decision maker, which is exactly what a reviewer samples.

What inactivity window should trigger a removal review?

Use a window that reflects the workload's cadence, with 90 to 180 days as a reasonable range depending on how often the job runs (Windows Active Directory). A 30-day window flags quarterly jobs and misses accounts that are quiet in the directory but still accepted through cached credentials. Pair the inactivity check with an ownership check, because the two failure modes differ.

Does review cadence replace credential rotation?

No. Review confirms the identity is still needed and still has a sponsor; rotation shortens the life of the credential. Many accounts should show "not applicable" for rotation because they use short-lived tokens or platform-managed credentials (Google Cloud IAM). Reserve manual rotation dates for the long-lived residue and list that residue as an exception.

How do AI agent credentials fit into the same inventory?

Record them as identities with an agent flag and a delegation column naming the human the agent acts for, because the keys are often created directly in each service and never reach centralized identity infrastructure (Scalekit). Note where revocation happens for each one, and test it. Agent credentials acting for a departing employee or contractor are the highest-priority rows in the sheet.

Sources

Sources

  1. Close-Up On Sources Of Substantive Audit Evidence
  2. AS 2510: Auditing Inventories
  3. How to detect stale/orphaned service accounts
  4. What to Rotate When a Developer Leaves | MavenHandle
  5. Create short-lived credentials for a service account
  6. Chapter 14. Using bound service account tokens
  7. Service Accounts
  8. Introduction to Active Directory service accounts
  9. WordPress AI Agent Security Checklist
  10. Best practices for using service accounts securely
  11. Entro's NHI Ownership Attribution Model
  12. What is non-human identity management
  13. When an Employee Leaves, Who Revokes Their AI Agent's ...
  14. The AI agent permissions checklist for SaaS apps (2026)
  15. Service accounts
  16. How do I generate short lived service account access ...
  17. How to rotate secrets without downtime
  18. PCAOB pushes for modernized auditing standards ...
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles