Help us understand the problem. What is going on with this article?

「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート - ①サービスの有効化

はじめに

AWSにはアカウントやリソースへの脅威検知に対応した、AWS IAM Access Analyzer, AWS Security Hub, Amazon Detective, Amazon Inspector, Amazon GuardDuty, AWS CloudTrail, AWS Config などのサービスが用意されています。

また、AWS Security Hub では、CIS AWS Foundations Standard , Payment Card Industry Data Security Standard , AWS Foundational Security Best Practices Standard などのセキュリティ標準が公開されており、このガイドラインは、AWSアカウントをセキュアに保つために必要なAWSのセキュリティ設定を集めたベストプラクティス集として活用できます。

本記事では、アカウントやリソースへの脅威検知が可能なAWSサービスを有効化するとともに、上記のセキュリティ標準に限りなく準拠することで、セキュアで堅牢なAWSアカウントを実現します。また、これらをお手軽に実現できるCloudFormationテンプレートを公開しています。

TL;DR

以下のCloudFormationテンプレートを実行することで、セキュアで堅牢なAWSアカウントをお手軽に実現します。下にあるボタンをクリックすると、自身のAWSアカウント(Asia Pacific Tokyo - ap-northeast-1)で、このCloudFormationテンプレートを実行することが可能となります。

cloudformation-launch-stack

作成されるAWSリソースとそのアーキテクチャ図はこちら。

このCloudFormationテンプレートは、Nested Stackの構成となっており、下記のAWSサービスを単体で作成することも可能です。

作成されるAWSサービス 個別のCloudFormationテンプレート
AWS IAM Access Analyzer cloudformation-launch-stack
AWS Security Hub cloudformation-launch-stack
Amazon Detective cloudformation-launch-stack
Amazon Inspector cloudformation-launch-stack
Amazon GuardDuty cloudformation-launch-stack
AWS CloudTrail cloudformation-launch-stack
AWS Config cloudformation-launch-stack

セキュリティ標準

このテンプレートは、CIS AWS Foundations, Payment Card Industry Data Security Standard (PCI DSS), AWS Foundational Security Best Practices の以下の項目に準拠します。現時点では全ての項目には対応できていませんが、対応範囲を今後順次増やしていく予定です。

CIS AWS Foundations

No. ルール 実行内容
1.3 90 日間以上使用されていない認証情報は無効にします Config で定期的に確認を行い、非準拠の場合は Lambda で自動的に削除します。
1.4 アクセスキーは 90 日ごとに更新します Config で定期的に確認を行い、非準拠の場合は Lambda で自動的に削除します。
1.5 IAM パスワードポリシーには少なくとも 1 つの大文字が必要です Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
1.6 IAM パスワードポリシーには少なくとも 1 つの小文字が必要です Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
1.7 IAM パスワードポリシーには少なくとも 1 つの記号が必要です Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
1.8 IAM パスワードポリシーには少なくとも 1 つの数字が必要です Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
1.9 IAM パスワードポリシーは 14 文字以上の長さが必要です Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
1.10 IAM パスワードポリシーはパスワードの再使用を禁止しています Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
1.12 ルートアカウントキーが存在しないことを確認します Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
2.1 CloudTrail はすべてのリージョンで有効になっています CloudTrail と関連サービスを有効化します。
2.2 CloudTrail ログファイルの検証は有効になっています CloudTrail と関連サービスを有効化します。
2.3 CloudTrail が記録する S3 バケットはパブリックアクセスできません CloudTrail と関連サービスを有効化します。
2.4 CloudTrail 証跡は Amazon CloudWatch Logs によって統合されています CloudTrail と関連サービスを有効化します。
2.5 すべてのリージョンで AWS Config が有効になっていることを確認します Config と関連サービスを有効化します。
2.6 S3 バケットアクセスログ記録が CloudTrail S3 バケットで有効になっていることを確認します CloudTrail と関連サービスを有効化します。
2.7 CloudTrail ログは保管時に AWS KMS CMK を使用して暗号化されていることを確認します CloudTrail と関連サービスを有効化します。
2.9 すべての VPC で VPC フローログ記録が有効になっていることを確認します Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
3.1 不正な API 呼び出しに対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.2 MFA なしの AWS マネジメントコンソール サインインに対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.3 「ルート」アカウントに対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.4 MFA なしの IAM ポリシーの変更に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.5 MFA なしの CloudTrail 設定の変更に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.6 AWS マネジメントコンソール 認証の失敗に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.7 カスタマー作成の CMK の無効化またはスケジュールされた削除に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.8 S3 バケットの変更に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.9 AWS Config 設定の変更に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.10 セキュリティグループの変更に対するメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.11 ネットワークアクセスコントロールリスト (NACL) への変更に対するログメトリクスとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.12 ネットワークゲートウェイへの変更に対するログメトリクスとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.13 ルートテーブルの変更に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
3.14 VPC の変更に対してログメトリクスフィルタとアラームが存在することを確認します ログメトリクスフィルタとCloudWatchアラームを作成します。
4.1 どのセキュリティグループでも 0.0.0.0/0 からポート 22 への入力を許可しないようにします Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
4.2 どのセキュリティグループでも 0.0.0.0/0 からポート 3389 への入力を許可しないようにします Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
4.3 すべての VPC のデフォルトセキュリティグループがすべてのトラフィックを制限するようにします Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。

