AWS CloudTrail(1)CloudTrailの概要

CloudTrailとは

CloudTrailは、AWS アカウントの ガバナンスコンプライアンス運用監査リスク監査を行うためのサービス。AWSマネージメントコンソールやAWS CLI、SDK、APIで実行されたアクションを、ログに記録する。API アクティビティに特化した機能であり、パフォーマンスのモニタリングとシステムの正常性をモニタリングできるCloudWatchとは用途が異なる。

CloudTrailは、AWSアカウントを作成した際に自動的に有効になる。イベントとして記録された証跡と呼ばれるこれらのデータは、過去90日分を表示、検索、ダウンロード、アーカイブ、分析等を行うことができる。

証跡はサーバサイド暗号化を使用してS3バケットへ配信、およびAmazon CloudWatch Logs 、Amazon CloudWatch Eventsなどを用いて配信や分析を行うことができる。ログは、 1時間に複数回、約5分ごとに発行され、イベント発生から15分以内に配信される。CloudTrailには、設定変更などを含む管理イベントと情報の取得などを含むデータイベントの2つの種類のイベントが保存できるが、標準では管理イベントのみが保存される。設定により、S3およびLambdaのデータイベントを証跡に含ませることができる。なお、CloudTrailは全てのリージョンに適用可能であるが、イベントをログに記録するリージョンのみで表示することができる

セキュリティ

以下の手段を用いることで、CloudTrailが生成した証跡を適切に保全し、インシデント発生時のフォレンジックを正常に遂行することができる。

データ保護

  • 診断ログに機密情報が残ることを避けるため、名前フィールドなどに機密情報を載せることはしない

検出

  • 全てのリージョンで証跡を有効化する
  • 証跡を保存するS3バケットは、サーバサード暗号化を行う
  • CloudWatch Logsとの統合を行い、イベントの監視を行う

予防

  • 証跡を保存するS3バケットは、専用のAWSアカウントに保存する
  • 証跡を保存するS3バケットには、最低限のアクセス権限のみ付与する。
  • 証跡を保存するS3バケットに対して、MFA Deleteを有効化する

AWS CloudTrail のセットアップ

CloudRrailはCloudFormationに対応しているため、CloudFormation経由でGuardDutyをセットアップすることができる。

IAM Roleの有効化

CloudTrailにCloudWatch Logsへのアクセス権限を付与する。

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 '${AWS::StackName}-AWSCloudTrailCloudWatchLogsPolicy-${AWS::Region}'
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:PutLogEvents'
                  - 'logs:CreateLogStream'
                Resource:
                  - !GetAtt CloudWatchLogsGroupForCloudTrail.Arn
      RoleName: !Sub '${AWS::StackName}-CloudTrail-${AWS::Region}'

S3バケットの作成

証跡を保存するS3バケットと、CloudTrailからS3バケットへのアクセスを許可する、バケットポリシーを作成する。適切なバケットポリシーを設定しないと、 InsufficientS3BucketPolicyException エラーが発生する。

Resouces:
  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の作成

CloudWatch Logs の Log Group を作成する。

Resources:
  CloudWatchLogsGroupForCloudTrail:
    Type: 'AWS::Logs::LogGroup'
    Properties:
      LogGroupName: !Sub '/aws/cloudtrail/${AWS::StackName}'
      RetentionInDays: 365

CloudTrailの有効化

CloudTrail を有効化する。先ほど作成したS3バケットとCloudWatch Logsを証跡の出力先に指定する。通常は、データイベントの保存は行わないが、以下のテンプレートでは、S3とLambdaのデータイベントも保存している。

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: !Sub ${AWS::StackName}

CloudFormation Launch Stack URL

以下のボタンから上のCloudFormationテンプレートを実行することが可能である。ソースコードは、aws-cloudformation-templates/security – GitHub にて公開。

作成されるAWSサービス CloudFormationテンプレート
セキュリティサービス全般 cloudformation-launch-stack
CloudTrailのみ cloudformation-launch-stack

AWS Config(1)Configの概要

AWS Configとは

AWS Configは、リソースごとの設定項目を生成し、履歴としてこれを保持するため、全ての変更を追跡することが可能で、AWSリソース間の関係と設定の履歴などを確認することができる。

  • リソースの設定が最適であるか
  • 現在のスナップショットの取得
  • リソース設定の取得
  • 設定履歴の取得
  • リソース間の関係の表示
  • 通知

