Start with one job and grow from there.
Free to start · No credit card required
cat .singulacomp/memory/compliance-policy.md 2>/dev/null || echo "(no policy file yet — using the defaults below)"
.singulacomp/memory/compliance-policy.md from them on this run:owner and environment.*:* or an unscoped iam:PassRole..singulacomp/memory/compliance-policy.md (Step 0 above), edit it to reflect the
requested rule, and confirm the change back to the human. No AWS calls, no
findings, no change request — the policy file itself is the human-authored
input the rest of this skill checks against.list-buckets
and list-roles return the same full set no matter which region you ask from.
List and evaluate each one exactly once per sweep, outside any region loop:for bucket in $(aws s3api list-buckets --query 'Buckets[].Name' --output text); do
bucket_region=$(aws s3api get-bucket-location --bucket "$bucket" --query 'LocationConstraint' --output text)
[ "$bucket_region" = "None" ] && bucket_region="us-east-1"
aws s3api get-bucket-policy-status --bucket "$bucket" --region "$bucket_region" 2>/dev/null
aws s3api get-bucket-tagging --bucket "$bucket" --region "$bucket_region" 2>/dev/null
done
for role in $(aws iam list-roles --query 'Roles[].RoleName' --output text); do
aws iam list-attached-role-policies --role-name "$role"
aws iam list-role-policies --role-name "$role"
done
list-*, get-*). The credentials are brokered
server-side and read-only — you use them, you never see the raw key.$(echo "{{aws_regions}}" | tr ',' ' ') — never re-loop the global
bucket/role checks above.| Check | Violation condition | Finding type |
|---|---|---|
| Bucket exposure | PolicyStatus.IsPublic = true and the bucket isn't allow-listed | Newly public bucket |
| Tagging | Missing a required tag key from the policy | Untagged resource |
| IAM scope | Role holds *:* or an unscoped iam:PassRole | Over-broad role |
$bucket_region).aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=ResourceName,AttributeValue="<resource-id>" \
--max-results 10 --region <region-per-rule-above>
project.cr.open (or one per resource
group when several findings share a fix). Title it with the resource and
violation, e.g. compliance: newly-public bucket acme-uploads. The CR body is
the diagnosis from Step 3 (what, when, who) plus the proposed fix. A human
reviews and applies it — you stop at opening the CR.