Payment Card Industry Data Security Standard (PCI DSS)

No. ルール 実行内容
PCI.CloudTrail.1 CloudTrail ログは、AWS KMS CMK を使用して保存時に暗号化する必要があります CloudTrail と関連サービスを有効化します。
PCI.CloudTrail.2 CloudTrail を有効にする必要があります CloudTrail と関連サービスを有効化します。
PCI.CloudTrail.3 CloudTrail ログファイルの検証を有効にする必要があります CloudTrail と関連サービスを有効化します。
PCI.CloudTrail.4 CloudTrail 証跡は CloudWatch ログと統合する必要があります CloudTrail と関連サービスを有効化します。
PCI.Config.1 AWS Config を有効にする必要があります Config と関連サービスを有効化します。
PCI.CW.1 「root」ユーザーの使用には、ログメトリクスフィルターとアラームが存在する必要があります ログメトリクスフィルタとCloudWatchアラームを作成します。
PCI.EC2.2 VPC のデフォルトのセキュリティグループでは、インバウンドトラフィックとアウトバウンドトラフィックが禁止されます Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
PCI.IAM.1 IAM ルートユーザーアクセスキーが存在してはいけません Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
PCI.S3.4 S3 バケットでは、サーバー側の暗号化を有効にする必要があります Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。

AWS Foundational Security Best Practices

No. ルール 実行内容
CloudTrail.1 CloudTrail を有効にし、少なくとも 1 つのマルチリージョンの証跡で設定する必要があります CloudTrail と関連サービスを有効化します。
CloudTrail.2 CloudTrail は保管時の暗号化を有効にする必要があります CloudTrail と関連サービスを有効化します。
Config.1 AWS Config を有効にする必要があります Config と関連サービスを有効化します。
EC2.2 VPC のデフォルトのセキュリティグループでは、インバウンドトラフィックとアウトバウンドトラフィックが禁止されます Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
GuardDuty.1 GuardDuty を有効にする必要があります GuardDuty と関連サービスを有効化します。
IAM.3 IAM ユーザーのアクセスキーは 90 日ごとに更新する必要があります Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
IAM.4 IAM ルートユーザーアクセスキーが存在してはいけません Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。
S3.4 S3 バケットでは、サーバー側の暗号化を有効にする必要があります Config で定期的に確認を行い、非準拠の場合は SSM Automation で自動修復を行います。

アーキテクチャ

このテンプレートの設定内容は以下の通りです。なお、以下のYAMLコードは、aws-cloudformation-templates/security - GitHubで公開しているCloudFormationテンプレートから、本記事用に一部抜粋したものです。本記事作成用に一部改変を行なっていること、またリポジトリの最新のコードを常に反映している訳ではないことをご了承ください。詳細は、GitHubの当該リポジトリをご覧ください。

IAM Access Analyzer

サービスにリンクされたロールを作成

IAM Access Analyzer で使用する Service-Linked Role を作成します。この Service-Linked Role は、 Amazon EC2, AWS IAM, AWS Key Management Service, AWS Lambda, AWS Organizations, Amazon S3 および Amazon SQS から 情報を取得する権限を IAM Access Analyzer に付与 します。

