Workday HCM ログを収集する
このドキュメントでは、サードパーティ API を使用してフィードを設定し、Workday HCM ログを Google Security Operations に取り込む方法について説明します。
パーサーは、JSON 形式のログから Workday HCM ユーザーデータを抽出します。フィールド名の変更、ネストされたオブジェクトの統合、日付の解析、ユーザー属性、雇用情報、組織構造の UDM フィールドへのデータの入力など、さまざまなデータ変換を処理します。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス。
- セキュリティ管理者または同等の権限を持つ Workday への特権アクセス。
Workday API 認証を構成する
統合システム ユーザー(ISU)を作成する
- 管理者権限で Workday にログインします。
- 検索バーに「統合システム ユーザーを作成」と入力し、タスクを選択します。
- [Username] にユーザー名を入力します(例:
ISU_SecOps_HCM)。 - パスワードを設定します。
- ISU がタイムアウトしないように、[Session Timeout Minutes] を
0に設定します。 - [UI セッションを許可しない] を有効にして、UI ログインを制限することでセキュリティを強化します。
- [Maintain Password Rules] タスクに移動します。
- 統合システム ユーザーを [パスワードの有効期限が切れないシステム ユーザー] フィールドに追加します。
統合セキュリティ グループを作成する
- 検索バーに「セキュリティ グループを作成」と入力し、タスクを選択します。
- [テナント化されたセキュリティ グループ] フィールドを見つけて、[統合システム セキュリティ グループ(制限なし)] を選択します。
- セキュリティ グループの名前を指定します(例:
ISG_SecOps_HCM)。 - [OK] をクリックします。
- 新しく作成したセキュリティ グループの [編集] をクリックします。
- 前の手順で作成した統合システム ユーザーをセキュリティ グループに割り当てます。
- [完了] をクリックします。
セキュリティ グループにドメイン アクセス権を付与する
Google SecOps フィードは、4 つの Workday REST API エンドポイントからデータを取得します。各エンドポイントでは、統合セキュリティ グループに特定のドメイン セキュリティ ポリシー権限を付与する必要があります。
- 検索バーに「セキュリティ グループの権限を維持」と入力し、タスクを選択します。
- [送信元セキュリティ グループ] リストから、作成したセキュリティ グループ(例:
ISG_SecOps_HCM)を選択します。 - [OK] をクリックします。
- [ドメイン セキュリティ ポリシーの権限] に移動します。
次の各ドメインに GET アクセス権を追加します。
API エンドポイント 必須のドメイン セキュリティ ポリシー /workers- ワーカーのリスト、プロフィール、現在のスタッフ配置Worker Data: Public Worker Reports、Worker Data: Current Staffing Information、Person Data: Work Contact Information/workers/{id}/timeOffEntries- 休暇残高Worker Data: Time Off (Time Off Balances)、Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history- ワーカーのスタッフ配置履歴Worker Data: Current Staffing Information/supervisoryOrganizations- 組織構造Worker Data: Organization Information[OK] をクリックします。
[完了] をクリックして変更を保存します。
セキュリティ ポリシーの変更を有効にする
- 検索バーに「保留中のセキュリティ ポリシーの変更を有効にする」と入力し、タスクを選択します。
- コメント欄に変更の理由を入力します(例:
Granting API access for Google SecOps HCM integration)。 - [OK] をクリックします。
- [確認] を選択し、[OK] をクリックします。
インテグレーション用の API クライアントを登録する
- 検索バーに「Register API Client for Integrations」と入力し、選択します。
- [作成] をクリックします。
次の構成情報を提供してください。
- クライアント名: 名前を入力します(例:
Google SecOps HCM Client)。 - システム ユーザー: 作成した統合システム ユーザー(
ISU_SecOps_HCMなど)を選択します。 範囲: 次のスコープを選択します。
範囲 必須となる対象 スタッフの割り当て /workersエンドポイントと/workers/{id}/historyエンドポイント連絡先情報 /workersから返される仕事用のメールアドレスと電話番号のフィールド(UDM の関連付けに使用)休暇と休職 /workers/{id}/timeOffEntriesエンドポイント組織とロール /supervisoryOrganizationsエンドポイントテナント構成不可 任意の OAuth 2.0 API クライアント(システムレベルの統合とトークン ローテーション)
- クライアント名: 名前を入力します(例:
[保存] をクリックします。
[OK] をクリックします。
クライアント ID とクライアント シークレットをすぐにコピーして保存します。
OAuth 2.0 更新トークンを生成する
- 検索バーに「Manage Refresh Tokens for Integrations」と入力して選択します。
- [新しい更新トークンを生成] をクリックします。
- [Workday アカウント] フィールドで、統合システム ユーザー(例:
ISU_SecOps_HCM)を検索して選択します。 - 作成した API クライアントを選択し、[OK] をクリックします。
- [Refresh Token] の値をコピーして保存します。
API エンドポイントの URL を取得する
- 検索バーに「View API Clients」と入力して選択します。
- [API Clients for Integrations] で、作成したクライアント(
Google SecOps HCM Clientなど)を見つけます。 次の詳細をコピーして保存します。
- トークン エンドポイント: アクセス トークンを取得する URL(例:
https://wd2-impl-services1.workday.com/ccx/oauth2/YOUR_TENANT/token)。 - Workday REST API エンドポイント: API 呼び出しのベース URL(例:
https://wd2-impl-services1.workday.com/ccx/api/v1/YOUR_TENANT)。
- トークン エンドポイント: アクセス トークンを取得する URL(例:
OAuth アクセス トークンを生成する
curl または同様の HTTP クライアントを使用して、トークン エンドポイントに POST リクエストを送信します。
curl -X POST "https://HOSTNAME/ccx/oauth2/TENANT/token" \
-d "grant_type=refresh_token" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "refresh_token=YOUR_REFRESH_TOKEN"
これにより、アクセス トークン("access_token": "abcd1234" など)が返されます。アクセス トークンをコピーして保存します。
API アクセスを確認する
フィードを構成する前に、ISU にキー エンドポイントに必要な権限があることを確認します。変数を実際の値に置き換えます。
TOKEN="your-access-token"
HOST="your-workday-host"
TENANT="your-tenant"
# Test 1: Workers (should return worker list)
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/workers?limit=1"
# Test 2: Time off entries (replace WORKER_ID with an ID from Test 1)
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/workers/WORKER_ID/timeOffEntries"
# Test 3: Worker history (replace WORKER_ID with an ID from Test 1)
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/workers/WORKER_ID/history"
# Test 4: Supervisory organizations
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/supervisoryOrganizations"
各テストは HTTP ステータス 200 を返す必要があります。エンドポイントから 403 が返された場合は、以下のトラブルシューティングのセクションをご覧ください。
Workday HCM データを取り込むように Google SecOps でフィードを構成する
フィードを設定する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで、[単一のフィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Workday HCM)。 - [ソースタイプ] として [サードパーティ API] を選択します。
- [ログタイプ] として [Workday] を選択します。
- [次へ] をクリックします。
フィード パラメータを構成する
次の入力パラメータの値を指定します。
API ホスト名: Workday REST API エンドポイントの完全修飾ドメイン名(例:
wd2-impl-services1.workday.com)。テナント: Workday インスタンスを識別する Workday REST API エンドポイントの最後のパス要素。
アクセス トークン: 前のセクションで生成された OAuth アクセス トークン。
詳細オプション:
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- [次へ] をクリックします。
- [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
トラブルシューティング
特定のエンドポイントで 403 Forbidden エラーが発生する
フィードでエラーが報告された場合や、特定のエンドポイントに対して検証 curl コマンドが 403 を返す場合は、統合システム ユーザーに権限がありません。
| 失敗したエンドポイント | 修正 |
|---|---|
/workers/{id}/timeOffEntries |
Worker Data: Time Off (Time Off Balances) ドメインと Worker Data: Time Off (Time Off Balances Manager View) ドメインの GET アクセス権を追加します。API クライアントに [Time Off and Leave] スコープを追加します。 |
/workers/{id}/history |
Worker Data: Historical Staffing Information ドメインの GET アクセス権を追加します。Staffing スコープが API クライアントに割り当てられていることを確認します。 |
/supervisoryOrganizations |
Manage: Supervisory Organization または View: Supervisory Organization ドメインの GET アクセス権を追加します。API クライアントに Organizations and Roles スコープを追加します。 |
権限を変更した後:
- Workday で Activate Pending Security Policy Changes を実行します。
- API クライアントに新しいスコープを追加した場合は、統合の更新トークンを管理するで新しい更新トークンを生成してから、新しいアクセス トークンを生成します。
- アクセス トークンが変更された場合は、新しいアクセス トークンでフィード設定を更新します。
認証エラー
- 401 Unauthorized: アクセス トークンの有効期限が切れています。更新トークンを使用して新しいトークンを生成し、フィードを更新します。
- Invalid client: クライアント ID とクライアント シークレットが正しいことを確認します。
- 更新トークンが無効: 更新トークンが取り消された可能性があります。インテグレーションの更新トークンを管理するで新しいトークンを生成します。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
entity_host_name |
entity.asset.hostname |
直接マッピングされます。 |
location.descriptor |
entity.location.city |
直接マッピングされます。 |
AU_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
直接マッピングされます。 |
COMPANY_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
直接マッピングされます。 |
ORIG_HIRE_DT |
entity.resource.attribute.labels.value |
直接マッピングされます。 |
STATUS_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
直接マッピングされます。 |
href |
entity.url |
直接マッピングされます。 |
CONT_START_DTE |
entity.user.attribute.labels.value |
直接マッピングされます。 |
EMPL_TYPE |
entity.user.attribute.labels.value |
直接マッピングされます。 |
EXEC_CD |
entity.user.attribute.labels.value |
直接マッピングされます。 |
EXEC_DESCR |
entity.user.attribute.labels.value |
直接マッピングされます。 |
HR_Status |
entity.user.attribute.labels.value |
直接マッピングされます。 |
Is_Active |
entity.user.attribute.labels.value |
直接マッピングされます。 |
Is_Manager |
entity.user.attribute.labels.value |
直接マッピングされます。 |
JOB_CODE |
entity.user.attribute.labels.value |
直接マッピングされます。 |
ORG_CD |
entity.user.attribute.labels.value |
直接マッピングされます。 |
ORG_Container |
entity.user.attribute.labels.value |
直接マッピングされます。 |
ORG_Container_Name |
entity.user.attribute.labels.value |
直接マッピングされます。 |
PER_Status |
entity.user.attribute.labels.value |
直接マッピングされます。 |
POSITION_NBR |
entity.user.attribute.labels.value |
直接マッピングされます。 |
PS_ELID |
entity.user.attribute.labels.value |
直接マッピングされます。 |
REG_TEMP |
entity.user.attribute.labels.value |
直接マッピングされます。 |
WB_LOGON_ID |
entity.user.attribute.labels.value |
直接マッピングされます。 |
ORG_DESCR |
entity.user.department |
統合済み |
primarySupervisoryOrganization.descriptor |
entity.user.department |
統合済み |
Email |
entity.user.email_addresses |
統合済み |
Work_Email |
entity.user.email_addresses |
統合済み |
primaryWorkEmail |
entity.user.email_addresses |
統合済み |
EMPLID |
entity.user.employee_id |
直接マッピングされます。 |
Employee_ID |
entity.user.employee_id |
直接マッピングされます。 |
First_Name |
entity.user.first_name |
直接マッピングされます。 |
Legal_Name_First_Name |
entity.user.first_name |
直接マッピングされます。 |
HIRE_DATE |
entity.user.hire_date |
RFC 3339 として解析済み |
Hire_Date |
entity.user.hire_date |
RFC 3339 として解析済み |
Last_Name |
entity.user.last_name |
直接マッピングされます。 |
Legal_Name_Last_Name |
entity.user.last_name |
直接マッピングされます。 |
gopher-supervisor.primaryWorkEmail |
entity.user.managers.email_addresses |
統合済み |
Reports_To_EMPLID |
entity.user.managers.employee_id |
直接マッピングされます。 |
gopher-supervisor.id |
entity.user.managers.product_object_id |
名前変更済み/マッピング済み |
Reports_To_Name |
entity.user.managers.user_display_name |
直接マッピングされます。 |
gopher-supervisor.descriptor |
entity.user.managers.user_display_name |
名前変更済み/マッピング済み |
primaryWorkPhone |
entity.user.phone_numbers |
統合済み |
Termination_Date |
entity.user.termination_date |
RFC 3339 として解析済み |
timeoff.descriptor |
entity.user.time_off.description |
直接マッピングされます。 |
timeoff.date |
entity.user.time_off.interval.start_time |
RFC 3339 として解析済み |
HR_JOB_TITLE |
entity.user.title |
直接マッピングされます。 |
Job_Profile |
entity.user.title |
直接マッピングされます。 |
businessTitle |
entity.user.title |
直接マッピングされます。 |
Full_Name |
entity.user.user_display_name |
直接マッピングされます。 |
descriptor |
entity.user.user_display_name |
直接マッピングされます。 |
udm_metadata |
metadata |
名前変更済み/マッピング済み |
metadata_entity_type |
metadata.entity_type |
直接マッピングされます。 |
actual_completed_date_and_time |
metadata.event_timestamp |
MM/dd/yyyy HH:mm:ss a として解析済み |
body.time |
metadata.event_timestamp |
UNIX_MS として解析済み |
requestTime |
metadata.event_timestamp |
RFC 3339 として解析済み |
timestamp |
metadata.event_timestamp |
RFC 3339 として解析済み |
EMPLID |
metadata.product_entity_id |
直接マッピングされます。 |
Employee_ID |
metadata.product_entity_id |
直接マッピングされます。 |
id |
metadata.product_entity_id |
直接マッピングされます。 |
Source_Name |
metadata.product_name |
直接マッピングされます。 |
userAgent |
network.http.parsed_user_agent |
名前変更済み/マッピング済み |
userAgent |
network.http.user_agent |
直接マッピングされます。 |
sessionId |
network.session_id |
直接マッピングされます。 |
ipAddress |
principal.ip |
統合済み |
taskId |
principal.process.pid |
直接マッピングされます。 |
activityAction_label |
principal.resource.attribute.labels |
統合済み |
body.event.Submitted_By |
principal.user.userid |
直接マッピングされます。 |
body.event.Response_Message |
security_result.action_details |
直接マッピングされます。 |
body.event.Messages |
security_result.description |
直接マッピングされます。 |
actual_start_date_and_time_label |
security_result.detection_fields |
統合済み |
background_process_is_running_label |
security_result.detection_fields |
統合済み |
by_person_label |
security_result.detection_fields |
統合済み |
created_from_trigger_label |
security_result.detection_fields |
統合済み |
items_processed_label |
security_result.detection_fields |
統合済み |
percent_complete_label |
security_result.detection_fields |
統合済み |
processing_time_label |
security_result.detection_fields |
統合済み |
scheduled_start_date_and_time_label |
security_result.detection_fields |
統合済み |
sent_on_label |
security_result.detection_fields |
統合済み |
total_duration_label |
security_result.detection_fields |
統合済み |
body.event.Integration_Event_Status |
security_result.summary |
直接マッピングされます。 |
body.event.Integration_System |
target.application |
直接マッピングされます。 |
target_data.id |
target.resource.product_object_id |
直接マッピングされます。 |
deviceType |
target.resource.resource_subtype |
直接マッピングされます。 |
deviceType |
target.resource.type |
マッピング: (?i)(Desktop/Laptop/Mobile) → DEVICE |
user_display_name |
target.user.user_display_name |
直接マッピングされます。 |
systemAccount |
target.user.userid |
直接マッピングされます。 |
| なし | entity.resource.attribute.labels.key |
定数: COMPANY_EFFECTIVE_DATE |
| なし | entity.user.attribute.labels.key |
定数: ORG_Container |
| なし | metadata.product_name |
定数: HCM |
| なし | metadata.vendor_name |
定数: Workday |
| なし | target.resource.type |
定数: DEVICE |
変更履歴
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。