コンテンツにスキップ

EC2.19

検証日: 2026-05-02 / リージョン: ap-northeast-1

コントロールの説明

セキュリティグループがハイリスクポートへの無制限インバウンドアクセス(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 になる。

本アカウントでは、過去に作成された launch-wizard セキュリティグループ(SSH 22 番ポートを 0.0.0.0/0 に開放)が未使用のまま残存しており、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-1
0

3. 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

Amazonアソシエイトリンク