デフォルトセキュリティグループを自動で無効化する

2019.09.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

デフォルトセキュリティグループを通信できる状態にしておくことは推奨されていません(チェック項目一覧(CIS v1.2.0) – insightwatchサポート)。 今回は自動で同一リージョン内のすべてのデフォルトセキュリティグループを無効化したいと思います。無効化はインバウンド、アウトバウンドのルールを全て削除することを意味します。

概要

AWS Configのマネージドルールであるvpc-default-security-group-closedを使用して、準拠していないデフォルトセキュリティグループを検知します。このルールでは下記の内容に違反しているかどうかが評価されます。

いずれの Amazon Virtual Private Cloud (VPC) のデフォルトのセキュリティグループでもインバウンドとアウトバウンドのいずれのトラフィックも許可しないことを確認します。

vpc-default-security-group-closed - AWS Config

次に修復アクションにSSM Automationを使用して、準拠していないデフォルトセキュリティグループからルールを全て削除します。

設定してみる

AWS Configの有効化

AWS Configを有効化します。記録するリソースタイプには少なくともセキュリティグループを含めるようにしてください。

セキュリティグループのルールを削除するAutomationドキュメントを作成

指定されたセキュリティグループのインバウンド、アウトバウンドのルールを削除するAutomationドキュメントをCloseSecurityGroupとして作成します。内容は次のようなものになります。

  • ステップ1
    指定されたセキュリティグループの内容を取得し、インバウンド、アウトバウンドのルールを後続のステップで使用できるように出力変数を作成
  • ステップ2
    インバウンド設定をすべて削除
  • ステップ3
    アウトバウンド設定をすべて削除
---
description: Revoke all ip permissions.
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  GroupId:
    type: String
    description: (Required) Security Group ID
    allowedPattern: ^([s][g]\-)([0-9a-f]){1,}$
  AutomationAssumeRole:
    type: String
    description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
    default: ""
mainSteps:
  - name: GetSecurityGroupInfo
    action: aws:executeAwsApi
    onFailure: Abort
    inputs:
      Service: ec2
      Api: DescribeSecurityGroups
      GroupIds: ["{{GroupId}}"]
    outputs:
      - Name: IpPermissionsIngress
        Selector: $.SecurityGroups[0].IpPermissions
        Type: MapList
      - Name: IpPermissionsEgress
        Selector: $.SecurityGroups[0].IpPermissionsEgress
        Type: MapList
  - name: RevokeAllIngress
    action: aws:executeAwsApi
    onFailure: Continue
    inputs:
      Service: ec2
      Api: RevokeSecurityGroupIngress
      GroupId: "{{GroupId}}"
      IpPermissions: "{{GetSecurityGroupInfo.IpPermissionsIngress}}"
  - name: RevokeAllEgress
    action: aws:executeAwsApi
    onFailure: Continue
    inputs:
      Service: ec2
      Api: RevokeSecurityGroupEgress
      GroupId: "{{GroupId}}"
      IpPermissions: "{{GetSecurityGroupInfo.IpPermissionsEgress}}"

SSM Automationを実行するIAM Roleを作成

まず下記のポリシーをRevokeSecurityGroupとして作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RevokeSecurityGroup",
            "Effect": "Allow",
            "Action": [
                "ec2:RevokeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:DescribeSecurityGroups"
            ],
            "Resource": "*"
        }
    ]
}

次にIAM RoleをRevokeSecurityGroupRoleとして作成し、先程作成したポリシーを割り当てます。

信頼関係は下記のようにします。

AWS Configのルール作成

AWS Configの画面からルールの追加をクリックし、マネージドルールのvpc-default-security-group-closedを選択します。

修復アクションを下記のように設定します。他はデフォルトのまま保存します。

  • 修復アクション:CloseSecurityGroup
  • 自動修復:はい
  • リソースIDパラメータ:GroupId
  • AutomationAssumeRole:上記で作成したIAM RoleのARN

設定は以上で完了です。

自動で修復してみる

ルール作成後、すぐに評価が始まります。

準拠していないデフォルトセキュリティグループがあれば検知されます。

こちらはルールの詳細画面ですが、「アクションが正常に実行されました」と表示され修復アクションが実行されたことがわかります。この時点で同リージョン内のすべてのデフォルトセキュリティグループからルールが削除されています。

ルールがきれいさっぱり削除されているのが確認できます。

セキュリティグループのルールが削除されたことで再評価が行われ、非準拠のリソースがなくなったことがわかります。

まとめ

このAWS ConfigルールはVPC作成時にできるデフォルトセキュリティグループや、既存のものを変更した際に自動で無効化してくれます。意図しない通信を防ぐためにもぜひご活用ください。

参考情報

最後にに記事執筆時に参照した情報を載せておきます。

条件分岐を使用した動的自動化ワークフローの作成 - AWS Systems Manager

VPC のセキュリティグループ - Amazon Virtual Private Cloud

SSM ドキュメントプラグインの参照 - AWS Systems Manager

あなたのAWSセキュリティ監査状況を採点〜CISベンチマークを読んでみた | DevelopersIO

【資料公開】PCI DSSのネットワークアクセス制御に関する要件とそのための実装を学ぶ勉強会をやりました(管理編) | DevelopersIO

defaultのセキュリティグループが使われているか調査するPythonスクリプト書いてみた | DevelopersIO

セキュリティグループのSSH全開放をAWS Configで自動修復したら3分くらいで直ったからみんな使ってほしい件 | DevelopersIO