#!/bin/bash # Run Prowler against All AWS Accounts in an AWS Organization # Change Directory (rest of the script, assumes you're in the root directory) cd / || exit # Show Prowler Version ./prowler/prowler -V # Source .awsvariables # shellcheck disable=SC1091 source .awsvariables # Get Values from Environment Variables echo "ROLE: $ROLE" echo "PARALLEL_ACCOUNTS: $PARALLEL_ACCOUNTS" echo "REGION: $REGION" # Function to unset AWS Profile Variables unset_aws() { unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN } unset_aws # Find THIS Account AWS Number CALLER_ARN=$(aws sts get-caller-identity --output text --query "Arn") PARTITION=$(echo "$CALLER_ARN" | cut -d: -f2) THISACCOUNT=$(echo "$CALLER_ARN" | cut -d: -f5) echo "THISACCOUNT: $THISACCOUNT" echo "PARTITION: $PARTITION" # Function to Assume Role to THIS Account & Create Session this_account_session() { unset_aws role_credentials=$(aws sts assume-role --role-arn arn:"$PARTITION":iam::"$THISACCOUNT":role/"$ROLE" --role-session-name ProwlerRun --output json) AWS_ACCESS_KEY_ID=$(echo "$role_credentials" | jq -r .Credentials.AccessKeyId) AWS_SECRET_ACCESS_KEY=$(echo "$role_credentials" | jq -r .Credentials.SecretAccessKey) AWS_SESSION_TOKEN=$(echo "$role_credentials" | jq -r .Credentials.SessionToken) export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN } # Find AWS Master Account this_account_session AWSMASTER=$(aws organizations describe-organization --query Organization.MasterAccountId --output text) echo "AWSMASTER: $AWSMASTER" # Function to Assume Role to Master Account & Create Session master_account_session() { unset_aws role_credentials=$(aws sts assume-role --role-arn arn:"$PARTITION":iam::"$AWSMASTER":role/"$ROLE" --role-session-name ProwlerRun --output json) AWS_ACCESS_KEY_ID=$(echo "$role_credentials" | jq -r .Credentials.AccessKeyId) AWS_SECRET_ACCESS_KEY=$(echo "$role_credentials" | jq -r .Credentials.SecretAccessKey) AWS_SESSION_TOKEN=$(echo "$role_credentials" | jq -r .Credentials.SessionToken) export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN } # Lookup All Accounts in AWS Organization master_account_session ACCOUNTS_IN_ORGS=$(aws organizations list-accounts --query Accounts[*].Id --output text) # Run Prowler against Accounts in AWS Organization echo "AWS Accounts in Organization" echo "$ACCOUNTS_IN_ORGS" for accountId in $ACCOUNTS_IN_ORGS; do # shellcheck disable=SC2015 test "$(jobs | wc -l)" -ge $PARALLEL_ACCOUNTS && wait -n || true { START_TIME=$SECONDS # Unset AWS Profile Variables unset_aws # Run Prowler echo -e "Assessing AWS Account: $accountId, using Role: $ROLE on $(date)" # Pipe stdout to /dev/null to reduce unnecessary Cloudwatch logs ./prowler/prowler -R "$ROLE" -A "$accountId" -M json-asff -q -S -f "$REGION" > /dev/null TOTAL_SEC=$((SECONDS - START_TIME)) printf "Completed AWS Account: $accountId in %02dh:%02dm:%02ds" $((TOTAL_SEC / 3600)) $((TOTAL_SEC % 3600 / 60)) $((TOTAL_SEC % 60)) echo "" } & done # Wait for All Prowler Processes to finish wait echo "Prowler Assessments Completed against All Accounts in AWS Organization" # Unset AWS Profile Variables unset_aws