EC2.19
コントロールの説明
セキュリティグループがハイリスクポートへの無制限インバウンドアクセス(0.0.0.0/0 または ::/0)を許可していないかをチェックする。以下の 24 ポートが対象。
20(FTP データ), 21(FTP コマンド), 22(SSH), 23(Telnet), 25(SMTP), 110(POP3), 135(RPC), 143(IMAP), 445(SMB), 1433(MSSQL), 1434(MSSQL Browser), 3000, 3306(MySQL), 3389(RDP), 4333, 5000, 5432(PostgreSQL), 5500(VNC), 5601(Kibana), 8080, 8088, 8888, 9200(Elasticsearch), 9300(Elasticsearch)
本コントロールはセキュリティグループの設定のみを評価する。セキュリティグループがどのリソースにもアタッチされていなくても、ハイリスクポートが開放されていれば FAILED になる。
対応する Config ルール: RESTRICTED_INCOMING_TRAFFIC(評価頻度: Configuration changes + Periodic)
検証環境
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
結果
- ハイリスクポートを 0.0.0.0/0 に開放したセキュリティグループは FAILED。リソースにアタッチされていなくても FAILED になる
- 同じハイリスクポートでも、特定 CIDR(10.0.0.0/8 等)に制限していれば PASSED
- 0.0.0.0/0 のルールを削除すると PASSED に復帰
- デフォルトでは保護されている(セキュリティグループのデフォルトはインバウンドルールなし)
検証の流れ
flowchart LR
A[1. デフォルト状態の確認<br>PASSED] --> B[2. ハイリスクポートを開放した<br>SG を作成]
B --> C[3. FAILED 確認]
C --> D[4. ルールを削除]
D --> E[5. PASSED 復帰確認]
E --> F[6. クリーンアップ]
1. デフォルト状態の確認
Security Hub finding の確認
既存の launch-wizard セキュリティグループ(未使用)を事前に削除済み。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.19"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[]FAILED が 0 件であることを確認。
2. ハイリスクポートを開放した SG を作成
2 つのセキュリティグループを作成する。どちらもリソースにはアタッチしない。
- SG-A: SSH(22)を 0.0.0.0/0 に開放(FAILED になるはず)
- SG-B: RDP(3389)を特定 CIDR(10.0.0.0/8)に制限(PASSED のままのはず)
SG-A の作成(SSH 22 → 0.0.0.0/0)
aws ec2 create-security-group \
--group-name ec2-19-test-a \
--description "EC2.19 test - SSH 0.0.0.0/0" \
--vpc-id <デフォルト VPC ID> \
--query '{GroupId:GroupId}' \
--region ap-northeast-1{
"GroupId": "<SG-A ID>"
}aws ec2 authorize-security-group-ingress \
--group-id <SG-A ID> \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0 \
--query 'SecurityGroupRules[].{RuleId:SecurityGroupRuleId,Port:FromPort,Cidr:CidrIpv4}' \
--region ap-northeast-1[
{
"RuleId": "<ルール ID 1>",
"Port": 22,
"Cidr": "0.0.0.0/0"
}
]SG-B の作成(RDP 3389 → 10.0.0.0/8)
aws ec2 create-security-group \
--group-name ec2-19-test-b \
--description "EC2.19 test - RDP 10.0.0.0/8" \
--vpc-id <デフォルト VPC ID> \
--query '{GroupId:GroupId}' \
--region ap-northeast-1{
"GroupId": "<SG-B ID>"
}aws ec2 authorize-security-group-ingress \
--group-id <SG-B ID> \
--protocol tcp \
--port 3389 \
--cidr 10.0.0.0/8 \
--query 'SecurityGroupRules[].{RuleId:SecurityGroupRuleId,Port:FromPort,Cidr:CidrIpv4}' \
--region ap-northeast-1[
{
"RuleId": "<ルール ID 2>",
"Port": 3389,
"Cidr": "10.0.0.0/8"
}
]リソースにアタッチされていないことを確認
aws ec2 describe-network-interfaces \
--filters Name=group-id,Values=<SG-A ID> \
--query 'length(NetworkInterfaces)' \
--region ap-northeast-103. FAILED 確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-vpc-sg-restricted-common-ports-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認
SG-A(0.0.0.0/0)は NON_COMPLIANT、SG-B(10.0.0.0/8)は COMPLIANT になる。
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-vpc-sg-restricted-common-ports-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<SG-A ID>` || EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<SG-B ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<SG-A ID>",
"ComplianceType": "NON_COMPLIANT"
},
{
"ResourceId": "<SG-B ID>",
"ComplianceType": "COMPLIANT"
}
]Security Hub finding の FAILED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.19"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:security-group/<SG-A ID>"
}
]SG-A(0.0.0.0/0)のみ FAILED。SG-B(10.0.0.0/8)は FAILED にならない。リソースにアタッチされていなくても FAILED になる。
4. SG-A のルールを削除
aws ec2 revoke-security-group-ingress \
--group-id <SG-A ID> \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0 \
--region ap-northeast-1{
"Return": true,
"RevokedSecurityGroupRules": [
{
"SecurityGroupRuleId": "<ルール ID 1>",
"GroupId": "<SG-A ID>",
"IsEgress": false,
"IpProtocol": "tcp",
"FromPort": 22,
"ToPort": 22,
"CidrIpv4": "0.0.0.0/0"
}
]
}5. PASSED 復帰確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-vpc-sg-restricted-common-ports-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-vpc-sg-restricted-common-ports-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<SG-A ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<SG-A ID>",
"ComplianceType": "COMPLIANT"
}
]Security Hub finding の PASSED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.19"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[]6. クリーンアップ
aws ec2 delete-security-group \
--group-id <SG-A ID> \
--region ap-northeast-1
(出力なし)aws ec2 delete-security-group \
--group-id <SG-B ID> \
--region ap-northeast-1
(出力なし)補足:Config ルール名の確認方法
aws configservice describe-config-rules \
--query 'ConfigRules[?contains(Source.SourceIdentifier,`RESTRICTED_INCOMING_TRAFFIC`)].ConfigRuleName' \
--region ap-northeast-1