はじめに
こんにちは。エンタープライズクラウド部の脇江です。
今回は Organizations 環境でデフォルトセキュリティグループのルールを自動的に無効化する方法について記載します。
対象読者
- Organizations を使用したマルチアカウント環境を運用されている方
- Organizations 環境全体でデフォルトセキュリティグループを使用できないようにしたい方
デフォルトセキュリティグループとは?
デフォルト VPC および新規作成する VPC に作成されるセキュリティグループです。
セキュリティグループ名は「default」となります。
デフォルトセキュリティグループの特徴としては以下が挙げられます。
特徴①:デフォルトで設定されているルールではデフォルトセキュリティグループ同士の通信がすべて許可されている
特徴②:ルールを変更・削除することはできるが、セキュリティグループ自体を削除することはできない
デフォルトセキュリティグループのルール無効化の必要性
Security Hub のコントロールでも定義されていますが、デフォルトセキュリティグループの使用は基本的に推奨されていません。
特徴①の通り、デフォルトセキュリティグループを適用しているリソース同士のすべてのトラフィックが許可されることによる意図しないトラフィック発生を防止するためとなります。
また、特徴②の通り、インバウンドルール・アウトバウンドルールの変更・削除はできますが、デフォルトセキュリティグループ自体は削除することができません。
そのため、デフォルトセキュリティグループによる意図しないトラフィックを防ぐためにはルールを無効化するといった対応が必要となります。
自動無効化の仕組み
構成図
Organizations 環境におけるデフォルトセキュリティグループのルール自動無効化を以下の図のように構成します。
CloudFormation StackSets を使用することで、Organizations 配下の各 AWS アカウントに必要なリソースの作成・設定を行います。 各 AWS アカウントに作成・設定するリソースは以下となります。
- Config ルール
- デフォルトセキュリティグループにルールが設定されていることを検知するための Config ルールです。
- Config ルールの自動修復
- Config ルールによるチェックでステータスが
非準拠
となった際の自動修復処理を設定します。 - 自動修復処理として対象のデフォルトセキュリティグループに対して、Systems Manager ドキュメント
AWS-CloseSecurityGroup
が実行されます。AWS-CloseSecurityGroup
が実行されることで対象セキュリティグループのインバウンドルールおよびアウトバウンドルールが削除されます。
- Config ルールによるチェックでステータスが
- IAM ロール
AWS-CloseSecurityGroup
がセキュリティグループのルール削除処理を実行する権限を付与するための IAM ロールです。
デフォルトセキュリティグループのルール自動無効化の流れは以下の通りとなります。
- デフォルトセキュリティグループにルールが設定されていることを Config ルールで検知
- 検知されたデフォルトセキュリティグループの Config ステータスが
非準拠
に変更される - ステータスが
非準拠
となったデフォルトセキュリティグループに対して、自動修復が実行される - 自動修復として設定していた
AWS-CloseSecurityGroup
の処理が実行される - デフォルトセキュリティグループからインバウンドルールおよびアウトバウンドルールが削除される
CloudFormation テンプレート
今回、CloudFormation StackSets でのデプロイには以下の CloudFormation テンプレートを使用します。
AWSTemplateFormatVersion: 2010-09-09 Description: Create an IAM role and Config rule to close the default security group. Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: "IAM role" Parameters: - RoleName - PolicyName - Label: default: "Config" Parameters: - ConfigRuleName Conditions: GlobalServiceDeployRegion: !Equals [!Ref AWS::Region, ap-northeast-1] Parameters: RoleName: Type: String Description: "Enter IAM role name." PolicyName: Type: String Description: "Enter inline policy name for IAM role." ConfigRuleName: Type: String Description: "Enter Config rule name." Resources: IamRole: Type: AWS::IAM::Role Condition: GlobalServiceDeployRegion Properties: RoleName: !Ref RoleName AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - "ssm.amazonaws.com" Action: - "sts:AssumeRole" Policies: - PolicyName: !Ref PolicyName PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "ec2:RevokeSecurityGroupIngress" - "ec2:RevokeSecurityGroupEgress" - "ec2:DescribeSecurityGroups" Resource: "*" ConfigRule: Type: AWS::Config::ConfigRule Properties: ConfigRuleName: !Ref ConfigRuleName Source: Owner: AWS SourceIdentifier: "VPC_DEFAULT_SECURITY_GROUP_CLOSED" Scope: ComplianceResourceTypes: - "AWS::EC2::SecurityGroup" RemediationConfiguration: Type: AWS::Config::RemediationConfiguration Properties: ConfigRuleName: !Ref ConfigRule Automatic: true MaximumAutomaticAttempts: 5 RetryAttemptSeconds: 60 TargetType: "SSM_DOCUMENT" TargetId: "AWS-CloseSecurityGroup" Parameters: SecurityGroupId: ResourceValue: Value: RESOURCE_ID AutomationAssumeRole: StaticValue: Values: - !Sub "arn:aws:iam::${AWS::AccountId}:role/${RoleName}"
やってみる
では、実際に設定してみたいと思います。
デフォルトセキュリティグループのルール確認
まずは設定を始める前にデフォルトセキュリティグループのルールが設定されていることを確認してみます。
今回はデフォルト VPC に作成されているデフォルトセキュリティグループを見てみます。
インバウンドルール、アウトバウンドルールともにルールが設定されていることが確認できました。
CloudFormation StackSets デプロイ
CloudFormation StackSets で Organizations 配下のアカウントにリソース・設定を展開します。
Organizations のマネジメントアカウントあるいは CloudFormation StackSets の委任管理者アカウントからデプロイを実行します。
Organizations 環境でのデプロイのため サービスマネージドアクセス許可
を選択します。
テンプレートは前述のものを使用します。
スタック名、使用するテンプレートで定義したパラメータを入力します。
オペレーションを複数並行して実行しないため、マネージド型の実行は 非アクティブ
を選択します。
組織全体にデプロイしたいのか、特定の OU にデプロイしたいのかによってデプロイターゲットを選択します。
新たなアカウントが組織あるいは OU に追加されたときに自動的にデプロイを実行するため、自動デプロイは アクティブ化済み
を選択します。
また、ターゲット OU からアカウントを削除する場合にアカウントからスタックを削除するため、アカウント削除の動作は スタックを削除
を選択します。
スタックをデプロイするリージョンを選択します。
IAM がグローバルサービスのため、今回使用する CloudFormation テンプレートでは東京リージョンでのスタック作成時のみ IAM ロールを作成するようにしています。
そのため、本記事に記載のテンプレートをそのまま使用する場合は必ず東京リージョンを選択し、デプロイの順番が一番最初になるようにする必要があります。
今回は東京リージョン(ap-northeast-1)のみを対象とします。
上記のように東京リージョンでのデプロイが一番最初に実行されるようにするため、リージョンの同時実行は 順次
を選択します。
IAM ロールを作成するため、AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。
にチェックを入れてデプロイを実行します。
StackSets のデプロイが完了したら、ターゲットアカウントのスタックを確認してみます。
リソースとして IAMロール、Config ルール、自動修復設定が作成されていることが確認できました。
動作確認
デフォルトセキュリティグループのルールが自動的に削除されているかを確認してみます。
StackSets デプロイ前に確認したセキュリティグループのルールを見てみます。
インバウンドルール、アウトバウンドルールともに自動的にルールが削除されていることが確認できました。
新規 VPC 作成時に作成されるデフォルトセキュリティグループの場合でも検知して、自動的に削除されることを確認します。
次は Config ルールの動きと合わせて確認をしてみます。
Config の管理画面から CloudFormation によって展開された Config ルールの詳細画面を開きます。
新規 VPC 作成前はルールに非準拠のデフォルトセキュリティグループがないため「評価結果がありません」と表示されています。
VPC を新規作成してみます。
新規作成した VPC に関連付いたデフォルトセキュリティグループも作成され、インバウンドルールおよびアウトバウンドルールが設定されている状態です。
Config ルールの状態を確認すると、新規作成されたデフォルトセキュリティグループのコンプライアンスが 非準拠
となっています。
ほどなくして自動修復アクションが開始待ちの状態となります。
自動修復アクションが開始され、正常に実行されました。
自動修復アクションが実行され、インバウンドルールおよびアウトバウンドルールが削除されたことでコンプライアンスが 準拠
に変更されます。
VPC 新規作成時にもデフォルトセキュリティグループのルールが自動無効化されることが確認できました。
おわりに
今回は Config ルールの展開を CloudFormation StackSets で行いましたが、Organizations 環境に対して Config ルールを設定するやり方もありそうです。
この記事がどなたかのお役に立てば嬉しいです。