#!/usr/bin/env bash # Prowler - the handy cloud security tool (copyright 2020) by Toni de la Fuente # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy # of the License at http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software distributed # under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR # CONDITIONS OF ANY KIND, either express or implied. See the License for the # specific language governing permissions and limitations under the License. # Current VPC Limit is 120 rules (60 inbound and 60 outbound) # Reference: https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html CHECK_ID_extra777="7.77" CHECK_TITLE_extra777="[extra777] Find VPC security groups with more than 50 ingress or egress rules " CHECK_SCORED_extra777="NOT_SCORED" CHECK_CIS_LEVEL_extra777="EXTRA" CHECK_SEVERITY_extra777="Medium" CHECK_ASFF_RESOURCE_TYPE_extra777="AwsEc2SecurityGroup" CHECK_ALTERNATE_check777="extra777" CHECK_SERVICENAME_extra777="ec2" CHECK_RISK_extra777='If Security groups are not properly configured the attack surface is increased. ' CHECK_REMEDIATION_extra777='Use a Zero Trust approach. Narrow ingress traffic as much as possible. Consider north-south as well as east-west traffic.' CHECK_DOC_extra777='https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html' CHECK_CAF_EPIC_extra777='Infrastructure Security' extra777(){ THRESHOLD=50 for regx in ${REGIONS}; do SECURITY_GROUP_IDS=$(${AWSCLI} ec2 describe-security-groups \ ${PROFILE_OPT} \ --region ${regx} \ --query 'SecurityGroups[*].GroupId' \ --output text 2>&1| xargs ) if [[ $(echo "$SECURITY_GROUP_IDS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then textInfo "$regx: Access Denied trying to describe security groups" "$regx" continue fi for SECURITY_GROUP in ${SECURITY_GROUP_IDS}; do INGRESS_TOTAL=$(${AWSCLI} ec2 describe-security-groups \ ${PROFILE_OPT} \ --filter "Name=group-id,Values=${SECURITY_GROUP}" \ --query "SecurityGroups[*].IpPermissions[*].IpRanges" \ --region ${regx} \ --output text | wc -l | xargs ) EGRESS_TOTAL=$(${AWSCLI} ec2 describe-security-groups \ ${PROFILE_OPT} \ --filter "Name=group-id,Values=${SECURITY_GROUP}" \ --query "SecurityGroups[*].IpPermissionsEgress[*].IpRanges" \ --region ${regx} \ --output text | wc -l | xargs ) if [[ (${INGRESS_TOTAL} -ge ${THRESHOLD}) || (${EGRESS_TOTAL} -ge ${THRESHOLD}) ]]; then textFail "${regx}: ${SECURITY_GROUP} has ${INGRESS_TOTAL} inbound rules and ${EGRESS_TOTAL} outbound rules" "${regx}" "${SECURITY_GROUP}" else textPass "${regx}: ${SECURITY_GROUP} has ${INGRESS_TOTAL} inbound rules and ${EGRESS_TOTAL} outbound rules" "${regx}" "${SECURITY_GROUP}" fi done done }