AWS IAM 로그 수집

다음에서 지원:

이 문서에서는 AWS IAM 로그를 Google Security Operations로 수집하는 방법을 설명합니다. 파서는 원시 JSON 형식 로그를 구조화된 통합 데이터 모델 (UDM)로 변환합니다. 사용자 세부정보, 역할 정보, 권한, 타임스탬프와 같은 관련 필드를 추출하여 일관된 보안 분석을 위해 해당 UDM 필드에 매핑합니다.

시작하기 전에

  • Google SecOps 인스턴스가 있는지 확인합니다.
  • AWS에 대한 권한이 있는지 확인합니다.

AWS IAM 및 S3 구성

  1. 버킷 만들기 사용자 가이드에 따라 Amazon S3 버킷을 만듭니다.
  2. 나중에 사용할 수 있도록 버킷 이름리전을 저장합니다.
  3. IAM 사용자 만들기 사용자 가이드에 따라 사용자를 만듭니다.
  4. 만든 사용자를 선택합니다.
  5. 보안 사용자 인증 정보 탭을 선택합니다.
  6. 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
  7. 사용 사례서드 파티 서비스를 선택합니다.
  8. 다음을 클릭합니다.
  9. 선택사항: 설명 태그를 추가합니다.
  10. 액세스 키 만들기를 클릭합니다.
  11. CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키비밀 액세스 키를 저장합니다.
  12. 완료를 클릭합니다.
  13. 권한 탭을 선택합니다.
  14. 권한 정책 섹션에서 권한 추가를 클릭합니다.
  15. 권한 추가를 선택합니다.
  16. Attach policies directly(정책 직접 연결)를 선택합니다.
  17. AmazonS3FullAccess 정책을 검색하여 선택합니다.
  18. 다음을 클릭합니다.
  19. 권한 추가를 클릭합니다.

IAM 로그를 캡처하도록 CloudTrail 구성

  1. AWS 관리 콘솔에 로그인합니다.
  2. 검색창에 CloudTrail을 입력하고 서비스 목록에서 선택합니다.
  3. 트레일 만들기를 클릭합니다.
  4. 트레일 이름을 제공합니다(예: IAMActivityTrail).
    • 모든 지역에 트레일 적용: 를 선택하여 모든 지역에서 활동을 캡처합니다.
    • 저장소 위치: 이전에 만든 S3 버킷을 선택하거나 새 버킷을 만듭니다.
    • S3 버킷: S3 버킷의 이름을 입력합니다(예: iam-logs-bucket).
    • 이전에 만들지 않은 경우 새 IAM 역할 만들기를 선택합니다.
    • 관리 이벤트: 읽기쓰기를 선택하여 IAM 리소스의 읽기 및 쓰기 이벤트를 모두 캡처합니다.
    • 데이터 이벤트: S3 및 Lambda 데이터 이벤트를 사용 설정합니다.
  5. 만들기를 클릭하여 트레일을 만듭니다.

로그를 S3로 내보내도록 CloudTrail 구성

  1. 서비스 > S3로 이동합니다.
  2. CloudTrail 로그가 저장된 S3 버킷을 선택합니다(예: iam-logs-bucket).
  3. CloudTrail에 버킷에 로그를 쓸 수 있는 올바른 권한이 있는지 확인합니다.
  4. 다음 정책이 아직 없는 경우 추가합니다.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "CloudTrailS3Access",
          "Effect": "Allow",
          "Principal": {
            "Service": "cloudtrail.amazonaws.com"
          },
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*"
        }
      ]
    }
    
  5. S3 버킷에서 버전 관리를 사용 설정하여 로그가 여러 버전으로 저장되도록 합니다.

  6. 속성 > 버킷 버전 관리 > 사용 설정으로 이동합니다.

선택사항: 실시간 내보내기를 위해 Lambda 구성

  1. AWS Lambda 콘솔로 이동합니다.
  2. 함수 만들기를 클릭합니다.
  3. 처음부터 작성자를 선택합니다.
  4. 함수 이름을 ExportIAMLogsToS3로 설정합니다.
  5. Python 3.x 런타임을 선택합니다.
  6. 다음 작업에 대한 권한이 있는 함수에 IAM 역할을 할당합니다.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:GetLogEvents",
            "logs:FilterLogEvents",
            "logs:DescribeLogGroups",
            "logs:DescribeLogStreams"
          ],
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject"
          ],
          "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
      ]
    }
    
  7. 다음 Python 코드를 사용하여 IAM 로그를 가져오고 S3에 업로드합니다.

    import boto3
    import gzip
    from io import BytesIO
    
    s3 = boto3.client('s3')
    logs = boto3.client('logs')
    
    def lambda_handler(event, context):
        log_group = event['logGroup']
        log_stream = event['logStream']
    
        log_events = logs.get_log_events(
            logGroupName=log_group,
            logStreamName=log_stream,
            startFromHead=True
        )
    
        log_data = "\n".join([event['message'] for event in log_events['events']])
    
        # Compress and upload to S3
        compressed_data = gzip.compress(log_data.encode('utf-8'))
        s3.put_object(
            Bucket='your-s3-bucket-name',
            Key='iam-logs/{log_stream}.gz',
            Body=compressed_data
        )
    
  • your-s3-bucket-name를 실제 버킷 이름으로 바꿉니다.