Resources:
  ServiceLinkedRoleForAccessAnalyzer:
    Type: AWS::IAM::ServiceLinkedRole
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: access-analyzer.amazonaws.com 
      Description: A service-linked role required for Access Analyzer to access your resources.

IAM Access Analyzer を有効化

IAM Access Analyzerを有効化します。

Resources:
  AccessAnalyzer:
    DependsOn:
      - ServiceLinkedRoleForAccessAnalyzer
    Type: AWS::AccessAnalyzer::Analyzer
    Properties: 
      Type: ACCOUNT

EventBridge を設定

IAM Access Analyzer から送られたイベントを受信して、 Amazon SNS に送信します。

Resources:
  EventBridgeForAccessAnalyzer:    
    Type: AWS::Events::Rule
    Properties: 
      Description: Rule for AccessAnalyzer.
      EventPattern:
        source:
           - aws.access-analyzer
        detail-type:
           - Access Analyzer Finding
      Name: AccessAnalyzer
      State: ENABLED
      Targets: 
        - Arn: !Ref SnsTopicARN
          Id: SNS

AWS Security Hub

サービスにリンクされたロールを作成

AWS Security Hub で使用する Service-Linked Role を作成します。この Service-Linked Role は、 AWS CloudTrail, AWS Config, Amazon CloudWatch Logs および Amazon SNS から 情報を取得する権限 と、 AWS Config に対して 新たなConfigルールを設定する権限AWS Security Hub に付与 します。

Resources:
  ServiceLinkedRoleForSecurityHub:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: securityhub.amazonaws.com
      Description: A service-linked role required for AWS Security Hub to access your resources.

AWS Security Hub を有効化

AWS Security Hubを有効化します。

Resources:
  SecurityHub:
    DependsOn:
      - ServiceLinkedRoleForSecurityHub
    Type: AWS::SecurityHub::Hub

EventBridge を設定

Security Hub は、すべての結果をイベントとして自動的に EventBridge に送信します。標準では、準拠した項目も含めて全ての検出結果を EventBridge へと送信してしまい、重要な情報が埋もれてしまう可能性があるため、下記では、MEDIUM 以上の深刻度の検出結果のみを Amazon SNS に送信する設定 にしています。

Resources:
  CloudWatchEventsForSecurityHubFindings:
    Type: 'AWS::Events::Rule'
    Properties: 
      Description: Rule for SecurityHub Findings.
      EventPattern:
        source:
          - aws.securityhub
        detail-type: 
          - Security Hub Findings - Imported
        detail:
          findings:
            Compliance:
              Status:
                - FAILED
            Severity:
              Label:
                - CRITICAL
                - HIGH
                - MEDIUM
      Name: SecurityHub-Findings
      State: ENABLED
      Targets:
        - Arn: !Ref SnsTopicARN
          Id: CloudWatchEventsForSecurityHub

Amazon Detective

Amazon Detectiveの有効化

Amazon Detective を有効化します。なお、 Amazon GuardDuty と Amazon Detective を 同時に有効化することはできません 。なぜなら Amazon Detective は、 Amazon GuardDuty を有効化してから48時間が経過している場合のみ有効化できる ためです。

本テンプレートでは、 Amazon Detective をデフォルトで無効化 しています。Amazon GuardDuty を有効化したあとに、Amazon Detective を有効化してください。

Resources:
  Detective:
    Type: 'AWS::Detective::Graph'

Amazon Inspector

サービスにリンクされたロール と IAMロールの作成

Amazon Inspector で使用する Service-Linked RoleIAM Roleを作成します。 IAM Role では、 EventBridgeinspector:StartAssessmentRun 権限を付与します。

Resources:
  ServiceLinkedRoleForInspector:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: inspector.amazonaws.com
      Description: A service-linked role required for Amazon Inspector to access your resources.   
  IAMRoleForInspectorEvents:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: 'sts:AssumeRole'
      Description: A role required for EventBridge to access Inspector.
      Policies:
        - PolicyName: !Sub 'DefaultSecuritySettings-AWSEventsInspectorPolicy-${AWS::Region}'
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'inspector:StartAssessmentRun'
                Resource: '*'
      RoleName: !Sub 'DefaultSecuritySettings-InspectorEvents-${AWS::Region}'

Amazon Inspectorの有効化

Amazon InspectorAssessment TargetAssessment Template を作成します。本テンプレートは、以下の4つの ルールパッケージ に対応します。

なお、AWSが公開しているルールパッケージのURLがリージョンごとに異なることから、本テンプレートは、Amazon Inspector に対応しているリージョンのうち、一部のリージョンのみに対応していることにご注意ください。

Resources:
  InspectorAssessmentTarget:
    DependsOn:
      - ServiceLinkedRoleForInspector
    Type: AWS::Inspector::AssessmentTarget
    Properties:
      AssessmentTargetName: DefaultSecuritySettings-Assessment-Target-All-Instances-All-Rules
  InspectorAssessmentTemplate:
    Type: AWS::Inspector::AssessmentTemplate
    Properties:
      AssessmentTargetArn: !GetAtt InspectorAssessmentTarget.Arn
      DurationInSeconds: 3600
      AssessmentTemplateName: DefaultSecuritySettings-Assessment-Template-Default-All-Rules
      RulesPackageArns:
        # Asia Pacific (Tokyo)リージョンの場合
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-gHP9oWNT
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-YI95DVd7
        - arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-bBUQnxMq

EventBridge を設定

Amazon Inspector は、EventBridgeを用いてAssessment Templateを定期実行することができます。本テンプレートでは毎週月曜日午前9時になると、EventBridgeAmazon Inspectorを定期実行します。

Resources:
  CloudWatchEventsForInspector:
    Type: AWS::Events::Rule
    Properties: 
      Description: !Join
        - ''
        - - Scheduled Inspector Assessment for 
          - !GetAtt InspectorAssessmentTemplate.Arn
          - running every 7 day(s)
      Name: Amazon_Inspector_Assessment
      # Every Monday 9AM
      ScheduleExpression: cron(0 9 ? * 1 *)
      State: ENABLED
      Targets:
        - Arn: !GetAtt InspectorAssessmentTemplate.Arn
          Id: CloudWatchEventsForInspector
          RoleArn: !GetAtt IAMRoleForInspectorEvents.Arn

Amazon GuardDuty

サービスにリンクされたロール の作成

Amazon GuardDuty で使用する Service-Linked Role を作成します。この Service-Linked Role は、 Amazon EC2 および AWS Organizations から 情報を取得する権限を GuardDuty に付与 します。

Resources:
  # Service-linked Role
  ServiceLinkedRoleForGuardDuty:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: guardduty.amazonaws.com
      Description: A service-linked role required for Amazon GuardDuty to access your resources.

Amazon GuardDuty を有効化

Amazon GuardDutyを有効化します。

Resources:
  GuardDutyDetector:
    DependsOn:
      - ServiceLinkedRoleForGuardDuty
    Type: AWS::GuardDuty::Detector
    Properties:
      Enable: true

EventBridge を設定

Amazon GuardDuty から送られたイベントを受信して、 Amazon SNS に送信します。標準では、全ての検出結果を EventBridge へと送信してしまい、重要な情報が埋もれてしまう可能性があるため、下記では、MEDIUM 以上の深刻度の検出結果のみを Amazon SNS に送信する設定 にしています。なお、現時点では、YAML形式のテンプレートの場合に Event Bridge の Numeric Matching が正常に変換されない という問題があるため、これを回避するために一部JSON形式にて記述 を行なっています。

Resources:
  CloudWatchEventsForGuardDuty:
    Type: 'AWS::Events::Rule'
    Properties: 
      Description: Rule for GuardDuty.
      EventPattern: |
        {
           "source": [
              "aws.guardduty"
           ],
           "detail-type": [
              "GuardDuty Finding"
           ],
           "detail": {
              "severity": [
                 { "numeric": [ ">=", 4 ] }
              ]
           }
        }
      Name: GuardDuty
      State: ENABLED
      Targets:
        - Arn: !Ref SnsTopicARN
          Id: CloudWatchEventsForGuardDuty

AWS CloudTrail

IAMロールの作成

AWS CloudTrail で使用する IAM Roleを作成します。この IAM Role は、 CloudWatch Logs へ ログを出力する権限を CloudTrail に付与 します。

