Workday HCM ログを収集する

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

このドキュメントでは、サードパーティ API を使用してフィードを設定し、Workday HCM ログを Google Security Operations に取り込む方法について説明します。

パーサーは、JSON 形式のログから Workday HCM ユーザーデータを抽出します。フィールド名の変更、ネストされたオブジェクトのマージ、日付の解析、ユーザー属性、雇用情報、組織構造の UDM フィールドへの入力など、さまざまなデータ変換を処理します。

始める前に

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

  • Google SecOps インスタンス
  • Workday への特権アクセス(セキュリティ管理者 または同等の権限)

Workday API 認証を構成する

統合システム ユーザー(ISU)を作成する

  1. 管理者権限で Workday にログインします。
  2. 検索バーに「Create Integration System User 」と入力し、タスクを選択します。
  3. [Username] にユーザー名を入力します(例: ISU_SecOps_HCM)。
  4. パスワード を設定します。
  5. ISU がタイムアウトしないように、[Session Timeout Minutes] を 0 に設定します。
  6. [Do Not Allow UI Sessions] を有効にして、UI ログインを制限することでセキュリティを強化します。
  7. [Maintain Password Rules] タスクに移動します。
  8. 統合システム ユーザーを [System Users exempt from password expiration] フィールドに追加します。

統合セキュリティ グループを作成する

  1. 検索バーに「Create Security Group 」と入力し、タスクを選択します。
  2. [Type of Tenanted Security Group] フィールドを見つけて、[Integration System Security Group (Unconstrained)] を選択します。
  3. セキュリティ グループの名前 を指定します(例: ISG_SecOps_HCM)。
  4. [OK] をクリックします。
  5. 新しく作成したセキュリティ グループの [Edit] をクリックします。
  6. 前のステップで作成した統合システム ユーザーをセキュリティ グループに割り当てます。
  7. [Done] をクリックします。

セキュリティ グループにドメイン アクセス権を付与する

Google SecOps フィードは、4 つの Workday REST API エンドポイントからデータを取得します。各エンドポイントでは、統合セキュリティ グループに特定のドメイン セキュリティ ポリシー権限を付与する必要があります。

  1. 検索バーに「Maintain Permissions for Security Group 」と入力し、タスクを選択します。
  2. [Source Security Group] リストから、作成したセキュリティ グループ(例: ISG_SecOps_HCM)を選択します。
  3. [OK] をクリックします。
  4. [Domain Security Policy Permissions] に移動します。
  5. 次の各ドメインに 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
  6. [OK] をクリックします。

  7. [Done] をクリックして変更を保存します。

セキュリティ ポリシーの変更を有効にする

  1. 検索バーに「Activate Pending Security Policy Changes 」と入力し、タスクを選択します。
  2. コメント欄に変更の理由を入力します(例: Granting API access for Google SecOps HCM integration)。
  3. [OK] をクリックします。
  4. [Confirm] を選択し、[OK] をクリックします。

統合用の API クライアントを登録する

  1. 検索バーに「Register API Client for Integrations 」と入力して選択します。
  2. [Create] をクリックします。
  3. 次の構成情報を提供してください。

    • クライアント名: 名前を入力します(例: Google SecOps HCM Client)。
    • システム ユーザー: 作成した統合システム ユーザー(例: ISU_SecOps_HCM)を選択します。
    • スコープ: 次のスコープを選択します。

      範囲 必須となる対象
      スタッフの割り当て /workers エンドポイントと /workers/{id}/history エンドポイント
      休暇と休職 /workers/{id}/timeOffEntries エンドポイント
      組織とロール /supervisoryOrganizations エンドポイント
  4. [Save] をクリックします。

  5. [OK] をクリックします。

  6. クライアント IDクライアント シークレット をコピーしてすぐに保存します。

OAuth 2.0 更新トークンを生成する

  1. 検索バーに「Manage Refresh Tokens for Integrations 」と入力して選択します。
  2. [Generate New Refresh Token] をクリックします。
  3. [Workday Account] フィールドで、統合システム ユーザー(例: ISU_SecOps_HCM)を検索して選択します。
  4. 作成した API クライアントを選択し、[OK] をクリックします。
  5. 更新トークン をコピーして保存します。

API エンドポイントの URL を取得する

  1. 検索バーに「View API Clients 」と入力して選択します。
  2. [API Clients for Integrations] で、作成したクライアント(例: Google SecOps HCM Client)を見つけます。
  3. 次の詳細をコピーして保存します。

    • トークン エンドポイント: アクセス トークンを取得する 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)。

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 でフィードを構成する

フィードを設定する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [Add New Feed] をクリックします。
  3. 次のページで、[Configure a single feed] をクリックします。
  4. [Feed name] フィールドに、フィードの名前を入力します(例: Workday HCM)。
  5. [Source type] として [Third Party API] を選択します。
  6. [Log type] で [Workday] を選択します。
  7. [次へ] をクリックします。

フィード パラメータを構成する

  1. 次の入力パラメータの値を指定します。

    • API ホスト名: Workday REST API エンドポイントの完全修飾ドメイン名(例: wd2-impl-services1.workday.com)。

    • テナント: Workday インスタンスを識別する Workday REST API エンドポイントの最後のパス要素。

    • アクセス トークン: 前のセクションで生成した OAuth アクセス トークン。

    詳細オプション:

    • アセットの名前空間: アセットの名前空間
    • 取り込みラベル: このフィードのイベントに適用されるラベル。
  2. [次へ] をクリックします。

  3. [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] スコープを追加します。

権限を変更した後:

  1. Workday で [Activate Pending Security Policy Changes] を実行します。
  2. API クライアントに新しいスコープを追加した場合は、[Manage Refresh Tokens for Integrations] で新しい更新トークンを生成し、新しいアクセス トークンを生成します。
  3. 変更した場合は、新しいアクセス トークンでフィード構成を更新します。

認証エラー

  • 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 のプロフェッショナルから回答を得ることができます。