Version: 1.5.0
Last Updated: 2026-02-03
Addresses: FIND-020 - Manual Access Reviews
This document describes the automated access review process for ThemisDB, addressing audit finding FIND-020. The automation provides regular CI/CD-based access reviews to ensure proper access controls and compliance with security policies.
- Automate quarterly access reviews
- Generate monthly access review reports
- Detect excessive or stale permissions
- Ensure compliance with ISO 27001 A.9.2.5 (Review of user access rights)
- Document all access review activities
The access review system automatically collects:
- User accounts and their roles
- Last login timestamps
- Permission assignments
- Role-to-permission mappings
- Access grant dates
- Account status (active/inactive)
Automated checks:
- Stale Accounts: No login in 90+ days
- Excessive Permissions: Users with admin rights in multiple systems
- Dormant Admin Accounts: Admin accounts with no activity in 30+ days
- Orphaned Accounts: Accounts without associated HR records
- Non-MFA Admin Accounts: Admin accounts without MFA enabled
Monthly Report Contents:
- Executive summary
- Access review statistics
- Findings and recommendations
- User access matrix
- Compliance status
- Action items
Data Collection → Analysis → Report Generation → Review → Remediation → Verification
Stakeholders:
- Security Team: Primary reviewers
- Managers: Validate team access
- Compliance Team: Ensure regulatory compliance
- Audit Team: Review findings and documentation
Location: scripts/operations/access-review.sh
Usage:
# Generate access review report
./scripts/operations/access-review.sh --report
# Generate compliance report (quarterly)
./scripts/operations/access-review.sh --compliance-report
# Export user access matrix
./scripts/operations/access-review.sh --export-matrix
# Check specific user
./scripts/operations/access-review.sh --user <username>
# Dry-run mode (no changes)
./scripts/operations/access-review.sh --dry-runOptions:
--report- Generate monthly access review report--compliance-report- Generate quarterly compliance report--export-matrix- Export user-role-permission matrix (CSV)--user <username>- Review specific user access--dry-run- Simulation mode without actual changes--email- Email report to stakeholders--format <format>- Output format: markdown, pdf, html (default: markdown)
GitHub Actions Workflow: .github/workflows/access-review.yml
Schedule:
- Monthly reports: 1st of each month at 09:00 UTC
- Quarterly compliance reports: 1st of Jan/Apr/Jul/Oct at 09:00 UTC
Workflow Steps:
- Collect user access data
- Run analysis checks
- Generate report
- Upload report as artifact
- Send notifications to security team
- Create tracking issue if findings detected
Workflow Configuration:
name: Access Review Automation
on:
schedule:
- cron: '0 9 1 * *' # Monthly on 1st at 09:00 UTC
workflow_dispatch: # Manual triggerFile: reports/access-review-YYYY-MM.md
Sections:
-
Executive Summary
- Total users reviewed
- Findings count by severity
- Compliance status
- Action items
-
Access Review Statistics
- Total accounts: Active / Inactive / Stale
- Role distribution
- MFA adoption rate
- Last review date
-
Findings
- Stale accounts (90+ days)
- Excessive permissions
- Dormant admin accounts
- Non-compliant configurations
-
User Access Matrix
- User → Role → Permissions mapping
- Access grant dates
- Last activity timestamps
-
Recommendations
- Immediate actions required
- Policy improvements
- Process enhancements
-
Compliance Status
- ISO 27001 A.9.2.5: Review of user access rights
- BSI C5 OIS-03: Access Management
- SOC 2 CC6.3: Logical Access Controls
File: reports/compliance/access-review-QN-YYYY.md
Additional Sections:
- Trend analysis (quarterly comparison)
- Policy compliance metrics
- Audit trail verification
- Management review signoff
| Category | Criteria | Review Frequency | Action |
|---|---|---|---|
| Active Users | Login within 30 days | Monthly monitoring | No action |
| Inactive Users | No login 30-90 days | Monthly review | Manager confirmation |
| Stale Accounts | No login 90+ days | Immediate review | Disable account |
| Admin Accounts | Admin role assigned | Weekly monitoring | MFA enforcement |
| Service Accounts | System/API accounts | Quarterly review | Rotate credentials |
- User role matches job function
- Permissions align with role definition
- No excessive admin privileges
- MFA enabled for privileged accounts
- Last access within policy timeframe
- Account owner confirmed by manager
- No orphaned accounts detected
- Access documentation up to date
| Metric | Target | Current | Status |
|---|---|---|---|
| Review completion rate | 100% | - | Tracked |
| Time to remediate findings | < 7 days | - | Tracked |
| Stale account detection rate | 100% | - | Tracked |
| False positive rate | < 5% | - | Tracked |
| Access review cycle time | < 2 weeks | - | Tracked |
Grafana Dashboard: Access Review Metrics
Metrics collected:
access_review_users_total- Total users reviewedaccess_review_findings_total- Total findings by severityaccess_review_stale_accounts- Stale accounts detectedaccess_review_completion_rate- Review completion percentageaccess_review_remediation_time- Average remediation time (days)
Prometheus Metrics:
# Stale accounts gauge
access_review_stale_accounts{threshold="90d"} 0
# Review completion rate
access_review_completion_rate{period="monthly"} 1.0
# Findings by severity
access_review_findings_total{severity="critical"} 0
access_review_findings_total{severity="high"} 0
access_review_findings_total{severity="medium"} 0
For stale accounts (90+ days):
# Automatic account suspension
./scripts/operations/access-review.sh --auto-suspend-staleFor non-MFA admin accounts:
# Enforce MFA enrollment
./scripts/operations/access-review.sh --enforce-mfa-adminExcessive permissions:
- Review user's job function
- Compare current vs. required permissions
- Submit change request
- Manager approval required
- Apply permission changes
- Verify and document
Orphaned accounts:
- Attempt to contact account owner
- Verify with HR department
- If no owner found within 7 days → Disable
- Preserve account for 30 days
- After 30 days → Delete account
- Maintain audit trail
A.9.2.5 - Review of user access rights
- ✅ Regular review of access rights (monthly/quarterly)
- ✅ Management authorization for access changes
- ✅ Documentation of review activities
- ✅ Removal of unnecessary access rights
OIS-03 - Access Management
- ✅ Documented access provisioning process
- ✅ Regular access reviews conducted
- ✅ Access rights aligned with job functions
- ✅ Audit trail of all access changes
Article 32 - Security of Processing
- ✅ Access controls implemented
- ✅ Regular review of access rights
- ✅ Documentation of processing activities
- ✅ Audit logging of access events
All access review activities are logged:
Log File: logs/access-review-audit.log
Log Format:
{
"timestamp": "2026-02-03T10:00:00Z",
"event": "access_review_completed",
"review_id": "AR-2026-02",
"users_reviewed": 142,
"findings": 3,
"reviewer": "security-team",
"status": "completed"
}Audit Events:
access_review_started- Review initiatedaccess_review_completed- Review finishedfinding_detected- Issue foundremediation_applied- Fix implementedreview_approved- Management signoff
# Test with sample data
./scripts/operations/access-review.sh --test-mode
# Validate report generation
./scripts/operations/access-review.sh --validate
# Dry-run (no actual changes)
./scripts/operations/access-review.sh --dry-run --report- Script executes without errors
- Report generated successfully
- All users included in review
- Findings accurately detected
- Metrics exported to dashboard
- Email notifications sent
- Audit logs created
Issue: Report generation fails
# Check database connectivity
./scripts/operations/access-review.sh --check-db
# Verify permissions
./scripts/operations/access-review.sh --check-permissionsIssue: Missing users in report
# Verify user data sync
./scripts/operations/access-review.sh --sync-users
# Check data source configuration
cat config/access-review.yamlIssue: False positives detected
# Review detection criteria
./scripts/operations/access-review.sh --show-criteria
# Adjust thresholds in config
vim config/access-review.yamlConfig File: config/access-review.yaml
access_review:
# Review schedule
schedule:
monthly_report: true
quarterly_compliance: true
# Detection thresholds
thresholds:
stale_account_days: 90
inactive_admin_days: 30
excessive_permissions: 5
# Notification settings
notifications:
enabled: true
recipients:
- security-team@example.com
- compliance@example.com
# Report settings
reports:
format: markdown
retention_days: 730 # 2 years
# Integration
integrations:
grafana_enabled: true
slack_enabled: true
jira_enabled: trueDocument Version: 1.5.0
Compliance: ISO 27001 A.9.2.5, BSI C5 OIS-03
Last Reviewed: 2026-02-03