CloudWatch 로그용 Lambda 트리거 구성

  1. Lambda Console에서 Designer로 이동합니다.
  2. 트리거 추가 > CloudWatch 로그를 선택합니다.
  3. IAM 로그와 연결된 CloudWatch Logs 로그 그룹(예: /aws/cloudtrail/)을 선택합니다.
  4. 추가를 클릭합니다.

AWS IAM 로그를 수집하도록 Google SecOps에서 피드 구성

  1. SIEM 설정 > 피드로 이동합니다.
  2. 새로 추가를 클릭합니다.
  3. 피드 이름 필드에 피드 이름을 입력합니다(예: AWS IAM 로그).
  4. 소스 유형으로 Amazon S3를 선택합니다.
  5. 로그 유형으로 AWS IAM을 선택합니다.
  6. 다음을 클릭합니다.
  7. 다음 입력 매개변수의 값을 지정합니다.

    • 리전: Amazon S3 버킷이 있는 리전입니다.
    • S3 URI: 버킷 URI입니다.
      • s3://your-log-bucket-name/
        • your-log-bucket-name을 버킷의 실제 이름으로 바꿉니다.
    • URI: 디렉터리 또는 하위 디렉터리가 포함된 디렉터리를 선택합니다.
    • 소스 삭제 옵션: 원하는 삭제 옵션을 선택합니다.

    • 액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키입니다.

    • 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.

    • 애셋 네임스페이스: 애셋 네임스페이스입니다.

    • 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.

  8. 다음을 클릭합니다.

  9. 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.

UDM 매핑 표

