Organizations 環境でのデフォルトセキュリティグループのルール自動無効化

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

はじめに

こんにちは。エンタープライズクラウド部の脇江です。

今回は Organizations 環境でデフォルトセキュリティグループのルールを自動的に無効化する方法について記載します。

対象読者

  • Organizations を使用したマルチアカウント環境を運用されている方
  • Organizations 環境全体でデフォルトセキュリティグループを使用できないようにしたい方

デフォルトセキュリティグループとは?

デフォルト VPC および新規作成する VPC に作成されるセキュリティグループです。
セキュリティグループ名は「default」となります。

docs.aws.amazon.com

デフォルトセキュリティグループの特徴としては以下が挙げられます。

特徴①:デフォルトで設定されているルールではデフォルトセキュリティグループ同士の通信がすべて許可されている
特徴②:ルールを変更・削除することはできるが、セキュリティグループ自体を削除することはできない

デフォルトセキュリティグループの特徴

デフォルトセキュリティグループのルール無効化の必要性

Security Hub のコントロールでも定義されていますが、デフォルトセキュリティグループの使用は基本的に推奨されていません。
特徴①の通り、デフォルトセキュリティグループを適用しているリソース同士のすべてのトラフィックが許可されることによる意図しないトラフィック発生を防止するためとなります。

docs.aws.amazon.com

また、特徴②の通り、インバウンドルール・アウトバウンドルールの変更・削除はできますが、デフォルトセキュリティグループ自体は削除することができません。
そのため、デフォルトセキュリティグループによる意図しないトラフィックを防ぐためにはルールを無効化するといった対応が必要となります。

自動無効化の仕組み

構成図

Organizations 環境におけるデフォルトセキュリティグループのルール自動無効化を以下の図のように構成します。

デフォルトセキュリティグループのルール自動無効化の仕組み

CloudFormation StackSets を使用することで、Organizations 配下の各 AWS アカウントに必要なリソースの作成・設定を行います。 各 AWS アカウントに作成・設定するリソースは以下となります。

  • Config ルール
    • デフォルトセキュリティグループにルールが設定されていることを検知するための Config ルールです。
  • Config ルールの自動修復
    • Config ルールによるチェックでステータスが 非準拠 となった際の自動修復処理を設定します。
    • 自動修復処理として対象のデフォルトセキュリティグループに対して、Systems Manager ドキュメント AWS-CloseSecurityGroup が実行されます。
      • AWS-CloseSecurityGroup が実行されることで対象セキュリティグループのインバウンドルールおよびアウトバウンドルールが削除されます。
  • IAM ロール
    • AWS-CloseSecurityGroup がセキュリティグループのルール削除処理を実行する権限を付与するための IAM ロールです。


デフォルトセキュリティグループのルール自動無効化の流れは以下の通りとなります。

  1. デフォルトセキュリティグループにルールが設定されていることを Config ルールで検知
  2. 検知されたデフォルトセキュリティグループの Config ステータスが 非準拠 に変更される
  3. ステータスが 非準拠 となったデフォルトセキュリティグループに対して、自動修復が実行される
  4. 自動修復として設定していた AWS-CloseSecurityGroup の処理が実行される
  5. デフォルトセキュリティグループからインバウンドルールおよびアウトバウンドルールが削除される

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 環境でのデプロイのため サービスマネージドアクセス許可 を選択します。
テンプレートは前述のものを使用します。

テンプレートの選択

スタック名、使用するテンプレートで定義したパラメータを入力します。

StackSet の詳細を指定

オペレーションを複数並行して実行しないため、マネージド型の実行は 非アクティブ を選択します。

StackSet オプションの設定

組織全体にデプロイしたいのか、特定の OU にデプロイしたいのかによってデプロイターゲットを選択します。

デプロイオプションの設定 - デプロイターゲット

新たなアカウントが組織あるいは OU に追加されたときに自動的にデプロイを実行するため、自動デプロイは アクティブ化済み を選択します。
また、ターゲット OU からアカウントを削除する場合にアカウントからスタックを削除するため、アカウント削除の動作は スタックを削除 を選択します。

デプロイオプションの設定 - 自動デプロイオプション

スタックをデプロイするリージョンを選択します。
IAM がグローバルサービスのため、今回使用する CloudFormation テンプレートでは東京リージョンでのスタック作成時のみ IAM ロールを作成するようにしています。
そのため、本記事に記載のテンプレートをそのまま使用する場合は必ず東京リージョンを選択し、デプロイの順番が一番最初になるようにする必要があります。
今回は東京リージョン(ap-northeast-1)のみを対象とします。

デプロイオプションの設定 - リージョンの指定

上記のように東京リージョンでのデプロイが一番最初に実行されるようにするため、リージョンの同時実行は 順次 を選択します。

デプロイオプションの設定 - デプロイオプション

IAM ロールを作成するため、AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。 にチェックを入れてデプロイを実行します。

レビュー - 機能

StackSets のデプロイが完了したら、ターゲットアカウントのスタックを確認してみます。
リソースとして IAMロール、Config ルール、自動修復設定が作成されていることが確認できました。

ターゲットアカウントの作成リソース確認

動作確認

デフォルトセキュリティグループのルールが自動的に削除されているかを確認してみます。
StackSets デプロイ前に確認したセキュリティグループのルールを見てみます。

ルール自動削除後のインバウンドルール

ルール自動削除後のアウトバウンドルール

インバウンドルール、アウトバウンドルールともに自動的にルールが削除されていることが確認できました。

新規 VPC 作成時に作成されるデフォルトセキュリティグループの場合でも検知して、自動的に削除されることを確認します。
次は Config ルールの動きと合わせて確認をしてみます。

Config の管理画面から CloudFormation によって展開された Config ルールの詳細画面を開きます。

Config ルールの詳細

新規 VPC 作成前はルールに非準拠のデフォルトセキュリティグループがないため「評価結果がありません」と表示されています。

Config ルールの詳細 - 対象範囲内のリソース

VPC を新規作成してみます。
新規作成した VPC に関連付いたデフォルトセキュリティグループも作成され、インバウンドルールおよびアウトバウンドルールが設定されている状態です。

VPC 新規作成
VPC 作成直後のインバウンドルール
VPC 作成直後のアウトバウンドルール

Config ルールの状態を確認すると、新規作成されたデフォルトセキュリティグループのコンプライアンスが 非準拠 となっています。

Config ルールのステータス①

ほどなくして自動修復アクションが開始待ちの状態となります。

Config ルールのステータス②

自動修復アクションが開始され、正常に実行されました。

Config ルールのステータス③

自動修復アクションが実行され、インバウンドルールおよびアウトバウンドルールが削除されたことでコンプライアンスが 準拠 に変更されます。

Config ルールのステータス④
ルール自動削除後のインバウンドルール
ルール自動削除後のアウトバウンドルール

VPC 新規作成時にもデフォルトセキュリティグループのルールが自動無効化されることが確認できました。

おわりに

今回は Config ルールの展開を CloudFormation StackSets で行いましたが、Organizations 環境に対して Config ルールを設定するやり方もありそうです。

docs.aws.amazon.com

この記事がどなたかのお役に立てば嬉しいです。

脇江 凜 (記事一覧)

エンタープライズクラウド部クラウドリライアビリティ課

猫が好きです。