Every organisation that moves to just-in-time access meets the same objection within a week: “some jobs really do need admin.” It is true. Rolling back a broken deploy in production, during an incident, may need permissions nobody should hold every day. The usual compromise is to leave a handful of senior engineers with AdministratorAccess “for emergencies”. Those accounts become the most valuable credentials in the company, and the ones least often reviewed.

This post walks through a high-risk request in the demo organisation, Northwind Labs: an engineer asking for admin on a production account to roll back an authentication service deploy. It shows how the request is narrowed, why it needs a second factor and two approvers, and what the broker actually creates in AWS.

In short

  • Admin is requested, not held. Sam asks for admin on prod-core for 30 minutes, with INC-4412 as the ticket. Nobody at Northwind keeps AdministratorAccess on that account.
  • “Admin” becomes four actions. The scoper narrows AdministratorAccess (*) to ecs:Describe*, ecs:List*, ecs:StopTask and ecs:UpdateService on service/auth*.
  • The person proves it is them first. Risk 57 and flow #30 both require step-up. Approvers do not see the request until Sam confirms with a second factor.
  • Two people approve, and neither is Sam. payments.lead@ and security@ must both approve; the requester can never approve their own request.
  • The broker builds and removes it. A per-grant IAM Identity Center permission set with an inline policy, deleted at expiry, created by a broker inside Northwind’s network.

The business case against standing admin

An account that holds AdministratorAccess all the time is a liability whether or not its owner is trustworthy. Laptops are stolen, sessions are hijacked, tokens leak into logs. When that happens to a standing administrator, the attacker inherits the whole account. When it happens to someone whose admin rights exist for thirty minutes a quarter, the attacker most likely inherits nothing.

Industry
data

Studies of cloud permissions have repeatedly found that the large majority of granted permissions are never used, and that highly privileged identities greatly outnumber the tasks that need them. Valid credentials remain among the most common ways in.

Sources: Microsoft State of Cloud Permissions Risks report (2023); Verizon Data Breach Investigations Report. Exact percentages vary by study.

There is also an audit and accountability cost. Auditors testing privileged access ask who holds it, who approved it and whether it was removed. A standing admin group answers the first question and fails the other two. And there is an operating cost: when the only route to admin is a person who already has it, incidents queue behind whoever is awake.

TODAY A small group keeps AdministratorAccess

Fast in an emergency, but the access exists every hour of every day, can do anything in the account, and is reviewed once a year if at all.

WITH INSIGHTKEYS Admin is asked for, narrowed and approved twice

Exists for thirty minutes, can do the four things the task needs on the one service named, and carries a second factor and two named approvals.

Step 1: Sam asks, and the scoper narrows

Sam is a platform engineer. During incident INC-4412 the team decides to roll back a recent deploy of the authentication service on the prod-core account, rated high and holding personal data. Sam types: “admin on prod-core to roll back the auth deploy for INC-4412, 30 min”. This is AR-0005.

The intake agent matches prod-core and the Administrator entitlement, whose ceiling is AdministratorAccess: *. The least-privilege scoper reads “roll back the auth deploy” and narrows inside that ceiling to what a rollback on Amazon ECS (Elastic Container Service) needs:

ActionsResources
Ceiling (AdministratorAccess)**
Narrowed for AR-0005ecs:Describe*, ecs:List*, ecs:StopTask, ecs:UpdateServicearn:aws:ecs:*:422233334444:service/auth*

That is the difference between being able to do anything in the account and being able to look at and update the auth services. No IAM, no data stores, no other services. The scoper runs at L3: it applies the narrowing and records it on the timeline, where any approver can see the before and after. If the narrowed set turns out not to be enough, the answer is a new, specific request, not a wider one.

Step 2: the score and the flow

The risk agent scores the narrowed request 57, High:

FactorPointsWhy
Environment+30Production
Resource sensitivity+12prod-core is rated high
Access level+25Admin
Sensitive data+8Holds personal data
Duration−330 minutes
First time+5Sam has not had this access before
Narrow scope−10Named resources only
Open incident−10INC-4412 is open
Total57High: above the step-up line of 55

Two things now decide the route. The score is above 55, so step-up is required. And the first flow that matches is #30, “Admin in production: two people”: approvers payments.lead@ and security@, a ticket required, step-up required, one hour maximum. The flow would have demanded two people even if the score had been lower, because admin in production is never approved automatically unless a flow explicitly allows it, and #30 does not. Sam is not on call for this team this week, so there is no on-call credit.

AR-0005 detail: prod-core Administrator, pending MFA, risk 57 High with each factor, 0 of 2 approvals, narrowed ECS actions on service/auth*, routed to payments.lead and security with step-up
AR-0005 as the admin sees it. Risk 57 with every factor, the four ECS actions on service/auth*, and “how it is decided”: goes to approval, step-up MFA, two approvals.
flowchart TD A["AR-0005 admin on prod-core, 30 min"] --> B["Scoper narrows to four ECS actions on service/auth*"] B --> C["Risk 57 High"] C --> D{"Flow #30 matches: admin in production"} D --> E["Ticket present: INC-4412"] E --> F{"Step-up done?"} F -- No --> G["Hold. Approvers do not see it yet"] G --> F F -- Yes --> H["payments.lead approves (never the requester)"] H --> I["security approves"] I --> J["Signed grant to broker"] J --> K["Broker grants for 30 minutes, then removes"]

The route AR-0005 takes. The order of the two approvals does not matter; both are required.

Step 3: the second factor comes first