これらの機能を用いて、リソースの管理監査とコンプライアンス設定変更の確認とトラブルシューティングセキュリティ分析などを行うことができる。

設定項目は、S3バケットに蓄積することが可能で、データはJSON形式で、S3に6時間ごとに送信される。また、リソースが変更されたタイミング等で、Amazon SNSを用いてEメール等で通知することも可能である。

AWS Configは、マルチアカウントマルチリージョンの データ集約 に対応しており、複数のアカウントやリージョンの設定、コンプライアンスデータを1つのアカウントに集約することができる。

AWS Configの概念

設定履歴と設定項目、スナップショット、レコーダ

設定履歴は、特定期間の特定リソースに関する設定項目のコレクションである。また、設定項目は、アカウント内のサポートされているAWSリソースの属性(メタデータ、関係、設定、関連イベントなど)を記録したものである。設定スナップショット は、設定項目のコレクションで、記録対象のリソースの全体像を示す。スナップショットは、S3 Bucketに配信が可能。

設定レコーダは、(標準設定では)Configがサポートしている全てのリソースの設定項目の評価と保存を行う。設定レコーダをオフにすると設定変更トリガによる評価は実行されない。一方で、定期実行トリガは引き続き指定した間隔で実行される

設定ストリーム

設定ストリームは、設定項目の自動更新リストで、リソースの作成や変更、削除が行われる度に、Amazon SNSを使用して通知を行うことができる。

ルール

AWS Configでは、望ましい設定をルールとして定めることができ、これに違反しているリソースに対しては、非準拠 のフラグを立てる。ルールは、事前に用意されたマネージドルールのほかに、ユーザが自ら作成したカスタムルールを適用することもできる。これらのルールは、リソースの設定変更時に評価されるのか、それとも定期的に評価されるのかを定義することができる。

AWS Configの仕組み

AWS Configは、サポートされているAWSリソースを検出し、リソースごとに設定項目を生成し、その記録を履歴として保持する。Configはリソースごとに、DescribeもしくはListのAPIコールによって、リソースの全ての変更を追跡する。Configルールを利用することで、定期的にこのルールに照らして、リソースの設定の評価を行うことができる。

また、この設定項目は、S3バケット もしくは Amazon SNS に配信することができる。SNSへ配信時のメッセージタイプは以下の通り。

メッセージタイプ 内容
ComplianceChangeNotification コンプライアンスタイプの変更時
ConfigRulesEvaluationStarted リソースの評価開始時
ConfigurationSnapshotDeliveryStarted スナップショット配信開始時
ConfigurationSnapshotDeliveryCompleted スナップショット配信完了時
ConfigurationSnapshotDeliveryFailed スナップショット配信失敗時
ConfigurationHistoryDeliveryCompleted 設定履歴配信完了時
ConfigurationItemChangeNotification リソース変更時
OversizedConfigurationItemChangeNotification SNSの最大サイズ超過時

AWS Configのセットアップ

AWS ConfigはCloudFormationに対応しているため、CloudFormation経由でConfigをセットアップすることができる。

サービスロールの有効化

以下のサービスロールを有効化することで、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.

Configの有効化

DeliveryChannelConfigurationRecorder を作成する。

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::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig

すでにAWS Configをセットアップ済みの状態で上記テンプレートを実行すると、 the maximum number of delivery channels エラーが発生する。その場合は既存の DeliveryChannel を削除した上で、上記テンプレートを再度実行する。

aws configservice delete-delivery-channel --delivery-channel-name default
aws configservice delete-configuration-recorder --configuration-recorder-name default

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

CloudFormation Launch Stack URL

以下のボタンから上のCloudFormationテンプレートを実行することが可能である。ソースコードは、aws-cloudformation-templates/security – GitHub にて公開。

作成されるAWSサービス CloudFormationテンプレート
セキュリティサービス全般 cloudformation-launch-stack
Configのみ cloudformation-launch-stack

モニタリング

他のAWSサービスを利用して、AWS Configのリソースをモニタリングすることができる。例えば、Amazon SQSAmazon CloudWatch Eventsを利用することで、AWSリソースが作成、変更、削除された際に通知を受け取ることが可能となる。

AWS S3(3)S3の概要

S3 (Simple Storage Service)とは

