Config ルールを使ってEBSデフォルト暗号化を自動修復する

2022.02.28

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

はじめに

AWS Configはリソース構成を記録・管理するサービスで、Config ルールでは管理しているリソースの評価ができます。その条件に違反しているリソースは非準拠としてフラグをつけられます。

Config ルールにはこの違反した非準拠のリソースに対して「修復」のアクションを定義でき、想定したリソースの状態へと自動修復する機能があります。

今回は EBSデフォルト暗号化を自動的に有効化する Configルールと自動修復の仕組みを構築してみます。

やってみる

前提としてConfigが既に有効化されていることを確認して下さい。

Config Ruleの作成

「AWS Config > ルール」の画面から「ルールを追加」を選択します。

AWSマネージド型ルールec2-ebs-encryption-by-defaultを選択します。

その他の設定はデフォルトのまま進めます。評価頻度はお好みの時間を選んでください。

あとはそのままルールを作成して下さい。この時点でEBSデフォルト暗号化が有効になっていなければ、非準拠として表示されます。

IAMロールの作成

次に自動修復するための IAMロール を作成します。

「IAM > ロール」の画面から「ロールを追加」を選択します。

信頼されたエンティティの他のAWSのサービスのユースケースに「Systems Manager」を選択してチェックを入れます。

ポリシーは後で追加するので特に設定せず、適当なロール名を入力して作成して下さい。

今回はssm-automation-role-ebs-default-encryptionで作成しました。

作成したロールを開いて、インラインポリシーを追加します。

JSONタブを開いて以下のポリシーを貼り付けます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:EnableEbsEncryptionByDefault",
                "ec2:GetEbsEncryptionByDefault"
            ],
            "Resource": "*"
        }
    ]
}

適当なポリシー名(今回はssm-automation-role-ebs-encryption-policy)をつけて作成して下さい。

SSM Automation(修復アクション)の設定

修復アクション用のロールを作成したので、Config ルールに自動修復の設定を追加していきます。

先ほど作成したルールを開いて、「アクション > 修復の管理」を選択します。

自動修復にチェックして、修復アクションとして AWSConfigRemediation-EnableEbsEncryptionByDefaultのドキュメントを選択します。

パラメータには先ほど作成したIAMロールのArnを入力して下さい。

ここまで入力が終わったら保存しましょう。

確認

設定前には非準拠となっており、EBSデフォルト暗号化が無効化されている状態でした。

修復の設定を追加したあと、画面を更新して確認してみるとステータスに「アクションが正常に実行されました」と表示されます。

このメッセージが出ていれば、自動修復で設定したアクションが実行されているので、EBSデフォルト暗号化が有効化されているはずです。

CloudFormationテンプレート

ここまでの設定をCloudFormationテンプレートにしましたのでご活用ください。Config ルールの評価間隔はデフォルト24時間に設定しています。

AWSTemplateFormatVersion: "2010-09-09"

# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------#
Parameters:
  MaximumExecutionFrequency:
    Description: "Maximum frequency with which AWSConfig performs rule evaluation"
    Type: String
    Default: TwentyFour_Hours
    AllowedValues:
      [One_Hour, Three_Hours, Six_Hours, Twelve_Hours, TwentyFour_Hours]

# ------------------------------------------------------------#
# Resources
# ------------------------------------------------------------#
Resources:
  IamRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ssm-automation-role-ebs-default-encryption-${AWS::Region}
      Description: "role for ssm automation: ebs default encryption"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "ssm.amazonaws.com"
            Action: "sts:AssumeRole"
      Policies:
        - PolicyName: !Sub Ssm-Automation-Policy-PutEncryptionConfiguration-${AWS::Region}
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              Effect: "Allow"
              Action:
                - "ec2:GetEbsEncryptionByDefault"
                - "ec2:EnableEbsEncryptionByDefault"
              Resource: "*"
  ConfigRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: ec2-ebs-encryption-by-default
      Description: "Check that Amazon Elastic Block Store (EBS) encryption is enabled by default. The rule is NON_COMPLIANT if the encryption is not enabled."
      Source:
        Owner: AWS
        SourceIdentifier: EC2_EBS_ENCRYPTION_BY_DEFAULT
      MaximumExecutionFrequency: !Ref MaximumExecutionFrequency

  RemediationConfiguration:
    Type: AWS::Config::RemediationConfiguration
    Properties:
      Automatic: true
      ConfigRuleName: !Ref ConfigRule
      MaximumAutomaticAttempts: 5
      RetryAttemptSeconds: 60
      TargetId: "AWSConfigRemediation-EnableEbsEncryptionByDefault"
      TargetType: "SSM_DOCUMENT"
      TargetVersion: "1"
      Parameters:
        AutomationAssumeRole:
          StaticValue:
            Values:
              - !GetAtt [IamRole, "Arn"]

おわりに

EBSデフォルト暗号化を継続的に有効化するため、Config ルールの自動修復を利用してみました。

StackSetを組み合わせることでリージョン、アカウント単位に展開も可能です。環境に合わせて活用してみて下さい。

Config ルールは評価回数あたり0.001USDとなります。1つのリージョンだけでは些細な金額ですが、例えば[全リージョン×1時間×アカウント数]で利用した場合は結構大きな金額になる可能性もあるので注意しましょう。

料金 - AWS Config | AWS