diff --git a/checks/check119 b/checks/check119 index c1ebe209cb..141a36c23b 100644 --- a/checks/check119 +++ b/checks/check119 @@ -27,9 +27,14 @@ CHECK_CAF_EPIC_check119='IAM' check119(){ for regx in $REGIONS; do - EC2_DATA=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query 'Reservations[].Instances[].[InstanceId, IamInstanceProfile.Arn, State.Name]' --output json) - EC2_DATA=$(echo $EC2_DATA | jq '.[]|{InstanceId: .[0], ProfileArn: .[1], StateName: .[2]}') - INSTANCE_LIST=$(echo $EC2_DATA | jq -r '.InstanceId') + EC2_DATA=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query 'Reservations[].Instances[].[InstanceId, IamInstanceProfile.Arn, State.Name]' --output json 2>&1) + if [[ $(echo "$EC2_DATA" | grep UnauthorizedOperation) ]]; then + textInfo "$regx: Unauthorized Operation error trying to describe instances" "$regx" + continue + else + EC2_DATA=$(echo $EC2_DATA | jq '.[]|{InstanceId: .[0], ProfileArn: .[1], StateName: .[2]}') + INSTANCE_LIST=$(echo $EC2_DATA | jq -r '.InstanceId') + fi if [[ $INSTANCE_LIST ]]; then for instance in $INSTANCE_LIST; do STATE_NAME=$(echo $EC2_DATA | jq -r --arg i "$instance" 'select(.InstanceId==$i)|.StateName') diff --git a/checks/check29 b/checks/check29 index dc9f37b4c9..b208f50697 100644 --- a/checks/check29 +++ b/checks/check29 @@ -30,13 +30,13 @@ check29(){ # "Ensure VPC Flow Logging is Enabled in all VPCs (Scored)" for regx in $REGIONS; do AVAILABLE_VPC=$($AWSCLI ec2 describe-vpcs $PROFILE_OPT --region $regx --query 'Vpcs[?State==`available`].VpcId' --output text 2>&1) - if [[ $(echo "$AVAILABLE_VPC" | grep AccessDenied) ]]; then + if [[ $(echo "$AVAILABLE_VPC" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then textFail "$regx: Access Denied trying to describe VPCs" "$regx" "$vpcx" continue fi for vpcx in $AVAILABLE_VPC; do CHECK_FL=$($AWSCLI ec2 describe-flow-logs $PROFILE_OPT --region $regx --filter Name="resource-id",Values="${vpcx}" --query 'FlowLogs[?FlowLogStatus==`ACTIVE`].FlowLogId' --output text 2>&1) - if [[ $(echo "$CHECK_FL" | grep AccessDenied) ]]; then + if [[ $(echo "$CHECK_FL" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then textFail "$regx: VPC $vpcx Access Denied trying to describe flow logs" "$regx" "$vpcx" continue fi diff --git a/checks/check41 b/checks/check41 index f8af5e9b2d..d6bf98cb06 100644 --- a/checks/check41 +++ b/checks/check41 @@ -29,7 +29,11 @@ CHECK_CAF_EPIC_check41='Infrastructure Security' check41(){ # "Ensure no security groups allow ingress from 0.0.0.0/0 or ::/0 to port 22 (Scored)" for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`22` && ToPort>=`22`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`22` && ToPort>=`22`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0" "$regx" "$SG" diff --git a/checks/check42 b/checks/check42 index cf4b3cf226..4d7350918b 100644 --- a/checks/check42 +++ b/checks/check42 @@ -29,7 +29,11 @@ CHECK_CAF_EPIC_check42='Infrastructure Security' check42(){ # "Ensure no security groups allow ingress from 0.0.0.0/0 or ::/0 to port 3389 (Scored)" for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`3389` && ToPort>=`3389`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`3389` && ToPort>=`3389`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0" "$regx" "$SG" diff --git a/checks/check43 b/checks/check43 index c3a57e129e..db704e87f9 100644 --- a/checks/check43 +++ b/checks/check43 @@ -29,7 +29,11 @@ CHECK_CAF_EPIC_check43='Infrastructure Security' check43(){ # "Ensure the default security group of every VPC restricts all traffic (Scored)" for regx in $REGIONS; do - CHECK_SGDEFAULT_IDS=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --filters Name=group-name,Values='default' --query 'SecurityGroups[*].GroupId[]' --output text) + CHECK_SGDEFAULT_IDS=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --filters Name=group-name,Values='default' --query 'SecurityGroups[*].GroupId[]' --output text 2>&1) + if [[ $(echo "$CHECK_SGDEFAULT_IDS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi for CHECK_SGDEFAULT_ID in $CHECK_SGDEFAULT_IDS; do CHECK_SGDEFAULT_ID_OPEN=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --group-ids $CHECK_SGDEFAULT_ID --query 'SecurityGroups[*].{IpPermissions:IpPermissions,IpPermissionsEgress:IpPermissionsEgress,GroupId:GroupId}' --output text |egrep '\s0.0.0.0|\:\:\/0') if [[ $CHECK_SGDEFAULT_ID_OPEN ]];then diff --git a/checks/check44 b/checks/check44 index e6b8aee9c2..3e55536ab9 100644 --- a/checks/check44 +++ b/checks/check44 @@ -28,7 +28,11 @@ CHECK_CAF_EPIC_check44='Infrastructure Security' check44(){ # "Ensure routing tables for VPC peering are \"least access\" (Not Scored)" for regx in $REGIONS; do - LIST_OF_VPCS_PEERING_CONNECTIONS=$($AWSCLI ec2 describe-vpc-peering-connections --output text $PROFILE_OPT --region $regx --query 'VpcPeeringConnections[*].VpcPeeringConnectionId'| sort | paste -s -d" " -) + LIST_OF_VPCS_PEERING_CONNECTIONS=$($AWSCLI ec2 describe-vpc-peering-connections --output text $PROFILE_OPT --region $regx --query 'VpcPeeringConnections[*].VpcPeeringConnectionId' 2>&1| sort | paste -s -d" " - ) + if [[ $(echo "$LIST_OF_VPCS_PEERING_CONNECTIONS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe vpc peering connections" "$regx" + continue + fi if [[ $LIST_OF_VPCS_PEERING_CONNECTIONS ]];then textInfo "$regx: $LIST_OF_VPCS_PEERING_CONNECTIONS - review routing tables" "$regx" "$LIST_OF_VPCS_PEERING_CONNECTIONS" #LIST_OF_VPCS=$($AWSCLI ec2 describe-vpcs $PROFILE_OPT --region $regx --query 'Vpcs[*].VpcId' --output text) diff --git a/checks/check45 b/checks/check45 index c9a461e98d..550757b42a 100644 --- a/checks/check45 +++ b/checks/check45 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_check45='Infrastructure Security' check45(){ for regx in $REGIONS; do - NACL_LIST=$($AWSCLI ec2 describe-network-acls --query 'NetworkAcls[?Entries[?(((!PortRange) || (PortRange.From<=`22` && PortRange.To>=`22`)) && ((CidrBlock == `0.0.0.0/0`) && (Egress == `false`) && (RuleAction == `allow`)))]].{NetworkAclId:NetworkAclId}' $PROFILE_OPT --region $regx --output text) + NACL_LIST=$($AWSCLI ec2 describe-network-acls --query 'NetworkAcls[?Entries[?(((!PortRange) || (PortRange.From<=`22` && PortRange.To>=`22`)) && ((CidrBlock == `0.0.0.0/0`) && (Egress == `false`) && (RuleAction == `allow`)))]].{NetworkAclId:NetworkAclId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$NACL_LIST" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe vpc network acls" "$regx" + continue + fi if [[ $NACL_LIST ]];then for NACL in $NACL_LIST;do textInfo "$regx: Found Network ACL: $NACL open to 0.0.0.0/0 for SSH port 22" "$regx" "$NACL" diff --git a/checks/check46 b/checks/check46 index 7239599174..fd2aaabf24 100644 --- a/checks/check46 +++ b/checks/check46 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_check46='Infrastructure Security' check46(){ for regx in $REGIONS; do - NACL_LIST=$($AWSCLI ec2 describe-network-acls --query 'NetworkAcls[?Entries[?(((!PortRange) || (PortRange.From<=`3389` && PortRange.To>=`3389`)) && ((CidrBlock == `0.0.0.0/0`) && (Egress == `false`) && (RuleAction == `allow`)))]].{NetworkAclId:NetworkAclId}' $PROFILE_OPT --region $regx --output text) + NACL_LIST=$($AWSCLI ec2 describe-network-acls --query 'NetworkAcls[?Entries[?(((!PortRange) || (PortRange.From<=`3389` && PortRange.To>=`3389`)) && ((CidrBlock == `0.0.0.0/0`) && (Egress == `false`) && (RuleAction == `allow`)))]].{NetworkAclId:NetworkAclId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$NACL_LIST" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe vpc network acls" "$regx" + continue + fi if [[ $NACL_LIST ]];then for NACL in $NACL_LIST;do textInfo "$regx: Found Network ACL: $NACL open to 0.0.0.0/0 for Microsoft RDP port 3389" "$regx" "$NACL" diff --git a/checks/check_extra710 b/checks/check_extra710 index ffd3b0357c..7edd17e818 100644 --- a/checks/check_extra710 +++ b/checks/check_extra710 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_extra710='Infrastructure Security' extra710(){ # "Check for internet facing EC2 Instances " for regx in $REGIONS; do - LIST_OF_PUBLIC_INSTANCES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query 'Reservations[*].Instances[?PublicIpAddress].[InstanceId,PublicIpAddress]' --output text) + LIST_OF_PUBLIC_INSTANCES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query 'Reservations[*].Instances[?PublicIpAddress].[InstanceId,PublicIpAddress]' --output text 2>&1) + if [[ $(echo "$LIST_OF_PUBLIC_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe instances" "$regx" + continue + fi if [[ $LIST_OF_PUBLIC_INSTANCES ]];then while read -r instance;do INSTANCE_ID=$(echo $instance | awk '{ print $1; }') diff --git a/checks/check_extra7101 b/checks/check_extra7101 index a4fd714c11..e2b6528c7a 100644 --- a/checks/check_extra7101 +++ b/checks/check_extra7101 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7101='Logging and Monitoring' extra7101(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do AUDIT_LOGS_ENABLED=$($AWSCLI es describe-elasticsearch-domain-config --domain-name $domain $PROFILE_OPT --region $regx --query DomainConfig.LogPublishingOptions.Options.AUDIT_LOGS.Enabled --output text |grep -v ^None|grep -v ^False) diff --git a/checks/check_extra7102 b/checks/check_extra7102 index f16c390894..40e23692d4 100644 --- a/checks/check_extra7102 +++ b/checks/check_extra7102 @@ -36,7 +36,11 @@ extra7102(){ textInfo "[extra7102] Requires a Shodan API key to work. Use -N " else for regx in $REGIONS; do - LIST_OF_EIP=$($AWSCLI $PROFILE_OPT --region $regx ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Association.PublicIp' --output text) + LIST_OF_EIP=$($AWSCLI $PROFILE_OPT --region $regx ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Association.PublicIp' --output text 2>&1) + if [[ $(echo "$LIST_OF_EIP" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe network interfaces" "$regx" + continue + fi if [[ $LIST_OF_EIP ]]; then for ip in $LIST_OF_EIP;do SHODAN_QUERY=$(curl -ks https://api.shodan.io/shodan/host/$ip?key=$SHODAN_API_KEY) diff --git a/checks/check_extra7103 b/checks/check_extra7103 index 12ace2038d..9ff11c652d 100644 --- a/checks/check_extra7103 +++ b/checks/check_extra7103 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7103='IAM' extra7103(){ for regx in ${REGIONS}; do - LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text) + LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list notebook instances" "$regx" + continue + fi if [[ $LIST_SM_NB_INSTANCES ]];then for nb_instance in $LIST_SM_NB_INSTANCES; do SM_NB_ROOTACCESS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-notebook-instance --notebook-instance-name $nb_instance --query 'RootAccess' --output text) diff --git a/checks/check_extra7104 b/checks/check_extra7104 index 7697ad5020..451ee532e4 100644 --- a/checks/check_extra7104 +++ b/checks/check_extra7104 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7104='Infrastructure Security' extra7104(){ for regx in ${REGIONS}; do - LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text) + LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list notebook instances" "$regx" + continue + fi if [[ $LIST_SM_NB_INSTANCES ]];then for nb_instance in $LIST_SM_NB_INSTANCES; do SM_NB_SUBNETID=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-notebook-instance --notebook-instance-name $nb_instance --query 'SubnetId' --output text) diff --git a/checks/check_extra7105 b/checks/check_extra7105 index 1b2d2c8926..9948e7840c 100644 --- a/checks/check_extra7105 +++ b/checks/check_extra7105 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7105='Infrastructure Security' extra7105(){ for regx in ${REGIONS}; do - LIST_SM_NB_MODELS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-models --query 'Models[*].ModelName' --output text) + LIST_SM_NB_MODELS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-models --query 'Models[*].ModelName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_MODELS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list models" "$regx" + continue + fi if [[ $LIST_SM_NB_MODELS ]];then for nb_model_name in $LIST_SM_NB_MODELS; do SM_NB_NETWORKISOLATION=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-model --model-name $nb_model_name --query 'EnableNetworkIsolation' --output text) diff --git a/checks/check_extra7106 b/checks/check_extra7106 index af09f2698e..b363fbb502 100644 --- a/checks/check_extra7106 +++ b/checks/check_extra7106 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7106='Infrastructure Security' extra7106(){ for regx in ${REGIONS}; do - LIST_SM_NB_MODELS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-models --query 'Models[*].ModelName' --output text) + LIST_SM_NB_MODELS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-models --query 'Models[*].ModelName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_MODELS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list models" "$regx" + continue + fi if [[ $LIST_SM_NB_MODELS ]];then for nb_model_name in $LIST_SM_NB_MODELS; do SM_NB_VPCCONFIG=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-model --model-name $nb_model_name --query 'VpcConfig.Subnets' --output text) diff --git a/checks/check_extra7107 b/checks/check_extra7107 index e5536e8734..02d983ca93 100644 --- a/checks/check_extra7107 +++ b/checks/check_extra7107 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7107='Data Protection' extra7107(){ for regx in ${REGIONS}; do - LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text) + LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_JOBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list training jobs" "$regx" + continue + fi if [[ $LIST_SM_NB_JOBS ]];then for nb_job_name in $LIST_SM_NB_JOBS; do SM_NB_INTERCONTAINERENCRYPTION=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-training-job --training-job-name $nb_job_name --query 'EnableInterContainerTrafficEncryption' --output text) diff --git a/checks/check_extra7108 b/checks/check_extra7108 index 2956afe8f5..a26e0b61c1 100644 --- a/checks/check_extra7108 +++ b/checks/check_extra7108 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7108='Data Protection' extra7108(){ for regx in ${REGIONS}; do - LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text) + LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_JOBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list training jobs" "$regx" + continue + fi if [[ $LIST_SM_NB_JOBS ]];then for nb_job_name in $LIST_SM_NB_JOBS; do SM_JOB_KMSENCRYPTION=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-training-job --training-job-name $nb_job_name --query 'ResourceConfig.VolumeKmsKeyId' --output text) diff --git a/checks/check_extra7109 b/checks/check_extra7109 index 90d036e027..808875a278 100644 --- a/checks/check_extra7109 +++ b/checks/check_extra7109 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7109='Infrastructure Security' extra7109(){ for regx in ${REGIONS}; do - LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text) + LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_JOBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list training jobs" "$regx" + continue + fi if [[ $LIST_SM_NB_JOBS ]];then for nb_job_name in $LIST_SM_NB_JOBS; do SM_NB_NETWORKISOLATION=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-training-job --training-job-name $nb_job_name --query 'EnableNetworkIsolation' --output text) diff --git a/checks/check_extra711 b/checks/check_extra711 index a7c7b79810..d7f0645546 100644 --- a/checks/check_extra711 +++ b/checks/check_extra711 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra711='Data Protection' extra711(){ # "Check for Publicly Accessible Redshift Clusters " for regx in $REGIONS; do - LIST_OF_PUBLIC_REDSHIFT_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --region $regx --query 'Clusters[?PubliclyAccessible == `true`].[ClusterIdentifier,Endpoint.Address]' --output text) + LIST_OF_PUBLIC_REDSHIFT_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --region $regx --query 'Clusters[?PubliclyAccessible == `true`].[ClusterIdentifier,Endpoint.Address]' --output text 2>&1) + if [[ $(echo "$LIST_OF_PUBLIC_REDSHIFT_CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe clusters" "$regx" + continue + fi if [[ $LIST_OF_PUBLIC_REDSHIFT_CLUSTERS ]];then while read -r cluster;do CLUSTER_ID=$(echo $cluster | awk '{ print $1; }') diff --git a/checks/check_extra7110 b/checks/check_extra7110 index 448e2308c2..45bd7cbfc7 100644 --- a/checks/check_extra7110 +++ b/checks/check_extra7110 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7110='Infrastructure Security' extra7110(){ for regx in ${REGIONS}; do - LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text) + LIST_SM_NB_JOBS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-training-jobs --query 'TrainingJobSummaries[*].TrainingJobName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_JOBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list training jobs" "$regx" + continue + fi if [[ $LIST_SM_NB_JOBS ]];then for nb_job_name in $LIST_SM_NB_JOBS; do SM_NB_SUBNETS=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-training-job --training-job-name $nb_job_name --query 'VpcConfig.Subnets' --output text) diff --git a/checks/check_extra7111 b/checks/check_extra7111 index a6669a090d..5c00f4518d 100644 --- a/checks/check_extra7111 +++ b/checks/check_extra7111 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7111='Infrastructure Security' extra7111(){ for regx in ${REGIONS}; do - LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text) + LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list notebook instances" "$regx" + continue + fi if [[ $LIST_SM_NB_INSTANCES ]];then for nb_instance in $LIST_SM_NB_INSTANCES; do SM_NB_DIRECTINET=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-notebook-instance --notebook-instance-name $nb_instance --query 'DirectInternetAccess' --output text) diff --git a/checks/check_extra7112 b/checks/check_extra7112 index e031065d86..b40c5996da 100644 --- a/checks/check_extra7112 +++ b/checks/check_extra7112 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7112='Data Protection' extra7112(){ for regx in ${REGIONS}; do - LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text) + LIST_SM_NB_INSTANCES=$($AWSCLI $PROFILE_OPT --region $regx sagemaker list-notebook-instances --query 'NotebookInstances[*].NotebookInstanceName' --output text 2>&1) + if [[ $(echo "$LIST_SM_NB_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list notebook instances" "$regx" + continue + fi if [[ $LIST_SM_NB_INSTANCES ]];then for nb_instance in $LIST_SM_NB_INSTANCES; do SM_NB_KMSKEY=$($AWSCLI $PROFILE_OPT --region $regx sagemaker describe-notebook-instance --notebook-instance-name $nb_instance --query 'KmsKeyId' --output text) diff --git a/checks/check_extra7113 b/checks/check_extra7113 index 4afcfdc30b..a70ebe4855 100644 --- a/checks/check_extra7113 +++ b/checks/check_extra7113 @@ -37,7 +37,11 @@ CHECK_CAF_EPIC_extra7113='Data Protection' extra7113(){ for regx in $REGIONS; do - LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query "DBInstances[?Engine != 'docdb'].DBInstanceIdentifier" --output text) + LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query "DBInstances[?Engine != 'docdb'].DBInstanceIdentifier" --output text 2>&1) + if [[ $(echo "$LIST_OF_RDS_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe DB instances" "$regx" + continue + fi if [[ $LIST_OF_RDS_INSTANCES ]];then for rdsinstance in $LIST_OF_RDS_INSTANCES; do IS_DELETIONPROTECTION=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --db-instance-identifier $rdsinstance --query 'DBInstances[*].DeletionProtection' --output text) diff --git a/checks/check_extra7114 b/checks/check_extra7114 index 91a640bb71..cc62ca5baf 100644 --- a/checks/check_extra7114 +++ b/checks/check_extra7114 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7114='Data Protection' extra7114(){ for regx in $REGIONS; do - LIST_EP_SC=$($AWSCLI glue get-dev-endpoints $PROFILE_OPT --region $regx --query 'DevEndpoints[*].{Name:EndpointName,Security:SecurityConfiguration}' --output json) + LIST_EP_SC=$($AWSCLI glue get-dev-endpoints $PROFILE_OPT --region $regx --query 'DevEndpoints[*].{Name:EndpointName,Security:SecurityConfiguration}' --output json 2>&1) + if [[ $(echo "$LIST_EP_SC" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get dev endpoints" "$regx" + continue + fi if [[ $LIST_EP_SC != '[]' ]]; then for ep in $(echo "${LIST_EP_SC}"| jq -r '.[] | @base64');do ENDPOINT_NAME=$(echo $ep | base64 --decode | jq -r '.Name') diff --git a/checks/check_extra7115 b/checks/check_extra7115 index e09e6590e8..6f8fd9bc9c 100644 --- a/checks/check_extra7115 +++ b/checks/check_extra7115 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7115='Data Protection' extra7115(){ for regx in $REGIONS; do - CONNECTION_LIST=$($AWSCLI glue get-connections $PROFILE_OPT --region $regx --output json --query 'ConnectionList[*].{Name:Name,SSL:ConnectionProperties.JDBC_ENFORCE_SSL}') + CONNECTION_LIST=$($AWSCLI glue get-connections $PROFILE_OPT --region $regx --output json --query 'ConnectionList[*].{Name:Name,SSL:ConnectionProperties.JDBC_ENFORCE_SSL}' 2>&1) + if [[ $(echo "$CONNECTION_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get connections" "$regx" + continue + fi if [[ $CONNECTION_LIST != '[]' ]]; then for connection in $(echo "${CONNECTION_LIST}" | jq -r '.[] | @base64'); do CONNECTION_NAME=$(echo $connection | base64 --decode | jq -r '.Name' ) diff --git a/checks/check_extra7116 b/checks/check_extra7116 index d18ab6f2e3..7ebd9d3c58 100644 --- a/checks/check_extra7116 +++ b/checks/check_extra7116 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7116='Data Protection' extra7116(){ for regx in $REGIONS; do - TABLE_LIST=$($AWSCLI glue search-tables --max-results 1 $PROFILE_OPT --region $regx --output text --query 'TableList[*]' ) + TABLE_LIST=$($AWSCLI glue search-tables --max-results 1 $PROFILE_OPT --region $regx --output text --query 'TableList[*]' 2>&1) + if [[ $(echo "$TABLE_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to search tables" "$regx" + continue + fi if [[ ! -z $TABLE_LIST ]]; then METADATA_ENCRYPTED=$($AWSCLI glue get-data-catalog-encryption-settings $PROFILE_OPT --region $regx --output text --query "DataCatalogEncryptionSettings.EncryptionAtRest.CatalogEncryptionMode") if [[ "$METADATA_ENCRYPTED" == "DISABLED" ]]; then diff --git a/checks/check_extra7117 b/checks/check_extra7117 index 6091a71cf0..389e50d31f 100644 --- a/checks/check_extra7117 +++ b/checks/check_extra7117 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7117='Data Protection' extra7117(){ for regx in $REGIONS; do - CONNECTION_LIST=$($AWSCLI glue get-connections $PROFILE_OPT --region $regx --output text --query 'ConnectionList[*]') + CONNECTION_LIST=$($AWSCLI glue get-connections $PROFILE_OPT --region $regx --output text --query 'ConnectionList[*]' 2>&1) + if [[ $(echo "$CONNECTION_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get connections" "$regx" + continue + fi if [[ ! -z $CONNECTION_LIST ]]; then METADATA_ENCRYPTED=$($AWSCLI glue get-data-catalog-encryption-settings $PROFILE_OPT --region $regx --output text --query "DataCatalogEncryptionSettings.ConnectionPasswordEncryption.ReturnConnectionPasswordEncrypted") if [[ "$METADATA_ENCRYPTED" == "False" ]]; then diff --git a/checks/check_extra7118 b/checks/check_extra7118 index 0b70fcab97..22dca80288 100644 --- a/checks/check_extra7118 +++ b/checks/check_extra7118 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7118='Data Protection' extra7118(){ for regx in $REGIONS; do - JOB_LIST=$($AWSCLI glue get-jobs $PROFILE_OPT --region $regx --output json --query 'Jobs[*].{Name:Name,SecurityConfiguration:SecurityConfiguration,JobEncryption:DefaultArguments."--encryption-type"}') + JOB_LIST=$($AWSCLI glue get-jobs $PROFILE_OPT --region $regx --output json --query 'Jobs[*].{Name:Name,SecurityConfiguration:SecurityConfiguration,JobEncryption:DefaultArguments."--encryption-type"}' 2>&1) + if [[ $(echo "$JOB_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get jobs" "$regx" + continue + fi if [[ $JOB_LIST != '[]' ]]; then for job in $(echo "${JOB_LIST}" | jq -r '.[] | @base64'); do JOB_NAME=$(echo $job | base64 --decode | jq -r '.Name') diff --git a/checks/check_extra7119 b/checks/check_extra7119 index a3ca4a1032..d8098c55d1 100644 --- a/checks/check_extra7119 +++ b/checks/check_extra7119 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7119='Logging and Monitoring' extra7119(){ for regx in $REGIONS; do - LIST_EP_SC=$($AWSCLI glue get-dev-endpoints $PROFILE_OPT --region $regx --query 'DevEndpoints[*].{Name:EndpointName,Security:SecurityConfiguration}' --output json) + LIST_EP_SC=$($AWSCLI glue get-dev-endpoints $PROFILE_OPT --region $regx --query 'DevEndpoints[*].{Name:EndpointName,Security:SecurityConfiguration}' --output json 2>&1) + if [[ $(echo "$LIST_EP_SC" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get dev endpoints" "$regx" + continue + fi if [[ $LIST_EP_SC != '[]' ]]; then for ep in $(echo "${LIST_EP_SC}"| jq -r '.[] | @base64');do ENDPOINT_NAME=$(echo $ep | base64 --decode | jq -r '.Name') diff --git a/checks/check_extra7120 b/checks/check_extra7120 index 93907c93c3..4b444d4357 100644 --- a/checks/check_extra7120 +++ b/checks/check_extra7120 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7120='Logging and Monitoring' extra7120(){ for regx in $REGIONS; do - JOB_LIST=$($AWSCLI glue get-jobs $PROFILE_OPT --region $regx --output json --query 'Jobs[*].{Name:Name,SecurityConfiguration:SecurityConfiguration}') + JOB_LIST=$($AWSCLI glue get-jobs $PROFILE_OPT --region $regx --output json --query 'Jobs[*].{Name:Name,SecurityConfiguration:SecurityConfiguration}' 2>&1) + if [[ $(echo "$JOB_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get jobs" "$regx" + continue + fi if [[ $JOB_LIST != '[]' ]]; then for job in $(echo "${JOB_LIST}" | jq -r '.[] | @base64'); do JOB_NAME=$(echo $job | base64 --decode | jq -r '.Name') diff --git a/checks/check_extra7121 b/checks/check_extra7121 index 13259770a4..65c2f566b8 100644 --- a/checks/check_extra7121 +++ b/checks/check_extra7121 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7121='Data Protection' extra7121(){ for regx in $REGIONS; do - LIST_EP_SC=$($AWSCLI glue get-dev-endpoints $PROFILE_OPT --region $regx --query 'DevEndpoints[*].{Name:EndpointName,Security:SecurityConfiguration}' --output json) + LIST_EP_SC=$($AWSCLI glue get-dev-endpoints $PROFILE_OPT --region $regx --query 'DevEndpoints[*].{Name:EndpointName,Security:SecurityConfiguration}' --output json 2>&1) + if [[ $(echo "$LIST_EP_SC" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get dev endpoints" "$regx" + continue + fi if [[ $LIST_EP_SC != '[]' ]]; then for ep in $(echo "${LIST_EP_SC}"| jq -r '.[] | @base64');do ENDPOINT_NAME=$(echo $ep | base64 --decode | jq -r '.Name') diff --git a/checks/check_extra7122 b/checks/check_extra7122 index 9f50bb71ba..8e3216a55b 100644 --- a/checks/check_extra7122 +++ b/checks/check_extra7122 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7122='Data Protection' extra7122(){ for regx in $REGIONS; do - JOB_LIST=$($AWSCLI glue get-jobs $PROFILE_OPT --region $regx --output json --query 'Jobs[*].{Name:Name,SecurityConfiguration:SecurityConfiguration}') + JOB_LIST=$($AWSCLI glue get-jobs $PROFILE_OPT --region $regx --output json --query 'Jobs[*].{Name:Name,SecurityConfiguration:SecurityConfiguration}' 2>&1) + if [[ $(echo "$JOB_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get jobs" "$regx" + continue + fi if [[ $JOB_LIST != '[]' ]]; then for job in $(echo "${JOB_LIST}" | jq -r '.[] | @base64'); do JOB_NAME=$(echo $job | base64 --decode | jq -r '.Name') diff --git a/checks/check_extra7124 b/checks/check_extra7124 index 7a7e8b1f63..54064650e8 100644 --- a/checks/check_extra7124 +++ b/checks/check_extra7124 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_extra7124='Infrastructure Security' extra7124(){ for regx in $REGIONS; do # Filters running instances only - LIST_EC2_INSTANCES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --query 'Reservations[*].Instances[*].[InstanceId]' --filters Name=instance-state-name,Values=running --region $regx --output text) + LIST_EC2_INSTANCES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --query 'Reservations[*].Instances[*].[InstanceId]' --filters Name=instance-state-name,Values=running --region $regx --output text 2>&1) + if [[ $(echo "$LIST_EC2_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe instances" "$regx" + continue + fi if [[ $LIST_EC2_INSTANCES ]]; then LIST_SSM_MANAGED_INSTANCES=$($AWSCLI ssm describe-instance-information $PROFILE_OPT --query "InstanceInformationList[].InstanceId" --region $regx | jq -r '.[]') LIST_EC2_UNMANAGED=$(echo ${LIST_SSM_MANAGED_INSTANCES[@]} ${LIST_EC2_INSTANCES[@]} | tr ' ' '\n' | sort | uniq -u) diff --git a/checks/check_extra7127 b/checks/check_extra7127 index 9c12009ad5..f044346b21 100644 --- a/checks/check_extra7127 +++ b/checks/check_extra7127 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_extra7127='Infrastructure Security' extra7127(){ for regx in $REGIONS; do - NON_COMPLIANT_SSM_MANAGED_INSTANCES=$($AWSCLI ssm list-resource-compliance-summaries $PROFILE_OPT --region $regx --filters Key=Status,Values=NON_COMPLIANT --query ResourceComplianceSummaryItems[].ResourceId --output text) + NON_COMPLIANT_SSM_MANAGED_INSTANCES=$($AWSCLI ssm list-resource-compliance-summaries $PROFILE_OPT --region $regx --filters Key=Status,Values=NON_COMPLIANT --query ResourceComplianceSummaryItems[].ResourceId --output text 2>&1) + if [[ $(echo "$NON_COMPLIANT_SSM_MANAGED_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list resource compliance summaries" "$regx" + continue + fi COMPLIANT_SSM_MANAGED_INSTANCES=$($AWSCLI ssm list-resource-compliance-summaries $PROFILE_OPT --region $regx --filters Key=Status,Values=COMPLIANT --query ResourceComplianceSummaryItems[].ResourceId --output text) if [[ $NON_COMPLIANT_SSM_MANAGED_INSTANCES || $COMPLIANT_SSM_MANAGED_INSTANCES ]]; then if [[ $NON_COMPLIANT_SSM_MANAGED_INSTANCES ]]; then diff --git a/checks/check_extra7128 b/checks/check_extra7128 index f9ad2cda4d..fc2944f726 100644 --- a/checks/check_extra7128 +++ b/checks/check_extra7128 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7128='Data Protection' extra7128(){ for regx in $REGIONS; do - DDB_TABLES_LIST=$($AWSCLI dynamodb list-tables $PROFILE_OPT --region $regx --output text --query TableNames) + DDB_TABLES_LIST=$($AWSCLI dynamodb list-tables $PROFILE_OPT --region $regx --output text --query TableNames 2>&1) + if [[ $(echo "$DDB_TABLES_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list tables" "$regx" + continue + fi if [[ $DDB_TABLES_LIST ]]; then for table in $DDB_TABLES_LIST; do DDB_TABLE_WITH_KMS=$($AWSCLI dynamodb describe-table --table-name $table $PROFILE_OPT --region $regx --query Table.SSEDescription.SSEType --output text) diff --git a/checks/check_extra7129 b/checks/check_extra7129 index caa6fefaa1..e798c919ba 100644 --- a/checks/check_extra7129 +++ b/checks/check_extra7129 @@ -29,7 +29,11 @@ PARALLEL_REGIONS="50" extra7129(){ for regx in $REGIONS; do # ( - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Scheme == `internet-facing` && Type == `application`].[LoadBalancerName]' --output text) + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Scheme == `internet-facing` && Type == `application`].[LoadBalancerName]' --output text 2>&1) + if [[ $(echo "$LIST_OF_ELBSV2" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi LIST_OF_WAFV2_WEBACL_ARN=$($AWSCLI wafv2 list-web-acls $PROFILE_OPT --region=$regx --scope=REGIONAL --query WebACLs[*].ARN --output text) LIST_OF_WAFV1_WEBACL_WEBACLID=$($AWSCLI waf-regional list-web-acls $PROFILE_OPT --region $regx --query WebACLs[*].[WebACLId] --output text) diff --git a/checks/check_extra713 b/checks/check_extra713 index 01f96d5807..17b568276e 100644 --- a/checks/check_extra713 +++ b/checks/check_extra713 @@ -44,7 +44,7 @@ extra713(){ fi else # if list-detectors return any error - textInfo "$regx: GuardDuty not checked" "$regx" + textInfo "$regx: GuardDuty not checked or Access Denied trying to get detector" "$regx" fi done } \ No newline at end of file diff --git a/checks/check_extra7130 b/checks/check_extra7130 index f16415168e..4e68318223 100644 --- a/checks/check_extra7130 +++ b/checks/check_extra7130 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7130='Data Protection' extra7130(){ for regx in $REGIONS; do - LIST_SNS=$($AWSCLI sns list-topics $PROFILE_OPT --region $regx --query 'Topics[*].TopicArn' --output text) + LIST_SNS=$($AWSCLI sns list-topics $PROFILE_OPT --region $regx --query 'Topics[*].TopicArn' --output text 2>&1) + if [[ $(echo "$LIST_SNS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list topics" "$regx" + continue + fi if [[ $LIST_SNS ]];then for topic in $LIST_SNS; do SHORT_TOPIC=$(echo $topic | awk -F ":" '{print $NF}') diff --git a/checks/check_extra7131 b/checks/check_extra7131 index dbd22bd9a3..871136b267 100644 --- a/checks/check_extra7131 +++ b/checks/check_extra7131 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7131='Infrastructure Security' extra7131(){ for regx in $REGIONS; do # LIST_OF_RDS_PUBLIC_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[?PubliclyAccessible==`true` && DBInstanceStatus==`"available"`].[DBInstanceIdentifier,Endpoint.Address]' --output text) - LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].[DBInstanceIdentifier,AutoMinorVersionUpgrade]' --output text) + LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].[DBInstanceIdentifier,AutoMinorVersionUpgrade]' --output text 2>&1) + if [[ $(echo "$LIST_OF_RDS_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe DB instances" "$regx" + continue + fi if [[ $LIST_OF_RDS_INSTANCES ]];then while read -r rds_instance;do RDS_NAME=$(echo $rds_instance | awk '{ print $1; }') diff --git a/checks/check_extra7132 b/checks/check_extra7132 index 4d3af5616c..eecf140a27 100644 --- a/checks/check_extra7132 +++ b/checks/check_extra7132 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7132='Logging and Monitoring' extra7132(){ for regx in $REGIONS; do - RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query "DBInstances[?Engine != 'docdb'].DBInstanceIdentifier" --output text) + RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query "DBInstances[?Engine != 'docdb'].DBInstanceIdentifier" --output text 2>&1) + if [[ $(echo "$RDS_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe DB instances" "$regx" + continue + fi if [[ $RDS_INSTANCES ]];then for rdsinstance in ${RDS_INSTANCES}; do RDS_NAME="$rdsinstance" diff --git a/checks/check_extra7133 b/checks/check_extra7133 index ee20f26179..23a8fab731 100644 --- a/checks/check_extra7133 +++ b/checks/check_extra7133 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7133='Data Protection' extra7133(){ for regx in $REGIONS; do - RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query "DBInstances[?Engine != 'docdb'].DBInstanceIdentifier" --output text) + RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query "DBInstances[?Engine != 'docdb'].DBInstanceIdentifier" --output text 2>&1) + if [[ $(echo "$RDS_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe DB instances" "$regx" + continue + fi if [[ $RDS_INSTANCES ]];then for rdsinstance in ${RDS_INSTANCES}; do RDS_NAME="$rdsinstance" diff --git a/checks/check_extra7134 b/checks/check_extra7134 index 14f2b95780..2ec1a44ead 100644 --- a/checks/check_extra7134 +++ b/checks/check_extra7134 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7134='Infrastructure Security' extra7134(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`20` && ToPort==`21`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`20` && ToPort==`21`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for FTP ports" "$regx" "$SG" diff --git a/checks/check_extra7135 b/checks/check_extra7135 index 2788b54e13..2978b6c421 100644 --- a/checks/check_extra7135 +++ b/checks/check_extra7135 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7135='Infrastructure Security' extra7135(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`9092` && ToPort==`9092`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`9092` && ToPort==`9092`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Kafka ports" "$regx" "$SG" diff --git a/checks/check_extra7136 b/checks/check_extra7136 index b7779b6feb..04df4c55be 100644 --- a/checks/check_extra7136 +++ b/checks/check_extra7136 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7136='Infrastructure Security' extra7136(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`23` && ToPort==`23`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`23` && ToPort==`23`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Telnet ports" "$regx" "$SG" diff --git a/checks/check_extra7137 b/checks/check_extra7137 index 5759927e43..d624a609cd 100644 --- a/checks/check_extra7137 +++ b/checks/check_extra7137 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7137='Infrastructure Security' extra7137(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`1433` && ToPort==`1434`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`1433` && ToPort==`1434`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Microsoft SQL Server ports" "$regx" "$SG" diff --git a/checks/check_extra7138 b/checks/check_extra7138 index f164aa6225..b12d2e12bd 100644 --- a/checks/check_extra7138 +++ b/checks/check_extra7138 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7138='Infrastructure Security' extra7138(){ for regx in $REGIONS; do - NACL_LIST=$($AWSCLI ec2 describe-network-acls --query 'NetworkAcls[?Entries[?((!PortRange) && (CidrBlock == `0.0.0.0/0`) && (Egress == `false`) && (RuleAction == `allow`))]].{NetworkAclId:NetworkAclId}' $PROFILE_OPT --region $regx --output text) + NACL_LIST=$($AWSCLI ec2 describe-network-acls --query 'NetworkAcls[?Entries[?((!PortRange) && (CidrBlock == `0.0.0.0/0`) && (Egress == `false`) && (RuleAction == `allow`))]].{NetworkAclId:NetworkAclId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$NACL_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe network acls" "$regx" + continue + fi if [[ $NACL_LIST ]];then for NACL in $NACL_LIST;do textInfo "$regx: Found Network ACL: $NACL open to 0.0.0.0/0 for any port" "$regx" "$NACL" diff --git a/checks/check_extra7139 b/checks/check_extra7139 index 094037eed5..e655a2a73a 100644 --- a/checks/check_extra7139 +++ b/checks/check_extra7139 @@ -25,7 +25,11 @@ extra7139(){ for regx in $REGIONS; do DETECTORS_LIST="" - DETECTORS_LIST=$($AWSCLI guardduty list-detectors --query DetectorIds $PROFILE_OPT --region $regx --output text) + DETECTORS_LIST=$($AWSCLI guardduty list-detectors --query DetectorIds $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$DETECTORS_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list detectors" "$regx" + continue + fi if [[ $DETECTORS_LIST ]];then for DETECTOR in $DETECTORS_LIST;do FINDINGS_COUNT="" diff --git a/checks/check_extra7140 b/checks/check_extra7140 index 42f93e7209..6ef144dd30 100644 --- a/checks/check_extra7140 +++ b/checks/check_extra7140 @@ -24,7 +24,11 @@ CHECK_CAF_EPIC_extra7140='Data Protection' extra7140(){ for regx in $REGIONS; do - SSM_DOCS=$($AWSCLI $PROFILE_OPT --region $regx ssm list-documents --filters Key=Owner,Values=Self --query DocumentIdentifiers[].Name --output text) + SSM_DOCS=$($AWSCLI $PROFILE_OPT --region $regx ssm list-documents --filters Key=Owner,Values=Self --query DocumentIdentifiers[].Name --output text 2>&1) + if [[ $(echo "$SSM_DOCS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list documents" "$regx" + continue + fi if [[ $SSM_DOCS ]];then for ssmdoc in $SSM_DOCS; do SSM_DOC_SHARED_ALL=$($AWSCLI $PROFILE_OPT --region $regx ssm describe-document-permission --name "$ssmdoc" --permission-type "Share" --query AccountIds[] --output text | grep all) diff --git a/checks/check_extra7141 b/checks/check_extra7141 index 3b828cddfb..84dc47f123 100644 --- a/checks/check_extra7141 +++ b/checks/check_extra7141 @@ -31,7 +31,11 @@ extra7141(){ fi for regx in $REGIONS; do - SSM_DOCS=$($AWSCLI $PROFILE_OPT --region $regx ssm list-documents --filters Key=Owner,Values=Self --query DocumentIdentifiers[].Name --output text) + SSM_DOCS=$($AWSCLI $PROFILE_OPT --region $regx ssm list-documents --filters Key=Owner,Values=Self --query DocumentIdentifiers[].Name --output text 2>&1) + if [[ $(echo "$SSM_DOCS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list documents" "$regx" + continue + fi if [[ $SSM_DOCS ]];then for ssmdoc in $SSM_DOCS; do SSM_DOC_FILE="$SECRETS_TEMP_FOLDER/extra7141-$ssmdoc-$regx-content.txt" diff --git a/checks/check_extra7142 b/checks/check_extra7142 index 9900d46da8..fa1cc2a5f8 100644 --- a/checks/check_extra7142 +++ b/checks/check_extra7142 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_extra7142='Data Protection' extra7142(){ for regx in $REGIONS; do - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Type == `application`].[LoadBalancerArn]' --output text) + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Type == `application`].[LoadBalancerArn]' --output text 2>&1) + if [[ $(echo "$LIST_OF_ELBSV2" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi if [[ $LIST_OF_ELBSV2 ]];then for alb in $LIST_OF_ELBSV2;do CHECK_IF_DROP_INVALID_HEADER_FIELDS=$($AWSCLI elbv2 describe-load-balancer-attributes $PROFILE_OPT --region $regx --load-balancer-arn $alb --query 'Attributes[6]' --output text|grep -i true) diff --git a/checks/check_extra7143 b/checks/check_extra7143 index 7d3ee0eb6b..cb9a1c3fe8 100644 --- a/checks/check_extra7143 +++ b/checks/check_extra7143 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7143='Data Protection' extra7143(){ # "Check if EFS have policies which allow access to everyone (Not Scored) (Not part of CIS benchmark)" for regx in $REGIONS; do - LIST_OF_EFS_IDS=$($AWSCLI efs describe-file-systems $PROFILE_OPT --region $regx --query FileSystems[*].FileSystemId --output text|xargs -n1) + LIST_OF_EFS_IDS=$($AWSCLI efs describe-file-systems $PROFILE_OPT --region $regx --query FileSystems[*].FileSystemId --output text 2>&1|xargs -n1 ) + if [[ $(echo "$LIST_OF_EFS_IDS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe file systems" "$regx" + continue + fi if [[ $LIST_OF_EFS_IDS ]]; then for efsId in $LIST_OF_EFS_IDS;do EFS_POLICY_STATEMENTS=$($AWSCLI efs $PROFILE_OPT describe-file-system-policy --region $regx --file-system-id $efsId --output json --query Policy 2>&1) diff --git a/checks/check_extra7145 b/checks/check_extra7145 index 8ef7760189..8d63e0eeb6 100644 --- a/checks/check_extra7145 +++ b/checks/check_extra7145 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7145='IAM' extra7145(){ # "Check if lambda functions have policies which allow access to every aws account (Not Scored) (Not part of CIS benchmark)" for regx in $REGIONS; do - LIST_OF_LAMBDA_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --query Functions[*].FunctionName --output text) + LIST_OF_LAMBDA_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --query Functions[*].FunctionName --output text 2>&1) + if [[ $(echo "$LIST_OF_LAMBDA_FUNCTIONS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list functions" "$regx" + continue + fi if [[ $LIST_OF_LAMBDA_FUNCTIONS ]]; then for lambdaFunction in $LIST_OF_LAMBDA_FUNCTIONS;do FUNCTION_POLICY_STATEMENTS=$($AWSCLI lambda $PROFILE_OPT get-policy --region $regx --function-name $lambdaFunction --output json --query Policy 2>&1) diff --git a/checks/check_extra7146 b/checks/check_extra7146 index 78e56683f9..c5afa3ded3 100644 --- a/checks/check_extra7146 +++ b/checks/check_extra7146 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7146='Infrastructure Security' extra7146(){ # "Check if there is any unassigned elastic ip (Not Scored) (Not part of CIS benchmark)" for regx in $REGIONS; do - ELASTIC_IP_ADDRESSES=$($AWSCLI ec2 describe-addresses $PROFILE_OPT --region $regx --query Addresses --output json) + ELASTIC_IP_ADDRESSES=$($AWSCLI ec2 describe-addresses $PROFILE_OPT --region $regx --query Addresses --output json 2>&1) + if [[ $(echo "$ELASTIC_IP_ADDRESSES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe addresses" "$regx" + continue + fi if [[ $ELASTIC_IP_ADDRESSES != [] ]]; then LIST_OF_ASSOCIATED_IPS=$(echo $ELASTIC_IP_ADDRESSES | jq -r '.[] | select(.AssociationId!=null) | .PublicIp') LIST_OF_UNASSOCIATED_IPS=$(echo $ELASTIC_IP_ADDRESSES | jq -r '.[] | select(.AssociationId==null) | .PublicIp') diff --git a/checks/check_extra7147 b/checks/check_extra7147 index 4903ab0f11..3dd82cf525 100644 --- a/checks/check_extra7147 +++ b/checks/check_extra7147 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7147='Data Protection' extra7147(){ for regx in $REGIONS; do - LIST_OF_VAULTS=$($AWSCLI glacier list-vaults $PROFILE_OPT --region $regx --account-id $ACCOUNT_NUM --query VaultList[*].VaultName --output text|xargs -n1) + LIST_OF_VAULTS=$($AWSCLI glacier list-vaults $PROFILE_OPT --region $regx --account-id $ACCOUNT_NUM --query VaultList[*].VaultName --output text 2>&1|xargs -n1) + if [[ $(echo "$LIST_OF_VAULTS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list vaults" "$regx" + continue + fi if [[ $LIST_OF_VAULTS ]]; then for vault in $LIST_OF_VAULTS;do VAULT_POLICY_STATEMENTS=$($AWSCLI glacier $PROFILE_OPT get-vault-access-policy --region $regx --account-id $ACCOUNT_NUM --vault-name $vault --output json --query policy.Policy 2>&1) diff --git a/checks/check_extra7148 b/checks/check_extra7148 index c69805b5d9..56f03a961c 100644 --- a/checks/check_extra7148 +++ b/checks/check_extra7148 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7148='Data Protection' extra7148() { for regx in $REGIONS; do - LIST_OF_EFS_SYSTEMS=$($AWSCLI efs describe-file-systems $PROFILE_OPT --region $regx --query 'FileSystems[*].FileSystemId' --output text) + LIST_OF_EFS_SYSTEMS=$($AWSCLI efs describe-file-systems $PROFILE_OPT --region $regx --query 'FileSystems[*].FileSystemId' --output text 2>&1) + if [[ $(echo "$LIST_OF_EFS_SYSTEMS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe file systems" "$regx" + continue + fi if [[ $LIST_OF_EFS_SYSTEMS ]]; then for filesystem in $LIST_OF_EFS_SYSTEMS; do # if retention is 0 then is disabled diff --git a/checks/check_extra7149 b/checks/check_extra7149 index 2aa0a7b098..4e0d0ecd0c 100644 --- a/checks/check_extra7149 +++ b/checks/check_extra7149 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7149='Data Protection' extra7149() { # "Check if Redshift cluster has audit logging enabled " for regx in $REGIONS; do - LIST_OF_REDSHIFT_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --region $regx --query 'Clusters[*].ClusterIdentifier' --output text) + LIST_OF_REDSHIFT_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --region $regx --query 'Clusters[*].ClusterIdentifier' --output text 2>&1) + if [[ $(echo "$LIST_OF_REDSHIFT_CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe clusters" "$regx" + continue + fi if [[ $LIST_OF_REDSHIFT_CLUSTERS ]]; then for redshiftcluster in $LIST_OF_REDSHIFT_CLUSTERS; do REDSHIFT_SNAPSHOT_ENABLED=$($AWSCLI redshift describe-cluster-snapshots $PROFILE_OPT --region $regx --cluster-identifier $redshiftcluster --snapshot-type automated) diff --git a/checks/check_extra715 b/checks/check_extra715 index b5ccdb0e53..8877d28237 100644 --- a/checks/check_extra715 +++ b/checks/check_extra715 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra715='Logging and Monitoring' extra715(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do SEARCH_SLOWLOG_ENABLED=$($AWSCLI es describe-elasticsearch-domain-config --domain-name $domain $PROFILE_OPT --region $regx --query DomainConfig.LogPublishingOptions.Options.SEARCH_SLOW_LOGS.Enabled --output text |grep -v ^None|grep -v ^False) diff --git a/checks/check_extra7150 b/checks/check_extra7150 index 673a3da895..07896b94d6 100644 --- a/checks/check_extra7150 +++ b/checks/check_extra7150 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7150='Data Protection' extra7150(){ # "Check if Elastic Load Balancers have delete protection enabled." for regx in $REGIONS; do - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[*].LoadBalancerArn' --output text|xargs -n1) + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[*].LoadBalancerArn' --output text 2>&1|xargs -n1 ) + if [[ $(echo "$LIST_OF_ELBSV2" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi if [[ $LIST_OF_ELBSV2 ]]; then for elb in $LIST_OF_ELBSV2; do CHECK_DELETION_PROTECTION_ENABLED=$($AWSCLI elbv2 describe-load-balancer-attributes $PROFILE_OPT --region $regx --load-balancer-arn $elb --query Attributes[*] --output text|grep "deletion_protection.enabled"|grep true ) diff --git a/checks/check_extra7151 b/checks/check_extra7151 index a17a36736d..a973d99947 100644 --- a/checks/check_extra7151 +++ b/checks/check_extra7151 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_extra7151='Data Protection' extra7151(){ # "Check if DynamoDB tables point-in-time recovery (PITR) is enabled" for regx in $REGIONS; do - LIST_OF_DYNAMODB_TABLES=$($AWSCLI dynamodb list-tables $PROFILE_OPT --region $regx --query 'TableNames[*]' --output text) + LIST_OF_DYNAMODB_TABLES=$($AWSCLI dynamodb list-tables $PROFILE_OPT --region $regx --query 'TableNames[*]' --output text 2>&1) + if [[ $(echo "$LIST_OF_DYNAMODB_TABLES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list tables" "$regx" + continue + fi if [[ $LIST_OF_DYNAMODB_TABLES ]]; then for dynamodb_table in $LIST_OF_DYNAMODB_TABLES; do POINT_IN_TIME_RECOVERY_ENABLED=$($AWSCLI dynamodb describe-continuous-backups $PROFILE_OPT --region $regx --table-name $dynamodb_table | jq '.[].PointInTimeRecoveryDescription | select(.PointInTimeRecoveryStatus=="ENABLED") | .PointInTimeRecoveryStatus') diff --git a/checks/check_extra7154 b/checks/check_extra7154 index 8ea2efe69f..c68b6511b2 100644 --- a/checks/check_extra7154 +++ b/checks/check_extra7154 @@ -34,7 +34,11 @@ CHECK_CAF_EPIC_extra7154='Infrastructure Protection' extra7154() { for regx in $REGIONS; do - CFN_STACKS=$($AWSCLI cloudformation describe-stacks $PROFILE_OPT --region $regx --output json) + CFN_STACKS=$($AWSCLI cloudformation describe-stacks $PROFILE_OPT --region $regx --output json 2>&1) + if [[ $(echo "$CFN_STACKS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe stacks" "$regx" + continue + fi LIST_OF_CFN_STACKS=$(echo $CFN_STACKS | jq -r '.Stacks[].StackName') if [[ $LIST_OF_CFN_STACKS ]];then for stack in $LIST_OF_CFN_STACKS; do diff --git a/checks/check_extra7155 b/checks/check_extra7155 index 7c66388647..f1544fb4db 100644 --- a/checks/check_extra7155 +++ b/checks/check_extra7155 @@ -33,7 +33,11 @@ CHECK_CAF_EPIC_extra7155='Data Protection' extra7155() { for regx in $REGIONS; do - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Type == `application`].[LoadBalancerArn]' --output text) + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Type == `application`].[LoadBalancerArn]' --output text 2>&1) + if [[ $(echo "$LIST_OF_ELBSV2" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi if [[ $LIST_OF_ELBSV2 ]];then for alb in $LIST_OF_ELBSV2;do CHECK_DESYNC_MITIGATION_MODE=$($AWSCLI elbv2 describe-load-balancer-attributes $PROFILE_OPT --region $regx --load-balancer-arn $alb --query 'Attributes[8]' --output json | jq -r '.Value') diff --git a/checks/check_extra7156 b/checks/check_extra7156 index 2cf31e72c7..91dfbd4e5a 100644 --- a/checks/check_extra7156 +++ b/checks/check_extra7156 @@ -28,7 +28,11 @@ extra7156(){ # "Check if API Gateway V2 has Access Logging enabled " for regx in $REGIONS; do - LIST_OF_API_GW=$($AWSCLI apigatewayv2 get-apis $PROFILE_OPT --region $regx --query Items[*].ApiId --output text) + LIST_OF_API_GW=$($AWSCLI apigatewayv2 get-apis $PROFILE_OPT --region $regx --query Items[*].ApiId --output text 2>&1) + if [[ $(echo "$LIST_OF_API_GW" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get APIs" "$regx" + continue + fi if [[ $LIST_OF_API_GW ]];then for apigwid in $LIST_OF_API_GW;do API_GW_NAME=$($AWSCLI apigatewayv2 get-apis $PROFILE_OPT --region $regx --query "Items[?ApiId==\`$apigwid\`].Name" --output text) diff --git a/checks/check_extra7157 b/checks/check_extra7157 index ec62f4a896..6626c7e8b6 100644 --- a/checks/check_extra7157 +++ b/checks/check_extra7157 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7157='IAM' extra7157(){ for regx in $REGIONS; do - LIST_OF_API_GW=$($AWSCLI apigatewayv2 get-apis $PROFILE_OPT --region $regx --query "Items[*].ApiId" --output text) + LIST_OF_API_GW=$($AWSCLI apigatewayv2 get-apis $PROFILE_OPT --region $regx --query "Items[*].ApiId" --output text 2>&1) + if [[ $(echo "$LIST_OF_API_GW" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get APIs" "$regx" + continue + fi if [[ $LIST_OF_API_GW ]];then for api in $LIST_OF_API_GW; do API_GW_NAME=$($AWSCLI apigatewayv2 get-apis $PROFILE_OPT --region $regx --query "Items[?ApiId==\`$api\`].Name" --output text) diff --git a/checks/check_extra7158 b/checks/check_extra7158 index 3aaf74ec6b..2f9bf2165f 100644 --- a/checks/check_extra7158 +++ b/checks/check_extra7158 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7158='Data Protection' extra7158(){ for regx in $REGIONS; do - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers --query 'LoadBalancers[*].LoadBalancerArn' $PROFILE_OPT --region $regx --output text) + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers --query 'LoadBalancers[*].LoadBalancerArn' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$LIST_OF_ELBSV2" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi if [[ $LIST_OF_ELBSV2 ]]; then for elb in $LIST_OF_ELBSV2; do LIST_OF_LISTENERS=$($AWSCLI elbv2 describe-listeners $PROFILE_OPT --region $regx --load-balancer-arn $elb --query 'Listeners[*]' --output text) diff --git a/checks/check_extra7159 b/checks/check_extra7159 index 5843751901..36109bcdf9 100644 --- a/checks/check_extra7159 +++ b/checks/check_extra7159 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7159='Data Protection' extra7159(){ for regx in $REGIONS; do - LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers --query 'LoadBalancerDescriptions[*].LoadBalancerName' $PROFILE_OPT --region $regx --output text) + LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers --query 'LoadBalancerDescriptions[*].LoadBalancerName' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$LIST_OF_ELBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi if [[ $LIST_OF_ELBS ]]; then for elb in $LIST_OF_ELBS; do LIST_OF_LISTENERS=$($AWSCLI elb describe-load-balancers --load-balancer-name $elb --query 'LoadBalancerDescriptions[*].ListenerDescriptions' $PROFILE_OPT --region $regx --output text) diff --git a/checks/check_extra716 b/checks/check_extra716 index 87980aea90..c6ca608660 100644 --- a/checks/check_extra716 +++ b/checks/check_extra716 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra716='Infrastructure Security' extra716(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do TEMP_POLICY_FILE=$(mktemp -t prowler-${ACCOUNT_NUM}-es-domain.policy.XXXXXXXXXX) diff --git a/checks/check_extra7160 b/checks/check_extra7160 index 8016819ee8..14c49bdfc1 100644 --- a/checks/check_extra7160 +++ b/checks/check_extra7160 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra7160='Infrastructure Security' extra7160(){ for regx in $REGIONS; do - LIST_OF_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --query 'Clusters[*].ClusterIdentifier' --region $regx --output text) + LIST_OF_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --query 'Clusters[*].ClusterIdentifier' --region $regx --output text 2>&1) + if [[ $(echo "$LIST_OF_CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe clusters" "$regx" + continue + fi if [[ $LIST_OF_CLUSTERS ]]; then for cluster in $LIST_OF_CLUSTERS; do AUTO_UPGRADE_ENABLED=$($AWSCLI redshift describe-clusters $PROFILE_OPT --cluster-identifier $cluster --query 'Clusters[*].AllowVersionUpgrade' --region $regx --output text) diff --git a/checks/check_extra7161 b/checks/check_extra7161 index 1de051c370..67a9836cb0 100644 --- a/checks/check_extra7161 +++ b/checks/check_extra7161 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra7161='Data Protection' extra7161(){ # "Check if EFS has encryption at rest enabled (Not Scored) (Proposed requirement for 1.5 CIS benchmark)" for regx in $REGIONS; do - LIST_OF_EFS_IDS=$($AWSCLI efs describe-file-systems $PROFILE_OPT --region $regx --query 'FileSystems[*].FileSystemId' --output text | xargs -n1) + LIST_OF_EFS_IDS=$($AWSCLI efs describe-file-systems $PROFILE_OPT --region $regx --query 'FileSystems[*].FileSystemId' --output text 2>&1| xargs -n1 ) + if [[ $(echo "$LIST_OF_EFS_IDS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe file systems" "$regx" + continue + fi if [[ $LIST_OF_EFS_IDS ]]; then for efsId in $LIST_OF_EFS_IDS;do EFS_ENCRYPTION_CHECK=$($AWSCLI efs $PROFILE_OPT describe-file-systems --region $regx --file-system-id $efsId --output json --query 'FileSystems[*].Encrypted' --output text) diff --git a/checks/check_extra7162 b/checks/check_extra7162 index af8adcca19..0ed53445d8 100644 --- a/checks/check_extra7162 +++ b/checks/check_extra7162 @@ -27,7 +27,11 @@ extra7162() { # "Check if CloudWatch Log Groups have a retention policy of 365 days" declare -i LOG_GROUP_RETENTION_PERIOD_DAYS=365 for regx in $REGIONS; do - LIST_OF_365_RETENTION_LOG_GROUPS=$($AWSCLI logs describe-log-groups $PROFILE_OPT --region $regx --query 'logGroups[?retentionInDays=="${LOG_GROUP_RETENTION_PERIOD_DAYS}"].[logGroupName]' --output text) + LIST_OF_365_RETENTION_LOG_GROUPS=$($AWSCLI logs describe-log-groups $PROFILE_OPT --region $regx --query 'logGroups[?retentionInDays=="${LOG_GROUP_RETENTION_PERIOD_DAYS}"].[logGroupName]' --output text 2>&1) + if [[ $(echo "$LIST_OF_365_RETENTION_LOG_GROUPS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe log groups" "$regx" + continue + fi if [[ $LIST_OF_365_RETENTION_LOG_GROUPS ]]; then for log in $LIST_OF_365_RETENTION_LOG_GROUPS; do textPass "$regx: $log Log Group has 365 days retention period!" "$regx" "$log" diff --git a/checks/check_extra7163 b/checks/check_extra7163 index fa1c8b6184..e7378ea69d 100644 --- a/checks/check_extra7163 +++ b/checks/check_extra7163 @@ -40,7 +40,11 @@ CHECK_CAF_EPIC_extra7163="Data Protection" extra7163(){ # "Check if Secrets Manager key rotation is enabled" for regx in $REGIONS; do - LIST_OF_SECRETS=$($AWSCLI secretsmanager list-secrets $PROFILE_OPT --region $regx --query 'SecretList[*].Name' --output text) + LIST_OF_SECRETS=$($AWSCLI secretsmanager list-secrets $PROFILE_OPT --region $regx --query 'SecretList[*].Name' --output text 2>&1) + if [[ $(echo "$LIST_OF_SECRETS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list secrets" "$regx" + continue + fi if [[ $LIST_OF_SECRETS ]]; then for secret in $LIST_OF_SECRETS; do KEY_ROTATION_ENABLED=$($AWSCLI secretsmanager describe-secret $PROFILE_OPT --region $regx --secret-id $secret --output json | jq '.RotationEnabled') diff --git a/checks/check_extra7164 b/checks/check_extra7164 index bfadc4ef79..4ef958facf 100644 --- a/checks/check_extra7164 +++ b/checks/check_extra7164 @@ -36,10 +36,14 @@ CHECK_CAF_EPIC_extra7164="Data Protection" extra7164(){ # "Check if Cloudwatch log groups are associated with AWS KMS" for regx in $REGIONS; do - LIST_OF_LOGGROUPS=$($AWSCLI logs describe-log-groups $PROFILE_OPT --region $regx --output json | jq '.logGroups[]') + LIST_OF_LOGGROUPS=$($AWSCLI logs describe-log-groups $PROFILE_OPT --region $regx --output json 2>&1 ) + if [[ $(echo "$LIST_OF_LOGGROUPS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe log groups" "$regx" + continue + fi if [[ $LIST_OF_LOGGROUPS ]]; then - LIST_OF_LOGGROUPS_WITHOUT_KMS=$(echo "${LIST_OF_LOGGROUPS}" | jq '. | select( has("kmsKeyId") == false )' | jq -r '.logGroupName') - LIST_OF_LOGGROUPS_WITH_KMS=$(echo "${LIST_OF_LOGGROUPS}" | jq '. | select( has("kmsKeyId") == true )' | jq -r '.logGroupName') + LIST_OF_LOGGROUPS_WITHOUT_KMS=$(echo "${LIST_OF_LOGGROUPS}" | jq '.logGroups[]' | jq '. | select( has("kmsKeyId") == false )' | jq -r '.logGroupName') + LIST_OF_LOGGROUPS_WITH_KMS=$(echo "${LIST_OF_LOGGROUPS}" | jq '.logGroups[]' | jq '. | select( has("kmsKeyId") == true )' | jq -r '.logGroupName') if [[ $LIST_OF_LOGGROUPS_WITHOUT_KMS ]]; then for loggroup in $LIST_OF_LOGGROUPS_WITHOUT_KMS; do textFail "$regx: ${loggroup} does not have AWS KMS keys associated." "$regx" "${loggroup}" diff --git a/checks/check_extra7165 b/checks/check_extra7165 index 652ae28886..fdd8a1acdc 100644 --- a/checks/check_extra7165 +++ b/checks/check_extra7165 @@ -40,9 +40,15 @@ extra7165(){ # "Check if DynamoDB: DAX Clusters are encrypted at rest" for regx in $REGIONS; do LIST_OF_DAX_CLUSTERS=$($AWSCLI dax describe-clusters $PROFILE_OPT --region $regx --query 'Clusters[*]' --output json 2>&1) - if [[ "$(echo "$LIST_OF_DAX_CLUSTERS" | grep "Could not connect\|Access Denied" )" ]]; then - textInfo "$regx: DynamoDB: DAX Clusters do not exist in this region." "$regx" - elif [[ $LIST_OF_DAX_CLUSTERS && $LIST_OF_DAX_CLUSTERS != '[]' ]]; then + if [[ $(echo "$LIST_OF_DAX_CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe clusters" "$regx" + continue + fi + if [[ $(echo "$LIST_OF_DAX_CLUSTERS" | grep -E 'Could not connect') ]]; then + textInfo "$regx: Service not available in this region" "$regx" + continue + fi + if [[ $LIST_OF_DAX_CLUSTERS && $LIST_OF_DAX_CLUSTERS != '[]' ]]; then LIST_OF_CLUSTERS_WITH_ENCRYPTION=$(echo "${LIST_OF_DAX_CLUSTERS}" | jq '.[] | select(.SSEDescription.Status=="ENABLED") | {ClusterName}' | jq -r '.ClusterName') LIST_OF_CLUSTERS_WITHOUT_ENCRYPTION=$(echo "${LIST_OF_DAX_CLUSTERS}" | jq '.[] | select(.SSEDescription.Status=="DISABLED") | {ClusterName}' | jq -r '.ClusterName') if [[ $LIST_OF_CLUSTERS_WITHOUT_ENCRYPTION ]]; then diff --git a/checks/check_extra717 b/checks/check_extra717 index aa42a36edc..7d01cb906c 100644 --- a/checks/check_extra717 +++ b/checks/check_extra717 @@ -26,12 +26,20 @@ CHECK_CAF_EPIC_extra717='Logging and Monitoring' extra717(){ # "Check if Elastic Load Balancers have logging enabled " for regx in $REGIONS; do - LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[*].LoadBalancerName' --output text|xargs -n1) - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[*].LoadBalancerArn' --output text|xargs -n1) + LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[*].LoadBalancerName' --output text 2>&1 |xargs -n1) + if [[ $(echo "$LIST_OF_ELBS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to list load balancers v1" "$regx" + continue + fi + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[*].LoadBalancerArn' --output text 2>&1 |xargs -n1) + if [[ $(echo "$LIST_OF_ELBSV2" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to list load balancers v2" "$regx" + continue + fi if [[ $LIST_OF_ELBS || $LIST_OF_ELBSV2 ]]; then if [[ $LIST_OF_ELBS ]]; then for elb in $LIST_OF_ELBS; do - CHECK_ELBS_LOG_ENABLED=$($AWSCLI elb describe-load-balancer-attributes $PROFILE_OPT --region $regx --load-balancer-name $elb --query 'LoadBalancerAttributes.AccessLog.Enabled'|grep "^true") + CHECK_ELBS_LOG_ENABLED=$($AWSCLI elb describe-load-balancer-attributes $PROFILE_OPT --region $regx --load-balancer-name $elb --query 'LoadBalancerAttributes.AccessLog.Enabled' |grep "^true") if [[ $CHECK_ELBS_LOG_ENABLED ]]; then textPass "$regx: $elb has access logs to S3 configured" "$regx" "$elb" else @@ -41,7 +49,7 @@ extra717(){ fi if [[ $LIST_OF_ELBSV2 ]]; then for elbarn in $LIST_OF_ELBSV2; do - CHECK_ELBSV2_LOG_ENABLED=$($AWSCLI elbv2 describe-load-balancer-attributes $PROFILE_OPT --region $regx --load-balancer-arn $elbarn --query Attributes[*] --output text|grep "^access_logs.s3.enabled"|cut -f2|grep true) + CHECK_ELBSV2_LOG_ENABLED=$($AWSCLI elbv2 describe-load-balancer-attributes $PROFILE_OPT --region $regx --load-balancer-arn $elbarn --query Attributes[*] --output text |grep "^access_logs.s3.enabled"|cut -f2|grep true) ELBV2_NAME=$(echo $elbarn|cut -d\/ -f3) if [[ $CHECK_ELBSV2_LOG_ENABLED ]]; then textPass "$regx: $ELBV2_NAME has access logs to S3 configured" "$regx" "$elb" diff --git a/checks/check_extra72 b/checks/check_extra72 index 019bfb2670..89bad44a38 100644 --- a/checks/check_extra72 +++ b/checks/check_extra72 @@ -28,7 +28,11 @@ CHECK_CAF_EPIC_extra72='Data Protection' extra72(){ # "Ensure there are no EBS Snapshots set as Public " for regx in $REGIONS; do - LIST_OF_EBS_SNAPSHOTS=$($AWSCLI ec2 describe-snapshots $PROFILE_OPT --region $regx --owner-ids $ACCOUNT_NUM --output text --query 'Snapshots[*].{ID:SnapshotId}' --max-items $MAXITEMS | grep -v None 2> /dev/null) + LIST_OF_EBS_SNAPSHOTS=$($AWSCLI ec2 describe-snapshots $PROFILE_OPT --region $regx --owner-ids $ACCOUNT_NUM --output text --query 'Snapshots[*].{ID:SnapshotId}' --max-items $MAXITEMS 2>&1 | grep -v None ) + if [[ $(echo "$LIST_OF_EBS_SNAPSHOTS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe snapshot" "$regx" + continue + fi for snapshot in $LIST_OF_EBS_SNAPSHOTS; do SNAPSHOT_IS_PUBLIC=$($AWSCLI ec2 describe-snapshot-attribute $PROFILE_OPT --region $regx --output text --snapshot-id $snapshot --attribute createVolumePermission --query "CreateVolumePermissions[?Group=='all']") if [[ $SNAPSHOT_IS_PUBLIC ]];then diff --git a/checks/check_extra721 b/checks/check_extra721 index 7d63b0ee9b..a8bfe0b288 100644 --- a/checks/check_extra721 +++ b/checks/check_extra721 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra721='Logging and Monitoring' extra721(){ # "Check if Redshift cluster has audit logging enabled " for regx in $REGIONS; do - LIST_OF_REDSHIFT_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --region $regx --query 'Clusters[*].ClusterIdentifier' --output text) + LIST_OF_REDSHIFT_CLUSTERS=$($AWSCLI redshift describe-clusters $PROFILE_OPT --region $regx --query 'Clusters[*].ClusterIdentifier' --output text 2>&1) + if [[ $(echo "$LIST_OF_REDSHIFT_CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe clusters" "$regx" + continue + fi if [[ $LIST_OF_REDSHIFT_CLUSTERS ]]; then for redshiftcluster in $LIST_OF_REDSHIFT_CLUSTERS;do REDSHIFT_LOG_ENABLED=$($AWSCLI redshift describe-logging-status $PROFILE_OPT --region $regx --cluster-identifier $redshiftcluster --query LoggingEnabled --output text | grep True) diff --git a/checks/check_extra722 b/checks/check_extra722 index 3def51c447..a7423a6e2c 100644 --- a/checks/check_extra722 +++ b/checks/check_extra722 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra722='Logging and Monitoring' extra722(){ # "Check if API Gateway has logging enabled " for regx in $REGIONS; do - LIST_OF_API_GW=$($AWSCLI apigateway get-rest-apis $PROFILE_OPT --region $regx --query items[*].id --output text) + LIST_OF_API_GW=$($AWSCLI apigateway get-rest-apis $PROFILE_OPT --region $regx --query items[*].id --output text 2>&1) + if [[ $(echo "$LIST_OF_API_GW" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to get rest APIs" "$regx" + continue + fi if [[ $LIST_OF_API_GW ]];then for apigwid in $LIST_OF_API_GW;do API_GW_NAME=$($AWSCLI apigateway get-rest-apis $PROFILE_OPT --region $regx --query "items[?id==\`$apigwid\`].name" --output text) diff --git a/checks/check_extra723 b/checks/check_extra723 index 94833c2318..5195b00b8f 100644 --- a/checks/check_extra723 +++ b/checks/check_extra723 @@ -27,7 +27,11 @@ extra723(){ # "Check if RDS Snapshots are public " for regx in $REGIONS; do # RDS snapshots - LIST_OF_RDS_SNAPSHOTS=$($AWSCLI rds describe-db-snapshots $PROFILE_OPT --region $regx --query DBSnapshots[*].DBSnapshotIdentifier --output text) + LIST_OF_RDS_SNAPSHOTS=$($AWSCLI rds describe-db-snapshots $PROFILE_OPT --region $regx --query DBSnapshots[*].DBSnapshotIdentifier --output text 2>&1) + if [[ $(echo "$LIST_OF_RDS_SNAPSHOTS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe db snapshots" "$regx" + continue + fi if [[ $LIST_OF_RDS_SNAPSHOTS ]]; then for rdssnapshot in $LIST_OF_RDS_SNAPSHOTS;do SNAPSHOT_IS_PUBLIC=$($AWSCLI rds describe-db-snapshot-attributes $PROFILE_OPT --region $regx --db-snapshot-identifier $rdssnapshot --query DBSnapshotAttributesResult.DBSnapshotAttributes[*] --output text|grep ^ATTRIBUTEVALUES|cut -f2|grep all) diff --git a/checks/check_extra726 b/checks/check_extra726 index 152beb756a..c3da9be3cf 100644 --- a/checks/check_extra726 +++ b/checks/check_extra726 @@ -31,6 +31,10 @@ extra726(){ textInfo "$REGION: Trusted Advisor requires AWS Premium Support Subscription" "$REGION" return fi + if [[ $(echo "$TA_CHECKS_ID" | grep "Could not connect") ]]; then + textInfo "$REGION: Trusted Advisor not available in this region" "$REGION" + return + fi for checkid in $TA_CHECKS_ID; do TA_CHECKS_NAME=$($AWSCLI support describe-trusted-advisor-checks --language en $PROFILE_OPT --region $REGION --query "checks[?id==\`$checkid\`].{name:name}[*]" --output text) diff --git a/checks/check_extra727 b/checks/check_extra727 index ce4f29972a..f9ff05fd9e 100644 --- a/checks/check_extra727 +++ b/checks/check_extra727 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra727='Infrastructure Security' extra727(){ for regx in $REGIONS; do - LIST_SQS=$($AWSCLI sqs list-queues $PROFILE_OPT --region $regx --query QueueUrls --output text |grep -v ^None) + LIST_SQS=$($AWSCLI sqs list-queues $PROFILE_OPT --region $regx --query QueueUrls --output text 2>&1|grep -v ^None ) + if [[ $(echo "$LIST_SQS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to list queues" "$regx" + continue + fi if [[ $LIST_SQS ]]; then for queue in $LIST_SQS; do SQS_POLICY=$($AWSCLI sqs get-queue-attributes --queue-url $queue $PROFILE_OPT --region $regx --attribute-names All --query Attributes.Policy) diff --git a/checks/check_extra728 b/checks/check_extra728 index 10ad0e0cd0..310f2e0cd5 100644 --- a/checks/check_extra728 +++ b/checks/check_extra728 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_extra728='Data Protection' extra728(){ for regx in $REGIONS; do - LIST_SQS=$($AWSCLI sqs list-queues $PROFILE_OPT --region $regx --query QueueUrls --output text |grep -v ^None) + LIST_SQS=$($AWSCLI sqs list-queues $PROFILE_OPT --region $regx --query QueueUrls --output text 2>&1|grep -v ^None ) + if [[ $(echo "$LIST_SQS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to list queues" "$regx" + continue + fi if [[ $LIST_SQS ]]; then for queue in $LIST_SQS; do # check if the policy has KmsMasterKeyId therefore SSE enabled diff --git a/checks/check_extra729 b/checks/check_extra729 index 5a839e5e53..383425be4b 100644 --- a/checks/check_extra729 +++ b/checks/check_extra729 @@ -28,7 +28,11 @@ CHECK_CAF_EPIC_extra729='Data Protection' extra729(){ # "Ensure there are no EBS Volumes unencrypted " for regx in $REGIONS; do - LIST_OF_EBS_NON_ENC_VOLUMES=$($AWSCLI ec2 describe-volumes $PROFILE_OPT --region $regx --query 'Volumes[?Encrypted==`false`].VolumeId' --output text) + LIST_OF_EBS_NON_ENC_VOLUMES=$($AWSCLI ec2 describe-volumes $PROFILE_OPT --region $regx --query 'Volumes[?Encrypted==`false`].VolumeId' --output text 2>&1) + if [[ $(echo "$LIST_OF_EBS_NON_ENC_VOLUMES" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe volumes" "$regx" + continue + fi if [[ $LIST_OF_EBS_NON_ENC_VOLUMES ]];then for volume in $LIST_OF_EBS_NON_ENC_VOLUMES; do textFail "$regx: $volume is not encrypted!" "$regx" "$volume" diff --git a/checks/check_extra731 b/checks/check_extra731 index 7bb9930073..9b3adf23bc 100644 --- a/checks/check_extra731 +++ b/checks/check_extra731 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra731='Infrastructure Security' extra731(){ for regx in $REGIONS; do - LIST_SNS=$($AWSCLI sns list-topics $PROFILE_OPT --region $regx --query Topics --output text |grep -v ^None) + LIST_SNS=$($AWSCLI sns list-topics $PROFILE_OPT --region $regx --query Topics --output text 2>&1|grep -v ^None ) + if [[ $(echo "$LIST_SNS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list topics" "$regx" + continue + fi if [[ $LIST_SNS ]]; then for topic in $LIST_SNS; do SHORT_TOPIC=$(echo $topic| cut -d: -f6) diff --git a/checks/check_extra735 b/checks/check_extra735 index 6b86cc52a7..e1717abb01 100644 --- a/checks/check_extra735 +++ b/checks/check_extra735 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra735='Data Protection' extra735(){ for regx in $REGIONS; do - LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].DBInstanceIdentifier' --output text) + LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].DBInstanceIdentifier' --output text 2>&1) + if [[ $(echo "$LIST_OF_RDS_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe DB instances" "$regx" + continue + fi if [[ $LIST_OF_RDS_INSTANCES ]];then for rdsinstance in $LIST_OF_RDS_INSTANCES; do IS_ENCRYPTED=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --db-instance-identifier $rdsinstance --query 'DBInstances[*].StorageEncrypted' --output text) diff --git a/checks/check_extra739 b/checks/check_extra739 index 2f998df011..241205dced 100644 --- a/checks/check_extra739 +++ b/checks/check_extra739 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra739='Data Protection' extra739(){ for regx in $REGIONS; do - LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].DBInstanceIdentifier' --output text) + LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].DBInstanceIdentifier' --output text 2>&1) + if [[ $(echo "$LIST_OF_RDS_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe DB instances" "$regx" + continue + fi if [[ $LIST_OF_RDS_INSTANCES ]];then for rdsinstance in $LIST_OF_RDS_INSTANCES; do # if retention is 0 then is disabled diff --git a/checks/check_extra74 b/checks/check_extra74 index 2c57b776a5..c8bb58def6 100644 --- a/checks/check_extra74 +++ b/checks/check_extra74 @@ -29,7 +29,11 @@ CHECK_CAF_EPIC_extra74='Infrastructure Security' extra74(){ # "Ensure there are no Security Groups without ingress filtering being used " for regx in $REGIONS; do - LIST_OF_SECURITYGROUPS=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --filters "Name=ip-permission.cidr,Values=0.0.0.0/0" --query "SecurityGroups[].[GroupId]" --output text --max-items $MAXITEMS) + LIST_OF_SECURITYGROUPS=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --filters "Name=ip-permission.cidr,Values=0.0.0.0/0" --query "SecurityGroups[].[GroupId]" --output text --max-items $MAXITEMS 2>&1) + if [[ $(echo "$LIST_OF_SECURITYGROUPS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi for SG_ID in $LIST_OF_SECURITYGROUPS; do SG_NO_INGRESS_FILTER=$($AWSCLI ec2 describe-network-interfaces $PROFILE_OPT --region $regx --filters "Name=group-id,Values=$SG_ID" --query "length(NetworkInterfaces)" --output text) if [[ $SG_NO_INGRESS_FILTER -ne 0 ]];then diff --git a/checks/check_extra740 b/checks/check_extra740 index d939a30594..250e81ef25 100644 --- a/checks/check_extra740 +++ b/checks/check_extra740 @@ -31,12 +31,21 @@ extra740(){ for regx in ${REGIONS}; do UNENCRYPTED_SNAPSHOTS=$(${AWSCLI} ec2 describe-snapshots ${PROFILE_OPT} \ --region ${regx} --owner-ids ${ACCOUNT_NUM} --output text \ - --query 'Snapshots[?Encrypted==`false`]|[*].{Id:SnapshotId}' \ - | grep -v None 2> /dev/null) + --query 'Snapshots[?Encrypted==`false`]|[*].{Id:SnapshotId}' 2>&1 \ + | grep -v None ) + if [[ $(echo "$UNENCRYPTED_SNAPSHOTS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe snapshots" "$regx" + continue + fi + ENCRYPTED_SNAPSHOTS=$(${AWSCLI} ec2 describe-snapshots ${PROFILE_OPT} \ --region ${regx} --owner-ids ${ACCOUNT_NUM} --output text \ - --query 'Snapshots[?Encrypted==`true`]|[*].{Id:SnapshotId}' \ - | grep -v None 2> /dev/null) + --query 'Snapshots[?Encrypted==`true`]|[*].{Id:SnapshotId}' 2>&1 \ + | grep -v None ) + if [[ $(echo "$ENCRYPTED_SNAPSHOTS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe snapshots" "$regx" + continue + fi typeset -i unencrypted typeset -i encrypted unencrypted=0 diff --git a/checks/check_extra741 b/checks/check_extra741 index 8a7d87e424..4681afea84 100644 --- a/checks/check_extra741 +++ b/checks/check_extra741 @@ -31,7 +31,11 @@ extra741(){ fi for regx in $REGIONS; do - LIST_OF_EC2_INSTANCES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query Reservations[*].Instances[*].InstanceId --output text --max-items $MAXITEMS | grep -v None) + LIST_OF_EC2_INSTANCES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query Reservations[*].Instances[*].InstanceId --output text --max-items $MAXITEMS 2>&1| grep -v None) + if [[ $(echo "$LIST_OF_EC2_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe instances" "$regx" + continue + fi if [[ $LIST_OF_EC2_INSTANCES ]];then for instance in $LIST_OF_EC2_INSTANCES; do EC2_USERDATA_FILE="$SECRETS_TEMP_FOLDER/extra741-$instance-userData.decoded" diff --git a/checks/check_extra742 b/checks/check_extra742 index 6933c1af28..c95b402e74 100644 --- a/checks/check_extra742 +++ b/checks/check_extra742 @@ -31,7 +31,11 @@ extra742(){ fi for regx in $REGIONS; do - CFN_STACKS=$($AWSCLI cloudformation describe-stacks $PROFILE_OPT --region $regx --output json) + CFN_STACKS=$($AWSCLI cloudformation describe-stacks $PROFILE_OPT --region $regx --output json 2>&1) + if [[ $(echo "$CFN_STACKS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe stacks" "$regx" + continue + fi LIST_OF_CFN_STACKS=$(echo $CFN_STACKS | jq -r '.Stacks[].StackName') if [[ $LIST_OF_CFN_STACKS ]];then for stack in $LIST_OF_CFN_STACKS; do diff --git a/checks/check_extra743 b/checks/check_extra743 index b7112cf9c0..74d480cf5a 100644 --- a/checks/check_extra743 +++ b/checks/check_extra743 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra743='Data Protection' extra743(){ for regx in $REGIONS; do - LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text) + LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text 2>&1) + if [[ $(echo "$LIST_OF_REST_APIS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get rest APIs" "$regx" + continue + fi if [[ $LIST_OF_REST_APIS ]];then for api in $LIST_OF_REST_APIS; do API_GW_NAME=$($AWSCLI apigateway get-rest-apis $PROFILE_OPT --region $regx --query "items[?id==\`$api\`].name" --output text) diff --git a/checks/check_extra744 b/checks/check_extra744 index a8672c9461..d19c9acccf 100644 --- a/checks/check_extra744 +++ b/checks/check_extra744 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra744='Infrastructure Security' extra744(){ for regx in $REGIONS; do - LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text) + LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text 2>&1) + if [[ $(echo "$LIST_OF_REST_APIS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get rest APIs" "$regx" + continue + fi if [[ $LIST_OF_REST_APIS ]];then for api in $LIST_OF_REST_APIS; do API_GW_NAME=$($AWSCLI apigateway get-rest-apis $PROFILE_OPT --region $regx --query "items[?id==\`$api\`].name" --output text) diff --git a/checks/check_extra745 b/checks/check_extra745 index 37cb6b175a..d26303a325 100644 --- a/checks/check_extra745 +++ b/checks/check_extra745 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra745='Infrastructure Security' extra745(){ for regx in $REGIONS; do - LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text) + LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text 2>&1) + if [[ $(echo "$LIST_OF_REST_APIS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get rest APIs" "$regx" + continue + fi if [[ $LIST_OF_REST_APIS ]];then for api in $LIST_OF_REST_APIS; do API_GW_NAME=$($AWSCLI apigateway get-rest-apis $PROFILE_OPT --region $regx --query "items[?id==\`$api\`].name" --output text) diff --git a/checks/check_extra746 b/checks/check_extra746 index e2ff570a83..c21eb70523 100644 --- a/checks/check_extra746 +++ b/checks/check_extra746 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra746='IAM' extra746(){ for regx in $REGIONS; do - LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text) + LIST_OF_REST_APIS=$($AWSCLI $PROFILE_OPT --region $regx apigateway get-rest-apis --query 'items[*].id' --output text 2>&1) + if [[ $(echo "$LIST_OF_REST_APIS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get rest APIs" "$regx" + continue + fi if [[ $LIST_OF_REST_APIS ]];then for api in $LIST_OF_REST_APIS; do API_GW_NAME=$($AWSCLI apigateway get-rest-apis $PROFILE_OPT --region $regx --query "items[?id==\`$api\`].name" --output text) diff --git a/checks/check_extra747 b/checks/check_extra747 index 80cedad37d..936ba41c00 100644 --- a/checks/check_extra747 +++ b/checks/check_extra747 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra747='Logging and Monitoring' extra747(){ for regx in $REGIONS; do - LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].DBInstanceIdentifier' --output text) + LIST_OF_RDS_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[*].DBInstanceIdentifier' --output text 2>&1) + if [[ $(echo "$LIST_OF_RDS_INSTANCES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to get rest APIs" "$regx" + continue + fi if [[ $LIST_OF_RDS_INSTANCES ]];then for rdsinstance in $LIST_OF_RDS_INSTANCES; do # if retention is 0 then is disabled diff --git a/checks/check_extra748 b/checks/check_extra748 index 49c10e764d..0ee78a5761 100644 --- a/checks/check_extra748 +++ b/checks/check_extra748 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra748='Infrastructure Security' extra748(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`0` && ToPort==`65535`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort==`0` && ToPort==`65535`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0" "$regx" "$SG" diff --git a/checks/check_extra749 b/checks/check_extra749 index 28dbaf4607..86e85d47a0 100644 --- a/checks/check_extra749 +++ b/checks/check_extra749 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra749='Infrastructure Security' extra749(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || ((FromPort<=`1521` && ToPort>=`1521`)||(FromPort<=`2483` && ToPort>=`2483`))) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || ((FromPort<=`1521` && ToPort>=`1521`)||(FromPort<=`2483` && ToPort>=`2483`))) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Oracle ports" "$regx" "$SG" diff --git a/checks/check_extra75 b/checks/check_extra75 index 8d24a41422..36b646fcb1 100644 --- a/checks/check_extra75 +++ b/checks/check_extra75 @@ -29,12 +29,15 @@ CHECK_CAF_EPIC_extra75='Infrastructure Security' extra75(){ # "Ensure there are no Security Groups not being used " for regx in $REGIONS; do - SECURITYGROUPS=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --max-items $MAXITEMS --output json | jq '.SecurityGroups|map({(.GroupId): (.GroupName)})|add') - if [[ $SECURITYGROUPS == "null" ]]; - then + SECURITYGROUPS=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --max-items $MAXITEMS --output json 2>&1 ) + if [[ $(echo "$SECURITYGROUPS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi + if [[ $SECURITYGROUPS == "null" ]]; then continue fi - LIST_OF_SECURITYGROUPS=$(echo $SECURITYGROUPS|jq -r 'to_entries|sort_by(.key)|.[]|.key') + LIST_OF_SECURITYGROUPS=$(echo $SECURITYGROUPS | jq '.SecurityGroups|map({(.GroupId): (.GroupName)})|add' |jq -r 'to_entries|sort_by(.key)|.[]|.key') for SG_ID in $LIST_OF_SECURITYGROUPS; do SG_NOT_USED=$($AWSCLI ec2 describe-network-interfaces $PROFILE_OPT --region $regx --filters "Name=group-id,Values=$SG_ID" --query "length(NetworkInterfaces)" --output text) # Default security groups can not be deleted, so draw attention to them diff --git a/checks/check_extra750 b/checks/check_extra750 index 1f0f30c50e..b8597d1311 100644 --- a/checks/check_extra750 +++ b/checks/check_extra750 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra750='Infrastructure Security' extra750(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`3306` && ToPort>=`3306`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`3306` && ToPort>=`3306`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for MySQL port" "$regx" "$SG" diff --git a/checks/check_extra751 b/checks/check_extra751 index 2b31dd9174..c08a3adb58 100644 --- a/checks/check_extra751 +++ b/checks/check_extra751 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra751='Infrastructure Security' extra751(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`5432` && ToPort>=`5432`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`5432` && ToPort>=`5432`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Postgres port" "$regx" "$SG" diff --git a/checks/check_extra752 b/checks/check_extra752 index d60d32f236..1857c3f248 100644 --- a/checks/check_extra752 +++ b/checks/check_extra752 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra752='Infrastructure Security' extra752(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`6379` && ToPort>=`6379`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`6379` && ToPort>=`6379`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Redis port" "$regx" "$SG" diff --git a/checks/check_extra753 b/checks/check_extra753 index bd11d24b22..93ccc177ea 100644 --- a/checks/check_extra753 +++ b/checks/check_extra753 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra753='Infrastructure Security' extra753(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || ((FromPort<=`27017` && ToPort>=`27017`) || (FromPort<=`27018` && ToPort>=`27018`))) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || ((FromPort<=`27017` && ToPort>=`27017`) || (FromPort<=`27018` && ToPort>=`27018`))) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for MongoDB ports" "$regx" "$SG" diff --git a/checks/check_extra754 b/checks/check_extra754 index a225229734..48f56b88f6 100644 --- a/checks/check_extra754 +++ b/checks/check_extra754 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra754='Infrastructure Security' extra754(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || ((FromPort<=`7199` && ToPort>=`7199`) || (FromPort<=`9160` && ToPort>=`9160`)|| (FromPort<=`8888` && ToPort>=`8888`))) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || ((FromPort<=`7199` && ToPort>=`7199`) || (FromPort<=`9160` && ToPort>=`9160`)|| (FromPort<=`8888` && ToPort>=`8888`))) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Cassandra ports" "$regx" "$SG" diff --git a/checks/check_extra755 b/checks/check_extra755 index 53ab014bac..3a1ea01ceb 100644 --- a/checks/check_extra755 +++ b/checks/check_extra755 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra755='Infrastructure Security' extra755(){ for regx in $REGIONS; do - SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`11211` && ToPort>=`11211`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text) + SG_LIST=$($AWSCLI ec2 describe-security-groups --query 'SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=`11211` && ToPort>=`11211`)) && (contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`))]) > `0`].{GroupId:GroupId}' $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi if [[ $SG_LIST ]];then for SG in $SG_LIST;do textFail "$regx: Found Security Group: $SG open to 0.0.0.0/0 for Memcached port" "$regx" "$SG" diff --git a/checks/check_extra757 b/checks/check_extra757 index dc603afedf..61a7317ff8 100644 --- a/checks/check_extra757 +++ b/checks/check_extra757 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra757='Infrastructure Security' extra757(){ OLDAGE="$(get_date_previous_than_months 6)" for regx in $REGIONS; do - EC2_RUNNING="$($AWSCLI ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId]" $PROFILE_OPT --region $regx --output text)" + EC2_RUNNING=$($AWSCLI ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId]" $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$EC2_RUNNING" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe instances" "$regx" + continue + fi if [[ $EC2_RUNNING ]]; then INSTACES_OLD_THAN_AGE=$($AWSCLI ec2 describe-instances --query "Reservations[].Instances[?LaunchTime<='$OLDAGE'][].{id: InstanceId, launched: LaunchTime}" $PROFILE_OPT --region $regx --output text) if [[ $INSTACES_OLD_THAN_AGE ]]; then diff --git a/checks/check_extra758 b/checks/check_extra758 index 63129eb37c..0b92f95b8f 100644 --- a/checks/check_extra758 +++ b/checks/check_extra758 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra758='Infrastructure Security' extra758(){ OLDAGE="$(get_date_previous_than_months 12)" for regx in $REGIONS; do - EC2_RUNNING="$($AWSCLI ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId]" $PROFILE_OPT --region $regx --output text)" + EC2_RUNNING=$($AWSCLI ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId]" $PROFILE_OPT --region $regx --output text 2>&1) + if [[ $(echo "$EC2_RUNNING" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe instances" "$regx" + continue + fi if [[ $EC2_RUNNING ]]; then INSTACES_OLD_THAN_AGE=$($AWSCLI ec2 describe-instances --query "Reservations[].Instances[?LaunchTime<='$OLDAGE'][].{id: InstanceId, launched: LaunchTime}" $PROFILE_OPT --region $regx --output text) if [[ $INSTACES_OLD_THAN_AGE ]]; then diff --git a/checks/check_extra759 b/checks/check_extra759 index 533f0445eb..a3a55cd6fd 100644 --- a/checks/check_extra759 +++ b/checks/check_extra759 @@ -31,7 +31,11 @@ extra759(){ fi for regx in $REGIONS; do - LIST_OF_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --query Functions[*].FunctionName --output text) + LIST_OF_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --query Functions[*].FunctionName --output text 2>&1) + if [[ $(echo "$LIST_OF_FUNCTIONS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list functions" "$regx" + continue + fi if [[ $LIST_OF_FUNCTIONS ]]; then for lambdafunction in $LIST_OF_FUNCTIONS;do LAMBDA_FUNCTION_VARIABLES_FILE="$SECRETS_TEMP_FOLDER/extra759-$lambdafunction-$regx-variables.txt" diff --git a/checks/check_extra76 b/checks/check_extra76 index 3a5d7e54bd..b7001ddf02 100644 --- a/checks/check_extra76 +++ b/checks/check_extra76 @@ -27,7 +27,11 @@ CHECK_CAF_EPIC_extra76='Infrastructure Security' extra76(){ # "Ensure there are no EC2 AMIs set as Public " for regx in $REGIONS; do - LIST_OF_PUBLIC_AMIS=$($AWSCLI ec2 describe-images --owners self $PROFILE_OPT --region $regx --filters "Name=is-public,Values=true" --query 'Images[*].{ID:ImageId}' --output text) + LIST_OF_PUBLIC_AMIS=$($AWSCLI ec2 describe-images --owners self $PROFILE_OPT --region $regx --filters "Name=is-public,Values=true" --query 'Images[*].{ID:ImageId}' --output text 2>&1) + if [[ $(echo "$LIST_OF_PUBLIC_AMIS" | grep -E 'AccessDenied|UnauthorizedOperation') ]]; then + textFail "$regx: Access Denied trying to describe images" "$regx" + continue + fi if [[ $LIST_OF_PUBLIC_AMIS ]];then for ami in $LIST_OF_PUBLIC_AMIS; do textFail "$regx: $ami is currently Public!" "$regx" "$ami" diff --git a/checks/check_extra762 b/checks/check_extra762 index 28f6c2ab28..4000cbc40f 100644 --- a/checks/check_extra762 +++ b/checks/check_extra762 @@ -18,7 +18,7 @@ CHECK_SEVERITY_extra762="Medium" CHECK_ASFF_RESOURCE_TYPE_extra762="AwsLambdaFunction" CHECK_ALTERNATE_check762="extra762" CHECK_SERVICENAME_extra762="lambda" -CHECK_RISK_extra762=' If you have functions running on a runtime that will be deprecated in the next 60 days; Lambda notifies you by email that you should prepare by migrating your function to a supported runtime. In some cases; such as security issues that require a backwards-incompatible update; or software that does not support a long-term support (LTS) schedule; advance notice might not be possible. After a runtime is deprecated; Lambda might retire it completely at any time by disabling invocation. Deprecated runtimes are not eligible for security updates or technical support.' +CHECK_RISK_extra762='If you have functions running on a runtime that will be deprecated in the next 60 days; Lambda notifies you by email that you should prepare by migrating your function to a supported runtime. In some cases; such as security issues that require a backwards-incompatible update; or software that does not support a long-term support (LTS) schedule; advance notice might not be possible. After a runtime is deprecated; Lambda might retire it completely at any time by disabling invocation. Deprecated runtimes are not eligible for security updates or technical support.' CHECK_REMEDIATION_extra762='Test new runtimes as they are made available. Implement them in production as soon as possible.' CHECK_DOC_extra762='https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html' CHECK_CAF_EPIC_extra762='Infrastructure Security' @@ -30,7 +30,11 @@ extra762(){ OBSOLETE='%(nodejs4.3|nodejs4.3-edge|nodejs6.10|nodejs8.10|dotnetcore1.0|dotnetcore2.0)' for regx in $REGIONS; do - LIST_OF_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --output text --query 'Functions[*].{R:Runtime,N:FunctionName}' | tr "\t" "%") + LIST_OF_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --output text --query 'Functions[*].{R:Runtime,N:FunctionName}' 2>&1| tr "\t" "%" ) + if [[ $(echo "$LIST_OF_FUNCTIONS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list functions" "$regx" + continue + fi if [[ $LIST_OF_FUNCTIONS ]]; then for lambdafunction in $LIST_OF_FUNCTIONS;do fname=$(echo "$lambdafunction" | cut -d'%' -f1) diff --git a/checks/check_extra768 b/checks/check_extra768 index 5e59c7b8d5..7b68075274 100644 --- a/checks/check_extra768 +++ b/checks/check_extra768 @@ -30,9 +30,13 @@ extra768(){ fi for regx in $REGIONS; do # Get a list of all task definition families first: - FAMILIES=$($AWSCLI ecs list-task-definition-families $PROFILE_OPT --region $regx --status ACTIVE | jq -r .families[]) - if [[ $FAMILIES ]]; then - for FAMILY in $FAMILIES;do + FAMILIES=$($AWSCLI ecs list-task-definition-families $PROFILE_OPT --region $regx --status ACTIVE 2>&1 ) + if [[ $(echo "$FAMILIES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list task definition families" "$regx" + continue + fi + if [[ $(echo $FAMILIES | jq -r .families[]) ]]; then + for FAMILY in $(echo $FAMILIES | jq -r .families[]);do # Get the full task definition arn: TASK_DEFINITION_TEMP=$($AWSCLI ecs list-task-definitions $PROFILE_OPT --region $regx --family-prefix $FAMILY --sort DESC --max-items 1 | jq -r .taskDefinitionArns[0]) # We only care about the task definition name: diff --git a/checks/check_extra770 b/checks/check_extra770 index e2c3abf736..aaff5220cc 100644 --- a/checks/check_extra770 +++ b/checks/check_extra770 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra770='Infrastructure Security' extra770(){ # "Check for internet facing EC2 Instances " for regx in $REGIONS; do - LIST_OF_PUBLIC_INSTANCES_WITH_INSTANCE_PROFILES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query 'Reservations[*].Instances[?((IamInstanceProfile!=`null` && PublicIpAddress!=`null`))].[InstanceId,PublicIpAddress,IamInstanceProfile.Arn]' --output text) + LIST_OF_PUBLIC_INSTANCES_WITH_INSTANCE_PROFILES=$($AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx --query 'Reservations[*].Instances[?((IamInstanceProfile!=`null` && PublicIpAddress!=`null`))].[InstanceId,PublicIpAddress,IamInstanceProfile.Arn]' --output text 2>&1) + if [[ $(echo "$LIST_OF_PUBLIC_INSTANCES_WITH_INSTANCE_PROFILES" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe instances" "$regx" + continue + fi if [[ $LIST_OF_PUBLIC_INSTANCES_WITH_INSTANCE_PROFILES ]];then while read -r instance;do INSTANCE_ID=$(echo $instance | awk '{ print $1; }') diff --git a/checks/check_extra772 b/checks/check_extra772 index c56a7c32a8..9073fecc4a 100644 --- a/checks/check_extra772 +++ b/checks/check_extra772 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra772='Infrastructure Security' extra772(){ for region in $REGIONS; do - EIP_DUMP=$($AWSCLI ec2 describe-addresses ${PROFILE_OPT} --region $region --output json) + EIP_DUMP=$($AWSCLI ec2 describe-addresses ${PROFILE_OPT} --region $region --output json 2>&1) + if [[ $(echo "$EIP_DUMP" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe addresses" "$regx" + continue + fi EIP_LIST=$(echo $EIP_DUMP | jq -r '.Addresses[].AllocationId') if [[ $EIP_LIST ]]; then for eip in $EIP_LIST; do diff --git a/checks/check_extra775 b/checks/check_extra775 index bc47823f26..56d14143be 100644 --- a/checks/check_extra775 +++ b/checks/check_extra775 @@ -30,7 +30,11 @@ extra775(){ fi for regx in $REGIONS; do - LIST_OF_EC2_AUTOSCALING=$($AWSCLI autoscaling describe-launch-configurations $PROFILE_OPT --region $regx --query LaunchConfigurations[*].LaunchConfigurationName --output text --max-items $MAXITEMS | grep -v None) + LIST_OF_EC2_AUTOSCALING=$($AWSCLI autoscaling describe-launch-configurations $PROFILE_OPT --region $regx --query LaunchConfigurations[*].LaunchConfigurationName --output text --max-items $MAXITEMS 2>&1 | grep -v None ) + if [[ $(echo "$LIST_OF_EC2_AUTOSCALING" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe launch configurations" "$regx" + continue + fi if [[ $LIST_OF_EC2_AUTOSCALING ]];then for autoscaling_configuration in $LIST_OF_EC2_AUTOSCALING; do EC2_AUTOSCALING_USERDATA_FILE="$SECRETS_TEMP_FOLDER/extra775-$autoscaling_configuration-userData.decoded" diff --git a/checks/check_extra779 b/checks/check_extra779 index ccb95abefa..ddf530998f 100644 --- a/checks/check_extra779 +++ b/checks/check_extra779 @@ -31,7 +31,11 @@ extra779(){ for regx in $REGIONS; do # crate a list of SG open to the world with port $ES_API_PORT or $ES_DATA_PORT or $ES_KIBANA_PORT SG_LIST=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --output text \ - --query "SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=\`$ES_API_PORT\` && ToPort>=\`$ES_API_PORT\`) || (FromPort<=\`$ES_DATA_PORT\` && ToPort>=\`$ES_DATA_PORT\`) || (FromPort<=\`$ES_KIBANA_PORT\` && ToPort>=\`$ES_KIBANA_PORT\`)) && (contains(IpRanges[].CidrIp, \`0.0.0.0/0\`) || contains(Ipv6Ranges[].CidrIpv6, \`::/0\`))]) > \`0\`].{GroupId:GroupId}") + --query "SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=\`$ES_API_PORT\` && ToPort>=\`$ES_API_PORT\`) || (FromPort<=\`$ES_DATA_PORT\` && ToPort>=\`$ES_DATA_PORT\`) || (FromPort<=\`$ES_KIBANA_PORT\` && ToPort>=\`$ES_KIBANA_PORT\`)) && (contains(IpRanges[].CidrIp, \`0.0.0.0/0\`) || contains(Ipv6Ranges[].CidrIpv6, \`::/0\`))]) > \`0\`].{GroupId:GroupId}" 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi # in case of open security groups goes through each one if [[ $SG_LIST ]];then for sg in $SG_LIST;do diff --git a/checks/check_extra78 b/checks/check_extra78 index bc32dc1cd9..015903b4e7 100644 --- a/checks/check_extra78 +++ b/checks/check_extra78 @@ -28,7 +28,11 @@ CHECK_CAF_EPIC_extra78='Data Protection' extra78(){ # "Ensure there are no Public Accessible RDS instances " for regx in $REGIONS; do - LIST_OF_RDS_PUBLIC_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[?PubliclyAccessible==`true` && DBInstanceStatus==`"available"`].[DBInstanceIdentifier,Endpoint.Address]' --output text) + LIST_OF_RDS_PUBLIC_INSTANCES=$($AWSCLI rds describe-db-instances $PROFILE_OPT --region $regx --query 'DBInstances[?PubliclyAccessible==`true` && DBInstanceStatus==`"available"`].[DBInstanceIdentifier,Endpoint.Address]' --output text 2>&1) + if [[ $(echo "$LIST_OF_RDS_PUBLIC_INSTANCES" | grep AccessDenied) ]]; then + textFail "$regx: Access Denied Trying to describe DB instances" "$regx" + continue + fi if [[ $LIST_OF_RDS_PUBLIC_INSTANCES ]];then while read -r rds_instance;do RDS_NAME=$(echo $rds_instance | awk '{ print $1; }') diff --git a/checks/check_extra780 b/checks/check_extra780 index d835d62668..15dd91f16f 100644 --- a/checks/check_extra780 +++ b/checks/check_extra780 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra780='IAM' extra780(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do CHECK_IF_COGNITO_ENABLED=$($AWSCLI es describe-elasticsearch-domain --domain-name $domain $PROFILE_OPT --region $regx --query 'DomainStatus.CognitoOptions.Enabled' --output text|grep -i true) diff --git a/checks/check_extra781 b/checks/check_extra781 index 38a4899aea..f1ead9009b 100644 --- a/checks/check_extra781 +++ b/checks/check_extra781 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra781='Data Protection' extra781(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do CHECK_IF_ENCREST_ENABLED=$($AWSCLI es describe-elasticsearch-domain --domain-name $domain $PROFILE_OPT --region $regx --query 'DomainStatus.EncryptionAtRestOptions.Enabled' --output text|grep -i true) diff --git a/checks/check_extra782 b/checks/check_extra782 index f6babb0495..46748f56d9 100644 --- a/checks/check_extra782 +++ b/checks/check_extra782 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra782='Data Protection' extra782(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do CHECK_IF_NODETOENCR_ENABLED=$($AWSCLI es describe-elasticsearch-domain --domain-name $domain $PROFILE_OPT --region $regx --query 'DomainStatus.NodeToNodeEncryptionOptions.Enabled' --output text|grep -i true) diff --git a/checks/check_extra783 b/checks/check_extra783 index ec8005e20f..d7053dacb8 100644 --- a/checks/check_extra783 +++ b/checks/check_extra783 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra783='Data Protection' extra783(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do CHECK_IF_ENFORCEHTTPS_ENABLED=$($AWSCLI es describe-elasticsearch-domain --domain-name $domain $PROFILE_OPT --region $regx --query 'DomainStatus.DomainEndpointOptions.EnforceHTTPS' --output text|grep -i true) diff --git a/checks/check_extra784 b/checks/check_extra784 index 3a200968b5..750d780110 100644 --- a/checks/check_extra784 +++ b/checks/check_extra784 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra784='IAM' extra784(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do CHECK_IF_INTERNALDB_ENABLED=$($AWSCLI es describe-elasticsearch-domain --domain-name $domain $PROFILE_OPT --region $regx --query 'DomainStatus.AdvancedSecurityOptions.InternalUserDatabaseEnabled' --output text|grep -i true) diff --git a/checks/check_extra785 b/checks/check_extra785 index e47e0a6f5d..1cb896d956 100644 --- a/checks/check_extra785 +++ b/checks/check_extra785 @@ -30,7 +30,11 @@ CHECK_CAF_EPIC_extra785='Infrastructure Security' extra785(){ for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do CHECK_IF_UPDATE_AVAILABLE_AND_VERSION=$($AWSCLI es describe-elasticsearch-domain --domain-name $domain $PROFILE_OPT --region $regx --query 'DomainStatus.[ServiceSoftwareOptions.UpdateAvailable,ElasticsearchVersion]' --output text) diff --git a/checks/check_extra786 b/checks/check_extra786 index 11643e4ae0..7517707625 100644 --- a/checks/check_extra786 +++ b/checks/check_extra786 @@ -28,7 +28,11 @@ extra786(){ TEMP_EXTRA786_FILE=$(mktemp -t prowler-${ACCOUNT_NUM}-es-domain.EXTRA786.XXXXXXXXXX) $AWSCLI ec2 describe-instances $PROFILE_OPT --region $regx \ --query 'Reservations[*].Instances[*].{HttpTokens:MetadataOptions.HttpTokens,HttpEndpoint:MetadataOptions.HttpEndpoint,InstanceId:InstanceId}' \ - --output text --max-items $MAXITEMS > $TEMP_EXTRA786_FILE + --output text --max-items $MAXITEMS > $TEMP_EXTRA786_FILE 2>&1 + if [[ $(cat $TEMP_EXTRA786_FILE | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe instances" "$regx" + continue + fi # if the file contains data, there are instances in that region if [[ -s "$TEMP_EXTRA786_FILE" ]];then # here we read content from the file fields instanceid httptokens_status httpendpoint diff --git a/checks/check_extra787 b/checks/check_extra787 index ef61f44fe4..4f026ee026 100644 --- a/checks/check_extra787 +++ b/checks/check_extra787 @@ -34,7 +34,11 @@ extra787(){ for regx in $REGIONS; do # create a list of SG open to the world with port $ES_API_PORT or $ES_DATA_PORT or $ES_KIBANA_PORT SG_LIST=$($AWSCLI ec2 describe-security-groups $PROFILE_OPT --region $regx --output text \ - --query "SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=\`$ES_API_PORT\` && ToPort>=\`$ES_API_PORT\`) || (FromPort<=\`$ES_DATA_PORT\` && ToPort>=\`$ES_DATA_PORT\`) || (FromPort<=\`$ES_KIBANA_PORT\` && ToPort>=\`$ES_KIBANA_PORT\`)) && (contains(IpRanges[].CidrIp, \`0.0.0.0/0\`) || contains(Ipv6Ranges[].CidrIpv6, \`::/0\`))]) > \`0\`].{GroupId:GroupId}") + --query "SecurityGroups[?length(IpPermissions[?((FromPort==null && ToPort==null) || (FromPort<=\`$ES_API_PORT\` && ToPort>=\`$ES_API_PORT\`) || (FromPort<=\`$ES_DATA_PORT\` && ToPort>=\`$ES_DATA_PORT\`) || (FromPort<=\`$ES_KIBANA_PORT\` && ToPort>=\`$ES_KIBANA_PORT\`)) && (contains(IpRanges[].CidrIp, \`0.0.0.0/0\`) || contains(Ipv6Ranges[].CidrIpv6, \`::/0\`))]) > \`0\`].{GroupId:GroupId}" 2>&1) + if [[ $(echo "$SG_LIST" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe security groups" "$regx" + continue + fi # in case of open security groups goes through each one if [[ $SG_LIST ]];then for sg in $SG_LIST;do diff --git a/checks/check_extra788 b/checks/check_extra788 index b407ccac47..792929a6e8 100644 --- a/checks/check_extra788 +++ b/checks/check_extra788 @@ -29,7 +29,11 @@ extra788(){ # "Check if Elasticsearch Service domains allow open access " for regx in $REGIONS; do - LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text) + LIST_OF_DOMAINS=$($AWSCLI es list-domain-names $PROFILE_OPT --region $regx --query DomainNames --output text 2>&1) + if [[ $(echo "$LIST_OF_DOMAINS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list domain names" "$regx" + continue + fi if [[ $LIST_OF_DOMAINS ]]; then for domain in $LIST_OF_DOMAINS;do TEMP_POLICY_FILE=$(mktemp -t prowler-${ACCOUNT_NUM}-es-domain.policy.XXXXXXXXXX) diff --git a/checks/check_extra789 b/checks/check_extra789 index 66fe62508e..d54eb02c32 100644 --- a/checks/check_extra789 +++ b/checks/check_extra789 @@ -32,8 +32,11 @@ extra789(){ ${PROFILE_OPT} \ --query "ServiceDetails[?Owner=='${ACCOUNT_NUM}'].ServiceId" \ --region ${regx} \ - --output text | xargs - ) + --output text | xargs 2>&1) + if [[ $(echo "$ENDPOINT_SERVICES_IDS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe VPC endpoint services" "$regx" + continue + fi for ENDPOINT_SERVICE_ID in ${ENDPOINT_SERVICES_IDS}; do diff --git a/checks/check_extra79 b/checks/check_extra79 index bcb414bba2..7db62f3128 100644 --- a/checks/check_extra79 +++ b/checks/check_extra79 @@ -28,8 +28,16 @@ CHECK_CAF_EPIC_extra79='Data Protection' extra79(){ # "Check for internet facing Elastic Load Balancers " for regx in $REGIONS; do - LIST_OF_PUBLIC_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[?Scheme == `internet-facing`].[LoadBalancerName,DNSName]' --output text) - LIST_OF_PUBLIC_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Scheme == `internet-facing`].[LoadBalancerName,DNSName]' --output text) + LIST_OF_PUBLIC_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[?Scheme == `internet-facing`].[LoadBalancerName,DNSName]' --output text 2>&1) + if [[ $(echo "$LIST_OF_PUBLIC_ELBS" | grep AccessDenied) ]]; then + textFail "$regx: Access Denied Trying to describe load balancers" "$regx" + continue + fi + LIST_OF_PUBLIC_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?Scheme == `internet-facing`].[LoadBalancerName,DNSName]' --output text 2>&1) + if [[ $(echo "$LIST_OF_PUBLIC_ELBSV2" | grep AccessDenied) ]]; then + textFail "$regx: Access Denied Trying to describe load balancers" "$regx" + continue + fi LIST_OF_ALL_ELBS=$( echo $LIST_OF_PUBLIC_ELBS; echo $LIST_OF_PUBLIC_ELBSV2) LIST_OF_ALL_ELBS_PER_LINE=$( echo $LIST_OF_ALL_ELBS| xargs -n2 ) if [[ $LIST_OF_ALL_ELBS ]];then diff --git a/checks/check_extra790 b/checks/check_extra790 index f2680c785d..600d0d4089 100644 --- a/checks/check_extra790 +++ b/checks/check_extra790 @@ -32,8 +32,11 @@ extra790(){ ${PROFILE_OPT} \ --query "ServiceDetails[?Owner=='${ACCOUNT_NUM}'].ServiceId" \ --region ${regx} \ - --output text | xargs - ) + --output text | xargs 2>&1) + if [[ $(echo "$ENDPOINT_SERVICES_IDS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe VPC endpoint services" "$regx" + continue + fi for ENDPOINT_SERVICE_ID in ${ENDPOINT_SERVICES_IDS}; do ENDPOINT_PERMISSIONS_LIST=$(${AWSCLI} ec2 describe-vpc-endpoint-service-permissions \ diff --git a/checks/check_extra792 b/checks/check_extra792 index 77e8ff58dc..f4c6f45a81 100644 --- a/checks/check_extra792 +++ b/checks/check_extra792 @@ -27,8 +27,16 @@ CHECK_CAF_EPIC_extra792='Data Protection' extra792(){ # "Check if Elastic Load Balancers have insecure SSL ciphers " for regx in $REGIONS; do - LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[*].LoadBalancerName' --output text|xargs -n1) - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[*].LoadBalancerArn' --output text|xargs -n1) + LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[*].LoadBalancerName' --output text 2>&1|xargs -n1 ) + if [[ $(echo "$LIST_OF_ELBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[*].LoadBalancerArn' --output text 2>&1|xargs -n1 ) + if [[ $(echo "$LIST_OF_ELBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi if [[ $LIST_OF_ELBS || $LIST_OF_ELBSV2 ]]; then if [[ $LIST_OF_ELBS ]]; then # https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-ssl-security-policy.html#ssl-ciphers diff --git a/checks/check_extra793 b/checks/check_extra793 index 413a8a4735..a8c5e6f768 100644 --- a/checks/check_extra793 +++ b/checks/check_extra793 @@ -27,8 +27,16 @@ CHECK_CAF_EPIC_extra793='Data Protection' extra793(){ # "Check if Elastic Load Balancers have encrypted listeners " for regx in $REGIONS; do - LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[*].LoadBalancerName' --output text|xargs -n1) - LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[?(Type == `application`)].LoadBalancerArn' --output text|xargs -n1) + LIST_OF_ELBS=$($AWSCLI elb describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancerDescriptions[*].LoadBalancerName' --output text 2>&1|xargs -n1) + if [[ $(echo "$LIST_OF_ELBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi + LIST_OF_ELBSV2=$($AWSCLI elbv2 describe-load-balancers $PROFILE_OPT --region $regx --query 'LoadBalancers[*].LoadBalancerArn' --output text 2>&1|xargs -n1) + if [[ $(echo "$LIST_OF_ELBS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to describe load balancers" "$regx" + continue + fi if [[ $LIST_OF_ELBS || $LIST_OF_ELBSV2 ]]; then if [[ $LIST_OF_ELBS ]]; then ENCRYPTEDPROTOCOLS=("HTTPS" "SSL") diff --git a/checks/check_extra794 b/checks/check_extra794 index 1ed33f7a49..080d711146 100644 --- a/checks/check_extra794 +++ b/checks/check_extra794 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra794='Logging and Monitoring' extra794(){ for regx in $REGIONS; do - CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text) + CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text 2>&1) + if [[ $(echo "$CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list EKS clusters" "$regx" + continue + fi if [[ $CLUSTERS ]]; then for CLUSTER in $CLUSTERS;do CLUSTERDEF=$($AWSCLI eks describe-cluster $PROFILE_OPT --region $regx --name $CLUSTER --query 'cluster.logging.clusterLogging[0]') diff --git a/checks/check_extra795 b/checks/check_extra795 index 7030d74166..aa9f663923 100644 --- a/checks/check_extra795 +++ b/checks/check_extra795 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra795='Infrastructure Security' extra795(){ for regx in $REGIONS; do - CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text) + CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text 2>&1) + if [[ $(echo "$CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list EKS clusters" "$regx" + continue + fi if [[ $CLUSTERS ]]; then for CLUSTER in $CLUSTERS;do CLUSTERDEF=$($AWSCLI eks describe-cluster $PROFILE_OPT --region $regx --name $CLUSTER --query 'cluster.resourcesVpcConfig') diff --git a/checks/check_extra796 b/checks/check_extra796 index 34789c74c7..78304fb5fc 100644 --- a/checks/check_extra796 +++ b/checks/check_extra796 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra796='Infrastructure Security' extra796(){ for regx in $REGIONS; do - CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text) + CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text 2>&1) + if [[ $(echo "$CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list EKS clusters" "$regx" + continue + fi if [[ $CLUSTERS ]]; then for CLUSTER in $CLUSTERS;do CLUSTERDEF=$($AWSCLI eks describe-cluster $PROFILE_OPT --region $regx --name $CLUSTER --query 'cluster.resourcesVpcConfig') diff --git a/checks/check_extra797 b/checks/check_extra797 index 473c53762e..4dde6decf5 100644 --- a/checks/check_extra797 +++ b/checks/check_extra797 @@ -25,7 +25,11 @@ CHECK_CAF_EPIC_extra797='Data Protection' extra797(){ for regx in $REGIONS; do - CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text) + CLUSTERS=$($AWSCLI eks list-clusters $PROFILE_OPT --region $regx --query 'clusters[]' --output text 2>&1) + if [[ $(echo "$CLUSTERS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list EKS clusters" "$regx" + continue + fi if [[ $CLUSTERS ]]; then for CLUSTER in $CLUSTERS;do ENC_CONFIG=$($AWSCLI eks describe-cluster $PROFILE_OPT --region $regx --name $CLUSTER --query 'cluster.encryptionConfig') diff --git a/checks/check_extra798 b/checks/check_extra798 index 0e14d22ad8..661b7ca6a9 100644 --- a/checks/check_extra798 +++ b/checks/check_extra798 @@ -26,7 +26,11 @@ CHECK_CAF_EPIC_extra798='Infrastructure Security' extra798(){ for regx in $REGIONS; do - LIST_OF_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --output text --query 'Functions[*].FunctionName') + LIST_OF_FUNCTIONS=$($AWSCLI lambda list-functions $PROFILE_OPT --region $regx --output text --query 'Functions[*].FunctionName' 2>&1) + if [[ $(echo "$LIST_OF_FUNCTIONS" | grep -E 'AccessDenied|UnauthorizedOperation|AuthorizationError') ]]; then + textFail "$regx: Access Denied trying to list functions" "$regx" + continue + fi if [[ $LIST_OF_FUNCTIONS ]]; then for lambdafunction in $LIST_OF_FUNCTIONS; do # get the policy per function