CyberArk EPM ログを収集する

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

このドキュメントでは、AWS S3 を使用して CyberArk EPM ログを Google Security Operations に取り込む方法について説明します。パーサーは、CyberArk EPM ログデータを統合データモデル(UDM)に変換します。ログ内の各イベントを反復処理し、関連するフィールドを対応する UDM フィールドにマッピングし、exposedUsers などの特定のデータ構造を処理して、ベンダーとプロダクトの静的情報で出力を拡充します。

始める前に

  • Google Security Operations インスタンスがあることを確認します。
  • AWS への特権アクセス権があることを確認します。
  • EPM Server Management コンソールへの特権アクセス権があることを確認します。

Google SecOps の取り込み用に AWS IAM を構成する

  1. IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
  2. 作成した [ユーザー] を選択します。
  3. [セキュリティ認証情報] タブを選択します。
  4. [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
  5. [ユースケース] として [サードパーティ サービス] を選択します。
  6. [次へ] をクリックします。
  7. (省略可)説明タグを追加します。
  8. [アクセスキーを作成] をクリックします。
  9. [CSV ファイルをダウンロード] をクリックして、[アクセスキー] と [シークレット アクセスキー] を保存し、後で使用できるようにします。
  10. [完了] をクリックします。
  11. [権限] タブを選択します。
  12. [権限ポリシー] セクションで、[権限を追加] をクリックします。
  13. [権限を追加] を選択します。
  14. [ポリシーを直接アタッチする] を選択します。
  15. AmazonS3FullAccess ポリシーを検索して選択します。
  16. [次へ] をクリックします。
  17. [権限を追加] をクリックします。

API アクセス用に CyberArk EPM を構成する

  1. 管理者として CyberArk EPM ウェブ コンソールにログインします。
  2. [管理] > [アカウント管理] に移動します。
  3. [+ ユーザーを追加] をクリックします。
  4. 以下の詳細を入力します。
    • ユーザー名: epm_api_user
    • パスワード: 強力なシークレット
    • メールアドレス/氏名: 省略可
  5. [権限] で、取得したログのすべての Set に対して ViewOnlySetAdmin を付与します。
  6. [保存] をクリックします。
  7. 省略可: セッションのタイムアウトを延長する:
    • [管理 > アカウント設定] に移動します。
    • [Timeout for inactive session] を 60 分に設定します。
    • [保存] をクリックします。
  8. [Policy & Sets]> セットを選択 > [Properties] に移動します。
  9. [Set ID (a GUID)] をコピーして保存します。スクリプトでは EPM_SET_ID として使用します。

AWS S3 バケットを作成する

  1. AWS Management Console にログインします。
  2. AWS コンソール > サービス > S3 > バケットの作成 に移動します。
  3. 次の構成の詳細を指定します。
    • バケット名: my-cyberark-epm-logs
    • リージョン: 選択 > [作成]

EC2 の IAM ロールを作成する

  1. AWS Management Console にログインします。
  2. [サービス] に移動します。
  3. 検索バーに「IAM」と入力して選択します。
  4. [IAM] ダッシュボードで、[ロール] をクリックします。
  5. [Create role] をクリックします。
  6. 次の構成の詳細を指定します。
    • 信頼できるエンティティ: [AWS サービス] > [EC2] > [次へ]。
    • 権限を関連付ける: AmazonS3FullAccess(またはバケットに対するスコープ設定されたポリシー)> [次へ]。
    • ロール名: EC2-S3-EPM-Writer > [ロールを作成] を選択します。

省略可: EC2 Collector VM を起動して構成する

  1. AWS Management Console にログインします。
  2. [サービス] に移動します。
  3. 検索バーに「EC2」と入力して選択します。
  4. EC2 ダッシュボードで、[インスタンス] をクリックします。
  5. [インスタンスを起動] をクリックします。
  6. 次の構成の詳細を指定します。
    • 名前: 「EPM-Log-Collector」と入力します。
    • AMI: Ubuntu Server 22.04 LTS を選択します。
    • インスタンス タイプ: t3.micro(またはそれより大きいサイズ)を選択し、[次へ] をクリックします。
    • ネットワーク: ネットワーク設定がデフォルトの VPC に設定されていることを確認します。
    • IAM ロール: メニューから EC2-S3-EPM-Writer` IAM ロールを選択します。
    • パブリック IP の自動割り当て: [有効] に設定します。VPN 経由で接続する場合は、この設定を無効のままにできます。
    • ストレージを追加: デフォルトのストレージ構成(8 GiB)のままにして、[次へ] をクリックします。
    • [新しいセキュリティ グループを作成] を選択します。
    • インバウンド ルール: [ルールを追加] をクリックします。
    • タイプ: SSH を選択します。
    • ポート: 22。
    • ソース: あなたの IP
    • [確認してリリース] をクリックします。
    • 鍵ペアを選択または作成します。
    • [Download Key Pair] をクリックします。
    • ダウンロードした PEM ファイルを保存します。このファイルは、SSH 経由でインスタンスに接続するために必要です。
  7. SSH を使用して仮想マシン(VM)に接続します。

    chmod 400 ~/Downloads/your-key.pem
    ssh -i ~/Downloads/your-key.pem ubuntu@<EC2_PUBLIC_IP>
    

コレクタの前提条件をインストールする

  1. オペレーティング システムを更新します。

    # Update OS
    sudo apt update && sudo apt upgrade -y
    
    # Install Python, Git
    sudo apt install -y python3 python3-venv python3-pip git
    
    # Create & activate virtualenv
    python3 -m venv ~/epm-venv
    source ~/epm-venv/bin/activate
    
    # Install libraries
    pip install requests boto3
    
  2. ディレクトリと状態ファイルを作成します。

    sudo mkdir -p /var/lib/epm-collector
    sudo touch /var/lib/epm-collector/last_run.txt
    sudo chown ubuntu:ubuntu /var/lib/epm-collector/last_run.txt
    
  3. 初期化します(1 時間前など)。

    echo "$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)" > /var/lib/epm-collector/last_run.txt
    

コレクタ スクリプトをデプロイする

  1. プロジェクト フォルダを作成します。

    mkdir ~/epm-collector && cd ~/epm-collector
    
  2. 環境変数を設定します(例: ~/.bashrc)。

    export EPM_URL="https://epm.mycompany.com"
    export EPM_USER="epm_api_user"
    export EPM_PASS="YourPasswordHere"
    export EPM_SET_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    export S3_BUCKET="my-cyberark-epm-logs"
    export S3_PREFIX="epm/"
    
  3. collector.py を作成し、次の内容を貼り付けます。

    #!/usr/bin/env python3
    import os
    import sys
    import json
    import boto3
    import requests
    from datetime import datetime, timezone, timedelta
    
    # ── LOAD CONFIG FROM ENV ───────────────────────────────────────────────────────
    def must_env(var):
        v = os.getenv(var)
        if not v:
            print(f"ERROR: environment variable {var} is required", file=sys.stderr)
            sys.exit(1)
        return v
    
    EPM_URL    = must_env("EPM_URL")        # for example, https://epm.mycompany.com
    USERNAME   = must_env("EPM_USER")       # API username
    PASSWORD   = must_env("EPM_PASS")       # API password
    SET_ID     = must_env("EPM_SET_ID")     # GUID of the Set to pull
    S3_BUCKET  = must_env("S3_BUCKET")      # for example, my-cyberark-epm-logs
    S3_PREFIX  = os.getenv("S3_PREFIX", "") # optional, for example "epm/"
    STATE_FILE = os.getenv("STATE_FILE", "/var/lib/epm-collector/last_run.txt")
    PAGE_SIZE  = int(os.getenv("PAGE_SIZE", "100"))
    # ── END CONFIG ────────────────────────────────────────────────────────────────
    
    def read_last_run():
        try:
            ts = open(STATE_FILE).read().strip()
            return datetime.fromisoformat(ts.replace("Z","+00:00"))
        except:
            # default to 1 hour ago
            return datetime.now(timezone.utc) - timedelta(hours=1)
    
    def write_last_run(dt):
        with open(STATE_FILE, "w") as f:
            f.write(dt.strftime("%Y-%m-%dT%H:%M:%SZ"))
    
    def logon():
        r = requests.post(
            f"{EPM_URL}/REST/EPMService.svc/Logon",
            json={"username": USERNAME, "password": PASSWORD},
            headers={"Content-Type": "application/json"}
        )
        r.raise_for_status()
        return r.json().get("SessionToken")
    
    def logoff(token):
        requests.post(
            f"{EPM_URL}/REST/EPMService.svc/Logoff",
            headers={"Authorization": f"Bearer {token}"}
        )
    
    def fetch_raw_events(token, start, end):
        headers = {"Authorization": f"Bearer {token}"}
        page = 1
        while True:
            params = {
                "setId":     SET_ID,
                "startDate": start,
                "endDate":   end,
                "pageSize":  PAGE_SIZE,
                "pageNumber": page
            }
            resp = requests.get(
                f"{EPM_URL}/REST/EPMService.svc/GetRawEvents",
                headers=headers, params=params
            )
            resp.raise_for_status()
            events = resp.json().get("RawEvents", [])
            if not events:
                break
            yield from events
            page += 1
    
    def upload_to_s3(obj, key):
        boto3.client("s3").put_object(
            Bucket=S3_BUCKET,
            Key=key,
            Body=json.dumps(obj).encode("utf-8")
        )
    
    def main():
        # determine time window
        start_dt = read_last_run()
        end_dt   = datetime.now(timezone.utc)
        START = start_dt.strftime("%Y-%m-%dT%H:%M:%SZ")
        END   = end_dt.strftime("%Y-%m-%dT%H:%M:%SZ")
    
        token = logon()
        try:
            for idx, raw_evt in enumerate(fetch_raw_events(token, START, END), start=1):
                key = f"{S3_PREFIX}{end_dt.strftime('%Y/%m/%d')}/raw_{int(end_dt.timestamp())}_{idx}.json"
                upload_to_s3(raw_evt, key)
                print(f"Uploaded raw event to {key}")
        finally:
            logoff(token)
    
        # persist for next run
        write_last_run(end_dt)
    
    if __name__ == "__main__":
        main()
    
  4. スクリプトを実行可能にします。

    chmod +x collector.py
    

Cron を使用して自動化する

  1. crontab を開きます。

    crontab -e
    
  2. 毎日のジョブを追加します。

    0 0 * * * cd ~/epm-collector && source ~/epm-venv/bin/activate && python collector.py >> ~/epm-collector/epm.log 2>&1
    

Cyberark EPM のログを取り込むように Google SecOps でフィードを構成する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [新しく追加] をクリックします。
  3. [フィード名] フィールドに、フィードの名前を入力します(例: Cyberark EPM Logs)。
  4. [ソースタイプ] として [Amazon S3] を選択します。
  5. [ログタイプ] として [Cyberark EPM] を選択します。
  6. [次へ] をクリックします。
  7. 次の入力パラメータの値を指定します。

    • リージョン: Amazon S3 バケットが配置されているリージョン。
    • S3 URI: バケット URI(形式は s3://your-log-bucket-name/ にする必要があります)。次の内容を置き換えます。
      • your-log-bucket-name: バケットの名前。
    • URI is a: [ディレクトリ] または [サブディレクトリを含むディレクトリ] を選択します。
    • Source deletion options: 必要に応じて削除オプションを選択します。
    • アクセスキー ID: s3 バケットにアクセスできるユーザー アクセスキー。
    • シークレット アクセスキー: s3 バケットにアクセスできるユーザーのシークレット キー。
    • アセットの名前空間: アセットの名前空間
    • Ingestion labels: このフィードのイベントに適用されるラベル。
  8. [次へ] をクリックします。

  9. [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

UDM マッピング テーブル

ログフィールド UDM マッピング 論理
agentId principal.asset.asset_id 「agentId:」と agentId フィールドの値を連結します。
computerName principal.hostname computerName フィールドを直接マッピングします。
displayName metadata.description displayName フィールドを直接マッピングします。
eventType metadata.product_event_type eventType フィールドを直接マッピングします。
exposedUsers.[].accountName target.user.attribute.labels キー「accountName_[index]」と exposedUsers.[index].accountName の値でラベルを作成します。
exposedUsers.[].domain target.user.attribute.labels キー「domain_[index]」と exposedUsers.[index].domain の値でラベルを作成します。
exposedUsers.[].username target.user.attribute.labels キー「username_[index]」と exposedUsers.[index].username の値でラベルを作成します。
filePath target.file.full_path filePath フィールドを直接マッピングします。
hash target.file.sha1 hash フィールドを直接マッピングします。
operatingSystemType principal.platform operatingSystemType フィールドが「Windows」の場合、「Windows」を「WINDOWS」にマッピングします。
policyName security_result.rule_name policyName フィールドを直接マッピングします。
processCommandLine target.process.command_line processCommandLine フィールドを直接マッピングします。
publisher additional.fields キー「Publisher」と publisher フィールドの string_value でフィールドを作成します。
sourceProcessCommandLine target.process.parent_process.command_line sourceProcessCommandLine フィールドを直接マッピングします。
sourceProcessHash target.process.parent_process.file.sha1 sourceProcessHash フィールドを直接マッピングします。
sourceProcessSigner additional.fields キー「sourceProcessSigner」と sourceProcessSigner フィールドの string_value でフィールドを作成します。
threatProtectionAction security_result.action_details threatProtectionAction フィールドを直接マッピングします。
metadata.event_timestamp イベントのタイムスタンプをログエントリの create_time に設定します。
metadata.event_type 「STATUS_UPDATE」にハードコードされています。
metadata.log_type 「CYBERARK_EPM」にハードコードされています。
metadata.product_name 「EPM」にハードコードされています。
metadata.vendor_name 「CYBERARK」にハードコードされています。
security_result.alert_state 「ALERTING」にハードコードされています。
userName principal.user.userid userName フィールドを直接マッピングします。

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。