Quarterly Access Review¶
Runbook for quarterly review of bench access + permissions. Required for SOC 2 + ISO 27001.
Goal¶
Confirm that only authorized operators have current bench access, that role assignments match job function, and that stale credentials are revoked. Quarterly cadence.
Prerequisites¶
- Admin role (only admin can read full operator roster)
- 60-min uninterrupted review window
- Last quarter's review document available for diff
Procedure¶
Step 1 — Export current operator roster¶
curl -fsS https://dashboard.tlsstress.art/api/gateway/operators \
-H "Authorization: Bearer $TLSSTRESS_ADMIN_TOKEN" \
> operators-$(date +%Y-Q%q).json
jq '.[] | {email, role, last_login, mfa_enabled}' \
operators-$(date +%Y-Q%q).json | head -40
Step 2 — Diff vs last quarter¶
diff operators-$(date -v-3m +%Y-Q$(echo $(date +%q) | awk '{print $1-1}')).json \
operators-$(date +%Y-Q%q).json
Categorize differences: - NEW: confirm onboarding ticket exists in HR + role appropriate - REMOVED: confirm offboarding completed (last_login + vault entries cleared) - ROLE CHANGED: confirm change approved + audit logged
Step 3 — Stale credential check¶
Flag any operator with last_login > 90 days:
jq '.[] | select(.last_login_age_days > 90) | .email' \
operators-$(date +%Y-Q%q).json
For each: confirm role still required. If not → revoke:
curl -X DELETE https://dashboard.tlsstress.art/api/gateway/operator/<email> \
-H "Authorization: Bearer $TLSSTRESS_ADMIN_TOKEN"
Step 4 — MFA enrollment check¶
Flag any operator without MFA:
jq '.[] | select(.mfa_enabled == false) | .email' \
operators-$(date +%Y-Q%q).json
Production-tier operators MUST have MFA enabled. Email reminders + revoke if not enabled within 7 days.
Step 5 — Vault credential audit¶
Per-DUT credential vault — check for orphaned credentials:
curl -fsS https://dashboard.tlsstress.art/api/vault/audit \
-H "Authorization: Bearer $TLSSTRESS_ADMIN_TOKEN" \
> vault-audit-$(date +%Y-Q%q).json
# Find credentials owned by departed operators
jq '.[] | select(.owner_status == "departed") | .credential_id' \
vault-audit-$(date +%Y-Q%q).json
Rotate any such credential immediately.
Step 6 — RBAC role policy review¶
Open /admin/gateway/rbac → for each role:
- Verify enumerated permissions still match policy
- Verify no role escalation paths exist
- Document any policy changes since last quarter
Step 7 — Sign + archive¶
Generate review report:
# Quarterly Access Review Q$(date +%Q) $(date +%Y)
**Reviewed by**: <admin name>
**Date**: $(date +%Y-%m-%d)
**Period**: $(date -v-3m +%Y-%m) to $(date +%Y-%m)
## Summary
- Total operators: N
- Added: N
- Removed: N
- Role changed: N
- MFA gap: N (remediated)
- Stale (>90d) revoked: N
- Vault credentials rotated: N
## Issues found
- ...
## Signoff
<PGP signature>
Archive to SOC 2 evidence bundle (per soc2-evidence-collection runbook).
Success criteria¶
- All operators in roster confirmed authorized
- All stale credentials revoked
- All MFA gaps addressed
- No orphaned vault credentials
- Review report signed + archived
Related¶
- SOC 2 evidence collection
- GATEWAY.Art primer
- Memory:
project_enterprise_compliance_track_2026_05_08