はじめに
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
テンプレートを実行することが可能となります。
作成されるAWSリソースとそのアーキテクチャ図はこちら。
このCloudFormation
テンプレートは、Nested Stack
の構成となっており、下記のAWSサービスを単体で作成することも可能です。
作成されるAWSサービス | 個別のCloudFormationテンプレート |
---|---|
AWS IAM Access Analyzer | |
AWS Security Hub | |
Amazon Detective | |
Amazon Inspector | |
Amazon GuardDuty | |
AWS CloudTrail | |
AWS Config |
セキュリティ標準
このテンプレートは、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の当該リポジトリをご覧ください。
- README(EN) - aws-cloudformation-templates/security
- README(JP) - aws-cloudformation-templates/security
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
detail:
status:
- ACTIVE
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
UpdateReplacePolicy: Retain
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 Role
と IAM Role
を作成します。 IAM Role
では、 EventBridge
に inspector:StartAssessmentRun
権限を付与します。
Resources:
ServiceLinkedRoleForInspector:
Type: AWS::IAM::ServiceLinkedRole
UpdateReplacePolicy: Retain
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 Inspector
の Assessment Target
と Assessment Template
を作成します。本テンプレートは、以下の4つの ルールパッケージ に対応します。
- Network Reachability
- Common Vulnerabilities and Exposures
- Center for Internet Security (CIS) Benchmarks
- Security Best Practices for Amazon Inspector
なお、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時になると、EventBridge
がAmazon 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
UpdateReplacePolicy: Retain
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
を有効化します。EventSelectors
で 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
KMSKeyId: !GetAtt KMSKey.Arn
S3BucketName: !Ref S3ForCloudTrail
TrailName: DefaultSecuritySettings
Amazon S3 バケットを作成
イベントログファイルを蓄積するために使用する、Amazon S3
バケットと、それに紐づくバケットポリシーを作成します。
Resources:
S3ForCloudTrail:
Type: 'AWS::S3::Bucket'
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
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
- Effect: Deny
Principal: '*'
Action: 's3:*'
Resource:
- !GetAtt S3ForCloudTrail.Arn
- !Join
- ''
- - !GetAtt S3ForCloudTrail.Arn
- /*
Condition:
Bool:
aws:SecureTransport: false
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
UpdateReplacePolicy: Retain
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
UpdateReplacePolicy: Retain
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 Config
の DeliveryChannel
と ConfigurationRecorder
を作成します。
Resources:
ConfigDeliveryChannel:
Type: AWS::Config::DeliveryChannel
Properties:
Name: default
S3BucketName: !Ref S3ForConfig
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'
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
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
- Effect: Deny
Principal: '*'
Action: 's3:*'
Resource:
- !GetAtt S3ForConfig.Arn
- !Join
- ''
- - !GetAtt S3ForConfig.Arn
- /*
Condition:
Bool:
aws:SecureTransport: false
以上で、AWS Security Hub, Amazon Inspector, Amazon GuardDuty, AWS CloudTrail, AWS Config の5つのサービスを有効化することができました。次回 以降は、CIS AWS Foundations Benchmark
の各項目へ準拠するための設定と、その設定を自動的に作成する CloudFormation
テンプレートについて説明します。
関連リンク
- サービスの有効化 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- パスワードポリシーの自動修復 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- モニタリングと通知の設定 - セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- アクセスキーのローテーションと削除 - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- 全てのVPCでフローログを有効化する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- SSHとRDPのアクセスを制限する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- デフォルトセキュリティグループを無効化する - 「セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート
- S3バケットのサーバサイド暗号化 - セキュアで堅牢なAWSアカウント」を実現する CloudFormationテンプレート