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 を構成する
- IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成した [ユーザー] を選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- (省略可)説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックして、[アクセスキー] と [シークレット アクセスキー] を保存し、後で使用できるようにします。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションで、[権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- AmazonS3FullAccess ポリシーを検索して選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
API アクセス用に CyberArk EPM を構成する
- 管理者として CyberArk EPM ウェブ コンソールにログインします。
- [管理] > [アカウント管理] に移動します。
- [+ ユーザーを追加] をクリックします。
- 以下の詳細を入力します。
- ユーザー名: epm_api_user
- パスワード: 強力なシークレット
- メールアドレス/氏名: 省略可
- [権限] で、取得したログのすべての Set に対して ViewOnlySetAdmin を付与します。
- [保存] をクリックします。
- 省略可: セッションのタイムアウトを延長する:
- [管理 > アカウント設定] に移動します。
- [Timeout for inactive session] を 60 分に設定します。
- [保存] をクリックします。
- [Policy & Sets]> セットを選択 > [Properties] に移動します。
- [Set ID (a GUID)] をコピーして保存します。スクリプトでは EPM_SET_ID として使用します。
AWS S3 バケットを作成する
- AWS Management Console にログインします。
- AWS コンソール > サービス > S3 > バケットの作成 に移動します。
- 次の構成の詳細を指定します。
- バケット名: my-cyberark-epm-logs
- リージョン: 選択 > [作成]
EC2 の IAM ロールを作成する
- AWS Management Console にログインします。
- [サービス] に移動します。
- 検索バーに「
IAM
」と入力して選択します。 - [IAM] ダッシュボードで、[ロール] をクリックします。
- [Create role] をクリックします。
- 次の構成の詳細を指定します。
- 信頼できるエンティティ: [AWS サービス] > [EC2] > [次へ]。
- 権限を関連付ける: AmazonS3FullAccess(またはバケットに対するスコープ設定されたポリシー)> [次へ]。
- ロール名: EC2-S3-EPM-Writer > [ロールを作成] を選択します。
省略可: EC2 Collector VM を起動して構成する
- AWS Management Console にログインします。
- [サービス] に移動します。
- 検索バーに「EC2」と入力して選択します。
- EC2 ダッシュボードで、[インスタンス] をクリックします。
- [インスタンスを起動] をクリックします。
- 次の構成の詳細を指定します。
- 名前: 「
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 経由でインスタンスに接続するために必要です。
- 名前: 「
SSH を使用して仮想マシン(VM)に接続します。
chmod 400 ~/Downloads/your-key.pem ssh -i ~/Downloads/your-key.pem ubuntu@<EC2_PUBLIC_IP>
コレクタの前提条件をインストールする
オペレーティング システムを更新します。
# 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
ディレクトリと状態ファイルを作成します。
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
初期化します(1 時間前など)。
echo "$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)" > /var/lib/epm-collector/last_run.txt
コレクタ スクリプトをデプロイする
プロジェクト フォルダを作成します。
mkdir ~/epm-collector && cd ~/epm-collector
環境変数を設定します(例: ~/.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/"
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()
スクリプトを実行可能にします。
chmod +x collector.py
Cron を使用して自動化する
crontab を開きます。
crontab -e
毎日のジョブを追加します。
0 0 * * * cd ~/epm-collector && source ~/epm-venv/bin/activate && python collector.py >> ~/epm-collector/epm.log 2>&1
Cyberark EPM のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [新しく追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Cyberark EPM Logs
)。 - [ソースタイプ] として [Amazon S3] を選択します。
- [ログタイプ] として [Cyberark EPM] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- リージョン: 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: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[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 のプロフェッショナルから回答を得ることができます。