-
Notifications
You must be signed in to change notification settings - Fork 49
/
Copy pathCloudTrail-Template.yaml
214 lines (198 loc) · 6.62 KB
/
CloudTrail-Template.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
AWSTemplateFormatVersion: '2010-09-09'
Description: Deploy The Basic CloudTrail Resources required to monitor the account
Parameters:
pLoggingBucketName:
Description: Name of the Bucket to Create for CloudTrail Logs
Type: String
pCloudTrailLogGroupName:
Type: String
Default: CloudTrail/DefaultLogGroup
pCreateBucket:
Type: String
Description: Boolean to create bucket or use existing one
AllowedValues:
- true
- false
pCreateTopic:
Type: String
Description: Boolean to create topic or use existing one
AllowedValues:
- true
- false
Conditions:
CreateBucket: !Equals [!Ref 'pCreateBucket', 'true']
CreateTopic: !Equals [!Ref 'pCreateTopic', 'true']
Resources:
LoggingS3Bucket:
DeletionPolicy: Retain
Condition: CreateBucket
Type: AWS::S3::Bucket
Properties:
AccessControl: LogDeliveryWrite
BucketName: !Ref 'pLoggingBucketName'
VersioningConfiguration:
Status: Enabled
LoggingBucketPolicy:
Type: AWS::S3::BucketPolicy
# Condition: CreateBucket
Properties:
Bucket: !Ref 'pLoggingBucketName'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: AWSCloudTrailAclCheck
Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action: s3:GetBucketAcl
Resource: !Sub "arn:aws:s3:::${pLoggingBucketName}"
- Sid: AWSCloudTrailWrite
Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action: s3:PutObject
Resource: !Sub "arn:aws:s3:::${pLoggingBucketName}/AWSLogs/*"
Condition:
StringEquals:
s3:x-amz-acl: bucket-owner-full-control
- Sid: DenyDelete
Effect: Deny
Principal: "*"
Action:
- s3:Delete*
- s3:PutBucketPolicy
Resource:
- !Sub "arn:aws:s3:::${pLoggingBucketName}"
- !Sub "arn:aws:s3:::${pLoggingBucketName}/*"
# Define an SNS Topic for Logfile delivery
CloudTrailTopic:
Condition: CreateTopic
Type: AWS::SNS::Topic
Properties:
DisplayName: CloudTrail Notification Topic
CloudTrailTopicPolicy:
Type: AWS::SNS::TopicPolicy
Condition: CreateTopic
Properties:
Topics: [!Ref 'CloudTrailTopic']
PolicyDocument:
Version: '2008-10-17'
Statement:
- Sid: AWSCloudTrailSNSPolicy
Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Resource: '*'
Action: SNS:Publish
# Define an KMS Key to Encrypt the CloudTrail Logs with
CloudTrailKMSKey:
Type: AWS::KMS::Key
Properties:
Description: CloudTrail KMS Key
Enabled: 'true'
EnableKeyRotation: 'true'
KeyPolicy:
Version: '2012-10-17'
Id: key-default-1
Statement:
- Sid: Allow administration of the key
Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: ['kms:Create*', 'kms:Describe*', 'kms:Enable*', 'kms:List*', 'kms:Put*',
'kms:Update*', 'kms:Revoke*', 'kms:Disable*', 'kms:Get*', 'kms:Delete*',
'kms:ScheduleKeyDeletion', 'kms:CancelKeyDeletion']
Resource: '*'
- Sid: Allow use of the key
Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action: ['kms:Encrypt', 'kms:Decrypt', 'kms:ReEncrypt*', 'kms:GenerateDataKey*', 'kms:DescribeKey']
Resource: '*'
- Sid: Allow local use of the key
Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: ['kms:Encrypt', 'kms:Decrypt', 'kms:ReEncrypt*', 'kms:GenerateDataKey*', 'kms:DescribeKey']
Resource: '*'
CloudtrailKMSKeyAlias:
Type: "AWS::KMS::Alias"
Properties:
AliasName: !Sub "alias/${AWS::StackName}KMSKey"
TargetKeyId: !Ref CloudTrailKMSKey
# Define a Log Group to Send the Cloudtrail Events to CloudWatch Logs
CloudTrailToCloudWatchLogsRole:
Type: "AWS::IAM::Role"
Properties:
Path: "/"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Principal:
Service:
- "cloudtrail.amazonaws.com"
Action:
- "sts:AssumeRole"
Policies:
- PolicyName: SendtoCloudWatchLogs
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: AWSCloudTrailCreateLogStream2014110
Effect: Allow
Action: logs:CreateLogStream
Resource: !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:${pCloudTrailLogGroupName}:log-stream:*
- Sid: AWSCloudTrailPutLogEvents20141101
Effect: Allow
Action: logs:PutLogEvents
Resource: !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:${pCloudTrailLogGroupName}:log-stream:*
CloudTrailLogGroup:
Type: "AWS::Logs::LogGroup"
Properties:
LogGroupName: !Ref pCloudTrailLogGroupName
RetentionInDays: 365
# And Define the CloudTrail. Make it Global and for all regions
CloudTrail:
DependsOn:
- LoggingBucketPolicy
# - CloudTrailTopicPolicy
# - Fn::If:
# - CreateTopic
# - CloudTrailTopicPolicy
# - !Ref AWS::NoValue
Type: AWS::CloudTrail::Trail
Properties:
S3BucketName: !Ref 'pLoggingBucketName'
SnsTopicName:
Fn::If:
- CreateTopic
- !GetAtt CloudTrailTopic.TopicName
- !Ref AWS::NoValue
IsLogging: true
KMSKeyId: !Ref 'CloudTrailKMSKey'
EnableLogFileValidation: true
IncludeGlobalServiceEvents: true
IsMultiRegionTrail: true
CloudWatchLogsRoleArn: !GetAtt CloudTrailToCloudWatchLogsRole.Arn
CloudWatchLogsLogGroupArn: !GetAtt CloudTrailLogGroup.Arn
Outputs:
CloudTrailTopicArn:
Condition: CreateTopic
Value: !Ref 'CloudTrailTopic'
Description: ARN of the SNS Topic Created
CloudTrailLogGroup:
Value: !Ref pCloudTrailLogGroupName
Description: Location in CloudWatch Logs where the CT Events are sent
CloudTrailLogGroupArn:
Value: !GetAtt CloudTrailLogGroup.Arn
Description: ARN Location in CloudWatch Logs where the CT Events are sent
LogBucket:
Value: !Ref pLoggingBucketName
Description: Bucket Name where CloudTrail and other Logs can be sent.
CloudTrailKMSKeyArn:
Value: !GetAtt CloudTrailKMSKey.Arn
Description: ARN of the KMS Key used to encrypt events
TemplateVersion:
Value: 1.0.3