Mengumpulkan log Akamai Enterprise Application Access
Versi Parser: 3.0
Dokumen ini menjelaskan cara menyerap log Akamai Enterprise Application Access (EAA) ke Google Security Operations menggunakan Akamai Unified Log Streamer (ULS) dan Bindplane. Akamai EAA adalah solusi akses jaringan zero-trust yang menyediakan akses aman dan berbasis identitas ke aplikasi perusahaan tanpa VPN tradisional. EAA menghasilkan data operasional dalam bentuk log akses, log audit admin, metrik kondisi konektor, inventaris perangkat, dan informasi kondisi direktori. 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 termasuk NETWORK_HTTP dan USER_UNCATEGORIZED berdasarkan keberadaan kolom tertentu.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps.
- Host Windows Server 2016 atau yang lebih baru, atau Linux dengan
systemduntuk menjalankan agen Bindplane. - Host Linux dengan Python 3.9 atau yang lebih baru, atau lingkungan yang di-container (Docker atau 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 API Akamai:
- Untuk feed audit akses dan admin: Kunci API dan Rahasia Lama EAA (dibuat di Enterprise Center).
- Untuk feed kondisi konektor, inventaris perangkat, dan kondisi direktori: Kredensial Akamai OPEN API (autentikasi EdgeGrid) dengan akses BACA-TULIS ke Enterprise Application Access API.
Mendapatkan kredensial Google SecOps untuk agen Bindplane
Untuk mengautentikasi agen Bindplane ke Google SecOps, pilih salah satu metode berikut:
- Deployment baru: Gunakan Chronicle API (Opsi 1).
- Deployment lama: Terus gunakan file autentikasi penyerapan (Opsi 2) hingga Ingestion API dihentikan pada 20 Juli 2027.
Opsi 1: Membuat akun layanan untuk Chronicle API (direkomendasikan)
- Login ke konsolGoogle Cloud dan pilih project Google Cloud yang ditautkan ke instance Google SecOps Anda.
- Buka IAM & Admin > Service Accounts.
- Klik Create service account.
- Berikan detail konfigurasi berikut:
- Service account name: Masukkan nama akun (misalnya,
bindplane-ingest). - Deskripsi akun layanan: Masukkan deskripsi (misalnya,
Bindplane agent log ingestion).
- Service account name: Masukkan nama akun (misalnya,
- Klik Create and continue.
- Di bagian Grant this service account access to project, klik Select a role, lalu pilih Chronicle Editor.
- Klik Continue lalu klik Done.
- Klik akun layanan yang Anda buat, lalu buka tab Keys.
- Klik Add key > Create new key.
- Pilih JSON, lalu klik Create. File kunci didownload ke komputer Anda.
- Simpan file kunci sebagai
ingestion-auth.jsondi direktori pengumpul Bindplane (/opt/observiq-otel-collector/ingestion-auth.jsondi Linux atauC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsondi Windows), atau perbaruicreds_file_pathdiconfig.yamlagar cocok dengan jalur tempat Anda menyimpannya. - Buka IAM & Admin > Settings dan salin Project number. Anda akan memerlukannya untuk konfigurasi pengekspor.
Opsi 2: Mendownload file autentikasi penyerapan (lama)
- Login ke konsol Google SecOps.
- Buka SIEM Settings > Collection Agents.
- Download file autentikasi penyerapan.
- Simpan file dengan aman di sistem tempat agen 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 agen BindPlane.
Mengonfigurasi agen Bindplane untuk menyerap log dan mengirimkannya ke Google SecOps
Buka file konfigurasi agen Bindplane di editor teks:
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"Edit file
config.yamlsebagai berikut:receivers: tcplog: listen_address: "0.0.0.0:5140" exporters: chronicle/akamai_eaa: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: '<CUSTOMER_ID>' endpoint: chronicle.googleapis.com log_type: 'AKAMAI_EAA' raw_log_field: body ingestion_labels: source: akamai_eaa service: pipelines: logs/akamai_eaa: receivers: - tcplog exporters: - chronicle/akamai_eaa
Ganti kode berikut:
/path/to/ingestion-authentication-file.json: Jalur lengkap ke file kunci JSON akun layanan (Opsi 1).- Linux:
/opt/observiq-otel-collector/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
- Ganti
<LOCATION>dengan region instance Google SecOps Anda (misalnya,us,europe, atauasia-southeast1). Pengekspor akan mengawalichronicle.googleapis.comdengan nilai ini. - Ganti
<PROJECT_NUMBER>dengan nomor project dari IAM & Admin > Settings. <CUSTOMER_ID>: ID pelanggan Google SecOps.0.0.0.0:5140: Alamat IP dan port yang akan diproses oleh Bindplane. Sesuaikan sesuai kebutuhan untuk lingkungan Anda.
Pengekspor API penyerapan lama
Jika Anda menggunakan file autentikasi penyerapan dari Opsi 2, ganti blok
exportersdengan kode berikut. Tetapkancreds_file_pathke jalur ke file autentikasi penyerapan, dan jika instance Anda berada di luar AS, gantimalachiteingestion-pa.googleapis.comdengan endpoint regional Anda (misalnya,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/akamai_eaa: 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
Mulai ulang agen Bindplane untuk menerapkan perubahan
Untuk memulai ulang agen Bindplane di Linux:
Jalankan perintah berikut:
sudo systemctl restart observiq-otel-collectorPastikan layanan sedang berjalan:
sudo systemctl status observiq-otel-collectorPeriksa log untuk mengetahui error:
sudo journalctl -u observiq-otel-collector -f
Untuk memulai ulang agen Bindplane di Windows:
Pilih salah satu opsi berikut:
- Command Prompt atau PowerShell sebagai administrator:
net stop observiq-otel-collector && net start observiq-otel-collector- Konsol layanan:
- Tekan
Win+R, ketikservices.msc, lalu tekan Enter. - Cari observIQ OpenTelemetry Collector.
- Klik kanan, lalu pilih Mulai ulang.
- Tekan
Pastikan layanan sedang berjalan:
sc query observiq-otel-collectorPeriksa log untuk mengetahui error:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Membuat kredensial Akamai API
Akamai EAA menggunakan dua jenis kredensial API, bergantung pada jenis feed. Buat kredensial yang sesuai dengan feed yang ingin Anda kumpulkan.
Membuat kredensial EAA Legacy API (untuk feed akses dan admin)
- Login ke Akamai Control Center.
- Pilih Enterprise Center dari menu navigasi utama di sebelah kiri.
- Buka Setelan Umum > Setelan.
- Pilih tab Kunci API.
- Klik Generate new API Key di pojok kanan atas.
- Masukkan nama dan deskripsi untuk kunci API.
Di layar konfirmasi, salin Key dan Secret.
Membuat kredensial Akamai OPEN API (untuk feed kondisi konektor, inventaris perangkat, dan kondisi direktori)
- Login ke Akamai Control Center.
- Buka Admin Akun > Identitas dan akses.
- Pilih tab Pengguna API.
- Klik Create API Client.
- Di bagian Select APIs, telusuri Enterprise Application Access dan tetapkan tingkat akses ke READ-WRITE.
- Lengkapi setelan lainnya, lalu klik Create API client.
Klik Download untuk mendownload kredensial dalam format
.edgerc, atau klik Salin untuk menyalinnya ke file.edgercyang ada.
Mengonfigurasi file kredensial .edgerc
Buat file kredensial
.edgercdi sistem tempat ULS akan berjalan:touch ~/.edgercBuka file di editor teks:
nano ~/.edgercTambahkan kredensial Akamai API Anda dalam format berikut:
[default] ; EAA Legacy API credentials (for access and admin feeds) eaa_api_host = manage.akamai-access.com eaa_api_key = <EAA_API_KEY> eaa_api_secret = <EAA_API_SECRET> ; Akamai OPEN API credentials (for conhealth, devinv, dirhealth feeds) host = <OPEN_API_HOST> client_token = <CLIENT_TOKEN> client_secret = <CLIENT_SECRET> access_token = <ACCESS_TOKEN>Amankan file kredensial:
chmod 600 ~/.edgerc
Ganti kode berikut:
<EAA_API_KEY>: Kunci API Lama EAA (misalnya,XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX).<EAA_API_SECRET>: Rahasia API EAA Legacy.<OPEN_API_HOST>: Nama host Akamai OPEN API Anda (misalnya,akaa-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net).<CLIENT_TOKEN>: Token klien Akamai OPEN API Anda (misalnya,akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx).<CLIENT_SECRET>: Rahasia klien Akamai OPEN API Anda.<ACCESS_TOKEN>: Token akses Akamai OPEN API Anda (misalnya,akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx).
Menginstal Akamai Unified Log Streamer
Unified Log Streamer (ULS) menarik log dari Akamai EAA melalui Akamai API dan mengalirkan log tersebut ke agen Bindplane menggunakan TCP. ULS adalah aplikasi Python yang memerlukan Python 3.9 atau yang lebih baru.
Penginstalan Linux (Python)
Buat clone repositori ULS:
git clone https://github.com/akamai/uls.git cd ulsInstal persyaratan Python ULS:
pip3 install -r bin/requirements.txtInstal dependensi CLI EAA:
git clone --depth 1 --single-branch https://github.com/akamai/cli-eaa.git ext/cli-eaa pip3 install -r ext/cli-eaa/requirements.txtVerifikasi penginstalannya:
python3 bin/uls.py --help
Penginstalan Docker
Tarik image Docker ULS resmi:
docker pull akamai/uls:latest
Mengonfigurasi ULS untuk melakukan streaming log EAA ke BindPlane
Eksekusi command line (pengujian)
Jalankan ULS dengan output TCP untuk mengalirkan log ke agen Bindplane:
python3 bin/uls.py --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 agen Bindplane.5140: Port yang dikonfigurasi di penerimatcplogBindplane.Untuk melakukan streaming beberapa jenis feed, jalankan instance ULS terpisah:
# Access logs python3 bin/uls.py --input eaa --feed access --output tcp --host <BINDPLANE_HOST> --port 5140 --edgerc ~/.edgerc --section default # Admin audit logs python3 bin/uls.py --input eaa --feed admin --output tcp --host <BINDPLANE_HOST> --port 5140 --edgerc ~/.edgerc --section default # Connector health python3 bin/uls.py --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/bin/python3 /opt/uls/bin/uls.py --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 Compose
Buat file
docker-compose.yml: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 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 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
Ganti <BINDPLANE_HOST> dengan alamat IP atau nama host server agen Bindplane.
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.recieved_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 bersyarat 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 |
Diurai dari kolom datetime menggunakan format RFC 3339. |
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 langsung sebagai label penyerapan. |
error_code |
additional.fields.key: "Kode error", 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 |
Diurai menggunakan grok untuk mengekstrak protokol dan versi. |
idpinfo |
additional.fields.key: "Info IDP", additional.fields.value.string_value: idpinfo |
Dipetakan secara bersyarat jika idpinfo ada. |
internal_host |
additional.fields.key: "Host internal", 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 |
Diprogram secara permanen ke "AKAMAI_EAA". |
metadata.vendor_name |
metadata.vendor_name |
Diprogram 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 disetel, 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 bersyarat 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, yang 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 bersyarat jika resource ada. |
resource_type |
principal.resource.attribute.labels.key: "Jenis Resource", principal.resource.attribute.labels.value: resource_type |
Dipetakan secara bersyarat jika resource_type ada. |
rscd |
metadata.ingestion_labels.key: "rscd", metadata.ingestion_labels.value: rscd |
Dipetakan 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 bersyarat 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 bersyarat jika total_resp_time tidak kosong atau "-". |
ts |
metadata.event_timestamp |
Diurai dari kolom ts sebagai milidetik atau detik UNIX jika ada, jika tidak, 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 langsung ke kolom parsed_user_agent terstruktur. |
username |
principal.user.email_addresses atau principal.user.userid |
Dipetakan ke email_addresses jika terlihat seperti email, jika tidak, dipetakan ke userid. |
Log Perubahan
Melihat Log Perubahan untuk parser ini
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.