Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Conduct periodic access reviews and certifications. Implement access governance and recertification workflows. Use when managing access compliance.
license
MIT
metadata
{"author":"devops-skills","version":"1.0"}
Access Review
Implement periodic access review processes for AWS IAM, GitHub, Okta, and other identity providers, including automated reporting, certification workflows, and unused permission detection.
When to Use
Conducting quarterly or annual access reviews for compliance (SOC 2, HIPAA, PCI DSS, ISO 27001)
Identifying and removing stale accounts and unused credentials
Certifying that current access levels match job responsibilities
Detecting excessive privileges and dormant service accounts
Generating evidence for auditor requests on access governance
Access Review Process
access_review_workflow:1_scope:actions:-Definesystemsinscopeforthereviewcycle-Identifyreviewowners(managers,systemowners)-Setreviewtimelineanddeadlines-Generateaccessinventoryfromallidentitysourcesfrequency:privileged_access:Quarterlystandard_access:Semi-annuallyservice_accounts:Quarterlyapi_keys:Monthly2_extract:actions:-Pullcurrentaccessdatafromallsystems-Correlateidentitiesacrossplatforms(SSOmapping)-Enrichwithlastloginandactivitydata-Flagaccountsforreview(inactive,over-privileged,orphaned)3_review:actions:-Assignreviewitemstoappropriatemanagers-Managercertifieseachuser'saccess(approve/revoke/modify)-Risk-basedprioritization(privilegedusersreviewedfirst)-Escalatenon-responsesafterdeadlinedecisions:approve:"Access is appropriate for current role"modify:"Access needs adjustment (reduce/change scope)"revoke:"Access is no longer needed"4_remediate:actions:-Revokeaccessflaggedforremoval-Modifyaccessasdirectedbyreviewers-Documentexceptionswithjustification-Confirmchangeswithsystemownerssla:revocations:"Complete within 5 business days of decision"modifications:"Complete within 10 business days"exceptions:"Approved by security team, documented, time-limited"5_report:actions:-Generatecompletionmetrics(%reviewed,%ontime)-Documentalldecisionsandactionstaken-Archiveevidenceforcomplianceaudits-Identifyprocessimprovementsfornextcycle
AWS IAM Access Review Scripts
#!/usr/bin/env bash# aws-iam-review.sh - Comprehensive IAM access review report
OUTPUT_DIR="./access-review/$(date +%Y-%m)"mkdir -p "$OUTPUT_DIR"echo"=== AWS IAM Access Review ==="# Generate credential report
aws iam generate-credential-report > /dev/null
sleep 10
aws iam get-credential-report --output text --query Content | \
base64 -d > "$OUTPUT_DIR/credential-report.csv"echo"--- Users Without MFA ---"
aws iam get-credential-report --output text --query Content | base64 -d | \
awk -F, 'NR>1 && $4=="true" && $8=="false" {print $1}' | \
tee"$OUTPUT_DIR/users-without-mfa.txt"echo"--- Inactive Users (90+ days) ---"
THRESHOLD=$(date -d '90 days ago' +%Y-%m-%dT%H:%M:%S 2>/dev/null || date -v-90d +%Y-%m-%dT%H:%M:%S)
aws iam get-credential-report --output text --query Content | base64 -d | \
awk -F, -v t="$THRESHOLD"'NR>1 && $5!="N/A" && $5!="no_information" && $5<t {
print $1","$5
}' | tee"$OUTPUT_DIR/inactive-users.csv"echo"--- Stale Access Keys (90+ days unused) ---"for user in $(aws iam list-users --query 'Users[*].UserName' --output text); dofor key_id in $(aws iam list-access-keys --user-name "$user" \
--query --output text);
last_used=$(aws iam get-access-key-last-used --access-key-id \
--query --output text)
[ = ] || [ \< ];
|
user $(aws iam list-users --query --output text);
policies=$(aws iam list-attached-user-policies --user-name \
--query --output text)
| grep -qi ;
=$(aws iam list-groups-for-user --user-name \
--query --output text)
|
role $(aws iam list-roles --query --output text);
trust=$(aws iam get-role --role-name \
--query --output json 2>/dev/null)
| grep -q && | grep -qv ;
| jq -c
|
aws iam get-credential-report --output text --query Content | -d | \
awk -F, | \
GitHub Access Review
#!/usr/bin/env bash# github-access-review.sh - GitHub organization access audit
ORG="your-org"
OUTPUT_DIR="./access-review/github/$(date +%Y-%m)"mkdir -p "$OUTPUT_DIR"echo"=== GitHub Organization Access Review ==="echo"--- Organization Members ---"
gh api orgs/$ORG/members --paginate \
--jq '.[] | [.login, .site_admin] | @csv' \
> "$OUTPUT_DIR/org-members.csv"echo"--- Organization Owners ---"
gh api "orgs/$ORG/members?role=admin" --paginate \
--jq '.[] | .login' \
> "$OUTPUT_DIR/org-owners.txt"echo"--- Outside Collaborators ---"
gh api orgs/$ORG/outside_collaborators --paginate \
--jq '.[] | .login' \
> "$OUTPUT_DIR/outside-collaborators.txt"echo"--- Repository Access Per Repo ---"for repo in $(gh repo list $ORG --json name -q '.[].name' --limit 500); doecho"Repo: $repo"
gh api "repos/$ORG/$repo/collaborators" --paginate \
--jq '.[] | [.login, .role_name] | @csv' \
> "$OUTPUT_DIR/repo-$repo-access.csv" 2>/dev/null
team $(gh api orgs//teams --paginate --jq );
gh api --paginate \
--jq \
>
gh api orgs//invitations --paginate \
--jq \
>
repo $(gh repo list --json name -q -- 500);
keys=$(gh api --jq 2>/dev/null)
[ -n ];
>
repo $(gh repo list --json name -q -- 500);
protection=$(gh api 2>/dev/null)
[ $? -eq 0 ];
| jq \
>
>>