AWS Configルールで使用されていない/アタッチされていないセキュリティグループが自動的に削除される方法

記事タイトルとURLをコピーする

こんにちは!イーゴリです。

以前、AWS Security Hubに「[EC2.22] 未使用の Amazon EC2 セキュリティグループを削除することをお勧めします」という項目がありましたが、AWS Security HubのAWS Foundational Security Best Practices 標準および NIST SP 800-53 Rev. 5 から削除されました。個人的に重要な項目だと思いますので紹介します。

特にEC2の作成時に「launch-wizard-XX」(アタッチされていない/使われていないSG)のようなセキュリティグループを削除することが重要です。間違ってアタッチしてしまうと、大事故に繋がる可能性がありますので、アタッチされていないセキュリティグループに注意する必要があります。意図のあるケースでない限り、アタッチされていない(使われていない)セキュリティグループは削除したほうが良いと思います。

但し、手作業や人による管理の手間や見逃しなどが発生すると思いますので、自動化したほうが漏れがなく早く済むので、効率が良いです。また、「このセキュリティグループを削除しても問題ないか」というパターンがよく発生しますよね。そのような時のためにも自動化すると迷わなくなります。使っているセキュリティグループのみ残したい場合のために、この記事を紹介したいと思います。

[EC2.22] 未使用の Amazon EC2 セキュリティグループを削除することをお勧めします

特定の標準から廃止 – Security Hub は、2023 年 9 月 20 日に AWS Foundational Security Best Practices 標準および NIST SP 800-53 Rev. 5 からこのコントロールを削除しました。このコントロールは、引き続きサービスマネージドスタンダード: の一部です AWS Control Tower。この コントロールでは、セキュリティグループが EC2 インスタンス、または Elastic Network Interface にアタッチされている場合に、合格の検出結果を生成します。ただし、特定のユースケースでは、セキュリティグループがアタッチされていなくてもセキュリティ上のリスクはありません。他の EC2 コントロール (EC2.2、EC2.13、EC2.14、EC2.18、EC2.19 など) を使用すると、セキュリティグループをモニタリングできます。 docs.aws.amazon.com

イメージ図

作業の大まかな流れ

  • セキュリティグループの削除ができるIAMロールを作成する。
  • 使われてないセキュリティグループの検出用のAWS Configルールを作成する。
  • AWS Configルールでセキュリティグループの削除のタスクを自動修復アクションで設定する。

注意点

ENIにアタッチされていないセキュリティグループは削除されますのでご注意ください。例えば、0台数で起動されているECS/ASGがある場合、セキュリティグループが削除されます。さらに、ASGの台数を0から1以降に変更しようとすると、対象セキュリティグループがないためエラーが発生し、ASGのEC2はスケールアウトされません。

なお、セキュリティグループの不在によるエラーについて、メールが来ました。

一方、下記の場合、セキュリティグループは削除されていません。

  • ENIにアタッチされていないセキュリティグループが他のセキュリティグループのソース/宛先として登録されている場合

手順

IAMロールの作成

AWSマネージドの修復アクションで必要になる権限は下記の記事に記載してありますので、その通りに設定します。

docs.aws.amazon.com

ポリシーを作成します。

ポリシー名 (任意の名前) タイプ
ec2-security-group-attached-to-eni-periodic-policy カスタマー管理

ポリシー内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartAutomationExecution",
                "ssm:GetAutomationExecution",
                "ec2:DescribeSecurityGroups",
                "ec2:DeleteSecurityGroup"
            ],
            "Resource": "*"
        }
    ]
}

ロールを作成します。

上で作成したポリシーをアタッチし、下記の信頼関係を設定します。

ロール名 (任意の名前) 信頼されたエンティティ
ec2-security-group-attached-to-eni-periodic-role AWS のサービス: ssm

信頼関係の内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

AWS Configルールを作成する

[AWS Config] > [ルール] > [ec2-security-group-attached-to-eni-periodic]を選択します。

「頻度」の欄でこのルールがどれぐらいの頻度で実行されるか指定します。

デフォルト値:24時間

この方法で設定すると、未アタッチのセキュリティグループを検知するという仕組みになります。

上記のConfigルールに先ほど作ったIAMロールをアタッチすることで、未アタッチのセキュリティグループの検知後、未アタッチのセキュリティグループが自動的に削除されます。

AWS Configの自動修復アクションの設定

修復アクション[AWSConfigRemediation-DeleteUnusedSecurityGroup]を選択します。

IAMロールのARNをコピーします。

  • GroupIdを選択します。
  • パラメーターにある「AutomationAssumeRole」の値にIAMロールのARN ※1をペーストします。

※1 ロール名ではないので、ご注意ください。ARNの例:arn:aws:iam::AWSアカウントID:role/ec2-security-group-attached-to-eni-periodic-role

動作確認

動作確認のため、「再評価」ボタンをクリックします。

実行前の状態:50個のセキュリティグループがある

実行後の状態:21個のセキュリティグループになった

アクションの実行失敗

あるセキュリティグループのそばに「アクションの実行失敗」というメッセージが出て、セキュリティグループが削除されませんでした。

私の場合、対象セキュリティグループは他のセキュリティグループと関連していたので、別のセキュリティグループのリソース/宛先から対象セキュリティグループIDを削除後、もう一度「再評価」ボタンをクリックすると、削除されなかったセキュリティグループが正常に削除されました。

このConfigルールを残すと、今後も定期的にルールが実行され、アタッチされていないセキュリティグループが自動的に削除されますので、運用に乗せるととても便利です。

以上、御一読ありがとうございました。

本田 イーゴリ (記事一覧)

カスタマーサクセス部

・2024 Japan AWS Top Engineers (Security)
・AWS SAP, DOP, SCS, DBS, SAA, DVA, CLF
・Azure AZ-900
・EC-Council CCSE

趣味:日本国内旅行(47都道府県制覇)・ドライブ・音楽