Mengumpulkan log Workday HCM
Dokumen ini menjelaskan cara menyerap log Workday HCM ke Google Security Operations dengan menyiapkan feed menggunakan Third Party API.
Parser mengekstrak data pengguna Workday HCM dari log berformat JSON. Proses ini menangani berbagai transformasi data, termasuk mengganti nama kolom, menggabungkan objek bertingkat, mengurai tanggal, dan mengisi kolom UDM untuk atribut pengguna, detail pekerjaan, dan struktur organisasi.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps.
- Akses istimewa ke Workday dengan izin Administrator Keamanan atau yang setara.
Mengonfigurasi autentikasi Workday API
Membuat Pengguna Sistem Integrasi (ISU)
- Login ke Workday dengan hak istimewa administratif.
- Di kotak penelusuran, ketik Create Integration System User, lalu pilih tugas.
- Masukkan Nama pengguna (misalnya,
ISU_SecOps_HCM). - Tetapkan Sandi.
- Setel Session Timeout Minutes ke
0untuk mencegah ISU kehabisan waktu. - Aktifkan Jangan Izinkan Sesi UI untuk meningkatkan keamanan dengan membatasi login UI.
- Buka tugas Pertahankan Aturan Sandi.
- Tambahkan pengguna sistem integrasi ke kolom Pengguna Sistem yang dikecualikan dari masa berlaku sandi.
Membuat grup keamanan integrasi
- Di kotak penelusuran, ketik Create Security Group, lalu pilih tugas.
- Cari kolom Type of Tenanted Security Group, lalu pilih Integration System Security Group (Unconstrained).
- Berikan Name untuk grup keamanan (misalnya,
ISG_SecOps_HCM). - Klik Oke.
- Klik Edit untuk grup keamanan yang baru dibuat.
- Tetapkan Pengguna Sistem Integrasi dari langkah sebelumnya ke grup keamanan.
- Klik Done.
Memberikan akses domain ke grup keamanan
Feed Google SecOps mengambil data dari empat endpoint Workday REST API. Setiap endpoint memerlukan izin Kebijakan Keamanan Domain tertentu yang diberikan kepada grup keamanan integrasi.
- Di kotak penelusuran, ketik Maintain Permissions for Security Group, lalu pilih tugas.
- Pilih grup keamanan yang Anda buat (misalnya,
ISG_SecOps_HCM) dari daftar Source Security Group. - Klik Oke.
- Buka Izin Kebijakan Keamanan Domain.
Tambahkan akses GET untuk setiap domain berikut:
Endpoint API Kebijakan Keamanan Domain yang Diperlukan /workers— Daftar pekerja, profil, dan staf saat iniWorker Data: Public Worker Reports,Worker Data: Current Staffing Information,Person Data: Work Contact Information/workers/{id}/timeOffEntries— Saldo waktu istirahatWorker Data: Time Off (Time Off Balances),Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history— Histori penempatan pekerjaWorker Data: Current Staffing Information/supervisoryOrganizations— Struktur organisasiWorker Data: Organization InformationKlik Oke.
Klik Done untuk menyimpan perubahan.
Mengaktifkan perubahan kebijakan keamanan
- Di kotak penelusuran, ketik Activate Pending Security Policy Changes, lalu pilih tugas.
- Masukkan alasan perubahan di kolom komentar (misalnya,
Granting API access for Google SecOps HCM integration). - Klik Oke.
- Pilih Konfirmasi, lalu klik Oke.
Mendaftarkan klien API untuk integrasi
- Di kotak penelusuran, ketik Register API Client for Integrations, lalu pilih.
- Klik Create.
Berikan detail konfigurasi berikut:
- Nama Klien: Masukkan nama (misalnya,
Google SecOps HCM Client). - Pengguna Sistem: Pilih Pengguna Sistem Integrasi yang Anda buat (misalnya,
ISU_SecOps_HCM). Cakupan: Pilih cakupan berikut:
Cakupan Diperlukan untuk Penempatan staf Endpoint /workersdan/workers/{id}/historyInformasi Kontak Kolom email dan telepon kantor yang ditampilkan oleh /workers(digunakan untuk korelasi UDM)Cuti dan Istirahat /workers/{id}/timeOffEntriesendpointOrganisasi dan Peran /supervisoryOrganizationsendpointTenant Tidak Dapat Dikonfigurasi Klien API OAuth 2.0 apa pun (integrasi tingkat sistem dan rotasi token)
- Nama Klien: Masukkan nama (misalnya,
Klik Simpan.
Klik Oke.
Segera salin dan simpan ID Klien dan Rahasia Klien.
Membuat token refresh OAuth 2.0
- Di kotak penelusuran, ketik Manage Refresh Tokens for Integrations, lalu pilih.
- Klik Generate New Refresh Token.
- Di kolom Workday Account, telusuri dan pilih Integration System User (misalnya,
ISU_SecOps_HCM). - Pilih klien API yang Anda buat, lalu klik OK.
- Salin dan simpan Refresh Token.
Mendapatkan URL endpoint API
- Di kotak penelusuran, ketik View API Clients dan pilih.
- Di bagian Klien API untuk Integrasi, temukan klien yang Anda buat (misalnya,
Google SecOps HCM Client). Salin dan simpan detail berikut:
- Endpoint Token: URL untuk mendapatkan token akses (misalnya,
https://wd2-impl-services1.workday.com/ccx/oauth2/YOUR_TENANT/token). - Endpoint REST API Workday: URL dasar untuk panggilan API (misalnya,
https://wd2-impl-services1.workday.com/ccx/api/v1/YOUR_TENANT).
- Endpoint Token: URL untuk mendapatkan token akses (misalnya,
Membuat token akses OAuth
Gunakan curl atau klien HTTP serupa untuk mengirim permintaan POST ke Endpoint Token:
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"
Perintah ini akan menampilkan token akses (misalnya, "access_token": "abcd1234"). Salin dan simpan token akses.
Memverifikasi akses API
Sebelum mengonfigurasi feed, pastikan ISU memiliki izin yang diperlukan untuk endpoint utama. Ganti variabel dengan nilai sebenarnya:
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"
Setiap pengujian harus menampilkan status HTTP 200. Jika ada endpoint yang menampilkan 403, lihat bagian Pemecahan masalah di bawah.
Mengonfigurasi feed di Google SecOps untuk menyerap data HCM Workday
Menyiapkan feed
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Workday HCM). - Pilih Third Party API sebagai Source type.
- Pilih Workday sebagai Jenis log.
- Klik Berikutnya.
Mengonfigurasi parameter feed
Tentukan nilai untuk parameter input berikut:
Nama Host API: Nama domain yang sepenuhnya memenuhi syarat untuk endpoint API Workday REST Anda (misalnya,
wd2-impl-services1.workday.com).Tenant: Elemen jalur terakhir dari endpoint Workday REST API yang mengidentifikasi instance Workday Anda.
Token akses: Token akses OAuth yang dibuat di bagian sebelumnya.
Opsi Lanjutan:
- Namespace aset: Namespace aset.
- Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
- Klik Berikutnya.
- Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Pemecahan masalah
403 Forbidden di endpoint tertentu
Jika feed melaporkan error atau perintah curl verifikasi menampilkan 403 untuk endpoint tertentu, Pengguna Sistem Integrasi tidak memiliki izin.
| Endpoint yang gagal | Perbaiki |
|---|---|
/workers/{id}/timeOffEntries |
Menambahkan akses GET untuk domain Worker Data: Time Off (Time Off Balances) dan Worker Data: Time Off (Time Off Balances Manager View). Tambahkan cakupan Time Off and Leave ke klien API. |
/workers/{id}/history |
Tambahkan akses GET untuk domain Worker Data: Historical Staffing Information. Pastikan cakupan Staffing ditetapkan ke klien API. |
/supervisoryOrganizations |
Tambahkan akses GET untuk domain Manage: Supervisory Organization atau View: Supervisory Organization. Tambahkan cakupan Organisasi dan Peran ke klien API. |
Setelah melakukan perubahan izin:
- Jalankan Activate Pending Security Policy Changes di Workday.
- Jika Anda menambahkan cakupan baru ke klien API, buat token refresh baru melalui Kelola Token Refresh untuk Integrasi, lalu buat token akses baru.
- Perbarui konfigurasi feed dengan token akses baru jika berubah.
Error autentikasi
- 401 Tidak Sah: Masa berlaku token akses telah berakhir. Buat token baru menggunakan token refresh dan perbarui feed.
- Klien tidak valid: Pastikan Client ID dan Rahasia Klien sudah benar.
- Token refresh tidak valid: Token refresh mungkin telah dicabut. Buat yang baru melalui Kelola Token Refresh untuk Integrasi.
Tabel pemetaan UDM
| Kolom log | Pemetaan UDM | Logika |
|---|---|---|
entity_host_name |
entity.asset.hostname |
Dipetakan secara langsung |
location.descriptor |
entity.location.city |
Dipetakan secara langsung |
AU_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Dipetakan secara langsung |
COMPANY_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Dipetakan secara langsung |
ORIG_HIRE_DT |
entity.resource.attribute.labels.value |
Dipetakan secara langsung |
STATUS_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Dipetakan secara langsung |
href |
entity.url |
Dipetakan secara langsung |
CONT_START_DTE |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
EMPL_TYPE |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
EXEC_CD |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
EXEC_DESCR |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
HR_Status |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
Is_Active |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
Is_Manager |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
JOB_CODE |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
ORG_CD |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
ORG_Container |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
ORG_Container_Name |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
PER_Status |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
POSITION_NBR |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
PS_ELID |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
REG_TEMP |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
WB_LOGON_ID |
entity.user.attribute.labels.value |
Dipetakan secara langsung |
ORG_DESCR |
entity.user.department |
Digabung |
primarySupervisoryOrganization.descriptor |
entity.user.department |
Digabung |
Email |
entity.user.email_addresses |
Digabung |
Work_Email |
entity.user.email_addresses |
Digabung |
primaryWorkEmail |
entity.user.email_addresses |
Digabung |
EMPLID |
entity.user.employee_id |
Dipetakan secara langsung |
Employee_ID |
entity.user.employee_id |
Dipetakan secara langsung |
First_Name |
entity.user.first_name |
Dipetakan secara langsung |
Legal_Name_First_Name |
entity.user.first_name |
Dipetakan secara langsung |
HIRE_DATE |
entity.user.hire_date |
Diurai sebagai RFC 3339 |
Hire_Date |
entity.user.hire_date |
Diurai sebagai RFC 3339 |
Last_Name |
entity.user.last_name |
Dipetakan secara langsung |
Legal_Name_Last_Name |
entity.user.last_name |
Dipetakan secara langsung |
gopher-supervisor.primaryWorkEmail |
entity.user.managers.email_addresses |
Digabung |
Reports_To_EMPLID |
entity.user.managers.employee_id |
Dipetakan secara langsung |
gopher-supervisor.id |
entity.user.managers.product_object_id |
Diganti nama/dipetakan |
Reports_To_Name |
entity.user.managers.user_display_name |
Dipetakan secara langsung |
gopher-supervisor.descriptor |
entity.user.managers.user_display_name |
Diganti nama/dipetakan |
primaryWorkPhone |
entity.user.phone_numbers |
Digabung |
Termination_Date |
entity.user.termination_date |
Diurai sebagai RFC 3339 |
timeoff.descriptor |
entity.user.time_off.description |
Dipetakan secara langsung |
timeoff.date |
entity.user.time_off.interval.start_time |
Diurai sebagai RFC 3339 |
HR_JOB_TITLE |
entity.user.title |
Dipetakan secara langsung |
Job_Profile |
entity.user.title |
Dipetakan secara langsung |
businessTitle |
entity.user.title |
Dipetakan secara langsung |
Full_Name |
entity.user.user_display_name |
Dipetakan secara langsung |
descriptor |
entity.user.user_display_name |
Dipetakan secara langsung |
udm_metadata |
metadata |
Diganti nama/dipetakan |
metadata_entity_type |
metadata.entity_type |
Dipetakan secara langsung |
actual_completed_date_and_time |
metadata.event_timestamp |
Diurai sebagai MM/dd/yyyy HH:mm:ss a |
body.time |
metadata.event_timestamp |
Diurai sebagai UNIX_MS |
requestTime |
metadata.event_timestamp |
Diurai sebagai RFC 3339 |
timestamp |
metadata.event_timestamp |
Diurai sebagai RFC 3339 |
EMPLID |
metadata.product_entity_id |
Dipetakan secara langsung |
Employee_ID |
metadata.product_entity_id |
Dipetakan secara langsung |
id |
metadata.product_entity_id |
Dipetakan secara langsung |
Source_Name |
metadata.product_name |
Dipetakan secara langsung |
userAgent |
network.http.parsed_user_agent |
Diganti nama/dipetakan |
userAgent |
network.http.user_agent |
Dipetakan secara langsung |
sessionId |
network.session_id |
Dipetakan secara langsung |
ipAddress |
principal.ip |
Digabung |
taskId |
principal.process.pid |
Dipetakan secara langsung |
activityAction_label |
principal.resource.attribute.labels |
Digabung |
body.event.Submitted_By |
principal.user.userid |
Dipetakan secara langsung |
body.event.Response_Message |
security_result.action_details |
Dipetakan secara langsung |
body.event.Messages |
security_result.description |
Dipetakan secara langsung |
actual_start_date_and_time_label |
security_result.detection_fields |
Digabung |
background_process_is_running_label |
security_result.detection_fields |
Digabung |
by_person_label |
security_result.detection_fields |
Digabung |
created_from_trigger_label |
security_result.detection_fields |
Digabung |
items_processed_label |
security_result.detection_fields |
Digabung |
percent_complete_label |
security_result.detection_fields |
Digabung |
processing_time_label |
security_result.detection_fields |
Digabung |
scheduled_start_date_and_time_label |
security_result.detection_fields |
Digabung |
sent_on_label |
security_result.detection_fields |
Digabung |
total_duration_label |
security_result.detection_fields |
Digabung |
body.event.Integration_Event_Status |
security_result.summary |
Dipetakan secara langsung |
body.event.Integration_System |
target.application |
Dipetakan secara langsung |
target_data.id |
target.resource.product_object_id |
Dipetakan secara langsung |
deviceType |
target.resource.resource_subtype |
Dipetakan secara langsung |
deviceType |
target.resource.type |
Dipetakan: (?i)(Desktop/Laptop/Mobile) → DEVICE |
user_display_name |
target.user.user_display_name |
Dipetakan secara langsung |
systemAccount |
target.user.userid |
Dipetakan secara langsung |
| T/A | entity.resource.attribute.labels.key |
Konstanta: COMPANY_EFFECTIVE_DATE |
| T/A | entity.user.attribute.labels.key |
Konstanta: ORG_Container |
| T/A | metadata.product_name |
Konstanta: HCM |
| T/A | metadata.vendor_name |
Konstanta: Workday |
| T/A | target.resource.type |
Konstanta: DEVICE |
Log Perubahan
Melihat Log Perubahan untuk parser ini
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.