Mengumpulkan log Akamai EAA (Enterprise Application Access)
Dokumen ini menjelaskan cara menyerap log Akamai Enterprise Application Access (EAA) ke Google Security Operations menggunakan Unified Log Streamer (ULS) dan Bindplane Akamai. Akamai EAA menghasilkan data operasional dalam bentuk log akses, log audit admin, detail autentikasi, dan metrik kesehatan konektor. Parser mengekstrak kolom dari log JSON, melakukan transformasi data seperti konversi string dan ekstraksi alamat IP, serta memetakan kolom ini ke UDM, menangani berbagai jenis peristiwa seperti NETWORK_HTTP dan USER_UNCATEGORIZED berdasarkan ada atau tidaknya kolom tertentu. Selain itu, metadata seperti nama vendor dan produk juga ditambahkan ke peristiwa UDM.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Host Windows 2016 atau yang lebih baru atau Linux dengan
systemduntuk menjalankan agen Bindplane - Linux, macOS, atau lingkungan dalam container (Docker/Kubernetes) untuk menjalankan Unified Log Streamer
- Jika beroperasi dari balik proxy, pastikan port firewall terbuka sesuai dengan persyaratan agen Bindplane
- Tenant Akamai EAA dengan akses administratif
- Kredensial Akamai API (autentikasi EdgeGrid):
- Token Akses
- Token Klien
- Rahasia Klien
- Nama Host Dasar API (misalnya,
akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net)
Mendapatkan file autentikasi penyerapan Google SecOps
- Login ke konsol Google SecOps.
- Buka Setelan SIEM > Agen Pengumpulan.
- Download File Autentikasi Penyerapan. Simpan file dengan aman di sistem tempat BindPlane akan diinstal.
Mendapatkan ID pelanggan Google SecOps
- Login ke konsol Google SecOps.
- Buka Setelan SIEM > Profil.
- Salin dan simpan ID Pelanggan dari bagian Detail Organisasi.
Menginstal agen Bindplane
Instal agen Bindplane di sistem operasi Windows atau Linux Anda sesuai dengan petunjuk berikut.
Penginstalan Windows
- Buka Command Prompt atau PowerShell sebagai administrator.
Jalankan perintah berikut:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Penginstalan Linux
- Buka terminal dengan hak istimewa root atau sudo.
Jalankan perintah berikut:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Referensi penginstalan tambahan
- Untuk opsi penginstalan tambahan, lihat panduan penginstalan ini.
Mengonfigurasi agen BindPlane untuk menyerap Syslog dan mengirimkannya ke Google SecOps
Akses file konfigurasi:
- Cari file
config.yaml. Biasanya, file ini berada di direktori/etc/bindplane-agent/di Linux atau di direktori penginstalan di Windows. - Buka file menggunakan editor teks (misalnya,
nano,vi, atau Notepad).
- Cari file
Edit file
config.yamlsebagai berikut:receivers: tcplog: listen_address: "0.0.0.0:5140" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: <CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com log_type: 'AKAMAI_EAA' raw_log_field: body ingestion_labels: source: akamai_eaa service: pipelines: logs/akamai_eaa: receivers: - tcplog exporters: - chronicle/chronicle_w_labels- Ganti kode berikut:
- Ganti
<CUSTOMER_ID>dengan ID pelanggan yang sebenarnya. - Ganti
/path/to/ingestion-authentication-file.jsondengan jalur tempat file autentikasi disimpan di bagian Mendapatkan file autentikasi penyerapan Google SecOps. 0.0.0.0:5140: Alamat IP dan port yang akan diproses Bindplane. Sesuaikan sesuai kebutuhan untuk lingkungan Anda.
- Ganti
- Ganti kode berikut:
Mulai ulang agen Bindplane untuk menerapkan perubahan
Untuk memulai ulang agen Bindplane di Linux, jalankan perintah berikut:
sudo systemctl restart bindplane-agentUntuk memulai ulang agen Bindplane di Windows, Anda dapat menggunakan konsol Services atau memasukkan perintah berikut:
net stop BindPlaneAgent && net start BindPlaneAgent
Menginstal Akamai Unified Log Streamer
Unified Log Streamer (ULS) menarik log dari Akamai EAA melalui Enterprise Application Access API dan menyalurkannya ke Bindplane menggunakan TCP atau UDP.
Penginstalan Linux
Download rilis ULS terbaru:
curl -LO https://github.com/akamai/uls/releases/latest/download/uls-linux-amd64Jadikan biner sebagai file yang dapat dieksekusi:
chmod +x uls-linux-amd64Pindahkan ke lokasi standar:
sudo mv uls-linux-amd64 /usr/local/bin/uls
Penginstalan macOS
Download rilis ULS terbaru:
curl -LO https://github.com/akamai/uls/releases/latest/download/uls-darwin-amd64Jadikan biner sebagai file yang dapat dieksekusi:
chmod +x uls-darwin-amd64Pindahkan ke lokasi standar:
sudo mv uls-darwin-amd64 /usr/local/bin/uls
Penginstalan Docker
Tarik image Docker ULS resmi:
docker pull akamai/uls:latest
Mengonfigurasi kredensial Akamai EdgeGrid
Buat file kredensial EdgeGrid:
mkdir -p ~/.edgerc nano ~/.edgercTambahkan kredensial Akamai API Anda dalam format berikut:
[default] client_secret = your-client-secret host = akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net access_token = your-access-token client_token = your-client-tokenAmankan file kredensial:
chmod 600 ~/.edgerc
Ganti kode berikut:
your-client-secret: Rahasia Klien Akamai Anda.your-access-token: Token Akses Akamai Anda.your-client-token: Token Klien Akamai Anda.akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net: Nama host dasar Akamai API Anda.
Mengonfigurasi ULS untuk melakukan streaming log EAA ke BindPlane
Eksekusi command line (pengujian)
Jalankan ULS dengan output TCP untuk melakukan streaming log ke agen BindPlane:
uls --input eaa \
--feed access \
--output tcp \
--host <BINDPLANE_HOST> \
--port 5140 \
--edgerc ~/.edgerc \
--section default
- Ganti kode berikut:
<BINDPLANE_HOST>: Alamat IP atau nama host server yang menjalankan Bindplane5140: Port yang dikonfigurasi di penerimatcplogBindplane
Untuk melakukan streaming beberapa jenis feed, jalankan instance ULS terpisah:
```bash
# Access logs
uls --input eaa --feed access --output tcp --host <BINDPLANE_HOST> --port 5140 --edgerc ~/.edgerc --section default
# Admin audit logs
uls --input eaa --feed admin --output tcp --host <BINDPLANE_HOST> --port 5140 --edgerc ~/.edgerc --section default
# Connector health
uls --input eaa --feed conhealth --output tcp --host <BINDPLANE_HOST> --port 5140 --edgerc ~/.edgerc --section default
```
Layanan Systemd (produksi)
Untuk deployment produksi, konfigurasi ULS sebagai layanan systemd:
Buat file konfigurasi ULS:
sudo mkdir -p /etc/uls sudo nano /etc/uls/eaa-access-tcp.confTambahkan konfigurasi berikut:
ULS_INPUT=eaa ULS_FEED=access ULS_OUTPUT=tcp ULS_HOST=<BINDPLANE_HOST> ULS_PORT=5140 ULS_EDGERC=/root/.edgerc ULS_SECTION=defaultBuat file layanan systemd:
sudo nano /etc/systemd/system/uls-eaa-access.serviceTambahkan konten berikut:
[Unit] Description=Unified Log Streamer - EAA Access Logs to BindPlane After=network.target [Service] Type=simple EnvironmentFile=/etc/uls/eaa-access-tcp.conf ExecStart=/usr/local/bin/uls --input ${ULS_INPUT} --feed ${ULS_FEED} --output ${ULS_OUTPUT} --host ${ULS_HOST} --port ${ULS_PORT} --edgerc ${ULS_EDGERC} --section ${ULS_SECTION} Restart=always RestartSec=10 User=root [Install] WantedBy=multi-user.targetAktifkan dan mulai layanan:
sudo systemctl daemon-reload sudo systemctl enable uls-eaa-access.service sudo systemctl start uls-eaa-access.servicePastikan layanan sedang berjalan:
sudo systemctl status uls-eaa-access.serviceMelihat log:
sudo journalctl -u uls-eaa-access.service -f
Ulangi langkah 1-7 untuk setiap jenis feed tambahan (admin, conhealth) dengan membuat file konfigurasi dan layanan terpisah dengan nama yang berbeda (misalnya, uls-eaa-admin.service, uls-eaa-conhealth.service).
Deployment Docker
Buat file Docker Compose:
nano docker-compose.ymlTambahkan konfigurasi berikut:
version: '3.8' services: uls-eaa-access: image: akamai/uls:latest container_name: uls-eaa-access restart: unless-stopped environment: - ULS_INPUT=eaa - ULS_FEED=access - ULS_OUTPUT=tcp - ULS_HOST=<BINDPLANE_HOST> - ULS_PORT=5140 volumes: - ~/.edgerc:/root/.edgerc:ro command: > --input eaa --feed access --output tcp --host "$${ULS_HOST}" --port "$${ULS_PORT}" --edgerc /root/.edgerc --section default uls-eaa-admin: image: akamai/uls:latest container_name: uls-eaa-admin restart: unless-stopped environment: - ULS_INPUT=eaa - ULS_FEED=admin - ULS_OUTPUT=tcp - ULS_HOST=<BINDPLANE_HOST> - ULS_PORT=5140 volumes: - ~/.edgerc:/root/.edgerc:ro command: > --input eaa --feed admin --output tcp --host "$${ULS_HOST}" --port "$${ULS_PORT}" --edgerc /root/.edgerc --section default uls-eaa-conhealth: image: akamai/uls:latest container_name: uls-eaa-conhealth restart: unless-stopped environment: - ULS_INPUT=eaa - ULS_FEED=conhealth - ULS_OUTPUT=tcp - ULS_HOST=<BINDPLANE_HOST> - ULS_PORT=5140 volumes: - ~/.edgerc:/root/.edgerc:ro command: > --input eaa --feed conhealth --output tcp --host "$${ULS_HOST}" --port "$${ULS_PORT}" --edgerc /root/.edgerc --section default- Ganti
<BINDPLANE_HOST>dengan alamat IP atau nama host server Bindplane Anda.
- Ganti
Mulai container:
docker-compose up -dMelihat log:
docker-compose logs -f
Tabel Pemetaan UDM
| Kolom log | Pemetaan UDM | Logika |
|---|---|---|
app |
target.application |
Nilai setelah titik dua di kolom app. |
apphost |
target.hostname |
Dipetakan secara langsung. |
browser |
network.http.user_agent |
Dipetakan secara langsung. |
bytes_in |
network.received_bytes |
Dipetakan secara langsung. |
bytes_out |
network.sent_bytes |
Dipetakan secara langsung. |
cc |
principal.location.country_or_region |
Dipetakan secara langsung. |
client_id |
additional.fields.key: "Client Id", additional.fields.value.string_value: client_id |
Dipetakan secara kondisional jika client_id ada. |
clientip |
principal.ip |
Dipetakan secara langsung. |
cloud_zone |
principal.cloud.availability_zone |
Dipetakan secara langsung. |
connector_resp_time |
security_result.detection_fields.key: "Waktu respons konektor", security_result.detection_fields.value: connector_resp_time |
Dipetakan secara kondisional jika connector_resp_time tidak kosong atau "-". |
content_type |
additional.fields.key: "Jenis konten", additional.fields.value.string_value: content_type |
Dipetakan secara kondisional jika content_type ada. |
datetime |
metadata.event_timestamp |
Diuraikan dari kolom datetime menggunakan format RFC3339. |
deny_reason |
security_result.summary |
Dipetakan secara langsung. |
device_type |
principal.platform, principal.platform_version |
Dipetakan ke WINDOWS, LINUX, atau MAC berdasarkan pencocokan ekspresi reguler. Nilai mentah dipetakan ke principal.platform_version. |
di |
metadata.ingestion_labels.key: "di", metadata.ingestion_labels.value: di |
Dipetakan secara langsung sebagai label penyerapan. |
error_code |
additional.fields.key: "Error code", additional.fields.value.string_value: error_code |
Dipetakan secara kondisional jika error_code ada. |
event |
metadata.description |
Dipetakan secara langsung. |
geo_city |
principal.location.city |
Dipetakan secara langsung. |
geo_country |
principal.location.country_or_region |
Dipetakan secara langsung. |
geo_state |
principal.location.state |
Dipetakan secara langsung. |
groups |
principal.user.group_identifiers |
Dipetakan secara langsung. |
http_method |
network.http.method |
Dipetakan secara langsung. |
http_ver |
network.application_protocol, network.application_protocol_version |
Diuraikan menggunakan grok untuk mengekstrak protokol dan versi. |
idpinfo |
additional.fields.key: "Info IDP", additional.fields.value.string_value: idpinfo |
Dipetakan secara kondisional jika idpinfo ada. |
internal_host |
additional.fields.key: "Internal host", additional.fields.value.string_value: internal_host |
Dipetakan secara kondisional jika internal_host ada. |
metadata.log_type |
metadata.log_type |
Dikodekan secara permanen ke "AKAMAI_EAA". |
metadata.product_name |
metadata.product_name |
Dikodekan secara permanen ke "AKAMAI_EAA". |
metadata.vendor_name |
metadata.vendor_name |
Dikodekan secara permanen ke "AKAMAI_EAA". |
metadata.event_type |
metadata.event_type |
Ditentukan oleh logika: USER_UNCATEGORIZED jika uid ada, NETWORK_HTTP jika principal.ip dan target ditetapkan, atau GENERIC_EVENT jika tidak. |
origin_host |
additional.fields.key: "Origin host", additional.fields.value.string_value: origin_host |
Dipetakan secara kondisional jika origin_host ada. |
origin_resp_time |
security_result.detection_fields.key: "Waktu respons asal", security_result.detection_fields.value: origin_resp_time |
Dipetakan secara kondisional jika origin_resp_time tidak kosong atau "-". |
os |
principal.platform |
Dipetakan ke WINDOWS, MAC, atau LINUX berdasarkan pencocokan ekspresi reguler. |
port |
target.port |
Nilai setelah titik dua di kolom app. |
ral |
metadata.description |
Nilai yang digabungkan dari array ral, dipisahkan dengan koma. |
referer |
network.http.referral_url |
Dipetakan secara langsung. |
resource |
principal.resource.attribute.labels.key: "Resource", principal.resource.attribute.labels.value: resource |
Dipetakan secara kondisional jika resource ada. |
resource_type |
principal.resource.attribute.labels.key: "Jenis Resource", principal.resource.attribute.labels.value: resource_type |
Dipetakan secara kondisional jika resource_type ada. |
rscd |
metadata.ingestion_labels.key: "rscd", metadata.ingestion_labels.value: rscd |
Dipetakan secara langsung sebagai label penyerapan. |
session_id |
network.session_id |
Dipetakan secara langsung. |
session_info |
additional.fields.key: "Info sesi", additional.fields.value.string_value: session_info |
Dipetakan secara kondisional jika session_info ada. |
state |
principal.location.state |
Dipetakan secara langsung. |
status_code |
network.http.response_code |
Dipetakan secara langsung. |
total_resp_time |
security_result.detection_fields.key: "Total response time", security_result.detection_fields.value: total_resp_time |
Dipetakan secara kondisional jika total_resp_time tidak kosong atau "-". |
ts |
metadata.event_timestamp |
Diuraikan dari kolom ts sebagai milidetik atau detik UNIX jika ada, atau dari kolom datetime. |
uid |
principal.user.userid |
Dipetakan secara langsung. |
uip |
principal.ip |
Dipetakan secara langsung. |
url_path |
target.url |
Dipetakan secara langsung. |
user_agent |
network.http.user_agent, network.http.parsed_user_agent |
Dipetakan dan diuraikan secara langsung ke dalam kolom parsed_user_agent terstruktur. |
username |
principal.user.email_addresses atau principal.user.userid |
Dipetakan ke email_addresses jika terlihat seperti email, atau ke userid. |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.