Skip to content

Just-In-Time Access

Standing privileges are one of the largest attack surfaces in any organization. Service accounts with persistent credentials, API keys that never expire, and bot tokens with broad scopes create opportunities for credential theft, lateral movement, and privilege escalation. VeraID’s Just-In-Time (JIT) access model eliminates standing privileges by creating credentials on demand, scoping them to the minimum required access, and automatically revoking them when the task is complete or the time window expires.

Zero Standing Privileges

The principle behind JIT access is simple: no identity should hold credentials that it does not actively need. Instead of provisioning long-lived credentials and hoping they get rotated, VeraID creates short-lived, narrowly scoped credentials at the moment they are needed and destroys them the moment they are not.

Benefits of zero standing privileges:

  • Reduced blast radius — Compromised credentials expire automatically, limiting the window of exposure
  • Audit clarity — Every credential is tied to a specific request, approval, and time window
  • Compliance alignment — Meets SOC 2 CC6.1 (logical access), PCI-DSS 7.2 (least privilege), and HIPAA access management requirements
  • Operational hygiene — No stale credentials to discover, rotate, or decommission

JIT Access Flow

┌──────────┐ request ┌──────────┐ approve ┌──────────┐ use ┌──────────┐
│ │───────────────►│ │───────────────►│ │────────────►│ │
│ Identity │ │ VeraID │ │ Credential│ │ Resource │
│ │◄───────────────│ │◄───────────────│ Issued │────────────►│ │
│ │ credential │ │ auto-expire │ │ expires │ │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
  1. Request — An identity (or its automation) requests temporary access to a specific resource or set of scopes
  2. Approve — The request is evaluated against auto-approval rules or routed to a human reviewer
  3. Grant — A temporary credential is created with the requested scopes and a defined TTL
  4. Use — The identity uses the credential to access resources within the granted scopes
  5. Expire — The credential automatically expires at the end of its TTL, or is revoked manually if the task completes early

Creating JIT Credentials

Direct JIT Credential

Create a JIT credential directly when auto-approval is sufficient and no human review is needed.

Terminal window
curl -X POST https://app.veraid.io/api/v1/credentials/jit \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"identityId": "idt_9c3a8b7e-4f21-4d6a-b8e1-a2c5d9f07e3b",
"name": "deploy-staging-20260319",
"scopes": ["deploy:staging", "read:config"],
"duration": "2h",
"maxUsage": 10
}'
FieldTypeRequiredDescription
identityIdstringYesThe identity that will use this credential
namestringYesHuman-readable name for audit trail
scopesstring[]YesAccess scopes granted to this credential
durationstringYesTTL in the format \d+[smhd] (seconds, minutes, hours, days)
maxUsageintegerNoMaximum number of times the credential can be used. Null for unlimited within TTL

Duration examples:

PatternDuration
30s30 seconds
15m15 minutes
2h2 hours
1d1 day

Response:

{
"id": "cred_jit_7f8a9b2c-3d4e-5f6a-b7c8-d9e0f1a2b3c4",
"key": "kd_jit_abc123def456ghi789jkl012mno345pqr678",
"name": "deploy-staging-20260319",
"type": "JIT",
"status": "ACTIVE",
"scopes": ["deploy:staging", "read:config"],
"maxUsage": 10,
"usageCount": 0,
"issuedAt": "2026-03-19T14:30:00Z",
"expiresAt": "2026-03-19T16:30:00Z",
"identityId": "idt_9c3a8b7e-4f21-4d6a-b8e1-a2c5d9f07e3b"
}

JIT Credential Format

JIT credentials follow the VeraID credential format with a jit environment prefix:

kd_jit_{random}

This prefix allows secret scanning tools, WAFs, and log analysis systems to immediately identify JIT credentials and distinguish them from long-lived production (kd_live_*) or test (kd_test_*) credentials.


JIT Requests with Approval

For operations that require human review, submit a JIT request that enters an approval workflow before the credential is issued.

Terminal window
curl -X POST https://app.veraid.io/api/v1/jit-requests \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"identityId": "idt_9c3a8b7e-4f21-4d6a-b8e1-a2c5d9f07e3b",
"reason": "Emergency hotfix deployment to production - JIRA-4521",
"scopes": ["deploy:production", "write:config", "read:secrets"],
"resources": ["prod:api-gateway", "prod:config-store"],
"duration": 3600
}'
FieldTypeRequiredDescription
identityIdstringYesThe identity requesting access
reasonstringYesBusiness justification for the access request
scopesstring[]YesRequested access scopes
resourcesstring[]NoSpecific resources to be accessed
durationintegerYesRequested TTL in seconds (60 to 604800 — 1 minute to 7 days)

