Terraform을 사용하여 다중 지역 키로 CloudTrail 로그 암호화

누가 무엇을, 어디서, 언제 했습니까? AWS Management Console, AWS Command Line Interface, AWS SDK 및 API를 통해 내 AWS 계정에서 AWS CloudTrail이 계정 소유자로서 귀하에게 응답할 수 있는 것입니다. 감사, 보안 모니터링, 운영 문제 해결을 지원하고 AWS 서비스 전반에서 사용자 활동 및 API 사용을 이벤트로 기록합니다. 이러한 이벤트는 AWS CloudTrail 콘솔의 Event History 페이지에서 볼 수 있으며 발생 후 최대 90일 동안 사용할 수 있습니다.

CloudTrail은 세 가지 유형의 이벤트를 기록합니다.

  • Amazon Simple Storage Service(Amazon S3) 버킷 생성 또는 삭제와 같은 리소스에 대한 제어 플레인 작업을 캡처하는 관리 이벤트.

  • Amazon S3 객체 읽기 또는 쓰기와 같은 리소스 내에서 데이터 평면 작업을 캡처하는 데이터 이벤트.

  • 통찰력 이벤트는 과거 API 사용량과 비교하여 AWS 계정의 비정상적인 API 활동을 보여줍니다.

  • 기본적으로 CloudTrail 이벤트 로그 파일은 Amazon S3 서버 측 암호화(SSE)를 사용하여 암호화됩니다. AWS KMS 키로 로그 파일을 암호화하도록 선택할 수도 있습니다. 이전에는 terraform을 사용하여 다중 지역 키를 빌드하는 방법을 살펴보았습니다. 동일한 MRK를 사용하여 CloudTrail 로그 파일을 암호화하고 여기 S3 버킷에 저장합니다.

    리소스: aws_cloudtrail는 계정/조직에 대한 추적을 생성하는 데 사용됩니다.

    resource "aws_cloudtrail" "default" {
      name                          = var.trailName
      s3_bucket_name                = var.trailBucket
      is_organization_trail         = true
      is_multi_region_trail         = true
      include_global_service_events = true
      kms_key_id                    = aws_kms_key.primary.arn
      depends_on = [
        aws_s3_bucket.cloudtrailbucket,
        aws_kms_key.primary
      ]
    }
    


    보시다시피 우리는 다중 지역 및 조직 수준에서 추적을 활성화하고 있으며 단일 지역 및 단일 계정에 대해서도 이를 수행할 수 있습니다.

    CloudTrail이 로그 파일을 작성하려면 S3 버킷이 필요하며 같은 이유로 S3 버킷을 먼저 생성하기 위해 리소스 블록에 추가했습니다depends_on.

    리소스: aws_s3_bucket는 terraform을 사용하여 S3 버킷을 생성하는 데 사용됩니다.

    resource "aws_s3_bucket" "cloudtrailbucket" {
      bucket = var.trailBucket
      depends_on = [
        aws_kms_key.primary
      ]
      force_destroy = true
      server_side_encryption_configuration {
        rule {
          apply_server_side_encryption_by_default {
            kms_master_key_id = aws_kms_key.primary.id
            sse_algorithm     = "aws:kms"
          }
          bucket_key_enabled = "false"
        }
      }
      object_lock_configuration {
        object_lock_enabled = "Enabled"
      }
    
      policy = <<POLICY
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AWSCloudTrailAclCheck",
                "Effect": "Allow",
                "Principal": {
                  "Service": "cloudtrail.amazonaws.com"
                },
                "Action": "s3:GetBucketAcl",
                "Resource": [
                    "arn:aws:s3:::${var.trailBucket}"
                ]
            },
            {
                "Sid": "AWSCloudTrailWriteAccount",
                "Effect": "Allow",
                "Principal": {
                  "Service": "cloudtrail.amazonaws.com"
                },
                "Action": "s3:PutObject",
                "Resource": "arn:aws:s3:::${var.trailBucket}/AWSLogs/${data.aws_caller_identity.current.account_id}/*",
                "Condition": {
                    "StringEquals": {
                        "s3:x-amz-acl": "bucket-owner-full-control",
                        "AWS:SourceArn" : "arn:aws:cloudtrail:ap-southeast-1:${data.aws_caller_identity.current.account_id}:trail/${var.trailName}"
                    }
                }
            },
            {
                "Sid" : "AWSCloudTrailWriteOrganization",
                "Effect" : "Allow",
                "Principal" : {
                    "Service" : "cloudtrail.amazonaws.com"
                },
                "Action" : "s3:PutObject",
                "Resource" : "arn:aws:s3:::${var.trailBucket}/AWSLogs/${data.aws_organizations_organization.myorg.id}/*",
                "Condition" : {
                    "StringEquals" : {
                        "s3:x-amz-acl" : "bucket-owner-full-control",
                        "AWS:SourceArn" : "arn:aws:cloudtrail:ap-southeast-1:${data.aws_caller_identity.current.account_id}:trail/${var.trailName}"
                    }
                }
            }
        ]
    }
    POLICY
    }
    


    버킷 정책에 첫 번째 문을 추가하고 이 버킷에 쓰도록 cloudtrail을 구성하면 CloudTrail 로그가 귀중한 정보를 얻는 데 얼마나 도움이 되는지 확인할 수 있습니다. 아래 스크린샷은 추적을 생성하려고 시도하는 동안 CloudTrail 서비스가 보고한 오류InsufficientS3BucketPolicyException를 보여줍니다.



    또한 CloudTrail은 특정 계정 대신 로그를 암호화하기 위해 KMS 키를 사용하기 위한 명시적 권한이 필요합니다. KMS 키 정책이 CloudTrail에 대해 올바르게 구성되지 않은 경우 CloudTrail은 로그를 전달할 수 없습니다. IAM 전역 조건 키aws:SourceArn는 CloudTrail이 구성 중인 이 특정 조직 추적에 대해서만 KMS 키를 사용하도록 하는 데 도움이 됩니다. 아래 문을 사용하여 이전에 생성한 키에 대한 KMS 정책을 업데이트해야 합니다.

      statement {
        sid       = "Allow CloudTrail to encrypt logs"
        effect    = "Allow"
        actions   = ["kms:GenerateDataKey*"]
        resources = ["*"]
        principals {
          type        = "Service"
          identifiers = ["cloudtrail.amazonaws.com"]
        }
        condition {
          test     = "StringLike"
          variable = "kms:EncryptionContext:aws:cloudtrail:arn"
          values   = ["arn:aws:cloudtrail:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:trail/${var.trailName}"]
        }
        condition {
          test     = "StringEquals"
          variable = "aws:SourceArn"
          values   = ["arn:aws:cloudtrail:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:trail/${var.trailName}"]
        }
      }
    


    위의 모든 구성으로 terraform apply 명령을 실행하면 아래와 같이 추적이 생성됩니다.



    위 설정에 대한 terraform 소스 코드를 찾을 수 있습니다here.

    좋은 웹페이지 즐겨찾기