로그 필드 UDM 매핑 논리
Arn entity.entity.resource.name USER 및 RESOURCE 항목 유형의 Arn 필드에서 직접 매핑됩니다. GROUP 항목 유형의 경우 Group.Arn에서 매핑됩니다.
AssumeRolePolicyDocument entity.entity.resource.attribute.permissions.name AssumeRolePolicyDocument 필드에서 직접 매핑되지만 RESOURCE 항목 유형에만 적용됩니다.
CreateDate entity.entity.user.attribute.creation_time CreateDate 필드에서 직접 매핑되고 USER 항목 유형의 Chronicle 타임스탬프 형식으로 변환됩니다.
CreateDate entity.entity.resource.attribute.creation_time CreateDate 필드에서 직접 매핑되고 RESOURCE 항목 유형의 Chronicle 타임스탬프 형식으로 변환됩니다.
Group.Arn entity.entity.resource.name GROUP 항목 유형의 Group.Arn 필드에서 직접 매핑됩니다.
Group.CreateDate entity.entity.group.attribute.creation_time Group.CreateDate 필드에서 직접 매핑되고 Chronicle의 타임스탬프 형식으로 변환됩니다.
Group.GroupID entity.entity.group.product_object_id Group.GroupID 필드에서 직접 매핑됩니다.
Group.GroupName entity.entity.group.group_display_name Group.GroupName 필드에서 직접 매핑됩니다.
Group.GroupName entity.entity.group.email_addresses Group.GroupName 필드에서 직접 매핑됩니다.
Group.Path entity.entity.group.attribute.labels.value Group.Path 필드에서 직접 매핑되며 키는 path로 하드코딩됩니다.
IsTruncated entity.entity.group.attribute.labels.value IsTruncated 필드에서 직접 매핑되고 문자열로 변환되며 키는 is_truncated로 하드코딩됩니다.
마커 entity.entity.group.attribute.labels.value Marker 필드에서 직접 매핑되며 키는 marker로 하드코딩됩니다.
PasswordLastUsed entity.entity.user.last_login_time PasswordLastUsed 필드에서 직접 매핑되고 Chronicle의 타임스탬프 형식으로 변환됩니다.
경로 entity.entity.user.attribute.labels.value USER 항목 유형의 Path 필드에서 직접 매핑되며 키는 path로 하드코딩됩니다.
경로 entity.entity.resource.attribute.labels.value RESOURCE 항목 유형의 Path 필드에서 직접 매핑되며 키는 path로 하드코딩됩니다.
PermissionsBoundary.PermissionsBoundaryArn entity.entity.resource.attribute.labels.value PermissionsBoundary.PermissionsBoundaryArn 필드에서 직접 매핑되며 키는 permissions_boundary_arn으로 하드코딩됩니다.
PermissionsBoundary.PermissionsBoundaryType entity.entity.resource.attribute.labels.value PermissionsBoundary.PermissionsBoundaryType 필드에서 직접 매핑되며 키는 permissions_boundary_type으로 하드코딩됩니다.
RoleID entity.entity.resource.product_object_id RoleID 필드에서 직접 매핑됩니다.
RoleLastUsed.LastUsedDate entity.entity.resource.attribute.labels.value RoleLastUsed.LastUsedDate 필드에서 직접 매핑되며 키는 role_last_used_date으로 하드코딩됩니다.
RoleLastUsed.Region entity.entity.location.name RoleLastUsed.Region 필드에서 직접 매핑됩니다.
RoleName entity.entity.resource.attribute.roles.name RoleName 필드에서 직접 매핑됩니다.
Tags.Key entity.entity.user.attribute.labels.key 사용자 속성 내 labels 필드의 키로 사용됩니다.
Tags.Value entity.entity.user.attribute.labels.value 사용자 속성 내 labels 필드의 값으로 사용됩니다.
UserID entity.entity.user.product_object_id UserID 필드에서 직접 매핑됩니다.
사용자 이름 entity.entity.user.userid UserName 필드에서 직접 매핑됩니다.
Users.Arn relations.entity.resource.name 사용자 관계 내 Users.Arn 필드에서 직접 매핑됩니다.
Users.CreateDate relations.entity.user.attribute.creation_time 사용자 관계 내의 Users.CreateDate 필드에서 직접 매핑되고 Chronicle의 타임스탬프 형식으로 변환됩니다.
Users.PasswordLastUsed relations.entity.user.last_login_time 사용자 관계 내의 Users.PasswordLastUsed 필드에서 직접 매핑되고 Chronicle의 타임스탬프 형식으로 변환됩니다.
Users.Path relations.entity.user.attribute.labels.value 사용자 관계 내의 Users.Path 필드에서 직접 매핑되며 키는 path로 하드코딩됩니다.
Users.PermissionsBoundary.PermissionsBoundaryArn relations.entity.resource.attribute.labels.value 사용자 관계 내의 Users.PermissionsBoundary.PermissionsBoundaryArn 필드에서 직접 매핑되며 키는 permissions_boundary_arn로 하드코딩됩니다.
Users.PermissionsBoundary.PermissionsBoundaryType relations.entity.resource.attribute.labels.value 사용자 관계 내의 Users.PermissionsBoundary.PermissionsBoundaryType 필드에서 직접 매핑되며 키는 permissions_boundary_type로 하드코딩됩니다.
Users.UserID relations.entity.user.product_object_id 사용자 관계 내 Users.UserID 필드에서 직접 매핑됩니다.
Users.UserName relations.entity.user.userid 사용자 관계 내 Users.UserName 필드에서 직접 매핑됩니다.
해당 사항 없음 entity.metadata.collected_timestamp 원시 로그의 이벤트 타임스탬프로 채워집니다.
해당 사항 없음 entity.metadata.vendor_name AWS로 하드코딩되었습니다.
해당 사항 없음 entity.metadata.product_name AWS IAM로 하드코딩되었습니다.
해당 사항 없음 entity.metadata.entity_type 특정 필드의 존재 여부에 따라 결정됩니다. UserID가 있는 경우 USER, RoleName가 있는 경우 RESOURCE, Group.GroupName가 있는 경우 GROUP입니다.
해당 사항 없음 entity.entity.resource.resource_subtype USER 및 GROUP 항목 유형의 경우 User로 설정합니다.
해당 사항 없음 entity.entity.resource.resource_type RESOURCE 항목 유형의 경우 ACCESS_POLICY로 설정합니다.
해당 사항 없음 entity.entity.resource.attribute.cloud.environment AMAZON_WEB_SERVICES로 하드코딩되었습니다.
해당 사항 없음 relations.entity_type 그룹 내 사용자 관계에 대해 USER로 하드코딩됩니다.
해당 사항 없음 relations.relationship 그룹 내 사용자 관계에 대해 MEMBER로 하드코딩됩니다.
해당 사항 없음 relations.direction 그룹 내 사용자 관계에 대해 UNIDIRECTIONAL로 하드코딩됩니다.
해당 사항 없음 relations.entity.resource.resource_subtype 그룹 내 사용자 관계에 대해 User로 하드코딩됩니다.

변경사항

2023-12-14

  • 파서를 새로 만들었습니다.

도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가의 답변을 받으세요.