Skip to main content

vulkro-sf org integration-users

Audits active integration-user accounts for excess privilege, human reuse of the integration login, and staleness (SF-INTEG-USER-001 / -002 / -003), then runs the service-account lifecycle audit (SF-SVC-USER-001 / -002 / -003).

Integration accounts are the accounts nobody owns: created for one vendor connection, granted broad access to make the integration work, and never reviewed again. They were the lateral-movement pivot in the published 2025 incidents.

Synopsis

vulkro-sf org integration-users --target-org <alias> [flags]

Flags

FlagTypeDefaultDescription
--target-org, -o <alias>string(required)Target org alias or username, as known to sf org login.
--format <fmt>table | jsontableOutput format.
--verbose, -vflagoffBump stderr log verbosity. -v enables debug-level tracing for the vulkro + vulkro_sf targets; -vv enables trace. Honoured only when RUST_LOG is unset (an explicit RUST_LOG always wins).

What gets read

User rows filtered to known integration-user profile names with IsActive = true for the first pack, then all active users for the service-account lifecycle pack.

What gets reported

Integration users

RuleSeverityWhat fires
SF-INTEG-USER-001HighAn integration user holding API permission alongside extra permissions (an admin profile). Signal org-integration-user-has-api-enabled.
SF-INTEG-USER-002MediumA recent interactive login on an integration account: a human is using the robot's credentials. Signal org-integration-user-recent-interactive-login.
SF-INTEG-USER-003LowAn integration account with no login for over 180 days. Signal org-integration-user-inactive-stale.

Service-account lifecycle

Runs over all active users. An account is classified heuristically as a bot or service account from username / alias markers or an integration or API-only profile, then checked:

RuleSeverityWhat fires
SF-SVC-USER-001HighMFA-exempt with no login-IP lock. Signal org-service-account-mfa-exempt-no-ip-lock.
SF-SVC-USER-002MediumNot time-bound: no expiry and a session window above 60 minutes. Signal org-service-account-not-time-bound.
SF-SVC-USER-003HighHolds a broad system permission (Modify All Data, View All Data, or Author Apex). Signal org-service-account-broad-permissions.

Examples

vulkro-sf org integration-users --target-org my-prod

vulkro-sf org integration-users -o my-prod --format json > integration-users.json

Exit codes

  • 0 - no findings.
  • 1 - posture findings reported.
  • 2 - error.

Scope and honesty

The org is read locally through your own authenticated sf CLI login; nothing is sent anywhere. The audit reads user, profile, and permission metadata. No business records are read.

Two limits worth being explicit about. The integration-user pack keys off known integration-user profile names, so an integration account running on a custom profile with an ordinary name may not be picked up by that pack. The service-account pack uses a heuristic classification from username, alias, and profile shape: it can classify a human account as a bot, or miss a bot that looks like a person. Review the classification before acting on a finding.

Findings are static posture signals, not runtime-validated exploits, and a clean run does not certify the org's integration accounts safe.

Where to go next