AWS Security Hub 로그 수집
이 문서에서는 AWS Security Hub 로그를 Google Security Operations로 수집하는 방법을 설명합니다. AWS 보안 허브는 AWS 계정 전반에서 보안 알림 및 발견 항목을 포괄적으로 보여줍니다. 이러한 발견 항목을 Google SecOps로 전송하면 Google SecOps 기능을 사용하여 모니터링 및 위협 감지를 개선할 수 있습니다.
시작하기 전에
- Google SecOps 인스턴스가 있는지 확인합니다.
- AWS에 대한 권한이 있는지 확인합니다.
AWS IAM 및 S3 구성
- 버킷 만들기 사용자 가이드에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 사용할 수 있도록 버킷 이름 및 리전을 저장합니다.
- IAM 사용자 만들기 사용자 가이드에 따라 사용자를 만듭니다.
- 만든 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키 및 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- Attach policies directly(정책 직접 연결)를 선택합니다.
- AmazonS3FullAccess 정책을 검색하여 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
Lambda 함수 만들기
- AWS 관리 콘솔에 로그인합니다.
- Lambda로 이동합니다.
- 함수 만들기를 클릭하고 처음부터 작성을 선택합니다.
- 함수 이름을 지정합니다(예:
SecurityHubToS3
). - 런타임으로 Python 3.x를 선택합니다.
EventBridge에서 발견된 항목을 가져와 S3 버킷에 쓰는 Lambda 코드를 입력합니다.
import json import boto3 from datetime import datetime # Initialize the S3 client s3_client = boto3.client('s3') # S3 bucket where findings will be stored bucket_name = 'aws-security-hub-findings-stream' def lambda_handler(event, context): # Extract Security Hub findings from the event findings = event['detail']['findings'] # Generate a timestamp for the file name to avoid overwriting timestamp = datetime.now().strftime('%Y-%m-%dT%H-%M-%S') # Generate the S3 object key (file name) based on the timestamp object_key = f"security_hub_findings_{timestamp}.json" # Convert findings to JSON format findings_json = json.dumps(findings, indent=4) # Upload the findings to S3 try: response = s3_client.put_object( Bucket=bucket_name, Key=object_key, Body=findings_json, ContentType='application/json' ) print(f"Successfully uploaded findings to S3: {response}") except Exception as e: print(f"Error uploading findings to S3: {e}") raise e return { 'statusCode': 200, 'body': json.dumps('Successfully processed findings') }
다음 정책을 사용하여 람다 함수에 IAM 역할을 추가하여 람다의 권한을 설정합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::aws-security-hub-findings-stream/*" } ] }
EventBridge를 사용하여 결과를 전달하도록 AWS Security Hub 구성
- AWS 관리 콘솔에 로그인합니다.
- 검색창에 Security Hub를 입력하고 서비스 목록에서 선택합니다.
- 설정을 클릭합니다.
- 통합 섹션에서 EventBridge를 찾아 사용 설정을 클릭합니다.
- 검색창에 EventBridge를 입력하고 서비스 목록에서 선택합니다.
- EventBridge 콘솔에서 규칙 > 규칙 만들기를 클릭합니다.
- 다음과 같은 규칙 구성을 제공합니다.
- 규칙 이름: 규칙의 설명이 포함된 이름을 지정합니다(예: SendSecurityHubFindingsToS3).
- 이벤트 소스: AWS 서비스를 선택합니다.
- 서비스 이름: Security Hub를 선택합니다.
- 이벤트 유형: Security Hub Findings(보안 허브 결과)를 선택합니다.
- 타겟 설정: 람다 함수를 선택합니다.
- 방금 만든 람다 함수 (
SecurityHubToS3
)를 선택합니다.
- 만들기를 클릭합니다.
AWS Security Hub 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예: AWS Security Hub 로그).
- 소스 유형으로 Amazon S3를 선택합니다.
- 로그 유형으로 AWS Security Hub를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI입니다.
s3://your-log-bucket-name/
your-log-bucket-name
을 버킷의 실제 이름으로 바꿉니다.
- URI: 디렉터리 또는 하위 디렉터리가 포함된 디렉터리를 선택합니다.
소스 삭제 옵션: 원하는 삭제 옵션을 선택합니다.
액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키입니다.
보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 표
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
account |
principal.group.product_object_id |
문제와 연결된 AWS 계정 ID입니다. |
configurationItem.ARN |
target.resource.id |
구성 항목의 Amazon 리소스 이름 (ARN)입니다. |
configurationItem.awsAccountId |
principal.user.userid |
구성 항목의 AWS 계정 ID입니다. |
configurationItem.awsRegion |
target.asset.location.country_or_region |
구성 항목의 AWS 리전입니다. |
configurationItem.configuration.complianceType |
security_result.summary |
구성 항목의 규정 준수 유형입니다. |
configurationItem.configuration.configRuleList[].complianceType |
security_result.summary |
각 구성 규칙의 규정 준수 상태입니다. |
configurationItem.configuration.configRuleList[].configRuleArn |
security_result.rule_id |
AWS Config 규칙의 ARN입니다. |
configurationItem.configuration.configRuleList[].configRuleId |
security_result.about.labels.configRuleId |
AWS Config 규칙의 ID입니다. |
configurationItem.configuration.configRuleList[].configRuleName |
security_result.rule_name |
AWS Config 규칙의 이름입니다. |
configurationItem.configuration.privateIpAddress |
target.ip |
구성 항목의 비공개 IP 주소입니다. |
configurationItem.configuration.publicIpAddress |
target.ip |
구성 항목의 공개 IP 주소입니다. |
configurationItem.configurationItemCaptureTime |
target.asset.attribute.creation_time |
구성 항목의 캡처 시간으로, 타임스탬프로 변환됩니다. |
configurationItem.configurationItemStatus |
target.asset.attribute.labels.Configuration Item Status |
구성 항목의 상태입니다. |
configurationItem.relationships[].resourceId |
target.asset.attribute.cloud.vpc.id |
관련 리소스의 리소스 ID로, vpc 와 일치하는 경우 VPC ID에 사용됩니다. |
configurationItem.resourceId |
target.resource.id |
구성 항목의 리소스 ID입니다. |
configurationItem.resourceName |
target.resource.name |
리소스 이름입니다. |
configurationItem.resourceType |
target.resource.resource_subtype |
구성 항목의 리소스 유형입니다. |
configurationItem.tags.Contact |
principal.user.user_display_name 또는 principal.user.email_addresses |
태그에서 추출된 연락처 세부정보로, 이메일 및 사용자 이름을 파싱합니다. |
configurationItem.tags.OS /configurationItem.tags.Os |
target.asset.platform_software.platform |
태그의 운영체제입니다. Windows 또는 Linux 인 경우 플랫폼에 매핑됩니다. |
configurationItemDiff.changeType |
metadata.event_type |
변경 유형으로, RESOURCE_WRITTEN 또는 RESOURCE_CREATION에 매핑됩니다. |
detail.accountId |
principal.group.product_object_id |
문제와 연결된 AWS 계정 ID입니다. |
detail.actionDescription detail.actionName detail.description |
sec_result.description |
발견 항목에 대한 설명입니다. |
detail.findings[].AwsAccountId |
principal.group.product_object_id |
문제와 연결된 AWS 계정 ID입니다. |
detail.findings[].CompanyName detail.findings[].CreatedAt detail.findings[].Description |
sec_result.description |
발견 항목에 대한 설명입니다. |
detail.findings[].FindingProviderFields.Severity.Label |
sec_result.severity |
발견 항목의 심각도 라벨로, 대문자로 변환됩니다. |
detail.findings[].FindingProviderFields.Types[] detail.findings[].FirstObservedAt detail.findings[].GeneratorId detail.findings[].Id detail.findings[].LastObservedAt detail.findings[].ProductArn detail.findings[].ProductFields. |
아래를 참조하세요. | 추가 필드, 사용자, 타겟 정보에 사용되는 다양한 필드입니다. |
detail.findings[].ProductName detail.findings[].RecordState detail.findings[].Region |
target.location.name |
발견 항목의 AWS 리전입니다. |
detail.findings[].Resources[].Details. |
아래를 참조하세요. | 발견 항목과 관련된 리소스에 대한 세부정보입니다. |
detail.findings[].Resources[].Id |
target.resource.product_object_id |
리소스의 ID입니다. |
detail.findings[].Resources[].Partition detail.findings[].Resources[].Region |
target.location.name |
리소스의 AWS 리전입니다. |
detail.findings[].Resources[].Tags detail.findings[].Resources[].Type |
target.resource.resource_type , target.resource.resource_subtype , metadata.event_type |
리소스 유형, 하위유형, 이벤트 유형 매핑에 사용되는 리소스 유형입니다. |
detail.findings[].Sample detail.findings[].SchemaVersion detail.findings[].Severity.Label detail.findings[].SourceUrl detail.findings[].Title |
sec_result.summary |
결과의 제목입니다. |
detail.findings[].Types[] detail.findings[].UpdatedAt detail.findings[].Workflow.Status detail.findings[].WorkflowState detail-type |
metadata.product_event_type |
이벤트의 세부정보 유형입니다. |
id |
metadata.product_log_id |
이벤트 ID입니다. |
region |
target.location.name |
이벤트의 AWS 리전입니다. |
resources[] source time version (파서 로직) |
metadata.event_timestamp |
이벤트 타임스탬프로 사용되는 원래 로그 항목의 생성 시간입니다. |
(파서 로직) | metadata.log_type |
AWS_SECURITY_HUB 로 설정합니다. |
(파서 로직) | metadata.product_name |
AWS Security Hub 로 설정합니다. |
(파서 로직) | metadata.vendor_name |
AMAZON 로 설정합니다. |
(파서 로직) | target.asset.attribute.cloud.environment |
AMAZON_WEB_SERVICES 로 설정합니다. |
(파서 로직) | metadata.event_type |
Resources[].Type 또는 configurationItemDiff.changeType 에서 매핑되지 않은 경우 기본값으로 USER_RESOURCE_ACCESS 로 설정합니다. configurationItems 가 있고 다른 이벤트 유형이 설정되지 않은 경우 STATUS_UPDATE 로 설정합니다. configurationItem 또는 configurationItems 이 있고 상태가 OK 또는 ResourceDiscovered 이면 RESOURCE_READ 로 설정합니다. configurationItem 또는 configurationItems 이 있고 상태가 ResourceDeleted 이면 RESOURCE_DELETION 로 설정합니다. |
(파서 로직) | metadata.description |
detail.findings[].ProductFields.aws/guardduty/service/serviceName 가 있는 경우 guardduty 로 설정합니다. |
(파서 로직) | target.asset.attribute.cloud.vpc.resource_type |
configurationItems.relationships[].resourceId 가 vpc 와 일치하면 VPC_NETWORK 로 설정합니다. |
(파서 로직) | target.resource.resource_type |
configurationItem 또는 configurationItems 가 있는 경우 VIRTUAL_MACHINE 로 설정합니다. 다른 리소스 유형이 설정되지 않은 경우 UNSPECIFIED 로 설정합니다. |
(파서 로직) | target.asset.platform_software.platform |
configurationItem 메시지에 Windows 또는 (Linux|LINUX) 가 있는지 여부에 따라 WINDOWS 또는 LINUX 로 설정합니다. configurationItems 의 경우 configItem.tags.OS 또는 configItem.tags.Os 를 기반으로 설정됩니다. |
(파서 로직) | disambiguation_key |
단일 로그 항목에서 여러 이벤트가 생성될 때 추가되었습니다. |
변경사항
2025-02-18
개선사항:
- JSON 로그 형식의 새 배열 지원을 추가했습니다.
2025-01-20
개선사항:
- 새 로그 형식 지원을 추가했습니다.
2025-01-16
개선사항:
- 새 JSON 로그 형식에 대한 지원이 추가되었습니다.
2023-06-20
개선사항:
metadata.event_type
를GENERIC_EVENT
에서USER_RESOURCE_ACCESS
로 수정했습니다.
2023-03-24
개선사항:
detail.findings.0.Resources.0.Type
==AwsEcsTaskDefinition
인 경우 -target.resource.resource_type
를TASK
에 매핑했습니다.event_type
를USER_RESOURCE_ACCESS
에 매핑했습니다.detail.findings.0.ProductFields.Resources:0/Id
를principal.asset_id
에 매핑했습니다.- STATUS_UPDATE가 적절한 파싱 옵션이 아니므로 다른 모든 실패 로그를 GENERIC_EVENT로 파싱했습니다.
2022-08-22
개선사항:
- vendor_name을
AWS SECURITY HUB
에서AMAZON
로 업데이트했습니다. - product_name을
AWS SECURITY HUB
에서AWS Security Hub
로 업데이트했습니다. configurationItem
또는configurationItems
가 포함된 새 JSON 형식 로그를 파싱했습니다.- for 루프를 사용하여 가져오기 파일로 처리된 로그를 분리하고 각각을 개별 이벤트로 파싱하여 처리했습니다.
2022-07-01
- 새로 만든 파서
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가의 답변을 받으세요.