デフォルトセキュリティグループを自動で無効化する
デフォルトセキュリティグループを通信できる状態にしておくことは推奨されていません(チェック項目一覧(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