Akamai WAF 로그 수집
이 문서에서는 Akamai CEF 커넥터와 Bindplane을 사용하여 Akamai WAF 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Bindplane 에이전트 설치를 위한 systemd가 있는 Windows 2016 이상 또는 Linux 호스트
- CPU 코어가 2개 이상이고, RAM이 6GB이며, Akamai CEF 커넥터용 여유 디스크 공간이 2GB인 Linux 서버 (CentOS/RHEL/Ubuntu 권장)
- CEF 커넥터 호스트에 Java 8 (JRE 1.8) 이상 설치
- 프록시 뒤에서 실행하는 경우 Bindplane 에이전트 요구사항에 따라 방화벽 포트가 열려 있고 프록시 허용 목록
*.cloudsecurity.akamaiapis.net및*.luna.akamaiapis.net이 - Akamai Control Center에 대한 액세스 권한
- App & API Protector, Kona Site Defender, Web Application Protector, Bot Manager 또는 Account Protector가 사용 설정된 Akamai 보안 구성
Google SecOps 수집 인증 파일 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 수집 에이전트로 이동합니다.
- 수집 인증 파일을 다운로드합니다. Bindplane이 설치될 시스템에 파일을 안전하게 저장합니다.
Google SecOps 고객 ID 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 프로필로 이동합니다.
- 조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.
Akamai Control Center에서 SIEM 통합 사용 설정
- Akamai Control Center에 로그인합니다.
- 웹 및 데이터 센터 보안에서 보안 구성을 클릭합니다.
- 보안 구성과 SIEM 데이터를 수집할 적절한 버전을 엽니다.
- 고급 설정을 클릭하고 SIEM 통합을 위한 데이터 수집을 펼칩니다.
- 사용을 클릭하여 SIEM을 사용 설정합니다.
- 데이터를 내보낼 보안 정책을 선택합니다.
- 모든 보안 정책: 보안 구성 내에서 하나 이상의 보안 정책을 위반하는 이벤트의 SIEM 데이터를 전송하려면 이 옵션을 선택합니다.
- 특정 보안 정책: 하나 이상의 특정 보안 정책에 관한 데이터를 전송하려면 이 옵션을 선택합니다. 드롭다운 목록에서 적절한 정책을 선택합니다.
- 선택사항: 계정 보호 기능을 사용하고 암호화되지 않은 사용자 이름을 포함하려면 사용자 이름 포함 체크박스를 선택합니다.
- 선택사항: SIEM 이벤트에서 JA4 지문 정보를 수신하려면 JA4 클라이언트 TLS 지문 포함 체크박스를 선택합니다.
- 선택사항: 특정 보호 유형 및 작업에 속하는 이벤트를 제외하려면 예외 추가를 클릭합니다. SIEM에서 수집하지 않으려는 보호 및 관련 작업을 선택합니다. 저장을 클릭합니다.
- 웹 보안 구성 ID 필드의 값을 복사합니다. 나중에 사용할 수 있도록 이 ID를 저장합니다.
- 활성화를 클릭하여 보안 구성 변경사항을 프로덕션 네트워크에 푸시합니다. 네트워크에서 프로덕션을 클릭한 다음 활성화를 클릭합니다.
Akamai Control Center에서 SIEM을 관리할 사용자 설정
- Akamai Control Center의 ACCOUNT ADMIN에서 Identity & access를 클릭합니다.
- 사용자 및 API 클라이언트 탭에서 역할을 할당할 사용자를 찾거나 사용자 만들기 버튼을 클릭합니다.
- 기존 사용자에게 SIEM 역할을 할당하려면 다음 단계를 따르세요.
- 사용자의 계정을 열고 역할 수정 탭을 클릭합니다.
- 적절한 그룹을 찾아 역할 메뉴를 클릭하고 SIEM 관리 역할을 선택합니다.
- 제출을 클릭합니다.
- 새 사용자에게 SIEM 역할을 할당하려면 다음 단계를 따르세요.
- 사용자 만들기를 클릭합니다.
- 사용자의 기본 정보를 입력하고 역할 할당 섹션으로 이동합니다.
- 적절한 그룹을 찾아 역할 메뉴를 클릭하고 SIEM 관리 역할을 선택합니다.
- 저장을 클릭합니다.
Akamai Control Center에서 SIEM API 사용자 인증 정보 프로비저닝
- Akamai 문서의 인증 사용자 인증 정보 만들기 페이지를 참고하세요.
- SIEM을 관리하도록 할당된 사용자에 대해 SIEM API를 프로비저닝하는 단계를 따릅니다.
- 다음 사용자 인증 정보를 복사하여 안전하게 저장합니다.
- Access Token(액세스 토큰)
- 클라이언트 토큰
- 클라이언트 보안 비밀번호
- 기준 URL
Akamai CEF 커넥터 설치
- Linux 서버에서 Akamai GitHub 저장소에서 최신 CEF 커넥터 배포 패키지를 다운로드합니다.
wget또는 SFTP를 사용하여 패키지를 서버로 전송합니다.- 다운로드한 파일의 SHA256 해시를 확인하여 무결성을 보장합니다.
배포 패키지를 추출합니다.
unzip CEFConnector-<version>.zip추출된 디렉터리로 이동합니다.
cd CEFConnector-<version>서비스를 설치하려면 시작 스크립트에 대한 심볼릭 링크를 만드세요.
sudo ln -s /path/to/CEFConnector-<version>/bin/AkamaiCEFConnector.sh /etc/init.d/AkamaiCEFConnector
Akamai CEF 커넥터 구성
CEF 커넥터 설치 내의
config디렉터리로 이동합니다.cd config텍스트 편집기 (예:
nano,vi)를 사용하여CEFConnector.properties파일을 엽니다.sudo nano CEFConnector.properties다음 필수 매개변수를 구성합니다.
# Akamai API Configuration akamai.data.requesturlhost=https://cloudsecurity.akamaiapis.net akamai.data.configs=<YOUR_SECURITY_CONFIG_ID> akamai.data.timebased=false akamai.data.limit=200000 # API Credentials (from Step: Provision SIEM API credentials) akamai.data.accesstoken=<YOUR_ACCESS_TOKEN> akamai.data.clienttoken=<YOUR_CLIENT_TOKEN> akamai.data.clientsecret=<YOUR_CLIENT_SECRET> akamai.data.baseurl=<YOUR_BASE_URL> # CEF Format Configuration akamai.cefformatheader=CEF:0|Akamai|akamai_siem|1.0|eventClassId()|name()|severity() akamai.cefformatextension=act=appliedAction() app=${httpMessage.protocol} c6a2=ipv6src() c6a2Label="Source IPv6 Address" cs1=${attackData.rules} cs1Label="Rules" cs2=${attackData.ruleMessages} cs2Label="Rule Messages" cs3=${attackData.ruleData} cs3Label="Rule Data" cs4=${attackData.ruleSelectors} cs4Label="Rule Selectors" cs5=${attackData.clientReputation} cs5Label="Client Reputation" cs6=${attackData.apiId} cs6Label="API ID" devicePayloadId=${httpMessage.requestId} dhost=${httpMessage.host} dpt=${httpMessage.port} flexString1=${attackData.configId} flexString1Label="Security Config ID" flexString2=${attackData.policyId} flexString2Label="Firewall Policy Id" out=${httpMessage.bytes} request=requestURL() requestMethod=${httpMessage.method} src=${attackData.clientIP} start=${httpMessage.start} AkamaiSiemSlowPostAction=${attackData.slowPostAction} AkamaiSiemSlowPostRate=${attackData.slowPostRate} AkamaiSiemRuleVersions=${attackData.ruleVersions} AkamaiSiemRuleTags=${attackData.ruleTags} AkamaiSiemJA4=${identity.ja4} AkamaiSiemRuleActions=${attackData.ruleActions} # Connector Pull Configuration connector.refresh.period=60 connector.consumer.count=3 connector.retry=5 # Proxy Configuration (if applicable) # connector.proxy.host= # connector.proxy.port=다음 자리표시자를 실제 값으로 바꿉니다.
<YOUR_SECURITY_CONFIG_ID>: 이전에 복사한 웹 보안 구성 ID입니다. 여러 구성의 경우 ID를 세미콜론으로 구분합니다 (예:12345;67890).<YOUR_ACCESS_TOKEN>: Akamai API 사용자 인증 정보의 액세스 토큰<YOUR_CLIENT_TOKEN>: Akamai API 사용자 인증 정보의 클라이언트 토큰<YOUR_CLIENT_SECRET>: Akamai API 사용자 인증 정보의 클라이언트 보안 비밀번호<YOUR_BASE_URL>: Akamai API 사용자 인증 정보의 기본 URL
저장하고 파일을 닫습니다.
CEF 커넥터 로깅 구성
- CEF 커넥터 설치 내의
config디렉터리로 이동합니다. 텍스트 편집기를 사용하여
log4j2.xml파일을 엽니다.sudo nano log4j2.xmlBindplane에 대한 syslog 출력에 대해 다음 매개변수를 구성합니다.
<!-- Syslog Appender Configuration --> <Syslog name="SyslogAppender" host="<BINDPLANE_IP_ADDRESS>" port="<BINDPLANE_PORT>" protocol="<PROTOCOL>" facility="LOCAL0" format="RFC5424"> <PatternLayout pattern="%m%n"/> </Syslog>다음 자리표시자를 바꿉니다.
<BINDPLANE_IP_ADDRESS>: Bindplane 에이전트가 설치된 서버의 IP 주소<BINDPLANE_PORT>: Bindplane 에이전트가 리슨하는 포트 번호입니다 (예: UDP의 경우514, TCP의 경우601).<PROTOCOL>:UDP또는TCP선택
CEF 관련 설정을 구성하여 CEF 커넥터가 원격 syslog 서버 (BindPpane)로 로그를 전송하는지 확인합니다.
# In CEFConnector.properties, ensure these are set: # Note: These settings are typically in log4j2.xml but referenced here for clarity저장하고 파일을 닫습니다.
Akamai CEF 커넥터 시작
CEF 커넥터 서비스를 시작합니다.
sudo /etc/init.d/AkamaiCEFConnector start서비스가 실행 중인지 확인합니다.
sudo /etc/init.d/AkamaiCEFConnector status커넥터가 Akamai에서 이벤트를 가져와 Bindplane으로 전송하는지 로그를 모니터링합니다.
tail -f /path/to/CEFConnector-<version>/bin/logs/cefconnector.log
Bindplane 에이전트 설치
다음 안내에 따라 Windows 또는 Linux 운영체제에 Bindplane 에이전트를 설치합니다.
Windows 설치
- 명령 프롬프트 또는 PowerShell을 관리자로 엽니다.
다음 명령어를 실행합니다.
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux 설치
- 루트 또는 sudo 권한으로 터미널을 엽니다.
다음 명령어를 실행합니다.
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
추가 설치 리소스
- 추가 설치 옵션은 이 설치 가이드를 참고하세요.
Syslog를 수집하여 Google SecOps로 전송하도록 Bindplane 에이전트 구성
구성 파일에 액세스합니다.
config.yaml파일을 찾습니다. 일반적으로 Linux에서는/etc/bindplane-agent/디렉터리에 있고 Windows에서는 설치 디렉터리에 있습니다.- 텍스트 편집기 (예:
nano,vi, 메모장)를 사용하여 파일을 엽니다.
다음과 같이
config.yaml파일을 수정합니다.receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" tcplog: # Alternative TCP receiver if using TCP protocol listen_address: "0.0.0.0:601" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in the Get ingestion authentication file section creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from the Get customer ID section customer_id: <YOUR_CUSTOMER_ID> # Select the appropriate regional endpoint based on where your Google SecOps instance is provisioned # For regional endpoints, see: https://cloud.google.com/chronicle/docs/reference/ingestion-api#regional_endpoints endpoint: malachiteingestion-pa.googleapis.com # Set the log_type to ensure the correct parser is applied log_type: 'AKAMAI_WAF' raw_log_field: body # Add optional ingestion labels for better organization ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog # - tcplog # Uncomment if using TCP exporters: - chronicle/chronicle_w_labels
Bindplane 에이전트를 다시 시작하여 변경사항 적용
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart bindplane-agentWindows에서 Bindplane 에이전트를 다시 시작하려면 서비스 콘솔을 사용하거나 다음 명령어를 입력하면 됩니다.
net stop BindPlaneAgent && net start BindPlaneAgent
로그 수집 확인
- Google SecOps 콘솔에 로그인합니다.
- 검색 또는 원시 로그 스캔으로 이동합니다.
수집 라벨을 사용하여 최근 Akamai WAF 로그를 검색합니다.
metadata.log_type = "AKAMAI_WAF"로그가 예상 필드 및 타임스탬프와 함께 표시되는지 확인합니다.
CEF 형식 필드가 올바르게 파싱되고 UDM에 매핑되는지 확인합니다.
문제 해결
CEF 커넥터 문제
- 이벤트가 가져오지 않음:
cefconnector.log파일에 오류가 있는지 확인합니다. Akamai API 사용자 인증 정보가 올바르고 보안 구성 ID가 유효한지 확인합니다. - 연결 오류: 프록시 설정 (해당하는 경우)이 올바르게 구성되어 있고 필수 도메인이 허용 목록에 추가되어 있는지 확인합니다.
데이터베이스 재설정: 오프셋 추적을 재설정해야 하는 경우 다음을 실행합니다.
sudo /etc/init.d/AkamaiCEFConnector resetdb
Bindplane 에이전트 문제
- 로그가 Bindplane에 도달하지 않음: CEF 커넥터가 올바른 Bindplane IP 주소 및 포트로 syslog를 전송하도록 구성되어 있는지 확인합니다. CEF 커넥터와 Bindplane 에이전트 간의 방화벽 규칙을 확인합니다.
로그가 Google SecOps에 도달하지 않음: Bindplane 구성 파일, 고객 ID, 수집 인증 경로를 확인합니다. Bindplane 로그에서 오류를 확인합니다.
sudo journalctl -u observiq-otel-collector -f
네트워크 및 연결
- CEF 커넥터가 Akamai SIEM API 엔드포인트에 연결할 수 있는지 확인합니다.
- Bindplane 에이전트가 Google SecOps 수집 엔드포인트 (
malachiteingestion-pa.googleapis.com)에 도달할 수 있는지 확인합니다. - 필수 방화벽 포트가 모두 열려 있는지 확인합니다.
이전 보안 이벤트 가져오기
Akamai CEF 커넥터는 두 가지 모드로 작동합니다.
- 오프셋 기반 (권장): 커넥터는 보안 이벤트가 거의 실시간으로 수집될 때 자동으로 로깅합니다.
akamai.data.timebased이false로 설정된 경우 기본 모드입니다. - 시간 기반: 특정 기간 (최대 12시간 전) 내에 발생한 이벤트를 가져올 수 있습니다.
누락되었거나 이전 보안 이벤트를 가져오려면 다음 단계를 따르세요.
커넥터의 구성 파일을 엽니다.
sudo nano /path/to/CEFConnector-<version>/config/CEFConnector.properties시간 기반 구성을 변경합니다.
akamai.data.timebased=true akamai.data.timebased.from=<EPOCH_START_TIME> akamai.data.timebased.to=<EPOCH_END_TIME><EPOCH_START_TIME>를 에포크 형식의 시작 시간 (지난 12시간 이내)으로 바꿉니다.<EPOCH_END_TIME>을 epoch 형식의 종료 시간으로 바꿉니다 (선택사항, 비워 두면 현재까지의 일정을 가져옴).
CEF 커넥터를 다시 시작합니다.
sudo /etc/init.d/AkamaiCEFConnector restart이전 데이터를 가져온 후 오프셋 모드로 되돌립니다.
akamai.data.timebased=falseCEF 커넥터를 다시 시작합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
src (attackData.clientIP) |
principal.ip |
요청을 보내는 클라이언트의 소스 IP 주소 |
c6a2 (ipv6src) |
principal.ip |
attackData.clientIP가 IPv6 형식인 경우 소스 IPv6 주소 |
dhost (httpMessage.host) |
target.hostname |
HTTP HOST 헤더의 호스트 이름 |
dpt (httpMessage.port) |
target.port |
수신 요청에서 사용되는 포트 번호 |
requestMethod (httpMessage.method) |
network.http.method |
수신 요청의 HTTP 메서드 (GET, POST 등) |
request (requestURL) |
target.url |
httpMessage 필드에서 계산된 전체 URL |
cs1 (attackData.rules) |
security_result.rule_id |
이 요청에 대해 트리거된 규칙의 규칙 ID |
cs2 (attackData.ruleMessages) |
security_result.rule_name |
트리거된 규칙의 메시지 |
act (appliedAction) |
security_result.action |
취해진 조치 (알림, 거부, 중단 등) |
severity |
security_result.severity |
계산된 심각도 (감지: 5, 완화: 10) |
cs5 (attackData.clientReputation) |
security_result.threat_name |
클라이언트 평판의 클라이언트 IP 점수 |
cs6 (attackData.apiId) |
security_result.detection_fields |
API 보호를 위한 API ID |
start (httpMessage.start) |
metadata.event_timestamp |
Edge 서버가 연결을 시작한 시간 (에포크 형식) |
devicePayloadId (httpMessage.requestId) |
metadata.product_log_id |
메시지의 전역 고유 ID |
flexString1 (attackData.configId) |
security_result.detection_fields |
이 요청에 적용된 보안 구성의 ID |
flexString2 (attackData.policyId) |
security_result.detection_fields |
이 요청에 적용된 방화벽 정책의 ID입니다. |
AkamaiSiemJA4 (identity.ja4) |
network.tls.client.ja3 |
JA4 클라이언트 TLS 디지털 지문 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.