mirror of
https://github.com/ghndrx/prowler.git
synced 2026-02-10 06:45:08 +00:00
84 lines
3.2 KiB
Bash
Executable File
84 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Run Prowler against All AWS Accounts in an AWS Organization
|
|
|
|
# Show Prowler Version
|
|
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 aws -R arn:"${PARTITION}":iam::"${accountId}":role/"${ROLE}" -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
|