Resources:
  IAMRoleForCloudTrail:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action: 'sts:AssumeRole'
      Description: A role required for CloudTrail to access CloudWatch Logs.
      Policies:
        - PolicyName: !Sub 'DefaultSecuritySettings-AWSCloudTrailCloudWatchLogsPolicy-${AWS::Region}'
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:PutLogEvents'
                  - 'logs:CreateLogStream'
                Resource:
                  - !GetAtt CloudWatchLogsGroupForCloudTrail.Arn
      RoleName: !Sub 'DefaultSecuritySettings-CloudTrail-${AWS::Region}'

KMS CMKを作成

CloudTrail Logs を保管する S3バケット を暗号化するための カスタマーマスターキー (CMK)を作成します。以下の例では、このバケットを 復号できるのは、root ユーザのみ です。また、CloudTrail に ログの暗号化の権限とCMK プロパティの記述権限を キーポリシー に記述 しています。

Resources:
  KMSKey:
    Condition: CreateCentralizedResources
    Type: AWS::KMS::Key
    Properties: 
      Description: Encrypt CloudTrail Logs
      Enabled: true
      EnableKeyRotation: true
      KeyPolicy: 
        Version: 2012-10-17
        Id: DefaultKeyPolicy
        Statement:
          - Sid: Enable IAM User Permissions
            Effect: Allow
            Principal:
              AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
            Action: 'kms:*'
            Resource: '*'
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 'kms:GenerateDataKey*'
            Resource:
              - '*'
            Condition:
              StringLike:
                kms:EncryptionContext:aws:cloudtrail:arn:
                  - !Sub arn:aws:cloudtrail:*:${AWS::AccountId}:trail/*
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 'kms:DescribeKey'
            Resource:
              - '*'
      KeyUsage: ENCRYPT_DECRYPT
      PendingWindowInDays: 30
      Tags: 
        - Key: !Ref TagKey
          Value: !Ref TagValue

AWS CloudTrail を有効化

AWS CloudTrailを有効化します。EventSelectorsS3Lambdaデータイベントの取得設定 も行なっています。

Resources:
  CloudTrail:
    DependsOn:
      - S3BucketPolicyForCloudTrail
    Condition: CreateCentralizedResources
    Type: AWS::CloudTrail::Trail
    Properties:
      CloudWatchLogsLogGroupArn: !GetAtt CloudWatchLogsGroupForCloudTrail.Arn
      CloudWatchLogsRoleArn: !GetAtt IAMRoleForCloudTrail.Arn
      EnableLogFileValidation: true
      EventSelectors:
        - DataResources: 
            # All S3 buckets
            - Type: AWS::S3::Object
              Values: 
                - arn:aws:s3
            # All Lambda functions.
            - Type: AWS::Lambda::Function
              Values: 
                - arn:aws:lambda
      IncludeGlobalServiceEvents: true
      IsLogging: true
      IsMultiRegionTrail: true
      S3BucketName: !Ref S3ForCloudTrail
      SnsTopicName: !Ref SnsTopicName
      TrailName: DefaultSecuritySettings

Amazon S3 バケットを作成

イベントログファイルを蓄積するために使用する、Amazon S3 バケットと、それに紐づくバケットポリシーを作成します。

Resources:
  S3ForCloudTrail:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Retain
    Properties:
      BucketEncryption:
        ServerSideEncryptionConfiguration: 
          - ServerSideEncryptionByDefault: 
              SSEAlgorithm: aws:kms
      BucketName: !Sub defaultsecuritysettings-cloudtrail-${AWS::Region}-${AWS::AccountId}
      LifecycleConfiguration:
        Rules:
          - Id: ExpirationInDays
            ExpirationInDays: 60
            Status: Enabled
      LoggingConfiguration:
        DestinationBucketName: !Ref LogBacketName
        LogFilePrefix: CloudTrail/
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  S3BucketPolicyForCloudTrail:
    Type: AWS::S3::BucketPolicy
    Properties: 
      Bucket: !Ref S3ForCloudTrail
      PolicyDocument:
        Version: 2012-10-17
        Id: !Ref S3ForCloudTrail
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 's3:GetBucketAcl'
            Resource:
              - !GetAtt S3ForCloudTrail.Arn
          - Effect: Allow
            Principal:
              Service: cloudtrail.amazonaws.com
            Action:
              - 's3:PutObject'
            Resource:
              - !Join
                - ''
                - - !GetAtt S3ForCloudTrail.Arn
                  - /AWSLogs/
                  - !Sub ${AWS::AccountId}
                  - /*
            Condition:
              StringEquals:
                s3:x-amz-acl: bucket-owner-full-control

CloudWatch Logs のロググループを作成

イベントログファイルを蓄積するために使用する、ロググループを作成します。

Resources:
  CloudWatchLogsGroupForCloudTrail:
    Type: 'AWS::Logs::LogGroup'
    Properties:
      LogGroupName: /aws/cloudtrail/DefaultSecuritySettings
      RetentionInDays: 365

AWS Config

サービスにリンクされたロールの作成

AWS Config で使用する Service-Linked Role を作成します。この Service-Linked Role は、 AWSリソースへの読み込み権限S3への書き込み権限Config に、また、IAMとSystemManagerへの書き込み権限Config Remediation にそれぞれ付与します。

Resources:
  ServiceLinkedRoleForConfig:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: config.amazonaws.com
      Description: A service-linked role required for AWS Config to access your resources.
  ServiceLinkedRoleForConfigRemediation:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Retain
    Properties: 
      AWSServiceName: remediation.config.amazonaws.com 
      Description: A service-linked role required for AWS Config Remediation to access your resources.

AWS Configの有効化

AWS ConfigDeliveryChannelConfigurationRecorder を作成します。

Resources:
  ConfigDeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      Name: default
      S3BucketName: !Ref S3ForConfig
      SnsTopicARN: !Ref SnsTopicARN
  ConfigConfigurationRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      Name: default
      RecordingGroup:
        AllSupported: true
        IncludeGlobalResourceTypes: true
      RoleARN: !Sub arn:aws:iam::DefaultSecuritySettings:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig

Amazon S3 バケットを作成

設定情報 (履歴ファイルやスナップショット) を保存するために使用する、Amazon S3 バケットと、それに紐づくバケットポリシーを作成します。

Resources:
  S3ForConfig:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub defaultsecuritysettings-config-${AWS::Region}-${AWS::AccountId}
      LifecycleConfiguration:
        Rules:
          - Id: ExpirationInDays
            ExpirationInDays: 60
            Status: Enabled
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  S3BucketPolicyForConfig:
    Type: AWS::S3::BucketPolicy
    Properties: 
      Bucket: !Ref S3ForConfig
      PolicyDocument:
        Version: 2012-10-17
        Id: !Ref S3ForConfig
        Statement:
          - Effect: Allow
            Principal:
              Service: config.amazonaws.com
            Action:
              - 's3:GetBucketAcl'
              - 's3:ListBucket'
            Resource:
              - !GetAtt S3ForConfig.Arn
          - Effect: Allow
            Principal:
              Service: config.amazonaws.com
            Action:
              - 's3:PutObject'
            Resource:
              - !Join
                - ''
                - - !GetAtt S3ForConfig.Arn
                  - /AWSLogs/
                  - !Sub ${AWS::AccountId}
                  - /Config/*
            Condition:
              StringEquals:
                s3:x-amz-acl: bucket-owner-full-control

以上で、AWS Security Hub, Amazon Inspector, Amazon GuardDuty, AWS CloudTrail, AWS Config の5つのサービスを有効化することができました。次回 以降は、CIS AWS Foundations Benchmarkの各項目へ準拠するための設定と、その設定を自動的に作成する CloudFormation テンプレートについて説明します。

関連リンク

  1. サービスの有効化 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
  2. パスワードポリシーの自動修復 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
  3. モニタリングと通知の設定 - セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
  4. アクセスキーのローテーションと削除 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
  5. 全てのVPCでフローログを有効化する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
  6. SSHとRDPのアクセスを制限する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
  7. デフォルトセキュリティグループを無効化する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
  8. S3バケットのサーバサイド暗号化 - セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
eijikominami
小南英司 / 放送&配信エンジニア / 2020 APN AWS Top Engineers / CSM / クラウド界隈で活動してます🌤
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away