Shayl.Taveras
portfolio / projects / iam-access-review
← back to portfolio
// Project Walkthrough · 01
Serverless IAM Access Review

An automated access review pipeline built on AWS that turns IAM control checks into auditor-ready output on a weekly cadence, with no human in the loop.

python aws lambda cloudformation iam · security hub · eventbridge · s3 · bedrock
Problem Statement
01

Manual access reviews are one of the most consistently failed controls in SOC 2 and ISO 27001 audits. Not because teams don't understand the requirement, but because the process is time-consuming, inconsistent, and easy to defer under audit pressure. When it does happen, the output is often a spreadsheet someone assembled the night before the assessment.

What came out of that is a pipeline that runs on a schedule, checks the controls auditors actually care about, and drops a timestamped HTML report into S3 every week. No one has to remember to run it. An auditor opens the file directly or downloads it offline.

Architecture Decision
02

Every infrastructure choice here was made with the audit in mind, not just the runtime. Serverless is the right call for GRC work because it removes an entire class of findings before a single control is checked.

// no server
Zero Patch Surface
No EC2 to patch, harden, or monitor. Lambda eliminates an entire class of infrastructure findings before an auditor ever looks.
// eventbridge
Auditable Cadence
Weekly trigger runs on schedule, every time, with a CloudWatch execution log. The cadence itself becomes audit evidence.
// s3 output
Immutable Evidence Trail
Reports land as access-review-YYYYMMDD.html: timestamped, versioned, and retrievable by auditors without any system access.
// bedrock
AI Executive Summary
Narrative module translates raw IAM findings into business-readable risk language. Bridges technical output to GRC-consumable evidence.
// system architecture · eventbridge → lambda → aws services → bedrock → s3
EVENTBRIDGE weekly schedule trigger invoke LAMBDA · handler.py iam_findings.py access_analyzer.py security_hub.py narrative.py report.py → assembles final HTML IAM stale accounts · MFA unused credentials ACCESS ANALYZER cross-account exposure public resource policies SECURITY HUB IAM.1 through IAM.9 active control failures BEDROCK AI narrative · findings → plain-language risk summary HTML report S3 access-review-YYYYMMDD.html · timestamped · immutable
What the System Checks
03

Each finding source maps to a specific compliance risk. The system checks the controls auditors actually test for.

iam_findings.py
IAM Identity Hygiene
Flags stale accounts (90+ days inactive), admin users missing MFA, and IAM users without manager tags. Maps to SOC 2 CC6.1 · ISO 27001 A.9 · NIST 800-53 AC-2.
access_analyzer.py
External Resource Exposure
Surfaces cross-account trust relationships, publicly accessible S3 buckets, and resource policies granting access outside the account boundary. Maps to NIST 800-53 AC-3 · PCI-DSS 7.2 · CMMC AC.L2-3.1.3.
security_hub.py
Active IAM Control Failures (IAM.1-IAM.9)
Pulls all FAILED findings for nine AWS Security Hub IAM controls: root MFA, password policy, unused credentials, access key rotation. Pre-mapped to NIST 800-53 and PCI-DSS. Mapped to NIST 800-53 IA-2, IA-5, PCI-DSS 8.x, and CMMC IA.L2.
The Output
04

The report module generates a self-contained HTML file with no external dependencies and no server required. An auditor opens it directly from S3 or downloads it offline. The narrative module generates an AI-written executive summary via Bedrock, translating raw findings into business-readable risk language.

IAM Access Review Report Output
// generated HTML report: auditor-ready, no console login required
Frameworks Addressed
05
SOC 2
CC6.1, CC6.2, CC6.3: logical access controls, user provisioning
ISO 27001
A.9 Access Control: user access management and responsibilities
NIST 800-53
AC-2, AC-3, IA-2, IA-5: account management, access enforcement
PCI-DSS 4.0
Requirements 7 and 8: restrict access, identify and authenticate
CMMC Level 2
AC.L2-3.1.1 through 3.1.3, IA.L2-3.5.3: access control and MFA
CMMC Level 3
Extended access control requirements from NIST 800-172
Demo Mode
06

The deployed portfolio version runs with DEMO_MODE=true, which generates realistic synthetic findings without pulling live IAM data from a real AWS account. Choosing to demo safely rather than expose live IAM data is itself a security judgment call.

// deploy via cloudformation
# Package and deploy the stack
aws cloudformation package --template-file template.yaml --s3-bucket your-bucket --output-template-file packaged.yaml
aws cloudformation deploy --template-file packaged.yaml --stack-name iam-access-review --parameter-overrides DemoMode=true --capabilities CAPABILITY_IAM
Test Coverage
07

28 tests pass across all six modules. Each finding source is tested against mock boto3 responses so the pipeline catches regressions before they produce a silently incorrect compliance report. A compliance report with a silent bug is worse than no report. It generates false confidence.

28
tests passing
6
modules covered
3
finding sources
6
frameworks mapped
Project Details
type
serverless pipeline
cloud
AWS
language
Python
iac
CloudFormation
cadence
weekly (EventBridge)
output
HTML + S3
demo mode
enabled
tests
28 passing
Controls
IAM.1-IAM.9
Security Hub
AC-2
Account Mgmt
AC-3
Access Enforce
IA-2
Identification
IA-5
Authenticator
Links
github
portfolio