Skip to content

Security Posture

VeraID provides Identity Security Posture Management (ISPM) — a continuous assessment of your organization’s non-human identity landscape. The ISPM dashboard surfaces unmanaged identities, quantifies risk, and guides remediation priorities across AWS, Azure, GCP, and Kubernetes.

ISPM Dashboard

The Security Posture dashboard provides a unified view of your identity security health:

  • Aggregate Security Score — A weighted score (0–100) across all managed and discovered identities, updated in real time as identities are created, modified, or remediated.
  • Identity Inventory — Total count of managed NHIs, broken down by type, platform, and risk level.
  • Risk Distribution — Visual breakdown of identities by risk tier (Low, Moderate, Elevated, High, Critical).
  • Discovery Status — Count of unmanaged identities discovered but not yet imported.
  • Trend Analysis — Historical posture score over 7, 30, and 90-day windows.

Aggregate Security Score

The aggregate score is computed from individual identity risk scores, weighted by:

FactorWeightDescription
Permission scope30%Breadth of access granted to the identity.
Credential hygiene25%Age, rotation frequency, and storage method of credentials.
Activity patterns20%Frequency and regularity of usage, dormancy detection.
Policy coverage15%Whether the identity is governed by active policies.
Owner assignment10%Whether a human owner is assigned for accountability.

Score ranges:

ScoreRatingInterpretation
90–100ExcellentStrong posture, minimal risk.
70–89GoodMinor improvements recommended.
50–69FairSeveral identities require attention.
30–49PoorSignificant risk exposure, remediation needed.
0–29CriticalImmediate action required.

Discovery

VeraID automatically scans your cloud environments to discover non-human identities that exist outside of VeraID’s management. Discovery surfaces shadow service accounts, orphaned API keys, and over-privileged roles that may pose security risks.

Supported Platforms and NHI Types

Discovery scans across four platforms and identifies the following NHI types:

PlatformNHI TypeDescription
AWSAWS_IAM_USERIAM users with programmatic access keys.
AWSAWS_IAM_ROLEIAM roles assumed by services or cross-account.
AWSAWS_LAMBDA_ROLEExecution roles attached to Lambda functions.
AWSAWS_ECS_TASK_ROLETask roles assigned to ECS containers.
AWSAWS_SECRETSecrets stored in AWS Secrets Manager.
GCPGCP_SERVICE_ACCOUNTGCP service accounts with key files or Workload Identity.
AzureAZURE_SERVICE_PRINCIPALAzure AD service principals and managed identities.
AzureAZURE_APP_REGISTRATIONAzure AD application registrations with client secrets.
KubernetesK8S_SERVICE_ACCOUNTKubernetes service accounts across clusters.
Google WorkspaceGOOGLE_WORKSPACE_DELEGATIONDomain-wide delegation grants to service accounts.

Discovery Scan API

Trigger and monitor discovery scans programmatically.

Start a discovery scan:

Terminal window
curl -X POST \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platforms": ["AWS", "GCP", "AZURE", "K8S"],
"scope": {
"aws": {
"accountIds": ["123456789012", "210987654321"],
"regions": ["us-east-1", "eu-west-1"]
},
"gcp": {
"projectIds": ["my-project-prod", "my-project-staging"]
},
"azure": {
"subscriptionIds": ["sub-abc-123"]
},
"k8s": {
"clusterNames": ["prod-cluster", "staging-cluster"]
}
}
}' \
https://app.veraid.io/api/v1/discovery/scans

Get scan history:

Terminal window
curl -H "Authorization: Bearer $API_KEY" \
https://app.veraid.io/api/v1/discovery/scans

Response:

{
"scans": [
{
"id": "scan_abc123",
"status": "COMPLETED",
"startedAt": "2026-03-19T08:00:00Z",
"completedAt": "2026-03-19T08:12:34Z",
"platforms": ["AWS", "GCP"],
"discovered": 47,
"newSinceLastScan": 12,
"riskSummary": {
"critical": 3,
"high": 8,
"moderate": 21,
"low": 15
}
}
]
}

List discovered NHIs:

Terminal window
curl -H "Authorization: Bearer $API_KEY" \
"https://app.veraid.io/api/v1/discovery/identities?status=DISCOVERED&platform=AWS"

Response:

{
"identities": [
{
"id": "disc_xyz789",
"type": "AWS_IAM_ROLE",
"name": "legacy-data-pipeline-role",
"platform": "AWS",
"accountId": "123456789012",
"region": "us-east-1",
"status": "DISCOVERED",
"discoveredAt": "2026-03-19T08:05:12Z",
"riskIndicators": [
"NO_OWNER_ASSIGNED",
"OVERPRIVILEGED",
"NO_ACTIVITY_90_DAYS",
"KEY_NOT_ROTATED_180_DAYS"
],
"riskScore": 78,
"lastActivity": "2025-12-15T03:22:00Z",
"permissions": {
"policies": ["AdministratorAccess"],
"scope": "FULL_ADMIN"
}
}
]
}

Risk Indicators

Each discovered NHI is tagged with risk indicators that explain why it was flagged:

IndicatorDescription
NO_OWNER_ASSIGNEDNo human owner is associated with this identity.
OVERPRIVILEGEDPermissions exceed what is needed for observed usage.
NO_ACTIVITY_90_DAYSNo API calls or authentication events in the last 90 days.
KEY_NOT_ROTATED_180_DAYSCredentials have not been rotated in over 180 days.
MULTIPLE_ACCESS_KEYSMore than one active access key (AWS-specific).
CROSS_ACCOUNT_TRUSTRole can be assumed from external AWS accounts.
DOMAIN_WIDE_DELEGATIONGoogle Workspace domain-wide delegation is active.
NO_MFA_ON_OWNERThe human owner does not have MFA enabled.

NHI Status Workflow

Discovered identities follow a triage workflow:

DISCOVERED → REVIEWED → IMPORTED
→ IGNORED
→ ARCHIVED
StatusDescription
DISCOVEREDNewly found by a scan, awaiting triage.
REVIEWEDA team member has reviewed the identity and is deciding on action.
IMPORTEDImported into VeraID for full lifecycle management and policy enforcement.
IGNOREDAcknowledged but intentionally left unmanaged (e.g., third-party managed).
ARCHIVEDNo longer active or relevant, retained for audit history.

Update discovery status:

Terminal window
curl -X PATCH \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "REVIEWED"}' \
https://app.veraid.io/api/v1/discovery/identities/{discoveryId}

Import a discovered identity into VeraID:

Terminal window
curl -X POST \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"discoveryId": "disc_xyz789",
"ownerId": "user_owner123",
"tags": ["legacy", "needs-rotation"],
"policies": ["pol_default_read_only"]
}' \
https://app.veraid.io/api/v1/discovery/identities/{discoveryId}/import

Scheduled Scans

Configure discovery scans to run on a recurring schedule:

Terminal window
curl -X POST \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"schedule": "0 2 * * *",
"platforms": ["AWS", "GCP", "AZURE", "K8S"],
"notifyOnNewDiscoveries": true,
"notifyOnRiskChange": true
}' \
https://app.veraid.io/api/v1/discovery/schedules

The schedule field accepts standard cron syntax. The example above runs a full scan daily at 2:00 AM UTC.

Next Steps