Workday HCM ログを収集する
このドキュメントでは、サードパーティ API を使用してフィードを設定し、Workday HCM ログを Google Security Operations に取り込む方法について説明します。
パーサーは、JSON 形式のログから Workday HCM ユーザーデータを抽出します。フィールド名の変更、ネストされたオブジェクトのマージ、日付の解析、ユーザー属性、雇用情報、組織構造の UDM フィールドへの入力など、さまざまなデータ変換を処理します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- Workday への特権アクセス(セキュリティ管理者 または同等の権限)
Workday API 認証を構成する
統合システム ユーザー(ISU)を作成する
- 管理者権限で Workday にログインします。
- 検索バーに「Create Integration System User 」と入力し、タスクを選択します。
- [Username] にユーザー名を入力します(例:
ISU_SecOps_HCM)。 - パスワード を設定します。
- ISU がタイムアウトしないように、[Session Timeout Minutes] を
0に設定します。 - [Do Not Allow UI Sessions] を有効にして、UI ログインを制限することでセキュリティを強化します。
- [Maintain Password Rules] タスクに移動します。
- 統合システム ユーザーを [System Users exempt from password expiration] フィールドに追加します。
統合セキュリティ グループを作成する
- 検索バーに「Create Security Group 」と入力し、タスクを選択します。
- [Type of Tenanted Security Group] フィールドを見つけて、[Integration System Security Group (Unconstrained)] を選択します。
- セキュリティ グループの名前 を指定します(例:
ISG_SecOps_HCM)。 - [OK] をクリックします。
- 新しく作成したセキュリティ グループの [Edit] をクリックします。
- 前のステップで作成した統合システム ユーザーをセキュリティ グループに割り当てます。
- [Done] をクリックします。
セキュリティ グループにドメイン アクセス権を付与する
Google SecOps フィードは、4 つの Workday REST API エンドポイントからデータを取得します。各エンドポイントでは、統合セキュリティ グループに特定のドメイン セキュリティ ポリシー権限を付与する必要があります。
- 検索バーに「Maintain Permissions for Security Group 」と入力し、タスクを選択します。
- [Source Security Group] リストから、作成したセキュリティ グループ(例:
ISG_SecOps_HCM)を選択します。 - [OK] をクリックします。
- [Domain Security Policy Permissions] に移動します。
次の各ドメインに GET アクセス権を追加します。
API エンドポイント 必要なドメイン セキュリティ ポリシー /workers- ワーカーリストとプロファイルWorker Data: Public Worker Reports/workers/{id}/timeOffEntries- 休暇残高Worker Data: Time Off (Time Off Balances),Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history- ワーカーの配置履歴Worker Data: Historical Staffing Information/supervisoryOrganizations- 組織構造Manage: Supervisory OrganizationまたはView: Supervisory Organization[OK] をクリックします。
[Done] をクリックして変更を保存します。
セキュリティ ポリシーの変更を有効にする
- 検索バーに「Activate Pending Security Policy Changes 」と入力し、タスクを選択します。
- コメント欄に変更の理由を入力します(例:
Granting API access for Google SecOps HCM integration)。 - [OK] をクリックします。
- [Confirm] を選択し、[OK] をクリックします。
統合用の API クライアントを登録する
- 検索バーに「Register API Client for Integrations 」と入力して選択します。
- [Create] をクリックします。
次の構成情報を提供してください。
- クライアント名: 名前を入力します(例:
Google SecOps HCM Client)。 - システム ユーザー: 作成した統合システム ユーザー(例:
ISU_SecOps_HCM)を選択します。 スコープ: 次のスコープを選択します。
範囲 必須となる対象 スタッフの割り当て /workersエンドポイントと/workers/{id}/historyエンドポイント休暇と休職 /workers/{id}/timeOffEntriesエンドポイント組織とロール /supervisoryOrganizationsエンドポイント
- クライアント名: 名前を入力します(例:
[Save] をクリックします。
[OK] をクリックします。
クライアント ID とクライアント シークレット をコピーしてすぐに保存します。
OAuth 2.0 更新トークンを生成する
- 検索バーに「Manage Refresh Tokens for Integrations 」と入力して選択します。
- [Generate New Refresh Token] をクリックします。
- [Workday Account] フィールドで、統合システム ユーザー(例:
ISU_SecOps_HCM)を検索して選択します。 - 作成した API クライアントを選択し、[OK] をクリックします。
- 更新トークン をコピーして保存します。
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] をクリックします。
- 次のページで、[Configure a single feed] をクリックします。
- [Feed name] フィールドに、フィードの名前を入力します(例:
Workday HCM)。 - [Source type] として [Third Party API] を選択します。
- [Log type] で [Workday] を選択します。
- [次へ] をクリックします。
フィード パラメータを構成する
次の入力パラメータの値を指定します。
API ホスト名: Workday REST API エンドポイントの完全修飾ドメイン名(例:
wd2-impl-services1.workday.com)。テナント: Workday インスタンスを識別する Workday REST API エンドポイントの最後のパス要素。
アクセス トークン: 前のセクションで生成した OAuth アクセス トークン。
詳細オプション:
- アセットの名前空間: アセットの名前空間。
- 取り込みラベル: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[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 アクセス権を追加します。API クライアントに [Staffing] スコープが割り当てられていることを確認します。 |
/supervisoryOrganizations |
Manage: Supervisory Organization ドメインまたは View: Supervisory Organization ドメインに GET アクセス権を追加します。API クライアントに [Organizations and Roles] スコープを追加します。 |
権限を変更した後:
- Workday で [Activate Pending Security Policy Changes] を実行します。
- API クライアントに新しいスコープを追加した場合は、[Manage Refresh Tokens for Integrations] で新しい更新トークンを生成し、新しいアクセス トークンを生成します。
- 変更した場合は、新しいアクセス トークンでフィード構成を更新します。
認証エラー
- 401 Unauthorized: アクセス トークンの有効期限が切れています。更新トークンを使用して新しいトークンを生成し、フィードを更新します。
- 無効なクライアント: クライアント ID とクライアント シークレットが正しいことを確認します。
- Invalid refresh token: 更新トークンが取り消されている可能性があります。[Manage Refresh Tokens for Integrations] で新しいトークンを生成します。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
@timestamp |
metadata.event_timestamp.seconds |
エポックからの秒単位のタイムスタンプとして解析されます。 |
businessTitle |
entity.entity.user.title |
直接マッピングされます。 |
descriptor |
entity.entity.user.user_display_name |
直接マッピングされます。 |
Employee_ID |
entity.entity.user.employee_id |
直接マッピングされます。 |
Employee_ID |
entity.metadata.product_entity_id |
id が存在しない場合にマッピングされます。 |
gopher-supervisor.descriptor |
entity.entity.user.managers.user_display_name |
直接マッピングされます。 |
gopher-supervisor.id |
entity.entity.user.managers.product_object_id |
直接マッピングされます。 |
gopher-supervisor.primaryWorkEmail |
entity.entity.user.managers.email_addresses |
直接マッピングされます。 |
gopher-time-off.date |
entity.entity.user.time_off.interval.start_time |
日付として解析されます。 |
gopher-time-off.descriptor |
entity.entity.user.time_off.description |
直接マッピングされます。 |
Hire_Date |
entity.entity.user.hire_date |
日付として解析されます。 |
id |
entity.metadata.product_entity_id |
存在する場合に直接マッピングされます。 |
Job_Profile |
entity.entity.user.title |
businessTitle が存在しない場合にマッピングされます。 |
Legal_Name_First_Name |
entity.entity.user.first_name |
直接マッピングされます。 |
Legal_Name_Last_Name |
entity.entity.user.last_name |
直接マッピングされます。 |
location.descriptor |
entity.entity.location.city |
直接マッピングされます。 |
primarySupervisoryOrganization.descriptor |
entity.entity.user.department |
直接マッピングされます。 |
primaryWorkEmail |
entity.entity.user.email_addresses |
直接マッピングされます。 |
primaryWorkPhone |
entity.entity.user.phone_numbers |
直接マッピングされます。 |
Termination_Date |
entity.entity.user.termination_date |
日付として解析されます。 |
Work_Email |
entity.entity.user.email_addresses |
primaryWorkEmail が存在しない場合にマッピングされます。 |
collection_time |
metadata.event_timestamp.collected_timestamp |
直接マッピングされます。 |
さらにサポートが必要な場合コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。