はじめに
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テンプレートを公開しています。
このCloudFormationテンプレートの実行はこちらから。
モニタリングと通知の設定
CIS AWS Foundations Benchmark の第3章には、AWSリソースの モニタリング とその 通知 を定めた、以下のガイドライン項目が存在します。
No. | ルール |
---|---|
3.1 | 不正な API 呼び出し に対してログメトリクスフィルタとアラームが存在することを確認します |
3.2 | MFA なし の AWS マネジメントコンソール サインイン に対してログメトリクスフィルタとアラームが存在することを確認します |
3.3 | 「ルート」アカウントに対してログメトリクスフィルタとアラームが存在することを確認します |
3.4 | MFA なし の IAM ポリシーの変更 に対してログメトリクスフィルタとアラームが存在することを確認します |
3.5 | MFA なし の CloudTrail 設定の変更 に対してログメトリクスフィルタとアラームが存在することを確認します |
3.6 | AWS マネジメントコンソール 認証の失敗 に対してログメトリクスフィルタとアラームが存在することを確認します |
3.7 | カスタマー作成の CMK の無効化またはスケジュールされた削除 に対してログメトリクスフィルタとアラームが存在することを確認します |
3.8 | S3 バケットの変更 に対してログメトリクスフィルタとアラームが存在することを確認します |
3.9 | AWS Config 設定の変更 に対してログメトリクスフィルタとアラームが存在することを確認します |
3.10 | セキュリティグループの変更 に対するメトリクスフィルタとアラームが存在することを確認します |
3.11 | ネットワークアクセスコントロールリスト (NACL) への変更 に対するログメトリクスとアラームが存在することを確認します |
3.12 | ネットワークゲートウェイへの変更 に対するログメトリクスとアラームが存在することを確認します |
3.13 | ルートテーブルの変更 に対してログメトリクスフィルタとアラームが存在することを確認します |
3.14 | VPC の変更 に対してログメトリクスフィルタとアラームが存在することを確認します |
これらのガイドラインに準拠するためには、 まず CloudTrailを有効化 した上で、このログを CloudWatch Logs上に出力 します。また、Amazon CloudWatch MetricFilter
を用いてログの中から上記項目に該当するデータのみを抽出して メトリクスを作成 します。 メトリクスのデータが Amazon CloudWatch Alarm
で設定した閾値を超えると、Amazon SNS
を経由してその情報がユーザに通知されます。
AWS CloudTrail
CloudTrail
を有効化して、このログを CloudWatch Logs
に出力します。「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート - ①サービスの有効化も合わせてご覧ください。
IAMロールの作成
AWS CloudTrail
で使用する IAM Role
を作成します。
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
を有効化します。
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
KMSKeyId: !GetAtt KMSKey.Arn
S3BucketName: !Ref S3ForCloudTrail
TrailName: DefaultSecuritySettings
CloudWatch Logs のロググループを作成
イベントログファイルを蓄積するために使用する、ロググループを作成します。
Resources:
CloudWatchLogsGroupForCloudTrail:
Type: 'AWS::Logs::LogGroup'
Properties:
LogGroupName: /aws/cloudtrail/DefaultSecuritySettings
RetentionInDays: 365
Amazon CloudWatch
CloudTrailのログから Amazon CloudWatch MetricFilter
を用いて該当するデータのみを抽出し、 メトリクスを作成します。 メトリクスのデータが Amazon CloudWatch Alarm
で設定した閾値を超えると、Amazon SNS
を経由してその情報がユーザに通知されます。
3.1 不正な API 呼び出しに対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailUnauthorizedAPICalls:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.errorCode="*UnauthorizedOperation") || ($.errorCode="AccessDenied*")}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: UnauthorizedAPICalls
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailUnauthorizedAPICalls:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *不正なAPIコールを検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-Unauthorized-API-Calls'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: UnauthorizedAPICalls
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.2 MFA なしのAWS マネジメントコンソールサインインに対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailLoginWithoutMFA:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName="ConsoleLogin") && ($.additionalEventData.MFAUsed !="Yes")}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: LoginWithoutMFA
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailLoginWithoutMFA:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *MFAなしのログインを検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-Login-Without-MFA'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: LoginWithoutMFA
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.3 「ルート」アカウントに対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailForRootAcount:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{$.userIdentity.type="Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType !="AwsServiceEvent"}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: ForRootAcount
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailForRootAcount:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ルートアカウントに対する変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-For-RootAcount'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: ForRootAcount
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.4 IAM ポリシーの変更に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailIamPolicyChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=DeleteGroupPolicy) || ($.eventName=DeleteRolePolicy) || ($.eventName=DeleteUserPolicy) || ($.eventName=PutGroupPolicy) || ($.eventName=PutRolePolicy) || ($.eventName=PutUserPolicy) || ($.eventName=CreatePolicy) || ($.eventName=DeletePolicy) || ($.eventName=CreatePolicyVersion) || ($.eventName=DeletePolicyVersion) || ($.eventName=AttachRolePolicy) || ($.eventName=DetachRolePolicy) || ($.eventName=AttachUserPolicy) || ($.eventName=DetachUserPolicy) || ($.eventName=AttachGroupPolicy) || ($.eventName=DetachGroupPolicy)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: IamPolicyChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailIamPolicyChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *IAMポリシーの変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-IamPolicy-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: IamPolicyChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.5 CloudTrail設定の変更に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailCloudTrailConfigurationChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateTrail) || ($.eventName=UpdateTrail) || ($.eventName=DeleteTrail) || ($.eventName=StartLogging) || ($.eventName=StopLogging)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: CloudTrailConfigurationChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailCloudTrailConfigurationChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *CloudTrailの設定変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-CloudTrailConfiguration-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: CloudTrailConfigurationChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.6 AWS マネジメントコンソール 認証の失敗 に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailAuthenticationFailuresDetected:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=ConsoleLogin) && ($.errorMessage="Failed authentication")}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: AuthenticationFailuresDetected
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailAuthenticationFailuresDetected:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ログイン認証失敗を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-AuthenticationFailures-Detected'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: AuthenticationFailuresDetected
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.7 カスタマー作成のCMK の無効化またはスケジュールされた削除に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailCustomerCreatedCMKsChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventSource=kms.amazonaws.com) && (($.eventName=DisableKey) || ($.eventName=ScheduleKeyDeletion))}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: CustomerCreatedCMKsChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailCustomerCreatedCMKsChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *カスタマー作成CMKの無効化もしくは削除を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-CustomerCreatedCMKs-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: CustomerCreatedCMKsChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.8 S3 バケットの変更に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailS3BucketPolicyChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventSource=s3.amazonaws.com) && (($.eventName=PutBucketAcl) || ($.eventName=PutBucketPolicy) || ($.eventName=PutBucketCors) || ($.eventName=PutBucketLifecycle) || ($.eventName=PutBucketReplication) || ($.eventName=DeleteBucketPolicy) || ($.eventName=DeleteBucketCors) || ($.eventName=DeleteBucketLifecycle) || ($.eventName=DeleteBucketReplication))}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: S3BucketPolicyChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailS3BucketPolicyChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *S3のバケットポリシーの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-S3BucketPolicy-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: S3BucketPolicyChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.9 AWS Config 設定の変更に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailConfigConfigurationChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventSource=config.amazonaws.com) && (($.eventName=StopConfigurationRecorder) || ($.eventName=DeleteDeliveryChannel) || ($.eventName=PutDeliveryChannel) || ($.eventName=PutConfigurationRecorder))}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: ConfigConfigurationChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailConfigConfigurationChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *Configの設定変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-ConfigConfiguration-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: ConfigConfigurationChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.10 セキュリティグループの変更に対するメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailSecurityGroupChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=AuthorizeSecurityGroupIngress) || ($.eventName=AuthorizeSecurityGroupEgress) || ($.eventName=RevokeSecurityGroupIngress) || ($.eventName=RevokeSecurityGroupEgress) || ($.eventName=CreateSecurityGroup) || ($.eventName=DeleteSecurityGroup)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: SecurityGroupChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailSecurityGroupChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *セキュリティグループの変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-SecurityGroup-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: SecurityGroupChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.11 ネットワークアクセスコントロールリスト (NACL) への変更に対するログメトリクスとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailNACLChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateNetworkAcl) || ($.eventName=CreateNetworkAclEntry) || ($.eventName=DeleteNetworkAcl) || ($.eventName=DeleteNetworkAclEntry) || ($.eventName=ReplaceNetworkAclEntry) || ($.eventName=ReplaceNetworkAclAssociation)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: NACLChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailNACLChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *NACLの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-NACL-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: NACLChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.12 ネットワークゲートウェイへの変更に対するログメトリクスとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailNetworkGatewayChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateCustomerGateway) || ($.eventName=DeleteCustomerGateway) || ($.eventName=AttachInternetGateway) || ($.eventName=CreateInternetGateway) || ($.eventName=DeleteInternetGateway) || ($.eventName=DetachInternetGateway)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: NetworkGatewayChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailNetworkGatewayChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ネットワークゲートウェイの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-NetworkGateway-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: NetworkGatewayChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.13 ルートテーブルの変更に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailRouteTableChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateRoute) || ($.eventName=CreateRouteTable) || ($.eventName=ReplaceRoute) || ($.eventName=ReplaceRouteTableAssociation) || ($.eventName=DeleteRouteTable) || ($.eventName=DeleteRoute) || ($.eventName=DisassociateRouteTable)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: RouteTableChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailRouteTableChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ルートテーブルの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-RouteTable-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: RouteTableChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
3.14 VPC の変更に対してログメトリクスフィルタとアラームが存在することを確認します
Resources:
CloudWatchLogsMetricFilterCloudTrailVpcChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateVpc) || ($.eventName=DeleteVpc) || ($.eventName=ModifyVpcAttribute) || ($.eventName=AcceptVpcPeeringConnection) || ($.eventName=CreateVpcPeeringConnection) || ($.eventName=DeleteVpcPeeringConnection) || ($.eventName=RejectVpcPeeringConnection) || ($.eventName=AttachClassicLinkVpc) || ($.eventName=DetachClassicLinkVpc) || ($.eventName=DisableVpcClassicLink) || ($.eventName=EnableVpcClassicLink)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: VpcChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailVpcChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *VPCの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-Vpc-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: VpcChanges
Namespace: LogMetrics
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
AWS Security Hub
を用いて、CIS AWS Foundations Standard
に対する達成度を確認することができますが、上記の項目をただ Amazon SNS
に送信しただけでは、ガイドライン準拠とは見なされません。ガイドラインに準拠するためには、このAmazon SNSに対する サブスクライバーの登録 が必須となりますので、Eメールや(AWS Chatbotから)Slack等を経由して、上記結果を受信できる環境を整えましょう。
なお、下記のCloudFormationテンプレートを実行することで、上記設定を含む、 AWS IAM Access Analyzer, AWS Security Hub, Amazon Inspector, Amazon GuardDuty, AWS CloudTrail, AWS Config などのサービス全てを有効化することも、今回の設定内容のみを有効化することも可能です。
作成されるAWSサービス | CloudFormationテンプレート |
---|---|
全てのセキュリティサービス | |
今回の設定のみ |
関連リンク
- サービスの有効化 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- パスワードポリシーの自動修復 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- モニタリングと通知の設定 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- アクセスキーのローテーションと削除 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- 全てのVPCでフローログを有効化する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- SSHとRDPのアクセスを制限する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- デフォルトセキュリティグループを無効化する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- S3バケットのサーバサイド暗号化 - セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート