Skip to content

Commit 617ad3d

Browse files
[Workday][Sign-on] Add Sign-on data stream (#20039)
This PR adds the `sign_on` data stream to the Workday integration, along with its associated dashboard and visualizations. Workday fields are mapped to their corresponding ECS fields where possible. Test samples were derived from live data samples, which were subsequently sanitized.
1 parent ff28848 commit 617ad3d

19 files changed

Lines changed: 3035 additions & 78 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
dependencies:
22
ecs:
3-
reference: git@v9.3.0
3+
reference: git@v9.4.0

packages/workday/_dev/build/docs/README.md

Lines changed: 70 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,36 @@
44

55
[Workday](https://www.workday.com/en-in/homepage.html) is a cloud-based ERP system that manages business processes and allows organizations to use an integrated application. Workday is a coherent cloud ERP system for financial analysis, analytical solutions, HCM suites, and better business processes.
66

7-
The Workday integration for Elastic collects `Activity Logs` via **API** and visualizes them in Kibana.
7+
The Workday integration for Elastic collects `Activity` logs via the **Workday API** and `Sign-on` logs via the **Workday Custom Report API**, and visualizes them in Kibana.
88

99
### Compatibility
1010

11-
The Workday integration is compatible with API version **v1**.
11+
- The **Activity** data stream is compatible with Workday API version **v1**.
12+
- The **Sign-on** data stream is compatible with Workday Custom Reports exposed via the **Reports as a Service (RaaS)** JSON endpoint (`/ccx/service/customreport2/...?format=json`).
1213

1314
### How it works
1415

15-
This integration periodically queries the Workday API to retrieve logs.
16+
- **Activity**: This integration periodically queries the Workday API to retrieve Activity logs.
17+
- **Sign-on**: This integration periodically downloads a Workday Custom Report (for example, a Sign-on report that lists sign-on records along with their key attributes) and ingests each report row as a single event.
1618

1719
## What data does this integration collect?
1820

19-
This integration collects log messages of the following type:
21+
This integration collects log messages of the following types:
2022

21-
- `Activity`: Collects [Activity Logs](https://community.workday.com/sites/default/files/file-hosting/restapi/#privacy/v1/get-/activityLogging) logs via Workday API (endpoint: `/activityLogging`).
23+
- `Activity`: Collects [Activity Logs](https://community.workday.com/sites/default/files/file-hosting/restapi/#privacy/v1/get-/activityLogging) via the Workday API (endpoint: `/activityLogging`).
24+
- `Sign-on`: Collects sign-on information from a Workday Custom Report via the Workday Reports as a Service (RaaS) JSON endpoint.
2225

2326
### Supported use cases
2427

25-
Integrating Workday with Elastic gives security and IT teams centralized visibility into **Workday activity logging**, so you can monitor configuration and usage changes, support audits, and investigate suspicious behavior from Kibana.
28+
Integrating Workday with Elastic gives security and IT teams centralized visibility into **Workday activity logging** and **Workday sign-on data**, so you can monitor configuration and usage changes, track sign-on activity and access patterns, support audits, and investigate suspicious or unusual authentication behavior from Kibana.
2629

27-
The **Activity** dashboard summarizes key patterns such as **activity volume over time** and **top actors**, helping you spot unusual spikes and focus on the users and operations that matter.
28-
29-
Built-in filters make it easier to narrow events by attributes such as **task**, **system account**, and **IP address**, which supports faster triage and a more consistent investigation workflow across your Workday telemetry.
30+
The **Activity** dashboard summarizes key patterns such as **activity volume over time** and **top actors**, helping you spot unusual spikes and focus on the users and operations that matter. Built-in filters make it easier to narrow events by attributes such as **task**, **system account**, and **IP address**, which supports faster triage and a more consistent investigation workflow across your Workday telemetry.
3031

3132
## What do I need to use this integration?
3233

3334
### From Workday
3435

35-
#### Collect Workday API credentials
36+
#### For the Activity data stream
3637

3738
##### Enable User Activity Logging
3839

@@ -43,7 +44,7 @@ Built-in filters make it easier to narrow events by attributes such as **task**,
4344

4445
**Note:** Once enabled, Workday records all user activity in a secure tenant database. Activity logging must be enabled before any logs are available for export.
4546

46-
#### Create Integration System User (ISU)
47+
##### Create Integration System User (ISU)
4748

4849
1. In the Workday search bar, search for Create Integration System User.
4950
2. Enter a User Name (for example, ISU_SIEM_Export) and a strong Password.
@@ -54,7 +55,7 @@ Built-in filters make it easier to narrow events by attributes such as **task**,
5455
7. Search for View Domain and locate the User Activity Logging domain. Grant Get access to the ISU security group for this domain.
5556
8. Search for Activate Pending Security Policy Changes and activate the changes.
5657

57-
#### Register API client for OAuth
58+
##### Register API client for OAuth
5859

5960
1. In the Workday search bar, search for Register API Client for Integrations.
6061
2. Enter a Client Name (for example, SIEM_OAuth_Client).
@@ -69,7 +70,7 @@ Built-in filters make it easier to narrow events by attributes such as **task**,
6970
9. Generate a new refresh token for the API client.
7071
10. Copy and save the Refresh Token.
7172

72-
#### Determine tenant URL
73+
##### Determine tenant URL
7374

7475
The API endpoint is based on your Workday tenant. The format is:
7576

@@ -83,6 +84,43 @@ Activity Logging API | https://HOST/ccx/api/privacy/v1/TENANT/activityLogging
8384

8485
**Note:** For additional Workday API security context, see [Generating API Keys for the Workday API](https://workday.my.site.com/customercenter/article?no=000013105&redirect=false).
8586

87+
#### For the Sign-on data stream
88+
89+
##### Build the Sign-on custom report
90+
91+
1. Sign in to your Workday tenant as a user with report-authoring privileges.
92+
2. In the Workday search bar, search for **Create Custom Report**.
93+
3. Create an Advanced report on a data source that exposes sign-on activity (for example, `Signons and Attempted Signons`).
94+
4. Add the columns required for sign-on analytics (for example, `System Account`, `Session Start`, `Session End`, `Authentication Type for Signon`, `Failed Signon`, `Invalid Credentials`, `Account Locked, Disabled or Expired`, `Browser Type`, `Operating System`, `Device Type`, `Request Originator`, `SAML Identity Provider`).
95+
5. On the **Advanced** tab, select **Enable As Web Service** so the report is exposed as Reports as a Service (RaaS).
96+
6. Save the report and note the **Report Name** and the **Report Owner** (the Workday account that owns the report).
97+
98+
##### Create the Integration System User (ISU)
99+
100+
1. In the Workday search bar, search for **Create Integration System User**.
101+
2. Enter a User Name (for example, `ISU_SIEM_Export`) and a strong Password.
102+
3. Clear the **Require New Password at Next Sign In** checkbox.
103+
4. Click **OK**.
104+
5. Search for **Create Security Group** and create an Integration System Security Group (Unconstrained).
105+
6. Add the ISU (`ISU_SIEM_Export`) to this security group.
106+
7. Grant the ISU security group access to the domain protecting the custom report's data source (for example, the `System Auditing` domain).
107+
8. Search for **Activate Pending Security Policy Changes** and activate the changes.
108+
109+
##### Determine the report URL
110+
111+
The Custom Report endpoint URL has the following format:
112+
113+
```
114+
https://HOST/ccx/service/customreport2/TENANT/REPORT_OWNER/REPORT_NAME?format=json
115+
```
116+
117+
Where:
118+
119+
- `HOST` is your Workday hostname.
120+
- `TENANT` is your Workday tenant name.
121+
- `REPORT_OWNER` is the Workday account that owns the custom report.
122+
- `REPORT_NAME` is the name of the custom report you created above.
123+
86124
## How do I deploy this integration?
87125

88126
This integration supports both Elastic Agentless-based and Agent-based installations.
@@ -105,7 +143,7 @@ Elastic Agent must be installed. For more details, check the Elastic Agent [inst
105143
4. Select **Add Workday** to add the integration.
106144
5. Enable and configure only the collection methods which you will use.
107145

108-
* To **Collect Workday logs via API**, you'll need to:
146+
* To **Collect Workday Activity logs via API**, you'll need to:
109147

110148
- Configure **Hostname**.
111149
- Configure **Tenant**.
@@ -114,6 +152,12 @@ Elastic Agent must be installed. For more details, check the Elastic Agent [inst
114152
- Configure **Refresh Token**.
115153
- Adjust the integration configuration parameters if required, including the **Interval**, **Initial Interval**, **Preserve original event** etc. to enable data collection.
116154

155+
* To **Collect Workday Sign-on logs via Custom Report API**, you'll need to:
156+
157+
- Configure **Report URL** with the full Workday Custom Report (RaaS) URL noted above.
158+
- Configure **Username** and **Password** for basic authentication against the Workday Custom Report API.
159+
- Adjust the integration configuration parameters if required, including the **Interval** and **Preserve original event** etc. to enable data collection.
160+
117161
6. Select **Save and continue** to save the integration.
118162

119163
### Validation
@@ -140,6 +184,10 @@ For more information on architectures that can be used for scaling this integrat
140184

141185
{{fields "activity"}}
142186

187+
#### Sign-on
188+
189+
{{fields "sign_on"}}
190+
143191
### Example event
144192

145193
#### Activity
@@ -148,12 +196,17 @@ For more information on architectures that can be used for scaling this integrat
148196

149197
### Inputs used
150198

151-
These input is used in the integration:
199+
These inputs are used in the integration:
152200

153201
- [CEL](https://www.elastic.co/docs/reference/beats/filebeat/filebeat-input-cel)
154202

155203
### API usage
156204

157-
This integration uses the following Workday API:
205+
This integration uses the following Workday APIs:
206+
207+
- **Activity**: [Workday Activity API documentation](https://community.workday.com/sites/default/files/file-hosting/restapi/#privacy/v1/get-/activityLogging).
208+
- **Sign-on**: The Workday **Reports as a Service (RaaS)** JSON endpoint is used to fetch a user-defined Sign-on custom report:
158209

159-
**Activity**: [Workday Activity API documentation](https://community.workday.com/sites/default/files/file-hosting/restapi/#privacy/v1/get-/activityLogging).
210+
```
211+
GET https://HOST/ccx/service/customreport2/TENANT/REPORT_OWNER/REPORT_NAME?format=json
212+
```

packages/workday/changelog.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
# newer versions go on top
2+
- version: '0.3.0'
3+
changes:
4+
- description: Add support for sign_on data stream.
5+
type: enhancement
6+
link: https://github.com/elastic/integrations/pull/20039
27
- version: '0.2.0'
38
changes:
49
- description: Fix token refresh after 401 by adding TTL-based expiry tracking.

packages/workday/data_stream/activity/_dev/test/system/test-common-config.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
input: cel
22
service: workday
33
vars:
4-
hostname: "{{Hostname}}:{{Port}}"
5-
tenant: tenant
6-
client_id: client_id
7-
client_secret: client_secret
8-
refresh_token: refresh_token
94
ssl: |
105
certificate_authorities:
116
- |
@@ -30,6 +25,11 @@ vars:
3025
-----END CERTIFICATE-----
3126
data_stream:
3227
vars:
28+
hostname: "{{Hostname}}:{{Port}}"
29+
tenant: tenant
30+
client_id: client_id
31+
client_secret: client_secret
32+
refresh_token: refresh_token
3333
preserve_original_event: true
3434
batch_size: 2
3535
assert:

packages/workday/data_stream/activity/manifest.yml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,41 @@ streams:
66
description: Collect Activity logs from Workday.
77
template_path: cel.yml.hbs
88
vars:
9+
- name: hostname
10+
type: text
11+
title: Hostname
12+
description: 'Hostname of Workday instance. Example: <your-workday-host>.workday.com'
13+
required: true
14+
show_user: true
15+
- name: tenant
16+
type: text
17+
title: Tenant
18+
description: Tenant of Workday instance.
19+
required: true
20+
show_user: true
21+
- name: client_id
22+
type: text
23+
title: Client ID
24+
multi: false
25+
required: true
26+
show_user: true
27+
description: Client ID.
28+
- name: client_secret
29+
type: password
30+
title: Client Secret
31+
multi: false
32+
required: true
33+
show_user: true
34+
secret: true
35+
description: Client Secret.
36+
- name: refresh_token
37+
type: text
38+
title: Refresh Token
39+
description: Refresh token for Workday instance.
40+
multi: false
41+
required: true
42+
show_user: true
43+
secret: true
944
- name: initial_interval
1045
type: text
1146
title: Initial Interval
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{"Account_Locked__Disabled_or_Expired":"0","Active_Session":"0","Authentication_Type_for_Signon":"SAML","Browser_Type":"Chrome","Device_Type":"Desktop","Device_is_Trusted":"0","Failed_Signon":"0","Forgotten_Password_Reset_Request":"0","Invalid_Credentials":"0","Is_Device_Managed":"0","Operating_System":"Mac OS X","Password_Changed":"0","Request_Originator":"UI","SAML_Identity_Provider":"IdP_Acme","Session_End":"2026-06-18T23:25:22-07:00","Session_Start":"2026-06-18T16:59:32-07:00","System_Account":"user534.acme / User 534"}
2+
{"Account_Locked__Disabled_or_Expired":"0","Active_Session":"0","Authentication_Type_for_Signon":"OAuth 2.0","Device_is_Trusted":"0","Failed_Signon":"0","Forgotten_Password_Reset_Request":"0","Invalid_Credentials":"0","Is_Device_Managed":"0","Password_Changed":"0","Request_Originator":"Internal","Session_End":"2026-06-18T22:55:34-07:00","Session_Start":"2026-06-18T16:55:34-07:00","System_Account":"ISU_Integration_049"}
3+
{"Account_Locked__Disabled_or_Expired":"0","Active_Session":"0","Authentication_Failure_Message":"Mobile PIN has expired. To reset your PIN, first sign in using your user name and password.","Authentication_Type_for_Signon":"Biometric","Browser_Type":"Workday Phone App","Device_Type":"Phone","Device_is_Trusted":"0","Failed_Signon":"1","Forgotten_Password_Reset_Request":"0","Invalid_Credentials":"0","Is_Device_Managed":"0","Operating_System":"iOS","Password_Changed":"0","Request_Originator":"UI","Session_Start":"2026-06-18T16:52:43-07:00","System_Account":"user179.acme / User 179","UI_Client_Type":"iPhone Native"}
4+
{"Account_Locked__Disabled_or_Expired":"0","Active_Session":"0","Authentication_Type_for_Signon":"SAML","Browser_Type":"Workday Phone App","Device_Type":"Phone","Device_is_Trusted":"0","Failed_Signon":"0","Forgotten_Password_Reset_Request":"0","Invalid_Credentials":"0","Is_Device_Managed":"0","Operating_System":"iOS","Password_Changed":"0","Request_Originator":"UI","SAML_Identity_Provider":"IdP_Acme","Session_End":"2026-06-18T22:59:33-07:00","Session_Start":"2026-06-18T16:57:04-07:00","System_Account":"user179.acme / User 179"}
5+
{"Account_Locked__Disabled_or_Expired":"0","Active_Session":"1","Authentication_Type_for_Signon":"User Name Password","Device_is_Trusted":"0","Failed_Signon":"0","Forgotten_Password_Reset_Request":"0","Invalid_Credentials":"0","Is_Device_Managed":"0","Password_Changed":"0","Request_Originator":"Web Services","Session_Start":"2026-06-18T13:18:51-07:00","System_Account":"ISU_Integration_001"}
6+
{"Authentication_Type":"SAML","Browser_Type":"Chrome","Created_Moment":"2026-06-22T01:08:10.374-07:00","Device_Type":"Desktop","Device_is_Trusted":"0","Operating_System":"Mac OS X","Prompt_-_Positive_Integer":"linda.andersson / Linda Andersson","Request_Originator":"UI","SAML_Identity_Provider":"Okta E2","Session_ID":"4562a3","Sign-on_Time":"2026-06-22T01:08:10-07:00","Signoff_Time":"2026-06-22T02:09:01-07:00","Signon_IP_Address":"81.2.69.142","Signon_Worker":"Linda Andersson (006193)","User_Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36","userName":"linda.andersson"}
7+
{"Authentication_Type":"User Name Password","Browser_Type":"Chrome","Created_Moment":"2026-06-22T00:44:17.617-07:00","Device_Type":"Desktop","Device_is_Trusted":"0","Operating_System":"Mac OS X","Prompt_-_Positive_Integer":"alina.goajga / Alina Garagancea","Request_Originator":"UI","Session_ID":"b40162","Sign-on_Time":"2026-06-22T00:44:17-07:00","Signoff_Time":"2026-06-22T03:35:15-07:00","Signon_IP_Address":"81.2.69.144","Signon_Worker":"Alina Garagancea (002036)","User_Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36","userName":"alina.goajga"}
8+
{"Authentication_Type":"Trusted","Created_Moment":"2026-06-22T00:04:11.094-07:00","Device_Type":"Desktop","Device_is_Trusted":"0","Prompt_-_Positive_Integer":"ISU_Adaptive_Insights_User_Provisioning","Request_Originator":"Internal","Session_ID":"89d613","Sign-on_Time":"2026-06-22T00:04:11-07:00","Signoff_Time":"2026-06-22T01:04:11-07:00","Signon_IP_Address":"Workday Internal","userName":"ISU_Adaptive_Insights_User_Provisioning"}
9+
{"Authentication_Type":"OAuth 2.0","Created_Moment":"2026-06-22T04:29:16.382-07:00","Device_is_Trusted":"0","Prompt_-_Positive_Integer":"ISU_WD_Logs","Request_Originator":"Internal","Session_ID":"87ed78","Sign-on_Time":"2026-06-22T04:29:16-07:00","Signoff_Time":"2026-06-22T05:29:16-07:00","Signon_IP_Address":"89.160.20.112","userName":"ISU_WD_Logs"}
10+
{"Authentication_Failure_Message":"Invalid password","Authentication_Type":"User Name Password","Browser_Type":"Chrome","Created_Moment":"2026-06-22T06:41:11.320-07:00","Device_Type":"Desktop","Device_is_Trusted":"0","Operating_System":"Mac OS X","Prompt_-_Positive_Integer":"chris.carnes / Chris Carnes","Request_Originator":"UI","Sign-on_Time":"2026-06-22T06:41:11-07:00","Signon_IP_Address":"175.16.199.1","Signon_Worker":"Chris Carnes (006423)","User_Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36","userName":"chris.carnes"}

0 commit comments

Comments
 (0)