Akamai Enterprise Application Access のログを収集する

パーサーのバージョン: 3.0

以下でサポートされています。

このドキュメントでは、Akamai Unified Log Streamer(ULS)と Bindplane を使用して、Akamai Enterprise Application Access(EAA)ログを Google Security Operations に取り込む方法について説明します。Akamai EAA は、従来の VPN を使用せずに、エンタープライズ アプリケーションへの安全な ID 認識アクセスを提供するゼロトラスト ネットワーク アクセス ソリューションです。EAA は、アクセスログ、管理者監査ログ、コネクタの健全性指標、デバイス インベントリ、ディレクトリの健全性情報の形式で運用データを生成します。パーサーは、JSON ログからフィールドを抽出し、文字列変換や IP アドレス抽出などのデータ変換を実行して、これらのフィールドを UDM にマッピングします。また、特定のフィールドの有無に基づいて、NETWORK_HTTP や USER_UNCATEGORIZED などのさまざまなイベントタイプを処理します。

始める前に

次の前提条件を満たしていることを確認してください。

  • Google SecOps インスタンス。
  • Bindplane エージェントを実行するための systemd を備えた Windows Server 2016 以降または Linux ホスト。
  • Python 3.9 以降を搭載した Linux ホスト、または Unified Log Streamer を実行するコンテナ化された環境(Docker または Kubernetes)。
  • プロキシの背後で実行している場合は、Bindplane エージェントの要件に従ってファイアウォール ポートが開いていることを確認します。
  • 管理者権限を持つ Akamai EAA テナント。
  • Akamai API 認証情報:

    • アクセス監査フィードと管理監査フィードの場合: EAA Legacy API キーとシークレット(Enterprise Center で作成)。
    • コネクタの健全性、デバイス インベントリ、ディレクトリの健全性フィードの場合: Enterprise Application Access API への読み取り / 書き込みアクセス権を持つ Akamai OPEN API 認証情報(EdgeGrid 認証)。

Bindplane エージェントの Google SecOps 認証情報を取得する