Before anyone is asked to approve, Sam must prove the request is really theirs. Sam’s page says: “Waiting for your second factor — approvers see this request once you confirm it is you.” Sam confirms with the authenticator app on their phone (a time-based one-time code, with replay protection) or a Duo push. The assertion lasts five minutes and can be used once.

AR-0005 as Sam sees it: a Confirm it is you button and the message that approvers see the request once Sam confirms with a second factor
Sam’s view. Nothing reaches the approvers until Sam confirms it is really Sam. A stolen session alone cannot raise an admin request in Sam’s name.

The order is deliberate. If Sam’s browser session had been hijacked, the attacker could type the sentence but could not produce the second factor, and the approvers would never be woken for a request Sam did not make. Sign-in MFA from Northwind’s identity provider protects the login; step-up protects this specific, risky action.

Step 4: two approvers, neither of them Sam

Once Sam confirms, the request reaches both approvers, in the console and as approve/deny buttons in Slack. Each sees the same page: the sentence, the ticket, the score with its factors, the narrowed permission and the thirty-minute window. The payments lead is asked whether the rollback is the right operational call. Security is asked whether the access is proportionate. The approval count goes from 0/2 to 2/2.

The requester can never be one of the two, even if Sam were listed as an approver on the flow for some other reason. An approver can also deny with a note, which is recorded and shown to the requester. In the same incident, Sam’s request AR-0006 for operator access on prod-payments to change an export bucket was denied by security: “Exports are frozen during INC-4412 — ask again after it closes.” A denial with a reason is part of the record too.

AR-0006 denied by security with the note: Exports are frozen during INC-4412, ask again after it closes
A denial is an answer with a reason. AR-0006 was refused during the same incident; the note tells Sam why and when to ask again.

Step 5: what the broker creates, and removes

With both approvals in, the control plane signs a grant instruction with Northwind’s organisation key. The broker, running in Northwind’s network, collects it over an outbound HTTPS connection and checks it: signature, nonce, freshness, addressee. Then it checks its own policy file, broker.yaml, which Northwind controls. Is admin allowed to be granted at all? Is thirty minutes within the longest grant it will create? Does the permission contain an action it will never grant? By default those are iam:*, organizations:* and sts:*; none appear here.

sequenceDiagram participant S as Sam participant K as InsightKeys control plane participant A1 as payments.lead participant A2 as security participant B as Broker in Northwind network participant IC as AWS IAM Identity Center S->>K: admin on prod-core to roll back auth, 30 min K-->>S: Confirm it is you S->>K: Step-up code verified K->>A1: Approve AR-0005? K->>A2: Approve AR-0005? A1-->>K: Approve A2-->>K: Approve K->>B: Signed grant instruction B->>B: Check broker.yaml, admin allowed, no iam or sts actions B->>IC: Create IK permission set with inline ECS policy B->>IC: Assign to Sam on prod-core Note over B,IC: Thirty minutes later, on the broker's own clock B->>IC: Remove assignment, delete permission set

AR-0005 end to end. The granting credential, an IAM role the broker assumes, never leaves Northwind’s network.

For AWS IAM Identity Center the broker creates a permission set for this grant alone, named with an IK- prefix, containing the four ECS actions as an inline policy and a session duration no longer than the grant. It assigns that permission set to Sam’s Identity Center user on the prod-core account. Sam signs in through the AWS access portal as usual and sees one extra, short-lived option. At expiry the broker removes the assignment and deletes the permission set, from its own local ledger, whether or not the InsightKeys service is reachable at that moment.

Retiring standing production adminIllustrative runbook with typical owners
1
List who holds admin todaySecurity

Discovery and identity analysis list standing administrators and escalation paths per account.

2
Create the admin entitlementPlatform

Ceiling AdministratorAccess on each production account, owned by the platform lead.

3
Write the two-person flowSecurity

Named approvers (an operational owner and security), ticket required, step-up, one hour maximum.

4
Allow admin at the brokerPlatform

In broker.yaml, permit admin grants for those accounts and keep iam:*, sts:* and organizations:* on the never-grant list.

5
Rehearse on a calm dayPlatform + approvers

Run a test request end to end so the first real one is not during an incident.

6
Convert the standing adminsSecurity

Use Convert to JIT on the standing-access list; removal goes through the broker.

7
Keep a break-glass flowSecurity

For the night nobody can approve: flow #5 for whoever is on call, with step-up and a review after.

Honest limits

The scoper narrows from the request’s words and from what similar past grants used. It can be wrong in either direction, which is why approvers see the narrowed permission and why a missing action means a new request, not a wider grant. The admin and ECS parts of the demo run against the simulator; the AWS drivers are tested against moto, the AWS API emulator, not large production estates. Step-up today is an authenticator app or Duo push; passkey (WebAuthn) step-up is on the roadmap. Two approvers slow things down by design: if both are asleep, break-glass is the route, not lowering the bar on this flow.

What each reader takes from it

For the CISO

Production admin is never held, only granted: narrowed, second-factored, approved by two named people and removed by software you run.

Every admin grant has the evidence an auditor will sample, written as it happened.

For the platform lead

Rollbacks are not blocked by who happens to hold admin. The request names the task and the approvers see exactly what will be allowed.

The broker’s local policy is your backstop: some actions are never granted, whatever the control plane asks.

For the board

The number of people who can change anything in production at any moment should be close to zero, and it can be shown.

High-risk access has two independent approvals and a second factor, which is what regulators and insurers increasingly expect.

Some jobs need admin. No one needs to keep it.

Ask for it with a reason, prove it is you, get two people to agree, receive the four actions the job needs for thirty minutes, and let the broker take it back.

Keep reading