Kanji
・클라우드 엔지니어 / 프리랜서 ・1993년생 ・에히메현 출신 / 도쿄도 시부야구 거주 ・AWS 경력 5년 프로필 상세
목차
cfn-guard validate \ --rules ~/cis-aws-benchmark-level-1.guard \ --data ./template.yml
다음 CloudFormation 템플릿은 AWS 서비스의 감사 로그 출력을 저장하기 위한 버킷을 생성합니다.
누적된 감사 로그의 소스는 AWS Config, AWS CloudTrail, Amazon GuardDuty, Amazon VPC Flow Logs입니다.
로그 보관 기간은 1년이며, 멀티파트 업로드 및 최신 파일이 아닌 파일의 보관 기간은 7일입니다.
서버 액세스 로그에 대해 별도의 버킷이 생성되며, 이는 감사 로그 버킷의 로그 대상으로 설정됩니다.
Amazon S3 서버 액세스 로깅이 이제 자동 날짜 기반 파티셔닝을 지원합니다 에 설명된 대로 서버 액세스 로그를 날짜별로 파티셔닝할 수 있으므로 S3 이벤트 시간에 경로가 잘립니다.
주석에는 버킷 정책 및 KMS 키 정책 설계 시 참고한 사이트의 URL이 포함되어 있습니다.
참조 문서 중 Condition 필드 aws:SourceArn 및 aws:SourceAccount 는 AWS 계정과 로그 소스의 리소스를 사용했지만 다음 템플릿에서는 생략되었습니다.AWS 서비스 이름은 ’Principal’에 의해 제한되므로 최소한 IAM 사용자 및 역할의 액세스는 거부됩니다.
Condition
aws:SourceArn
aws:SourceAccount
설계 실수로 인해 예상치 못한 AWS 계정에서 로그가 출력될 위험이 있으므로 필요에 따라 ’조건’문을 추가해 주시기 바랍니다.
설계는 주로 CIS 및 CFN_NAG 규칙을 기반으로 합니다.
AWSTemplateFormatVersion: 2010-09-09 Resources: AuditLogBucket01: Type: AWS::S3::Bucket Properties: BucketName: !Sub sample-audit-bucket-${AWS::AccountId}-${AWS::Region} BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: KMSMasterKeyID: !GetAtt AuditLogKey01.Arn SSEAlgorithm: aws:kms OwnershipControls: Rules: - ObjectOwnership: BucketOwnerEnforced LifecycleConfiguration: Rules: - Status: Enabled AbortIncompleteMultipartUpload: DaysAfterInitiation: 7 NoncurrentVersionExpirationInDays: 7 - Status: Enabled ExpirationInDays: 365 Prefix: / PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true VersioningConfiguration: Status: Enabled LoggingConfiguration: DestinationBucketName: !Ref ServerAccessLogBucket01 TargetObjectKeyFormat: PartitionedPrefix: PartitionDateSource: EventTime AuditLogBucketPolicy01: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref AuditLogBucket01 PolicyDocument: Version: 2012-10-17 Statement: # Reference: https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-policy.html - Sid: AWSConfigAclCheck Effect: Allow Principal: Service: config.amazonaws.com Action: - s3:GetBucketAcl Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01} - Sid: AWSConfigWrite Effect: Allow Principal: Service: config.amazonaws.com Action: - s3:PutObject - s3:PutObjectAcl Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01}/* # Reference: https://docs.aws.amazon.com/awscloudtrail/latest/userguide/create-s3-bucket-policy-for-cloudtrail.html - Sid: AWSCloudTrailAclCheck Effect: Allow Principal: Service: cloudtrail.amazonaws.com Action: - s3:GetBucketAcl Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01} - Sid: AWSCloudTrailWrite Effect: Allow Principal: Service: cloudtrail.amazonaws.com Action: - s3:PutObject Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01}/AWSLogs/* Condition: StringEquals: s3:x-amz-acl: bucket-owner-full-control # Reference: https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_exportfindings.html#guardduty_exportfindings-s3-policies - Sid: AllowPutObject Effect: Allow Principal: Service: guardduty.amazonaws.com Action: s3:PutObject Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01}/* - Sid: AllowGetBucketLocation Effect: Allow Principal: Service: guardduty.amazonaws.com Action: s3:GetBucketLocation Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01} # Reference: https://docs.aws.amazon.com/vpc/latest/tgw/flow-logs-s3.html#flow-logs-s3-permissions - Sid: VPCFlowLogsWrite Effect: Allow Principal: Service: delivery.logs.amazonaws.com Action: - s3:PutObject Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01}/* Condition: StringEquals: s3:x-amz-acl: bucket-owner-full-control - Sid: AWSLogDeliveryAclCheck Effect: Allow Principal: Service: delivery.logs.amazonaws.com Action: - s3:GetBucketAcl - s3:ListBucket Resource: !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01} # Reference: https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-5 - Sid: AllowSSLRequestsOnly Effect: Deny Principal: '*' Action: s3:* Resource: - !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01} - !Sub arn:${AWS::Partition}:s3:::${AuditLogBucket01}/* Condition: Bool: aws:SecureTransport: false ServerAccessLogBucket01: Type: AWS::S3::Bucket Metadata: cfn_nag: rules_to_suppress: - id: W35 reason: There is no need to record the server access log bucket itself guard: SuppressedRules: - S3_BUCKET_LOGGING_ENABLED # There is no need to record the server access log bucket itself Properties: BucketName: !Sub sample-server-access-log-bucket-${AWS::AccountId}-${AWS::Region} BucketEncryption: # Since SSE-KMS is not supported, use SSE-S3 # Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 OwnershipControls: Rules: - ObjectOwnership: BucketOwnerEnforced LifecycleConfiguration: Rules: - Status: Enabled AbortIncompleteMultipartUpload: DaysAfterInitiation: 7 NoncurrentVersionExpirationInDays: 7 - Status: Enabled ExpirationInDays: 365 Prefix: / PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true VersioningConfiguration: Status: Enabled ServerAccessLogBucketPolicy01: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref ServerAccessLogBucket01 PolicyDocument: Version: 2012-10-17 Statement: # Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html#grant-log-delivery-permissions-general - Sid: S3ServerAccessLogsPolicy Effect: Allow Principal: Service: logging.s3.amazonaws.com Action: s3:PutObject Resource: !Sub arn:${AWS::Partition}:s3:::${ServerAccessLogBucket01}/* # Reference: https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-5 - Sid: AllowSSLRequestsOnly Effect: Deny Principal: '*' Action: s3:* Resource: - !Sub arn:${AWS::Partition}:s3:::${ServerAccessLogBucket01} - !Sub arn:${AWS::Partition}:s3:::${ServerAccessLogBucket01}/* Condition: Bool: aws:SecureTransport: false AuditLogKey01: Type: AWS::KMS::Key UpdateReplacePolicy: Retain DeletionPolicy: Retain Properties: EnableKeyRotation: true RotationPeriodInDays: 365 KeyPolicy: Version: 2012-10-17 Statement: - Sid: EnableIAMUserPermissions Effect: Allow Principal: AWS: !Ref AWS::AccountId Action: kms:* Resource: '*' # Reference: https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_exportfindings.html - Sid: AllowGuardDutyKey Effect: Allow Principal: Service: guardduty.amazonaws.com Action: kms:GenerateDataKey Resource: '*'
s3:PutObject
s3:GetBucketLocation
AWSTemplateFormatVersion: 2010-09-09 Resources: AthenaBucket01: Type: AWS::S3::Bucket Properties: BucketName: !Sub sample-athena-bucket-${AWS::AccountId}-${AWS::Region} BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 LifecycleConfiguration: Rules: - Status: Enabled ExpirationInDays: 45 Prefix: athena/ - Status: Enabled AbortIncompleteMultipartUpload: DaysAfterInitiation: 7 NoncurrentVersionExpirationInDays: 7 PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true LoggingConfiguration: DestinationBucketName: !Sub sample-server-access-log-bucket-${AWS::AccountId}-${AWS::Region} TargetObjectKeyFormat: PartitionedPrefix: PartitionDateSource: EventTime VersioningConfiguration: Status: Enabled AthenaBucketPolicy01: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref AthenaBucket01 PolicyDocument: Version: 2012-10-17 Statement: - Sid: AllowAthenaGetBucketLocation Effect: Allow Principal: Service: - !Sub athena.${AWS::Region}.amazonaws.com Action: - s3:GetBucketLocation - s3:PutObject Resource: - !Sub arn:${AWS::Partition}:s3:::${AthenaBucket01} - !Sub arn:${AWS::Partition}:s3:::${AthenaBucket01}/* # Reference: https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-5 - Sid: AllowSSLRequestsOnly Effect: Deny Principal: '*' Action: s3:* Resource: - !Sub arn:${AWS::Partition}:s3:::${AthenaBucket01} - !Sub arn:${AWS::Partition}:s3:::${AthenaBucket01}/* Condition: Bool: aws:SecureTransport: false