JIT Request Status Lifecycle

┌──────────┐ approve ┌──────────┐ use ┌──────────┐
│ PENDING │───────────────►│ APPROVED │──────────────►│ EXPIRED │
│ │ │ │ │ │
└────┬─────┘ └────┬─────┘ └──────────┘
│ │
│ reject │ revoke
▼ ▼
┌──────────┐ ┌──────────┐
│ REJECTED │ │ REVOKED │
└──────────┘ └──────────┘
StatusDescription
PENDINGRequest submitted and awaiting approval
APPROVEDRequest approved; JIT credential issued and active
REJECTEDRequest denied by a reviewer
EXPIREDCredential TTL has elapsed; access automatically revoked
REVOKEDCredential manually revoked before TTL expiration

Auto-Approval Rules

Auto-approval rules allow JIT requests to be granted automatically when they meet predefined conditions, eliminating the latency of human review for low-risk, routine operations.

{
"autoApprovalRules": [
{
"name": "staging-deploy-auto-approve",
"conditions": {
"resources": ["staging:*"],
"maxDuration": 7200,
"maxScopes": ["deploy:staging", "read:config"],
"identityRiskScore": { "max": 30 },
"identityTags": ["ci-cd"]
},
"enabled": true
},
{
"name": "read-only-auto-approve",
"conditions": {
"scopes": ["read:*"],
"maxDuration": 3600,
"identityRiskScore": { "max": 20 }
},
"enabled": true
}
]
}

A JIT request is auto-approved when all conditions in at least one matching rule are satisfied. If no rule matches, the request enters the standard approval workflow.

ConditionDescription
resourcesRequested resources must match these patterns
maxDurationRequested duration must not exceed this value (seconds)
maxScopesRequested scopes must be a subset of these scopes
identityRiskScore.maxIdentity’s current risk score must be at or below this threshold
identityTagsIdentity must have all specified tags

Break-Glass Emergency Access

In critical incidents, standard approval workflows may be too slow. VeraID provides a break-glass mechanism that grants immediate emergency access with enhanced logging and mandatory post-incident review.

Terminal window
curl -X POST https://app.veraid.io/api/v1/jit-requests/break-glass \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"identityId": "idt_9c3a8b7e-4f21-4d6a-b8e1-a2c5d9f07e3b",
"reason": "P0 production outage - all payment processing halted",
"scopes": ["admin:production"],
"resources": ["prod:*"],
"duration": 1800,
"incidentId": "INC-2026-0319-001"
}'

Break-glass access differs from standard JIT in several ways:

  • No approval required — Credential is issued immediately
  • Enhanced audit logging — Every action taken with the credential is logged with full request/response bodies
  • Mandatory review — A post-incident review task is automatically created and assigned to the security team
  • Alert escalation — Notifications are sent to security leadership, the identity’s owner, and configured incident channels
  • Short TTL — Maximum duration is capped at 4 hours (14400 seconds)

SDK Integration

import { VeraIDClient } from '@veraid/sdk';
const client = new VeraIDClient({
apiKey: process.env.VERAID_API_KEY,
agentId: process.env.VERAID_AGENT_ID,
});
// Request JIT access
const jitRequest = await client.jit.request({
reason: 'Scheduled database migration - JIRA-4590',
scopes: ['write:database', 'read:config'],
resources: ['prod:analytics-db'],
duration: 3600,
});
// Check status (auto-approved requests return immediately)
if (jitRequest.status === 'APPROVED') {
const credential = jitRequest.credential;
console.log(`JIT credential issued: ${credential.id}`);
console.log(`Expires at: ${credential.expiresAt}`);
// Use the credential
// ...
// Revoke early when done
await client.jit.revoke(jitRequest.id, {
reason: 'Migration complete',
});
}

What’s Next

  • Attestation Campaigns — Review and certify identity access on a recurring basis
  • Compliance — Map JIT access controls to SOC 2, HIPAA, and PCI-DSS requirements
  • Policy Overview — Define PBAC policies that govern JIT credential scopes