Elastic Auditbeat 로그 수집
이 문서에서는 Amazon S3를 사용하여 Elastic Auditbeat 로그를 Google Security Operations에 수집하는 방법을 설명합니다. 파서는 JSON 로그에서 필드를 추출하고, 이를 통합 데이터 모델 (UDM)로 정규화하고, 호스트 정보, 네트워크 세부정보, 보안 결과 분류와 같은 추가 컨텍스트로 데이터를 보강합니다. event1.action
및 기타 필드를 특정 UDM 메타데이터 이벤트 유형에 매핑하여 다양한 이벤트 유형을 처리하며, 가능한 경우 GENERIC_EVENT
또는 더 구체적인 카테고리가 기본값으로 설정됩니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스입니다.
- Elastic Auditbeat 서버에 대한 권한이 있는 액세스
- Logstash 서버에 대한 액세스 권한
- AWS (S3, Identity and Access Management (IAM))에 대한 권한 있는 액세스
Elastic Auditbeat 기본 요건 가져오기
- Elastic Auditbeat가 서버에 설치 및 구성되어 있는지 확인합니다.
- 전용 서버 또는 Auditbeat와 함께 Logstash를 설치합니다.
- Auditbeat 구성 파일 위치 (일반적으로
/etc/auditbeat/auditbeat.yml
)를 확인합니다.
Google SecOps용 AWS S3 버킷 및 IAM 구성
- 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 참조할 수 있도록 버킷 이름과 리전을 저장합니다 (예:
elastic-auditbeat-logs
). - 이 사용자 가이드(IAM 사용자 만들기)에 따라 사용자를 만듭니다.
- 생성된 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- .CSV 파일 다운로드를 클릭하여 향후 참조할 수 있도록 액세스 키와 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess 정책을 검색합니다.
- 정책을 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
Logstash로 전송하도록 Auditbeat 구성
- Auditbeat 구성 파일
/etc/auditbeat/auditbeat.yml
를 수정합니다. - 기존 출력 구성 (Elasticsearch 등)을 주석 처리합니다.
Logstash 출력 구성을 추가합니다.
# ==================== Outputs ==================== output.logstash: hosts: ["localhost:5044"] # If Logstash is on a different server, use its IP/hostname # hosts: ["logstash-server:5044"] # Optional: Enable load balancing if using multiple Logstash instances loadbalance: true # Optional: Configure bulk settings (default is 2048) bulk_max_size: 2048 # Optional: Configure SSL if needed # ssl.enabled: true # ssl.certificate_authorities: ["/path/to/ca.crt"]
Auditbeat를 다시 시작하여 변경사항을 적용합니다.
sudo systemctl restart auditbeat
Logstash 파이프라인 구성
새 Logstash 파이프라인 구성 파일
/etc/logstash/conf.d/auditbeat-to-s3.conf
을 만듭니다.input { beats { port => 5044 # Optional: Configure SSL # ssl => true # ssl_certificate => "/path/to/server.crt" # ssl_key => "/path/to/server.key" } } filter { # Add any necessary transformations here # The data should remain in raw JSON format for Chronicle parsing # Optional: Add metadata for debugging mutate { add_field => { "[@metadata][pipeline]" => "auditbeat-to-s3" } } } output { s3 { # AWS credentials access_key_id => "YOUR_AWS_ACCESS_KEY_ID" secret_access_key => "YOUR_AWS_SECRET_ACCESS_KEY" # S3 bucket configuration region => "us-east-1" # Replace with your bucket region bucket => "elastic-auditbeat-logs" # Replace with your bucket name # Organize logs by date using Logstash timestamp interpolation prefix => "auditbeat/%{+YYYY}/%{+MM}/%{+dd}/" # File rotation settings size_file => 10485760 # 10MB files time_file => 5 # Rotate every 5 minutes # Compression for cost optimization encoding => "gzip" # Output format - keep as JSON for Chronicle codec => "json_lines" # Optional: Server-side encryption # server_side_encryption => true # server_side_encryption_algorithm => "AES256" } # Optional: Keep a local copy for debugging # stdout { # codec => rubydebug # } }
YOUR_AWS_ACCESS_KEY_ID
및YOUR_AWS_SECRET_ACCESS_KEY
를 실제 AWS 사용자 인증 정보로 바꿉니다.- S3 구성과 일치하도록
region
및bucket
값을 업데이트합니다. - Logstash를 시작하거나 다시 시작합니다.
sudo systemctl restart logstash
(선택사항) Google SecOps용 읽기 전용 IAM 사용자 및 키 만들기
- AWS 콘솔 > IAM > 사용자로 이동합니다.
- Add users를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 사용자:
secops-reader
를 입력합니다. - 액세스 유형: 액세스 키 – 프로그래매틱 액세스를 선택합니다.
- 사용자:
- 사용자 만들기를 클릭합니다.
- 최소 읽기 정책 (맞춤) 연결: 사용자 > secops-reader > 권한 > 권한 추가 > 정책 직접 연결 > 정책 만들기
JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::elastic-auditbeat-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::elastic-auditbeat-logs" } ] }
이름 =
secops-reader-policy
정책 만들기 > 검색/선택 > 다음 > 권한 추가를 클릭합니다.
secops-reader
의 액세스 키를 만듭니다(보안 사용자 인증 정보 > 액세스 키).액세스 키 만들기를 클릭합니다.
.CSV
을 다운로드합니다. (이 값은 피드에 붙여넣습니다.)
Elastic Auditbeat 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- + 새 피드 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예:
Elastic Auditbeat Logs
). - 소스 유형으로 Amazon S3 V2를 선택합니다.
- 로그 유형으로 Elastic Audit Beats를 선택합니다.
- 다음을 클릭합니다.
- 다음 입력 파라미터의 값을 지정합니다.
- S3 URI:
s3://elastic-auditbeat-logs/auditbeat/
- 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
- 액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
- 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- S3 URI:
- 다음을 클릭합니다.
- 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 테이블
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
@timestamp |
metadata.event_timestamp |
이벤트 타임스탬프는 @timestamp 필드에서 파싱됩니다. |
agent.id |
observer.asset_id |
'agent_id: '가 앞에 붙습니다. |
agent.type |
observer.application |
관찰자 애플리케이션이 에이전트 유형으로 설정됩니다. |
agent.version |
observer.platform_version |
관찰자 플랫폼 버전이 에이전트 버전으로 설정됩니다. |
client.bytes |
principal.labels |
'Bytes' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
client.ip |
principal.ip |
주 구성원 IP가 클라이언트 IP로 설정됩니다. |
client.packets |
principal.labels |
'Packets' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
client.port |
principal.port |
주 포트가 클라이언트 포트로 설정됩니다. 정수로 변환되었습니다. |
cloud.availability_zone |
principal.cloud.availability_zone |
기본 클라우드 가용성 영역이 클라우드 가용성 영역으로 설정됩니다. |
cloud.instance.id |
principal.resource.id |
주 구성원 리소스 ID가 클라우드 인스턴스 ID로 설정됩니다. |
cloud.machine.type |
principal.resource.resource_subtype |
주 구성원 리소스 하위 유형이 클라우드 머신 유형으로 설정됩니다. |
cloud.region |
principal.cloud.availability_zone |
클라우드 리전이 있으면 가용성 영역이 재정의됩니다. |
destination.bytes |
target.labels |
'Bytes' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
destination.ip |
target.ip |
타겟 IP가 대상 IP로 설정됩니다. |
destination.packets |
target.labels |
'Packets' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
destination.port |
target.port |
타겟 포트가 대상 포트로 설정됩니다. 정수로 변환되었습니다. |
ecs.version |
metadata.product_version |
있는 경우 jsonPayload.@metadata.version 의 값을 재정의합니다. |
event1.category |
security_result.category_details |
모든 값이 category_details에 추가됩니다. |
event1.duration |
network.session_duration.seconds |
정수로 변환되었습니다. |
event1.id |
metadata.product_log_id |
메타데이터 제품 로그 ID가 이벤트 ID로 설정됩니다. |
event1.outcome |
extensions.auth.auth_details |
인증 세부정보가 이벤트 결과로 설정됩니다. |
file.extension |
target.file.mime_type |
타겟 파일 MIME 유형이 파일 확장자로 설정됩니다. |
file.hash.sha1 |
target.file.sha1 |
타겟 파일 SHA-1이 파일 SHA-1 해시로 설정됩니다. |
file.path |
target.file.full_path |
타겟 파일 전체 경로가 경로로 설정됩니다. |
file.size |
target.file.size |
uinteger로 변환되었습니다. |
group.id |
principal.group.product_object_id |
기본 그룹 제품 객체 ID가 그룹 ID로 설정됩니다. |
group.name |
principal.group.group_display_name |
기본 그룹 표시 이름이 그룹 이름으로 설정됩니다. |
host.architecture |
principal.asset.hardware.cpu_platform |
임시 변수 hardware.cpu_platform 에 저장된 후 principal.asset.hardware 에 병합됩니다. |
host.hostname |
principal.hostname |
주 서버 호스트 이름이 호스트 호스트 이름으로 설정됩니다. |
host.id |
principal.asset.asset_id |
'호스트 ID: '가 앞에 붙습니다. |
host.ip |
principal.asset.ip |
모든 값이 기본 애셋 IP에 추가됩니다. |
host.mac |
principal.mac |
대시가 콜론으로 바뀝니다. |
host.name |
principal.hostname , observer.hostname |
있는 경우 host.hostname 의 값을 재정의합니다. |
host.os.kernel |
principal.platform_patch_level |
주요 플랫폼 패치 수준이 호스트 OS 커널로 설정됩니다. |
host.os.version |
principal.platform_version |
기본 플랫폼 버전이 호스트 OS 버전으로 설정됩니다. 임시 변수 host_os_version 에 저장됩니다. |
httpRequest.remoteIp |
target.ip |
이 값이 있고 다른 타겟 IP가 설정되지 않은 경우 이 값이 사용됩니다. |
httpRequest.requestMethod |
network.http.method |
네트워크 HTTP 메서드가 HTTP 요청 메서드로 설정됩니다. |
httpRequest.requestSize |
network.sent_bytes |
uinteger로 변환되었습니다. |
httpRequest.requestUrl |
network.http.referral_url |
네트워크 HTTP 추천 URL이 HTTP 요청 URL로 설정됩니다. |
httpRequest.responseSize |
network.received_bytes |
uinteger로 변환되었습니다. |
httpRequest.serverIp |
principal.ip |
이 값이 있고 다른 주 구성원 IP가 설정되지 않은 경우 이 값이 사용됩니다. |
httpRequest.status |
network.http.response_code |
정수로 변환되었습니다. |
httpRequest.userAgent |
network.http.user_agent |
네트워크 HTTP 사용자 에이전트가 HTTP 요청 사용자 에이전트로 설정됩니다. |
insertId |
network.session_id |
네트워크 세션 ID가 삽입 ID로 설정됩니다. |
jsonPayload.@metadata.beat |
metadata.product_event_type |
메타데이터 제품 이벤트 유형이 메타데이터 비트로 설정됩니다. |
jsonPayload.@metadata.version |
metadata.product_version |
메타데이터 제품 버전이 메타데이터 버전으로 설정됩니다. |
jsonPayload.destination.ip |
target.ip |
이 값이 있고 다른 타겟 IP가 설정되지 않은 경우 이 값이 사용됩니다. |
jsonPayload.destination.port |
target.port |
이 값이 있고 다른 타겟 포트가 설정되지 않은 경우 이 값이 사용됩니다. 정수로 변환되었습니다. |
jsonPayload.event1.category |
security_result.category_details |
모든 값이 category_details에 추가됩니다. |
jsonPayload.file.path |
target.file.full_path |
이 값이 있고 다른 타겟 경로가 설정되지 않은 경우 이 값이 사용됩니다. |
jsonPayload.process.executable |
principal.process.file.full_path , target.process.file.full_path |
다른 값이 없는 경우 주체 및 타겟 프로세스 전체 경로를 모두 설정하는 데 사용됩니다. |
jsonPayload.process.name |
principal.application |
이 값이 있고 다른 주 애플리케이션이 설정되지 않은 경우 이 값이 사용됩니다. |
jsonPayload.process.parent.pid |
principal.process.pid |
이 값이 있고 다른 기본 프로세스 PID가 설정되지 않은 경우 이 값이 사용됩니다. 문자열로 변환되었습니다. |
jsonPayload.process.parent.ppid |
principal.process.parent_process.pid |
이 값이 있고 다른 기본 상위 프로세스 PID가 설정되지 않은 경우 이 값이 사용됩니다. 문자열로 변환되었습니다. |
jsonPayload.process.parent.process.executable |
principal.process.file.full_path |
이 값이 있고 다른 주 프로세스 전체 경로가 설정되지 않은 경우 이 값이 사용됩니다. |
jsonPayload.process.parent.process.exe |
principal.process.file.full_path |
이 값이 있고 다른 주 프로세스 전체 경로가 설정되지 않은 경우 이 값이 사용됩니다. |
jsonPayload.process.parent.process.title |
principal.process.command_line |
이 값이 있고 다른 기본 프로세스 명령줄이 설정되지 않은 경우 이 값이 사용됩니다. |
jsonPayload.process.pid |
target.process.pid |
타겟 프로세스 PID가 JSON 페이로드 프로세스 PID로 설정됩니다. |
jsonPayload.process.title |
target.process.command_line |
타겟 프로세스 명령줄이 JSON 페이로드 프로세스 제목으로 설정됩니다. |
jsonPayload.user.id |
target.user.userid |
이 값이 있고 다른 타겟 사용자 ID가 설정되지 않은 경우 이 값이 사용됩니다. 문자열로 변환되었습니다. |
jsonPayload.user.name |
target.user.user_display_name |
이 값이 있고 다른 대상 사용자 표시 이름이 설정되지 않은 경우 이 값이 사용됩니다. |
msg |
metadata.description |
메타데이터 설명이 메시지로 설정됩니다. |
network.bytes |
network.sent_bytes |
uinteger로 변환되었습니다. |
network.community_id |
network.community_id |
네트워크 커뮤니티 ID는 네트워크 커뮤니티 ID로 설정됩니다. |
network.transport |
network.ip_protocol |
대문자로 변환되었습니다. |
package.description |
security_result.description |
보안 결과 설명이 패키지 설명으로 설정됩니다. |
package.name |
security_result.rule_name |
보안 결과 규칙 이름이 패키지 이름으로 설정됩니다. |
package.reference |
security_result.about.url |
보안 결과 URL이 패키지 참조로 설정됩니다. |
package.size |
security_result.about.file.size |
uinteger로 변환되었습니다. |
package.type |
security_result.about.file.mime_type , security_result.rule_type |
보안 결과 MIME 유형과 규칙 유형이 패키지 유형으로 설정됩니다. |
process.created |
principal.asset.creation_time |
이 값이 있으면 이 값이 사용됩니다. ISO8601로 파싱됩니다. |
process.entity_id |
principal.process.product_specific_process_id |
'Process:'가 앞에 붙습니다. |
process.executable |
principal.process.file.full_path , target.process.file.full_path |
다른 값이 없는 경우 주체 및 타겟 프로세스 전체 경로를 모두 설정하는 데 사용됩니다. |
process.hash.sha1 |
principal.process.file.sha1 |
주 프로세스 SHA-1이 프로세스 SHA-1 해시로 설정됩니다. |
process.name |
principal.application |
이 값이 있고 다른 주 애플리케이션이 설정되지 않은 경우 이 값이 사용됩니다. |
process.pid |
principal.process.pid |
이 값이 있고 다른 기본 프로세스 PID가 설정되지 않은 경우 이 값이 사용됩니다. 문자열로 변환되었습니다. |
process.ppid |
principal.process.parent_process.pid |
이 값이 있고 다른 기본 상위 프로세스 PID가 설정되지 않은 경우 이 값이 사용됩니다. 문자열로 변환되었습니다. |
process.start |
principal.asset.creation_time |
process.created 이 없고 이 필드가 있으면 이 값이 사용됩니다. ISO8601로 파싱됩니다. |
resource.labels.backend_service_name |
target.resource.name |
타겟 리소스 이름이 리소스 백엔드 서비스 이름으로 설정됩니다. |
resource.labels.forwarding_rule_name |
target.resource.attribute.labels |
'전달 규칙 이름' 키가 있는 라벨로 추가되었습니다. |
resource.labels.project_id |
target.resource.product_object_id |
타겟 리소스 제품 객체 ID가 리소스 프로젝트 ID로 설정됩니다. |
resource.labels.target_proxy_name |
target.resource.attribute.labels |
'타겟 프록시 이름' 키가 있는 라벨로 추가됩니다. |
resource.labels.url_map_name |
target.resource.attribute.labels |
'URL 맵 이름' 키가 있는 라벨로 추가되었습니다. |
server.bytes |
intermediary.labels |
'Bytes' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
server.ip |
intermediary.ip |
중개자 IP가 서버 IP로 설정됩니다. |
server.packets |
intermediary.labels |
'Packets' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
server.port |
intermediary.port |
중개 포트가 서버 포트로 설정됩니다. 정수로 변환되었습니다. |
service.type |
target.application |
타겟 애플리케이션이 서비스 유형으로 설정됩니다. |
source.bytes |
src.labels |
'Bytes' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
source.ip |
src.ip |
소스 IP가 소스 IP로 설정됩니다. |
source.packets |
src.labels |
'Packets' 키가 있는 라벨로 추가되었습니다. 문자열로 변환되었습니다. |
source.port |
src.port |
소스 포트가 소스 포트로 설정됩니다. 정수로 변환되었습니다. |
system.audit.host.boottime |
about.asset.last_boot_time |
ISO8601로 파싱됩니다. |
system.audit.host.hostname |
about.hostname |
about 호스트 이름이 시스템 감사 호스트 호스트 이름으로 설정됩니다. |
system.audit.host.id |
principal.user.userid |
주 사용자 ID가 시스템 감사 호스트 ID로 설정됩니다. |
system.audit.host.mac.0 |
about.mac |
MAC 주소 정보는 첫 번째 시스템 감사 호스트 MAC 주소로 설정됩니다. |
trace |
target.process.file.full_path |
이 값이 있고 다른 타겟 프로세스 전체 경로가 설정되지 않은 경우 이 값이 사용됩니다. |
user.effective.id |
target.user.userid |
이 값이 있고 다른 타겟 사용자 ID가 설정되지 않은 경우 이 값이 사용됩니다. |
user.effective.name |
target.user.user_display_name |
이 값이 있고 다른 대상 사용자 표시 이름이 설정되지 않은 경우 이 값이 사용됩니다. |
user.id |
target.user.userid |
이 값이 있고 다른 타겟 사용자 ID가 설정되지 않은 경우 이 값이 사용됩니다. 문자열로 변환되었습니다. |
user.name |
target.user.user_display_name |
이 값이 있고 다른 대상 사용자 표시 이름이 설정되지 않은 경우 이 값이 사용됩니다. |
해당 사항 없음 | metadata.event_type |
처음에는 'GENERIC_EVENT'로 설정합니다. 파서 코드 주석에 설명된 로직에 따라 변경되었습니다. |
해당 사항 없음 | metadata.log_type |
'ELASTIC_AUDITBEAT'으로 설정됩니다. |
해당 사항 없음 | metadata.product_name |
'Auditbeat'으로 설정합니다. |
해당 사항 없음 | metadata.vendor_name |
'탄력적'으로 설정합니다. |
해당 사항 없음 | extensions.auth.type |
USER_LOGIN 및 USER_LOGOUT 이벤트의 경우 'AUTHTYPE_UNSPECIFIED'로 설정됩니다. |
auditd.data.syscall |
metadata.product_event_type |
메타데이터 제품 이벤트 유형이 auditd syscall로 설정됩니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.