Bindplane エージェントを Google SecOps に対して認証するには、次のいずれかの方法を選択します。

  • 新規デプロイ: Chronicle API を使用します(オプション 1)。
  • 以前のデプロイ: 2027 年 7 月 20 日に Ingestion API が廃止されるまで、取り込み認証ファイル(オプション 2)を引き続き使用します。
  1. Google Cloud コンソールにログインし、Google SecOps インスタンスにリンクされている Google Cloud プロジェクトを選択します。
  2. [IAM と管理] > [サービス アカウント] に移動します。
  3. [サービス アカウントを作成] をクリックします。
  4. 次の構成情報を指定します。
    • サービス アカウント名: アカウントの名前を入力します(例: bindplane-ingest)。
    • サービス アカウントの説明: 説明を入力します(例: Bindplane agent log ingestion)。
  5. [作成して続行] をクリックします。
  6. [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、[ロールを選択] をクリックし、[Chronicle 編集者] を選択します。
  7. [続行] をクリックして [完了] をクリックします。
  8. 作成したサービス アカウントをクリックし、[キー] タブに移動します。
  9. [鍵を追加] > [新しい鍵を作成] の順にクリックします。
  10. [JSON] を選択し、[作成] をクリックします。鍵ファイルがパソコンにダウンロードされます。
  11. 鍵ファイルを Bindplane コレクタ ディレクトリ(Linux の場合は /opt/observiq-otel-collector/ingestion-auth.json、Windows の場合は C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json)に ingestion-auth.json として保存するか、config.yaml の creds_file_path を保存先のパスと一致するように更新します。
  12. [IAM と管理] > [設定] に移動し、[プロジェクト番号] をコピーします。エクスポーターの構成に必要になります。

オプション 2: 取り込み認証ファイルをダウンロードする(レガシー)

  1. Google SecOps コンソールにログインします。
  2. [SIEM 設定] > [収集エージェント] に移動します。
  3. 取り込み認証ファイルをダウンロードします。
  4. Bindplane エージェントがインストールされるシステムにファイルを安全に保存します。

Google SecOps のお客様 ID を取得する

  1. Google SecOps コンソールにログインします。
  2. [SIEM 設定] > [プロファイル] に移動します。
  3. [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。

Bindplane エージェントをインストールする

次の手順に沿って、Windows または Linux オペレーティング システムに Bindplane エージェントをインストールします。

Windows のインストール

  1. 管理者としてコマンド プロンプトまたは PowerShell を開きます。
  2. 次のコマンドを実行します。

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Linux へのインストール

  1. root 権限または sudo 権限でターミナルを開きます。
  2. 次のコマンドを実行します。

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

その他のインストール リソース

その他のインストール オプションについては、Bindplane エージェントのインストール ガイドをご覧ください。

ログを取り込んで Google SecOps に送信するように Bindplane エージェントを構成する

  1. テキスト エディタで Bindplane エージェントの構成ファイルを開きます。

    Linux:

    sudo nano /opt/observiq-otel-collector/config.yaml
    

    Windows:

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    
  2. config.yaml ファイルを次のように編集します。

    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
    

次のように置き換えます。

  • /path/to/ingestion-authentication-file.json: サービス アカウントの JSON キーファイルのフルパス(オプション 1)。
    • Linux: /opt/observiq-otel-collector/ingestion-auth.json
    • Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
  • <LOCATION> は、Google SecOps インスタンスのリージョン(us、europe、asia-southeast1 など)に置き換えます。エクスポータは、chronicle.googleapis.com の先頭にこの値を付加します。
  • <PROJECT_NUMBER> は、[IAM と管理] > [設定] のプロジェクト番号に置き換えます。
  • <CUSTOMER_ID>: Google SecOps のお客様 ID。
  • 0.0.0.0:5140: Bindplane がリッスンする IP アドレスとポート。環境に合わせて必要に応じて調整します。

以前の Ingestion API エクスポータ

  • オプション 2 の取り込み認証ファイルを使用する場合は、exporters ブロックを次のように置き換えます。creds_file_path を取り込み認証ファイルのパスに設定します。インスタンスが米国以外にある場合は、malachiteingestion-pa.googleapis.com をリージョン エンドポイント(例: 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
    

Bindplane エージェントを再起動して変更を適用する

Linux で Bindplane エージェントを再起動するには:

  1. 次のコマンドを実行します。

    sudo systemctl restart observiq-otel-collector
    
  2. サービスが実行されていることを確認します。

    sudo systemctl status observiq-otel-collector
    
  3. ログでエラーを確認します。

    sudo journalctl -u observiq-otel-collector -f
    

Windows で Bindplane エージェントを再起動するには:

  1. 次のいずれかのオプションを選択します。

    • 管理者としてコマンド プロンプトまたは PowerShell を開きます。
    net stop observiq-otel-collector && net start observiq-otel-collector
    
    • サービス コンソール:
      1. Win+R を押し、「services.msc」と入力して Enter キーを押します。
      2. observIQ OpenTelemetry Collector を見つけます。
      3. 右クリックして [再起動] を選択します。
  2. サービスが実行されていることを確認します。

    sc query observiq-otel-collector
    
  3. ログでエラーを確認します。

    type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
    

Akamai API 認証情報を作成する

Akamai EAA は、フィードの種類に応じて 2 種類の API 認証情報を使用します。収集するフィードに対応する認証情報を作成します。

EAA Legacy API 認証情報を作成する(アクセス フィードと管理フィード用)

  1. Akamai Control Center にログインします。
  2. 左側のメイン ナビゲーション メニューで [Enterprise Center] を選択します。
  3. [General Settings] > [Settings] に移動します。
  4. [API キー] タブを選択します。
  5. 右上にある [Generate new API Key] をクリックします。
  6. API キーの名前と説明を入力します。
  7. 確認画面で、[Key] と [Secret] をコピーします。

Akamai OPEN API 認証情報を作成する(コネクタの健全性、デバイス インベントリ、ディレクトリの健全性フィード用)

  1. Akamai Control Center にログインします。
  2. [Account Admin] > [Identity and access] に移動します。
  3. [API Users] タブを選択します。
  4. [API クライアントを作成] をクリックします。
  5. [API を選択] セクションで、[Enterprise Application Access] を検索し、アクセスレベルを [読み取り / 書き込み] に設定します。
  6. 残りの設定を完了して、[API クライアントを作成] をクリックします。
  7. [ダウンロード] をクリックして .edgerc 形式で認証情報をダウンロードするか、[コピー] をクリックして既存の .edgerc ファイルにコピーします。

.edgerc 認証情報ファイルを構成する

  1. ULS を実行するシステムに .edgerc 認証情報ファイルを作成します。

    touch ~/.edgerc
    
  2. テキスト エディタでファイルを開きます。

    nano ~/.edgerc
    
  3. 次の形式で Akamai API 認証情報を追加します。

    [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>
    
  4. 認証情報ファイルを保護します。

    chmod 600 ~/.edgerc
    

次のように置き換えます。

  • <EAA_API_KEY>: EAA レガシー API キー(例: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)。
  • <EAA_API_SECRET>: EAA Legacy API シークレット。
  • <OPEN_API_HOST>: Akamai OPEN API ホスト名(例: akaa-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net)。
  • <CLIENT_TOKEN>: Akamai OPEN API クライアント トークン(例: akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx)。
  • <CLIENT_SECRET>: Akamai OPEN API クライアント シークレット。
  • <ACCESS_TOKEN>: Akamai OPEN API アクセス トークン(例: akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx)。

Akamai Unified Log Streamer をインストールする

Unified Log Streamer(ULS)は、Akamai API を介して Akamai EAA からログを pull し、TCP を使用して Bindplane エージェントにストリーミングします。ULS は Python 3.9 以降を必要とする Python アプリケーションです。

Linux へのインストール(Python)

  1. ULS リポジトリのクローンを作成します。

    git clone https://github.com/akamai/uls.git
    cd uls
    
  2. ULS Python の要件をインストールします。

    pip3 install -r bin/requirements.txt
    
  3. EAA CLI の依存関係をインストールします。

    git clone --depth 1 --single-branch https://github.com/akamai/cli-eaa.git ext/cli-eaa
    pip3 install -r ext/cli-eaa/requirements.txt
    
  4. インストールを確認します。

    python3 bin/uls.py --help
    

Docker のインストール

  1. 公式の ULS Docker イメージを pull します。

    docker pull akamai/uls:latest
    

EAA ログを Bindplane にストリーミングするように ULS を構成する

コマンドライン実行(テスト)

  • TCP 出力で ULS を実行して、ログを Bindplane エージェントにストリーミングします。

    python3 bin/uls.py --input eaa \
        --feed access \
        --output tcp \
        --host <BINDPLANE_HOST> \
        --port 5140 \
        --edgerc ~/.edgerc \
        --section default
    

次のように置き換えます。

  • <BINDPLANE_HOST>: Bindplane エージェントを実行しているサーバーの IP アドレスまたはホスト名。
  • 5140: Bindplane tcplog レシーバーで構成されたポート。

  • 複数のフィードタイプをストリーミングするには、個別の ULS インスタンスを実行します。

    # 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
    

Systemd サービス(本番環境)

本番環境のデプロイでは、ULS を systemd サービスとして構成します。

  1. ULS 構成ファイルを作成します。

    sudo mkdir -p /etc/uls
    sudo nano /etc/uls/eaa-access-tcp.conf
    
  2. 次の構成を追加します。

    ULS_INPUT=eaa
    ULS_FEED=access
    ULS_OUTPUT=tcp
    ULS_HOST=<BINDPLANE_HOST>
    ULS_PORT=5140
    ULS_EDGERC=/root/.edgerc
    ULS_SECTION=default
    
  3. systemd サービス ファイルを作成します。

    sudo nano /etc/systemd/system/uls-eaa-access.service
    
  4. 次の内容を追加します。

    [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.target
    
  5. サービスを有効にして起動します。

    sudo systemctl daemon-reload
    sudo systemctl enable uls-eaa-access.service
    sudo systemctl start uls-eaa-access.service
    
  6. サービスが実行されていることを確認します。

    sudo systemctl status uls-eaa-access.service
    
  7. ログを表示します。

    sudo journalctl -u uls-eaa-access.service -f
    

別の名前(uls-eaa-admin.service、uls-eaa-conhealth.service など)の構成ファイルとサービスファイルを作成して、追加のフィードタイプ(admin、conhealth)ごとに手順 1 ~ 7 を繰り返します。

Docker Compose によるデプロイ

  1. 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
    

<BINDPLANE_HOST> は、Bindplane エージェント サーバーの IP アドレスまたはホスト名に置き換えます。

  1. コンテナを起動します。

    docker compose up -d
    
  2. ログを表示します。

    docker compose logs -f
    

UDM マッピング テーブル

ログフィールド UDM マッピング ロジック
app target.application app フィールドのコロンの後の値。
apphost target.hostname 直接マッピングされます。
browser network.http.user_agent 直接マッピングされます。
bytes_in network.recieved_bytes 直接マッピングされます。
bytes_out network.sent_bytes 直接マッピングされます。
cc principal.location.country_or_region 直接マッピングされます。
client_id additional.fields.key: "クライアント 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: "コネクタのレスポンス時間", security_result.detection_fields.value: connector_resp_time connector_resp_time が空でないか「-」でない場合、条件付きでマッピングされます。
content_type additional.fields.key: 「コンテンツ タイプ」、additional.fields.value.string_value: content_type content_type が存在する場合、条件付きでマッピングされます。
datetime metadata.event_timestamp RFC 3339 形式を使用して 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: "エラーコード", 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: "内部ホスト", 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: "リソースタイプ", 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 のプロフェッショナルから回答を得ることができます。