S3は、どこからの、どのような量のデータ(通常100バケットまで1ファイル5TBまで)でも保存と取得が可能なオブジェクトストレージ。データは3箇所以上のデータセンタへ自動複製され、
99.999999999% の耐久性を提供している。高い耐久性、可用性、スケーラビリティー、数多くのセキュリテイ機能を持つ。AWS AthenaやS3 Selectを用いることで簡単に、S3内のデータに対してビッグデータ解析を行うことが可能で、さまざまな方法でS3へのデータ転送を行うことができる。

S3には、S3 StanderdS3 Standerd(低頻度アクセス)S3(1ゾーン/低頻度アクセス)Amazon Glacierの4つのストレージが用意されている。S3(1ゾーン/低頻度アクセス)は、地震や洪水といった災害によるアベイラビリティーゾーンの物理的な損失時にデータを失う可能性がある。S3 Standerd(低頻度アクセス)とS3(1ゾーン/低頻度アクセス)は、他の手法で復元可能なデータや原本のコピーを保存する目的で使用する。VPCエンドポイントを用いることで、同一リージョンのVPC内からセキュアにファイル転送を行うことが可能である。また、複数の暗号化、監査ログ、バージョニングにも対応している。

S3は、キーバリュー型のストアであるので、フラットな構造であり、ディレクトリや階層構造は存在しない。フォルダやファイル名に相当するのがキーであり、スラッシュ文字によってディレクトリ構造のように見せることができる。

タイプ 堅牢性 備考
Standard 99.999999999% 3箇所以上にデータ複製
Standard(低頻度アクセス) 99.999999999% 安価だが読み出しに課金される
1ゾーン(低頻度アクセス) 99.99% 低い堅牢性。オブジェクト毎に指定可能。
Glacier 99.999999999% 取り出しに時間(3-5時間)とコストを要する

S3は、ファイルを複数のチャンクに分割して並列アップロードを行う、Multipart Uploadに対応している。ファイルサイズが100MBを超える場合は、このMultipart Uploadを使用することが奨励されている。AWS CLIでは、ファイルサイズによって自動判別されてこの機能が利用される。Glacierに格納されたデータの復元時には、迅速(Expedited)(=1-5分)、標準(Standard)(=3-5時間)、大容量(Bulk)(=5-12時間)の3種類が用意され、それぞれ実行単価が異なる。

また、静的なファイルをS3のみでホステイング可能なWEBサイトホスティング機能を有している。独自ドメインの指定クロスドメインCloudFrontとの連携なども可能。

セキュリティ

アクセス管理

S3はデフォルトでは全てプライベートアクセス権限となっている。アクセス権限は、バケットやオブジェクト単位で指定可能である。IAMユーザ単位でS3へのアクセス権限を指定できる「ユーザポリシー」(=IPアドレスも指定可能)、バケット毎にアクセス権限を指定できる「バケットポリシー」(=IPアドレスレンジやMFA等も指定可能)、バケットやオブジェクト単位で指定可能な「ACL」などが存在する。バケットポリシーは、バケットの所有者のみが設定でき、またACLは、バケットACLよりもオブジェクトACLが優先される。

暗号化

サーバサイド暗号化、クライアントサイド暗号化の両方に対応している。デフォルト暗号化を指定することも可能である。

Pre-signed Object URL

一定時間のみアクセスを許可するURLを発行できる。

通知

バケットにイベントが発生した際に、SNS、SQS、Lambdaに対して通知を行うことが可能。

モニタリング

CloudWatchとCloudTrailによるモニタリングが可能。

料金

通常ははストレージおよびデータ転送に掛かるコスト全ては、バケットの所有者が負担する。しかし、リクエスタ支払いバケットに指定した場合は、リクエストおよびバケットからのデータダウンロードに掛かるコストは、 所有者ではなくリクエストを実行したリクエスタが支払う

バージョニング

バージョニングが有効となったオブジェクトに対してDELETE処理を行った場合、全てのバージョンはストレージに残り削除マーカーが付加される。当該オブジェクトをGETしようとすると404 Not Foundが返されるが、オブジェクトバージョンを指定すると当該オブジェクトを取得可能である。

ライフサイクル

ライフサイクルと呼ばれる、オブジェクトに対するアクションルールをXMLにより規定できる。ライフサイクルによって、オブジェクトを異なるストレージクラスに移行したり、オブジェクトを削除したりすることができる。Glacierは削除や上書き、アーカイブリクエスト、復元に対して費用が発生する。ただし90日以上アーカイブされているオブジェクトに対する削除および上書きは無料である。