Akamai EAA-Logs (Enterprise Application Access) erfassen
In diesem Dokument wird beschrieben, wie Sie Akamai Enterprise Application Access-Logs (EAA) mit dem Unified Log Streamer (ULS) von Akamai und Bindplane in Google Security Operations aufnehmen. Akamai EAA generiert Betriebsdaten in Form von Zugriffslogs, Administrator-Audit-Logs, Authentifizierungsdetails und Connector-Integritätsmesswerten. Der Parser extrahiert Felder aus den JSON-Logs, führt Datentransformationen wie Stringkonvertierungen und IP-Adressenextraktion durch und ordnet diese Felder dem UDM zu. Dabei werden verschiedene Ereignistypen wie NETWORK_HTTP und USER_UNCATEGORIZED anhand des Vorhandenseins bestimmter Felder verarbeitet. Außerdem werden dem UDM-Ereignis Metadaten wie Anbieter- und Produktnamen hinzugefügt.
Hinweise
Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:
- Eine Google SecOps-Instanz
- Ein Windows 2016- oder höher- oder Linux-Host mit
systemdzum Ausführen des BindPlane-Agents - Linux, macOS oder eine containerisierte Umgebung (Docker/Kubernetes) zum Ausführen von Unified Log Streamer
- Wenn Sie den Agent hinter einem Proxy ausführen, müssen die Firewallports gemäß den Anforderungen des Bindplane-Agents geöffnet sein.
- Akamai EAA-Mandant mit Administratorzugriff
- Akamai API-Anmeldedaten (EdgeGrid-Authentifizierung):
- Access Token (Zugriffstoken)
- Client-Token
- Clientschlüssel
- API-Basishostname (z. B.
akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net)
Authentifizierungsdatei für die Aufnahme in Google SecOps abrufen
- Melden Sie sich in der Google SecOps-Konsole an.
- Rufen Sie die SIEM-Einstellungen > Collection Agents auf.
- Laden Sie die Authentifizierungsdatei für die Aufnahme herunter. Speichern Sie die Datei sicher auf dem System, auf dem BindPlane installiert wird.
Google SecOps-Kundennummer abrufen
- Melden Sie sich in der Google SecOps-Konsole an.
- Rufen Sie die SIEM-Einstellungen > Profile auf.
- Kopieren und speichern Sie die Kunden-ID aus dem Bereich Organisationsdetails.
BindPlane-Agent installieren
Installieren Sie den Bindplane-Agent auf Ihrem Windows- oder Linux-Betriebssystem gemäß der folgenden Anleitung.
Fenstereinbau
- Öffnen Sie die Eingabeaufforderung oder PowerShell als Administrator.
Führen Sie dazu diesen Befehl aus:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux-Installation
- Öffnen Sie ein Terminal mit Root- oder Sudo-Berechtigungen.
Führen Sie dazu diesen Befehl aus:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Zusätzliche Installationsressourcen
- Weitere Installationsoptionen finden Sie in diesem Installationsleitfaden.
BindPlane-Agent zum Erfassen von Syslog-Daten und Senden an Google SecOps konfigurieren
Konfigurationsdatei aufrufen:
- Suchen Sie die Datei
config.yaml. Normalerweise befindet sie sich unter Linux im Verzeichnis/etc/bindplane-agent/oder unter Windows im Installationsverzeichnis. - Öffnen Sie die Datei mit einem Texteditor (z. B.
nano,vioder Notepad).
- Suchen Sie die Datei
Bearbeiten Sie die Datei
config.yamlso: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- Dabei gilt:
- Ersetzen Sie
<CUSTOMER_ID>durch die tatsächliche Kunden-ID. - Aktualisieren Sie
/path/to/ingestion-authentication-file.jsonauf den Pfad, in dem die Authentifizierungsdatei im Abschnitt Get Google SecOps ingestion authentication file (Authentifizierungsdatei für die Google SecOps-Aufnahme abrufen) gespeichert wurde. 0.0.0.0:5140: Die IP-Adresse und der Port, an dem Bindplane auf Anfragen wartet. Passen Sie die Einstellungen nach Bedarf an Ihre Umgebung an.
- Ersetzen Sie
- Dabei gilt:
Bindplane-Agent neu starten, um die Änderungen zu übernehmen
Führen Sie den folgenden Befehl aus, um den Bindplane-Agent unter Linux neu zu starten:
sudo systemctl restart bindplane-agentUm den Bindplane-Agent unter Windows neu zu starten, können Sie entweder die Konsole Dienste verwenden oder den folgenden Befehl eingeben:
net stop BindPlaneAgent && net start BindPlaneAgent
Akamai Unified Log Streamer installieren
Unified Log Streamer (ULS) ruft Logs über die Enterprise Application Access API von Akamai EAA ab und streamt sie über TCP oder UDP an Bindplane.
Linux-Installation
Laden Sie den aktuellen ULS-Release herunter:
curl -LO https://github.com/akamai/uls/releases/latest/download/uls-linux-amd64So machen Sie die Binärdatei ausführbar:
chmod +x uls-linux-amd64Verschieben Sie sie an einen Standardspeicherort:
sudo mv uls-linux-amd64 /usr/local/bin/uls
Installation unter macOS
Laden Sie den aktuellen ULS-Release herunter:
curl -LO https://github.com/akamai/uls/releases/latest/download/uls-darwin-amd64So machen Sie die Binärdatei ausführbar:
chmod +x uls-darwin-amd64Verschieben Sie sie an einen Standardspeicherort:
sudo mv uls-darwin-amd64 /usr/local/bin/uls
Docker-Installation
Rufen Sie das offizielle ULS-Docker-Image ab:
docker pull akamai/uls:latest
Akamai EdgeGrid-Anmeldedaten konfigurieren
Erstellen Sie die EdgeGrid-Datei mit Anmeldedaten:
mkdir -p ~/.edgerc nano ~/.edgercFügen Sie Ihre Akamai API-Anmeldedaten im folgenden Format hinzu:
[default] client_secret = your-client-secret host = akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net access_token = your-access-token client_token = your-client-tokenDatei mit Anmeldedaten sichern:
chmod 600 ~/.edgerc
Ersetzen Sie Folgendes:
your-client-secret: Ihr Akamai-Clientschlüssel.your-access-token: Ihr Akamai-Zugriffstoken.your-client-token: Ihr Akamai-Client-Token.akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net: Der Akamai-API-Basishostname.
ULS für das Streamen von EAA-Logs an BindPlane konfigurieren
Ausführung über die Befehlszeile (Tests)
Führen Sie ULS mit TCP-Ausgabe aus, um Logs an den BindPlane-Agent zu streamen:
uls --input eaa \
--feed access \
--output tcp \
--host <BINDPLANE_HOST> \
--port 5140 \
--edgerc ~/.edgerc \
--section default
- Dabei gilt:
<BINDPLANE_HOST>: Die IP-Adresse oder der Hostname des Servers, auf dem Bindplane ausgeführt wird5140: Der imtcplog-Empfänger von BindPlane konfigurierte Port
Wenn Sie mehrere Feedtypen streamen möchten, führen Sie separate ULS-Instanzen aus:
```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
```
Systemd-Dienst (Produktion)
Konfigurieren Sie für Produktionsbereitstellungen ULS als systemd-Dienst:
Erstellen Sie eine ULS-Konfigurationsdatei:
sudo mkdir -p /etc/uls sudo nano /etc/uls/eaa-access-tcp.confFügen Sie die folgende Konfiguration hinzu:
ULS_INPUT=eaa ULS_FEED=access ULS_OUTPUT=tcp ULS_HOST=<BINDPLANE_HOST> ULS_PORT=5140 ULS_EDGERC=/root/.edgerc ULS_SECTION=defaultErstellen Sie eine systemd-Dienstdatei:
sudo nano /etc/systemd/system/uls-eaa-access.serviceFügen Sie den folgenden Inhalt hinzu:
[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.targetAktivieren und starten Sie den Dienst:
sudo systemctl daemon-reload sudo systemctl enable uls-eaa-access.service sudo systemctl start uls-eaa-access.servicePrüfen Sie, ob der Dienst ausgeführt wird:
sudo systemctl status uls-eaa-access.serviceLogs ansehen:
sudo journalctl -u uls-eaa-access.service -f
Wiederholen Sie die Schritte 1 bis 7 für jeden zusätzlichen Feedtyp (admin, conhealth), indem Sie separate Konfigurations- und Dienstdateien mit unterschiedlichen Namen erstellen (z. B. uls-eaa-admin.service, uls-eaa-conhealth.service).
Docker-Bereitstellung
Docker Compose-Datei erstellen:
nano docker-compose.ymlFügen Sie die folgende Konfiguration hinzu:
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- Ersetzen Sie
<BINDPLANE_HOST>durch die IP-Adresse oder den Hostnamen Ihres Bindplane-Servers.
- Ersetzen Sie
Starten Sie die Container:
docker-compose up -dLogs ansehen:
docker-compose logs -f
UDM-Zuordnungstabelle
| Logfeld | UDM-Zuordnung | Logik |
|---|---|---|
app |
target.application |
Der Wert nach dem Doppelpunkt im Feld app. |
apphost |
target.hostname |
Direkt zugeordnet. |
browser |
network.http.user_agent |
Direkt zugeordnet. |
bytes_in |
network.received_bytes |
Direkt zugeordnet. |
bytes_out |
network.sent_bytes |
Direkt zugeordnet. |
cc |
principal.location.country_or_region |
Direkt zugeordnet. |
client_id |
additional.fields.key: „Client Id“, additional.fields.value.string_value: client_id |
Wird bedingt zugeordnet, wenn client_id vorhanden ist. |
clientip |
principal.ip |
Direkt zugeordnet. |
cloud_zone |
principal.cloud.availability_zone |
Direkt zugeordnet. |
connector_resp_time |
security_result.detection_fields.key: „Connector response time“ (Antwortzeit des Connectors), security_result.detection_fields.value: connector_resp_time |
Wird nur zugeordnet, wenn connector_resp_time nicht leer oder „-“ ist. |
content_type |
additional.fields.key: „Content-Typ“, additional.fields.value.string_value: content_type |
Wird bedingt zugeordnet, wenn content_type vorhanden ist. |
datetime |
metadata.event_timestamp |
Wird aus dem Feld datetime im RFC3339-Format geparst. |
deny_reason |
security_result.summary |
Direkt zugeordnet. |
device_type |
principal.platform, principal.platform_version |
Wird basierend auf dem Abgleich mit regulären Ausdrücken WINDOWS, LINUX oder MAC zugeordnet. Der Rohwert wird principal.platform_version zugeordnet. |
di |
metadata.ingestion_labels.key: „di“, metadata.ingestion_labels.value: di |
Direkt als Ingestionslabel zugeordnet. |
error_code |
additional.fields.key: „Fehlercode“, additional.fields.value.string_value: error_code |
Wird bedingt zugeordnet, wenn error_code vorhanden ist. |
event |
metadata.description |
Direkt zugeordnet. |
geo_city |
principal.location.city |
Direkt zugeordnet. |
geo_country |
principal.location.country_or_region |
Direkt zugeordnet. |
geo_state |
principal.location.state |
Direkt zugeordnet. |
groups |
principal.user.group_identifiers |
Direkt zugeordnet. |
http_method |
network.http.method |
Direkt zugeordnet. |
http_ver |
network.application_protocol, network.application_protocol_version |
Mit grok geparst, um Protokoll und Version zu extrahieren. |
idpinfo |
additional.fields.key: „IDP Info“, additional.fields.value.string_value: idpinfo |
Wird bedingt zugeordnet, wenn idpinfo vorhanden ist. |
internal_host |
additional.fields.key: „Interner Host“, additional.fields.value.string_value: internal_host |
Wird bedingt zugeordnet, wenn internal_host vorhanden ist. |
metadata.log_type |
metadata.log_type |
Fest codiert auf „AKAMAI_EAA“. |
metadata.product_name |
metadata.product_name |
Fest codiert auf „AKAMAI_EAA“. |
metadata.vendor_name |
metadata.vendor_name |
Fest codiert auf „AKAMAI_EAA“. |
metadata.event_type |
metadata.event_type |
Wird durch die Logik bestimmt: USER_UNCATEGORIZED, wenn uid vorhanden ist, NETWORK_HTTP, wenn sowohl principal.ip als auch target festgelegt sind, oder GENERIC_EVENT andernfalls. |
origin_host |
additional.fields.key: „Origin host“, additional.fields.value.string_value: origin_host |
Wird bedingt zugeordnet, wenn origin_host vorhanden ist. |
origin_resp_time |
security_result.detection_fields.key: „Origin response time“ (Antwortzeit des Ursprungs), security_result.detection_fields.value: origin_resp_time |
Wird nur zugeordnet, wenn origin_resp_time nicht leer oder „-“ ist. |
os |
principal.platform |
Wird basierend auf dem Abgleich mit regulären Ausdrücken WINDOWS, MAC oder LINUX zugeordnet. |
port |
target.port |
Der Wert nach dem Doppelpunkt im Feld app. |
ral |
metadata.description |
Verkettete Werte des ral-Arrays, durch Kommas getrennt. |
referer |
network.http.referral_url |
Direkt zugeordnet. |
resource |
principal.resource.attribute.labels.key: „Resource“, principal.resource.attribute.labels.value: resource |
Wird bedingt zugeordnet, wenn resource vorhanden ist. |
resource_type |
principal.resource.attribute.labels.key: „Resource Type“ (Ressourcentyp), principal.resource.attribute.labels.value: resource_type |
Wird bedingt zugeordnet, wenn resource_type vorhanden ist. |
rscd |
metadata.ingestion_labels.key: „rscd“, metadata.ingestion_labels.value: rscd |
Direkt als Ingestionslabel zugeordnet. |
session_id |
network.session_id |
Direkt zugeordnet. |
session_info |
additional.fields.key: „Sitzungsinformationen“, additional.fields.value.string_value: session_info |
Wird bedingt zugeordnet, wenn session_info vorhanden ist. |
state |
principal.location.state |
Direkt zugeordnet. |
status_code |
network.http.response_code |
Direkt zugeordnet. |
total_resp_time |
security_result.detection_fields.key: „Gesamte Reaktionszeit“, security_result.detection_fields.value: total_resp_time |
Wird nur zugeordnet, wenn total_resp_time nicht leer oder „-“ ist. |
ts |
metadata.event_timestamp |
Wird aus dem Feld ts als UNIX-Millisekunden oder -Sekunden geparst, falls vorhanden, andernfalls aus dem Feld datetime. |
uid |
principal.user.userid |
Direkt zugeordnet. |
uip |
principal.ip |
Direkt zugeordnet. |
url_path |
target.url |
Direkt zugeordnet. |
user_agent |
network.http.user_agent, network.http.parsed_user_agent |
Direkt zugeordnet und in ein strukturiertes parsed_user_agent-Feld geparst. |
username |
principal.user.email_addresses oder principal.user.userid |
Wird email_addresses zugeordnet, wenn es wie eine E-Mail-Adresse aussieht, andernfalls userid. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten