Akamai EAA(Enterprise Application Access)ログを収集する
このドキュメントでは、Akamai の Unified Log Streamer(ULS)と Bindplane を使用して Akamai Enterprise Application Access(EAA)ログを Google Security Operations に取り込む方法について説明します。Akamai EAA は、アクセスログ、管理監査ログ、認証の詳細、コネクタの健全性指標の形式で運用データを生成します。パーサーは、JSON ログからフィールドを抽出し、文字列変換や IP アドレスの抽出などのデータ変換を実行して、これらのフィールドを UDM にマッピングします。特定のフィールドの有無に基づいて、NETWORK_HTTP や USER_UNCATEGORIZED などのさまざまなイベントタイプを処理します。また、ベンダー名やプロダクト名などのメタデータも UDM イベントに追加します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- Bindplane エージェントを実行するための
systemdを使用する Windows 2016 以降または Linux ホスト - Unified Log Streamer を実行するための Linux、macOS、またはコンテナ化された環境(Docker/Kubernetes)
- プロキシの背後で実行している場合は、Bindplane エージェントの要件に従ってファイアウォール ポートが開いていることを確認します。
- 管理者権限を持つ Akamai EAA テナント
- Akamai API 認証情報(EdgeGrid 認証):
- アクセス トークン
- クライアント トークン
- クライアント シークレット
- API ベースホスト名(例:
akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net)
Google SecOps の取り込み認証ファイルを取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [コレクション エージェント] に移動します。
- Ingestion Authentication File をダウンロードします。Bindplane をインストールするシステムにファイルを安全に保存します。
Google SecOps のお客様 ID を取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [プロファイル] に移動します。
- [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。
Bindplane エージェントをインストールする
次の手順に沿って、Windows または Linux オペレーティング システムに Bindplane エージェントをインストールします。
Windows のインストール
- 管理者として コマンド プロンプトまたは PowerShell を開きます。
次のコマンドを実行します。
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux のインストール
- root 権限または 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: 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- 次のように置き換えます。
<CUSTOMER_ID>は、実際の顧客 ID に置き換えます。/path/to/ingestion-authentication-file.jsonの値を、Google SecOps の取り込み認証ファイルを取得するで認証ファイルを保存したパスに更新します。0.0.0.0:5140: Bindplane がリッスンする IP アドレスとポート。環境に合わせて必要に応じて調整します。
- 次のように置き換えます。
Bindplane エージェントを再起動して変更を適用する
Linux で Bindplane エージェントを再起動するには、次のコマンドを実行します。
sudo systemctl restart bindplane-agentWindows で Bindplane エージェントを再起動するには、Services コンソールを使用するか、次のコマンドを入力します。
net stop BindPlaneAgent && net start BindPlaneAgent
Akamai Unified Log Streamer をインストールする
Unified Log Streamer(ULS)は、Enterprise Application Access API を介して Akamai EAA からログを取得し、TCP または UDP を使用して Bindplane にストリーミングします。
Linux のインストール
最新の ULS リリースをダウンロードします。
curl -LO https://github.com/akamai/uls/releases/latest/download/uls-linux-amd64バイナリを実行可能にします。
chmod +x uls-linux-amd64標準の場所に移動します。
sudo mv uls-linux-amd64 /usr/local/bin/uls
macOS のインストール
最新の ULS リリースをダウンロードします。
curl -LO https://github.com/akamai/uls/releases/latest/download/uls-darwin-amd64バイナリを実行可能にします。
chmod +x uls-darwin-amd64標準の場所に移動します。
sudo mv uls-darwin-amd64 /usr/local/bin/uls
Docker のインストール
公式の ULS Docker イメージを pull します。
docker pull akamai/uls:latest
Akamai EdgeGrid 認証情報を構成する
EdgeGrid 認証情報ファイルを作成します。
mkdir -p ~/.edgerc nano ~/.edgercAkamai API 認証情報を次の形式で追加します。
[default] client_secret = your-client-secret host = akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net access_token = your-access-token client_token = your-client-token認証情報ファイルを保護します。
chmod 600 ~/.edgerc
次のように置き換えます。
your-client-secret: Akamai クライアント シークレット。your-access-token: Akamai アクセス トークン。your-client-token: Akamai クライアント トークン。akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net: Akamai API のベース ホスト名。
EAA ログを BindPlane にストリーミングするように ULS を構成する
コマンドライン実行(テスト)
TCP 出力で ULS を実行して、ログを Bindplane エージェントにストリーミングします。
uls --input eaa \
--feed access \
--output tcp \
--host <BINDPLANE_HOST> \
--port 5140 \
--edgerc ~/.edgerc \
--section default
- 次のように置き換えます。
<BINDPLANE_HOST>: Bindplane を実行しているサーバーの IP アドレスまたはホスト名5140: Bindplane のtcplogレシーバーで構成されたポート
複数のフィードタイプをストリーミングするには、個別の ULS インスタンスを実行します。
```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 サービス(本番環境)
本番環境のデプロイでは、ULS を systemd サービスとして構成します。
ULS 構成ファイルを作成します。
sudo mkdir -p /etc/uls sudo nano /etc/uls/eaa-access-tcp.conf次の構成を追加します。
ULS_INPUT=eaa ULS_FEED=access ULS_OUTPUT=tcp ULS_HOST=<BINDPLANE_HOST> ULS_PORT=5140 ULS_EDGERC=/root/.edgerc ULS_SECTION=defaultsystemd サービス ファイルを作成します。
sudo nano /etc/systemd/system/uls-eaa-access.service次の内容を追加します。
[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.targetサービスを有効にして開始します。
sudo systemctl daemon-reload sudo systemctl enable uls-eaa-access.service sudo systemctl start uls-eaa-access.serviceサービスが実行されていることを確認します。
sudo systemctl status uls-eaa-access.serviceログを表示します。
sudo journalctl -u uls-eaa-access.service -f
別の名前(uls-eaa-admin.service、uls-eaa-conhealth.service など)の構成ファイルとサービスファイルを作成して、追加のフィードタイプ(admin、conhealth)ごとに手順 1 ~ 7 を繰り返します。
Docker デプロイ
Docker Compose ファイルを作成します。
nano 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 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<BINDPLANE_HOST>は、Bindplane サーバーの IP アドレスまたはホスト名に置き換えます。
コンテナを起動します。
docker-compose up -dログを表示します。
docker-compose logs -f
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
app |
target.application |
app フィールドのコロンの後の値。 |
apphost |
target.hostname |
直接マッピングされます。 |
browser |
network.http.user_agent |
直接マッピングされます。 |
bytes_in |
network.received_bytes |
直接マッピングされます。 |
bytes_out |
network.sent_bytes |
直接マッピングされます。 |
cc |
principal.location.country_or_region |
直接マッピングされます。 |
client_id |
additional.fields.key: "Client Id", additional.fields.value.string_value: client_id |
client_id が存在する場合は条件付きでマッピングされます。 |
clientip |
principal.ip |
直接マッピングされます。 |
cloud_zone |
principal.cloud.availability_zone |
直接マッピングされます。 |
connector_resp_time |
security_result.detection_fields.key: "Connector response time", security_result.detection_fields.value: connector_resp_time |
connector_resp_time が空でないか「-」でない場合、条件付きでマッピングされます。 |
content_type |
additional.fields.key: "Content type", additional.fields.value.string_value: content_type |
content_type が存在する場合は条件付きでマッピングされます。 |
datetime |
metadata.event_timestamp |
RFC3339 形式を使用して datetime フィールドから解析されます。 |
deny_reason |
security_result.summary |
直接マッピングされます。 |
device_type |
principal.platform、principal.platform_version |
正規表現の一致に基づいて WINDOWS、LINUX、または MAC にマッピングされます。未加工の値は principal.platform_version にマッピングされます。 |
di |
metadata.ingestion_labels.key: "di", metadata.ingestion_labels.value: di |
取り込みラベルとして直接マッピングされます。 |
error_code |
additional.fields.key: "Error code", additional.fields.value.string_value: error_code |
error_code が存在する場合は条件付きでマッピングされます。 |
event |
metadata.description |
直接マッピングされます。 |
geo_city |
principal.location.city |
直接マッピングされます。 |
geo_country |
principal.location.country_or_region |
直接マッピングされます。 |
geo_state |
principal.location.state |
直接マッピングされます。 |
groups |
principal.user.group_identifiers |
直接マッピングされます。 |
http_method |
network.http.method |
直接マッピングされます。 |
http_ver |
network.application_protocol、network.application_protocol_version |
grok を使用して解析され、プロトコルとバージョンが抽出されます。 |
idpinfo |
additional.fields.key: "IDP Info", additional.fields.value.string_value: idpinfo |
idpinfo が存在する場合は条件付きでマッピングされます。 |
internal_host |
additional.fields.key: "Internal host", additional.fields.value.string_value: internal_host |
internal_host が存在する場合は条件付きでマッピングされます。 |
metadata.log_type |
metadata.log_type |
「AKAMAI_EAA」にハードコードされています。 |
metadata.product_name |
metadata.product_name |
「AKAMAI_EAA」にハードコードされています。 |
metadata.vendor_name |
metadata.vendor_name |
「AKAMAI_EAA」にハードコードされています。 |
metadata.event_type |
metadata.event_type |
ロジックによって決定されます。uid が存在する場合は USER_UNCATEGORIZED、principal.ip と target の両方が設定されている場合は NETWORK_HTTP、それ以外の場合は GENERIC_EVENT。 |
origin_host |
additional.fields.key: "Origin host", additional.fields.value.string_value: origin_host |
origin_host が存在する場合は条件付きでマッピングされます。 |
origin_resp_time |
security_result.detection_fields.key: "オリジン応答時間", security_result.detection_fields.value: origin_resp_time |
origin_resp_time が空でないか「-」でない場合、条件付きでマッピングされます。 |
os |
principal.platform |
正規表現の一致に基づいて WINDOWS、MAC、または LINUX にマッピングされます。 |
port |
target.port |
app フィールドのコロンの後の値。 |
ral |
metadata.description |
ral 配列の連結値(カンマ区切り)。 |
referer |
network.http.referral_url |
直接マッピングされます。 |
resource |
principal.resource.attribute.labels.key: "Resource", principal.resource.attribute.labels.value: resource |
resource が存在する場合は条件付きでマッピングされます。 |
resource_type |
principal.resource.attribute.labels.key: "Resource Type", principal.resource.attribute.labels.value: resource_type |
resource_type が存在する場合は条件付きでマッピングされます。 |
rscd |
metadata.ingestion_labels.key: "rscd", metadata.ingestion_labels.value: rscd |
取り込みラベルとして直接マッピングされます。 |
session_id |
network.session_id |
直接マッピングされます。 |
session_info |
additional.fields.key: 「セッション情報」、additional.fields.value.string_value: session_info |
session_info が存在する場合は条件付きでマッピングされます。 |
state |
principal.location.state |
直接マッピングされます。 |
status_code |
network.http.response_code |
直接マッピングされます。 |
total_resp_time |
security_result.detection_fields.key: "Total response time", security_result.detection_fields.value: total_resp_time |
total_resp_time が空でないか「-」でない場合、条件付きでマッピングされます。 |
ts |
metadata.event_timestamp |
存在する場合は ts フィールドから UNIX ミリ秒または秒として解析され、存在しない場合は datetime フィールドから解析されます。 |
uid |
principal.user.userid |
直接マッピングされます。 |
uip |
principal.ip |
直接マッピングされます。 |
url_path |
target.url |
直接マッピングされます。 |
user_agent |
network.http.user_agent、network.http.parsed_user_agent |
直接マッピングされ、構造化された parsed_user_agent フィールドに解析されます。 |
username |
principal.user.email_addresses または principal.user.userid |
メールアドレスのように見える場合は email_addresses に、それ以外の場合は userid にマッピングされます。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。