netskope_api_v2
Netskope API v2 provides a powerful interface for managing and monitoring Netskope deployments. It enables users to retrieve alerts and events, manage URL lists, and control clients. With Netskope API v2, organizations can proactively respond to security threats, enforce web access policies, and efficiently administer their Netskope environment.
Network Security · Netskope
Details
| ID | netskope_api_v2 |
|---|---|
| Provider | Netskope |
| Category | Network Security |
| From Version | 6.9.0 |
| Docker Image | demisto/python3:3.12.13.10116658 |
| Supported Modules | Agentix XSIAM |
README
Netskope API v2 provides a powerful interface for managing and monitoring Netskope deployments. It enables users to retrieve alerts and events, manage URL lists, and control clients. With Netskope API v2, organizations can proactively respond to security threats, enforce web access policies, and efficiently administer their Netskope environment.
This integration was integrated and tested with version 2 of the Netskope API.
To successfully instantiate an instance of the Netskope API v2 integration under the RBACv3 framework, follow the steps below.
Note: Netskope has deprecated the legacy single-step API token generation process. All new and migrated tenants must use RBACv3 to create API tokens through Service Accounts.
Step 1: Create a Service Account (RBACv3)
Follow the instructions under the section Create a New Service Account.
Step 2: Assign required functional roles
Ensure the Service Account has access to the following functional areas:
In total 4 sections need to be enabled:
- Administration
- Access Control
- DLP
- Events & Analytics

For Administration
In the Administration section, select Function > Audit Log and grant it View rights.

Under Users & Groups, select Manage:

Events & Analytics
Functions that need to be set to view: Application Events, Page Events, Network Events, and Alerts.

For Access Control
Select Access Control, for the Infrastructure function, grant View rights.

For the URL List, set to Manage and Apply.

For DLP
For DLP Incident, set to View.

Step 3
- API Token: Copy the generated API token and store it securely.
- Server URL: Construct the server URL using your account name and region. Example:
If your account name isxsoarand the region isde, your Server URL is: https://xsoar.de.goskope.com/
Configue Netskope (API v2) in Cortex
| Parameter | Description | Required |
|---|---|---|
| Server URL | True | |
| Use system proxy settings | False | |
| Trust any certificate (not secure) | False | |
| API token | Netskope API access token (make sure to generate token for the required endpoints). | True |
| First fetch timestamp | First alert created date to fetch. e.g., “1 min ago”,”2 weeks ago”,”3 months ago”. | False |
| Maximum incidents per fetch | Maximum number of incidents per fetch. Default is 50. The maximum is 100. | False |
| Maximum Netskope events per fetch. Max value is 200. | False | |
| Maximum Netskope DLP incidents per fetch. Max value is 200. | False | |
| Fetch Events | Fetch events as incidents, in addition to the alerts. | False |
| Fetch DLP incidents | Fetch Netskope DLP incidents as incidents, in addition to the alerts. | False |
| Event types to fetch. | The event types to fetch as incidents. | False |
| Alerts Query | Free text query to filter the fetched alerts. For more information, visit Netskope documentation (https://docs.netskope.com/en/get-alerts-data.html). | False |
| Events Query | Free text query to filter the fetched events (if configured). For more information, visit Netskope documentation (https://docs.netskope.com/en/get-alerts-data.html). | False |
| Incident type | False | |
| Fetch incidents | False | |
| User Email | The user email for update incident in Netskope. | False |
| Incidents Fetch Interval | False | |
| Incident Mirroring Direction | Cortex XSOAR only parameter. | False |
| Close Mirrored XSOAR Incident | Cortex XSOAR only parameter. | False |
| Close Mirrored Netskope Incident | False |
Commands
You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears with the command details in the War Room.
netskope-alert-list
Retrieve alerts generated by Netskope. Select the desired alerts using the alert_type parameter. Mandatory inputs include start_time and end_time, or insertion_start_time and insertion_end_time (If end_time or insertion_end_time is not provided, it defaults to the current date and time). Additionally, it is not permissible to supply a combination of the aforementioned options.
Base Command
netskope-alert-list
Input
| Argument Name | Description | Required |
|---|---|---|
| start_time | Restrict events to those that have dates greater than the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘end_time’ argument must be provided as well. | Optional |
| end_time | Restrict events to those that have dates less than or equal to the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘start_time’ argument must also be provided. If the start_time argument is provided and this argument is not - the default value will be set for now. | Optional |
| insertion_start_time | Restrict events to those that were inserted into the system after the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘insertion_end_time’ argument must also be provided. | Optional |
| insertion_end_time | Restrict events to those that were inserted into the system before the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘insertion_start_time’ argument must also be provided. If the insertion_start_time argument is provided and this argument is not - the default value will be set for now. | Optional |
| query | Free query to filter the alerts. For example, “alert_name like test”. For more information, please visit Netskope documentation: https://docs.netskope.com/en/get-alerts-data.html. | Optional |
| alert_type | Select alerts by their type. | Optional |
| acked | Whether to retrieve acknowledged alerts. Possible values are: True, False. | Optional |
| page | Page number of paginated results. Minimum value: 1. | Optional |
| limit | The maximum number of records to retrieve. Default is 50. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.Alert._appsession_start | String | The timestamp marking the start of an application session. |
| Netskope.Alert._category_id | String | The unique identifier for a category. |
| Netskope.Alert._category_name | String | The name or label associated with a category. |
| Netskope.Alert._category_tags | Number | Numeric tags or labels associated with the category. |
| Netskope.Alert._content_version | Number | A numeric value representing the content version. |
| Netskope.Alert._correlation_id | String | An identifier used for correlating events or data. |
| Netskope.Alert._creation_timestamp | Number | The timestamp when the data or event was created. |
| Netskope.Alert._ef_received_at | Date | The timestamp indicating when the event was received. |
| Netskope.Alert._event_id | String | A unique identifier for the event. |
| Netskope.Alert._forwarded_by | String | Information indicating the source responsible for forwarding the event. |
| Netskope.Alert._gef_src_dp | String | The source data path for the event. |
| Netskope.Alert._id | String | A unique identifier for the event or data. |
| Netskope.Alert._insertion_epoch_timestamp | Number | Insertion timestamp. |
| Netskope.Alert._nshostname | String | The hostname associated with Netskope. |
| Netskope.Alert._raw_event_inserted_at | Date | The timestamp indicating when the raw event was inserted. |
| Netskope.Alert._service_identifier | String | An identifier associated with a specific service. |
| Netskope.Alert._session_begin | String | The timestamp marking the beginning of a session. |
| Netskope.Alert._skip_geoip_lookup | String | A flag indicating whether GeoIP lookup should be skipped. |
| Netskope.Alert._src_epoch_now | Number | A numeric value representing the source epoch. |
| Netskope.Alert.access_method | String | Cloud app traffic can be steered to the Netskope cloud using different deployment methods such as Client (Netskope Client), Secure Forwarder etc. Administrators can also upload firewall and/or proxy logs for log analytics. This field shows the actual access method that triggered the event. For log uploads this shows the actual log type such as PAN, Websense, etc. |
| Netskope.Alert.acked | String | Whether the user acknowledged the alert or not. |
| Netskope.Alert.action | String | Action taken on the event for the policy. |
| Netskope.Alert.activity | String | Description of the user-performed activity. |
| Netskope.Alert.alert | String | Indicates whether the alert is generated or not. Populated as yes for all alerts. |
| Netskope.Alert.alert_name | String | Name of the alert. |
| Netskope.Alert.alert_type | String | Type of the alert. |
| Netskope.Alert.app | String | Specific cloud application used by the user (e.g., app = Dropbox). |
| Netskope.Alert.app_session_id | Number | Unique App/Site Session ID for traffic_type = CloudApp and Web. An app session starts when a user starts using a cloud app/site and ends once they have been inactive for a certain period of time (15 mins). Use app_session_id to check all the user activities in a single app session. app_session_id is unique for a user, device, browser, and domain. |
| Netskope.Alert.appcategory | String | Application category as designated by Netskope. |
| Netskope.Alert.appsuite | String | Information related to the suite of applications or software used. |
| Netskope.Alert.browser | String | Shows the actual browser from where the cloud app was accessed. |
| Netskope.Alert.browser_session_id | Number | Browser session ID. If there is an idle timeout of 15 minutes, it will time out the session. |
| Netskope.Alert.category | String | A classification or grouping label for data or events. |
| Netskope.Alert.cci | Number | Cloud Confidence Index, indicating the readiness and security of cloud applications. |
| Netskope.Alert.ccl | String | “Cloud Confidence Level. CCL measures the enterprise readiness of the cloud apps taking into consideration those apps’ security, auditability, and business continuity. Each app is assigned one of five cloud confidence levels: excellent, high, medium, low, or poor. Useful for querying if users are accessing a cloud app with a lower CCL.” |
| Netskope.Alert.connection_id | Number | Each connection has a unique ID. Shows the ID for the connection event. |
| Netskope.Alert.count | Number | Number of raw log lines/events sessionized or suppressed during the suppressed interval. |
| Netskope.Alert.device | String | Device type from where the user accessed the cloud app. It could be a Macintosh, Windows device, iPad, etc. |
| Netskope.Alert.device_classification | String | Designation of the device as determined by the Netskope Client as to whether the device is managed or not. |
| Netskope.Alert.domain | String | Domain value. This will hold the host header value or SNI or extracted from an absolute URI. |
| Netskope.Alert.dst_country | String | Application’s two-letter country code as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.dst_latitude | Number | Latitude of the application as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.dst_location | String | Application’s city as determined by maxmind or IP2Location Geolocation database. |
| Netskope.Alert.dst_longitude | Number | Longitude of the application as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.dst_region | String | Application’s state or region as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.dst_timezone | String | Destination timezone. |
| Netskope.Alert.dst_zipcode | String | Application’s zip code as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.dstip | String | IP address where the destination app is hosted. |
| Netskope.Alert.hostname | String | Host name. |
| Netskope.Alert.incident_id | Number | A unique identifier for an incident or event. |
| Netskope.Alert.ja3 | String | A field indicating JA3 information. |
| Netskope.Alert.ja3s | String | A field indicating JA3S information. |
| Netskope.Alert.managed_app | String | Whether or not the app in question is managed. |
| Netskope.Alert.managementID | String | Management ID. |
| Netskope.Alert.netskope_pop | String | Netskope Point of Presence, related to network infrastructure. |
| Netskope.Alert.notify_template | String | The template used for notifications or alerts. |
| Netskope.Alert.nsdeviceuid | String | Device identifiers on macOS and Windows. |
| Netskope.Alert.organization_unit | String | Organization units for which the event correlates to. This ties to user information extracted from Active Directory using the Directory Importer/AD Connector application. |
| Netskope.Alert.os | String | Operating system of the host that generated the event. |
| Netskope.Alert.os_version | String | Operating system version of the host. |
| Netskope.Alert.other_categories | String | Additional categories or labels not specified elsewhere. |
| Netskope.Alert.page | String | The URL of the originating page. |
| Netskope.Alert.page_site | String | Information about the web page or site being accessed. |
| Netskope.Alert.policy | String | Name of the policy configured by an admin. |
| Netskope.Alert.policy_id | String | The Netskope internal ID for the policy created by an admin. |
| Netskope.Alert.port | String | The network port used for communication. |
| Netskope.Alert.protocol | String | The communication protocol or method used. |
| Netskope.Alert.request_id | Number | Unique request ID for the event. |
| Netskope.Alert.severity | String | Severity used by watchlist and malware alerts. |
| Netskope.Alert.site | String | For traffic_type = CloudApp, site = app, and for traffic_type = Web, it will be the second-level domain name + top-level domain name. For example, in “www.cnn.com”, it is “cnn.com”. |
| Netskope.Alert.src_country | String | User’s country’s two-letter country code as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.src_latitude | Number | Latitude of the user as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.src_location | String | User’s city as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.src_longitude | Number | Longitude of the user as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.src_region | String | Source state or region as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.src_time | Date | A timestamp associated with the source or event. |
| Netskope.Alert.src_timezone | String | Source timezone. Shows the long-format timezone designation. |
| Netskope.Alert.src_zipcode | String | Source zip code as determined by Maxmind or IP2Location Geolocation database. |
| Netskope.Alert.srcip | String | IP address of the source/user. |
| Netskope.Alert.telemetry_app | String | Typically, SaaS app websites use web analytics code within the pages to gather analytic data. When a SaaS app action or page is shown, there is subsequent traffic generated to tracking apps such as doubleclick.net, Optimizely, etc. These tracking apps are listed if applicable in the Telemetry App field. |
| Netskope.Alert.timestamp | Number | Timestamp when the event/alert happened. Event timestamp in Unix epoch format. |
| Netskope.Alert.traffic_type | String | “Type of the traffic: CloudApp or Web. CloudApp indicates CASB and web indicates HTTP traffic. Web traffic is only captured for inline access method. It is currently not captured for Risk Insights.” |
| Netskope.Alert.transaction_id | Number | Unique ID for a given request/response. |
| Netskope.Alert.type | String | Shows if it is an application event or a connection event. Application events are recorded to track user events inside a cloud app. Connection events show the actual HTTP connection. |
| Netskope.Alert.ur_normalized | String | All lowercase user email. |
| Netskope.Alert.url | String | URL of the application that the user visited as provided by the log or data plane traffic. |
| Netskope.Alert.user | String | User email. |
| Netskope.Alert.useragent | String | Browser HTTP user agent header. |
| Netskope.Alert.userip | String | IP address of the user. |
| Netskope.Alert.userkey | String | User ID or email. |
| Netskope.Alert._client_timeout | Number | Information related to client timeouts. |
| Netskope.Alert._dlp_backup_profile | String | Information related to DLP (Data Loss Prevention) backup profiles. |
| Netskope.Alert._nsp_dur_back | Number | Duration information for NSP (Network Security Platform) on the back end. |
| Netskope.Alert._nsp_dur_front | Number | Duration information for NSP on the front end. |
| Netskope.Alert._nsp_retrans_back | Number | Retransmission information for NSP on the back end. |
| Netskope.Alert._nsp_retrans_front | Number | Retransmission information for NSP on the front end. |
| Netskope.Alert._nsp_rtt_back | Number | Round-trip time information for NSP on the back end. |
| Netskope.Alert._nsp_rtt_front | Number | Round-trip time information for NSP on the front end. |
| Netskope.Alert._resource_name | String | The name associated with a resource. |
| Netskope.Alert._scan_source | String | Information indicating the source of a scan. |
| Netskope.Alert._tenant_max_file_size | Number | The maximum file size allowed for a tenant. |
| Netskope.Alert.all_policy_matches | String | Information related to policy matches. |
| Netskope.Alert.browser_version | String | Browser version. |
| Netskope.Alert.file_size | Number | Size of the file in bytes. |
| Netskope.Alert.file_type | String | File type. |
| Netskope.Alert.md5 | String | MD5 of the file. |
| Netskope.Alert.object | String | Name of the object which is being acted on. It could be a filename, folder name, report name, document name, etc. |
| Netskope.Alert.object_type | String | Type of the object which is being acted on. Object type could be a file, folder, report, document, message, etc. |
| Netskope.Alert.web_universal_connector | String | Universal web connector information. |
Command example
!netskope-alert-list start_time="2023-05-05 11:06" alert_type=policy limit=2
Context Example
{
"Netskope": {
"Alert": [
{
"_appsession_start": "yes",
"_category_id": "8",
"_category_name": "Collaboration",
"_category_tags": [10001, 564, 8],
"_content_version": 1687272302,
"_correlation_id": "011c0f84-9938-460b-8cbe-dab38fa6cb31",
"_creation_timestamp": 1687656279,
"_ef_received_at": 1687656276462,
"_event_id": "724d1174-d78c-4197-8243-4fbd3644b192",
"_forwarded_by": "msg-relayer",
"_gef_src_dp": "IL-TLV1",
"_id": "c3c98336e9d6807dd821b8dc",
"_insertion_epoch_timestamp": 1687656283,
"_nshostname": "dppool1-2-egress",
"_raw_event_inserted_at": 1687656276776,
"_service_identifier": "service-nsproxy",
"_session_begin": "1",
"_skip_geoip_lookup": "yes",
"_src_epoch_now": 1687667040,
"access_method": "Client",
"acked": "false",
"action": "block",
"activity": "Browse",
"alert": "yes",
"alert_id": "c3c98336e9d6807dd821b8dc",
"alert_name": "365 block",
"alert_type": "policy",
"app": "Microsoft Teams",
"app_session_id": 3379014715943843300,
"appcategory": "Collaboration",
"appsuite": "Office365",
"browser": "Native",
"browser_session_id": 2893692091617575400,
"category": "Collaboration",
"cci": 92,
"ccl": "excellent",
"connection_id": 1717056737521399300,
"count": 1,
"device": "Windows Device",
"device_classification": "unmanaged",
"domain": "config.teams.microsoft.com",
"dst_country": "US",
"dst_latitude": 47.682899475097656,
"dst_location": "Redmond",
"dst_longitude": -122.12090301513672,
"dst_region": "Washington",
"dst_timezone": "America/Los_Angeles",
"dst_zipcode": "N/A",
"dstip": "8.8.8.8",
"hostname": "DESKTOP-TOR2VO7",
"incident_id": 6782360912641091000,
"ja3": "a0e9f5d64349fb13191bc781f81f42e1",
"ja3s": "NotAvailable",
"managed_app": "no",
"managementID": "",
"netskope_pop": "IL-TLV1",
"notify_template": "block_page.html",
"nsdeviceuid": "A633E874-D3B2-0FB7-F5CC-AF89F428B182",
"organization_unit": "",
"os": "Windows 10",
"os_version": "Windows 10",
"other_categories": ["Test web Policy Beni", "Technology", "Collaboration"],
"page": "config.teams.microsoft.com",
"page_site": "Microsoft Teams",
"policy": "365 block",
"policy_id": "84BE7DC6087E38BCA19B3788C5E02A67 2023-06-22 14:42:51.404368",
"port": "443",
"protocol": "HTTPS/1.1",
"request_id": 2605870162901070000,
"severity": "unknown",
"site": "Microsoft Teams",
"src_country": "IL",
"src_latitude": 32.0803,
"src_location": "Tel Aviv",
"src_longitude": 34.7805,
"src_region": "Tel Aviv",
"src_time": "Sun Jun 25 04:24:00 2023",
"src_timezone": "Asia/Jerusalem",
"src_zipcode": "N/A",
"srcip": "8.8.8.8",
"telemetry_app": "",
"timestamp": "2023-06-25T01:24:36.000Z",
"traffic_type": "CloudApp",
"transaction_id": 6782360912641091000,
"type": "nspolicy",
"ur_normalized": "example@qmasters.co",
"url": "config.teams.microsoft.com/config/v1/ODSP_Sync_Client/23.119.0606.0001",
"user": "example@qmasters.co",
"useragent": "OneDrive-23.119.0606.0001",
"userip": "8.8.8.8",
"userkey": "example@qmasters.co"
},
{
"_appsession_start": "yes",
"_category_id": "8",
"_category_name": "Collaboration",
"_category_tags": [10001, 564, 8],
"_content_version": 1687272302,
"_correlation_id": "46647142-2f24-4802-b8f5-22814e80353a",
"_creation_timestamp": 1687659879,
"_ef_received_at": 1687659876494,
"_event_id": "6827a5eb-de85-48af-8eae-6d3034084fd6",
"_forwarded_by": "msg-relayer",
"_gef_src_dp": "IL-TLV1",
"_id": "da711d311019f02d79ebc8f4",
"_insertion_epoch_timestamp": 1687659883,
"_nshostname": "dppool1-2-egress",
"_raw_event_inserted_at": 1687659876771,
"_service_identifier": "service-nsproxy",
"_session_begin": "1",
"_skip_geoip_lookup": "yes",
"_src_epoch_now": 1687670640,
"access_method": "Client",
"acked": "false",
"action": "block",
"activity": "Browse",
"alert": "yes",
"alert_id": "da711d311019f02d79ebc8f4",
"alert_name": "365 block",
"alert_type": "policy",
"app": "Microsoft Teams",
"app_session_id": 4359394467077842400,
"appcategory": "Collaboration",
"appsuite": "Office365",
"browser": "Native",
"browser_session_id": 2893692091617575400,
"category": "Collaboration",
"cci": 92,
"ccl": "excellent",
"connection_id": 8981978357397935000,
"count": 1,
"device": "Windows Device",
"device_classification": "unmanaged",
"domain": "config.teams.microsoft.com",
"dst_country": "AT",
"dst_latitude": 48.2049,
"dst_location": "Vienna",
"dst_longitude": 16.3662,
"dst_region": "Vienna",
"dst_timezone": "Europe/Vienna",
"dst_zipcode": "1010",
"dstip": "8.8.8.8",
"hostname": "DESKTOP-TOR2VO7",
"incident_id": 1478029261577663500,
"ja3": "a0e9f5d64349fb13191bc781f81f42e1",
"ja3s": "NotAvailable",
"managed_app": "no",
"managementID": "",
"netskope_pop": "IL-TLV1",
"notify_template": "block_page.html",
"nsdeviceuid": "A633E874-D3B2-0FB7-F5CC-AF89F428B182",
"organization_unit": "",
"os": "Windows 10",
"os_version": "Windows 10",
"other_categories": ["Test web Policy Beni", "Technology", "Collaboration"],
"page": "config.teams.microsoft.com",
"page_site": "Microsoft Teams",
"policy": "365 block",
"policy_id": "84BE7DC6087E38BCA19B3788C5E02A67 2023-06-22 14:42:51.404368",
"port": "443",
"protocol": "HTTPS/1.1",
"request_id": 2605900362175087600,
"severity": "unknown",
"site": "Microsoft Teams",
"src_country": "IL",
"src_latitude": 32.0803,
"src_location": "Tel Aviv",
"src_longitude": 34.7805,
"src_region": "Tel Aviv",
"src_time": "Sun Jun 25 05:24:00 2023",
"src_timezone": "Asia/Jerusalem",
"src_zipcode": "N/A",
"srcip": "8.8.8.8",
"telemetry_app": "",
"timestamp": "2023-06-25T02:24:36.000Z",
"traffic_type": "CloudApp",
"transaction_id": 1478029261577663500,
"type": "nspolicy",
"ur_normalized": "example@qmasters.co",
"url": "config.teams.microsoft.com/config/v1/ODSP_Sync_Client/23.119.0606.0001",
"user": "example@qmasters.co",
"useragent": "OneDrive-23.119.0606.0001",
"userip": "8.8.8.8",
"userkey": "example@qmasters.co"
}
]
}
}
Human Readable Output
Alert List
Showing page 1.
Current page size: 2.
Alert Id Alert Name Alert Type Severity Action Activity Type Category Name Event Id Domain Dst Country Policy Port Protocol Md5 Timestamp c3c98336e9d6807dd821b8dc 365 block policy unknown block Browse nspolicy Collaboration 724d1174-d78c-4197-8243-4fbd3644b192 config.teams.microsoft.com US 365 block 443 HTTPS/1.1 2023-06-25T01:24:36.000Z da711d311019f02d79ebc8f4 365 block policy unknown block Browse nspolicy Collaboration 6827a5eb-de85-48af-8eae-6d3034084fd6 config.teams.microsoft.com AT 365 block 443 HTTPS/1.1 2023-06-25T02:24:36.000Z
netskope-event-list
Get events extracted from SaaS traffic. You may choose what events to receive with the event_type parameter. You must provide start_time and end_time, or insertion_start_time and insertion_end_time (If end_time or insertion_end_time isn’t provided - it defaults to the current date and time). Also, you cannot provide a combination of the options mentioned above.
Base Command
netskope-event-list
Input
| Argument Name | Description | Required |
|---|---|---|
| event_type | Select events by their type. Available types: page,application,audit,infrastructure,network. Possible values are: page, application, audit, infrastructure, network. | Required |
| query | Free query to filter the events. For example, “app eq Dropbox”. For more information, please visit Netskope documentation: https://docs.netskope.com/en/get-events-data.html. | Optional |
| start_time | Restrict events to those that have dates greater than the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘end_time’ argument must also be provided. | Optional |
| end_time | Restrict events to those that have dates less than or equal to the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘start_time’ argument must also be provided. If the start_time argument is provided and this argument is not - the default value will be set for now. | Optional |
| insertion_start_time | Restrict events to those that were inserted into the system after the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘insertion_end_time’ argument must also be provided. | Optional |
| insertion_end_time | Restrict events to those that were inserted into the system before the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). When this argument is provided, the ‘insertion_start_time’ argument must also be provided. If the insertion_start_time argument is provided and this argument is not - the default value will be set for now. | Optional |
| page | Page number of paginated results. Minimum value: 1. | Optional |
| limit | The maximum number of records to retrieve. Default is 50. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.Event._appsession_start | String | Netskope event application session start. |
| Netskope.Event._category_id | String | Netskope event category ID. |
| Netskope.Event._category_name | String | Netskope event category name. |
| Netskope.Event._category_tags | Number | Netskope event category tags. |
| Netskope.Event._content_version | Number | Netskope event content version. |
| Netskope.Event._correlation_id | String | Netskope event correlation ID. |
| Netskope.Event._creation_timestamp | Number | Netskope event creation timestamp. |
| Netskope.Event._ef_received_at | Date | The timestamp indicating when the event was received. |
| Netskope.Event._event_id | String | Netskope event event ID. |
| Netskope.Event._forwarded_by | String | Netskope event forwarded by. |
| Netskope.Event._gef_src_dp | String | The source data path for the event. |
| Netskope.Event._id | String | Netskope event ID. |
| Netskope.Event._insertion_epoch_timestamp | Number | Netskope event insertion epoch timestamp |
| Netskope.Event._nshostname | String | The hostname associated with Netskope. |
| Netskope.Event._raw_event_inserted_at | Date | The date the Netskope raw event was inserted. |
| Netskope.Event._service_identifier | String | Netskope event service identifier. |
| Netskope.Event._session_begin | String | The timestamp marking the beginning of a session. |
| Netskope.Event._skip_geoip_lookup | String | Netskope event skip GeoIP lookup. |
| Netskope.Event._src_epoch_now | Number | A numeric value representing the source epoch. |
| Netskope.Event.access_method | String | Netskope event access method. |
| Netskope.Event.action | String | Netskope event action. |
| Netskope.Event.activity | String | Netskope event activity. |
| Netskope.Event.alert | String | Netskope event alert. |
| Netskope.Event.app | String | Netskope event app. |
| Netskope.Event.app_session_id | Number | Netskope event app session ID. |
| Netskope.Event.appcategory | String | Netskope event app category. |
| Netskope.Event.appsuite | String | Netskope event app suite. |
| Netskope.Event.browser | String | Netskope event browser. |
| Netskope.Event.browser_session_id | Number | Netskope event browser session ID. |
| Netskope.Event.category | String | Netskope event category. |
| Netskope.Event.cci | Number | Netskope event Cloud Confidence Index. |
| Netskope.Event.ccl | String | Netskope event Cloud Confidence Levels. |
| Netskope.Event.connection_id | Number | Netskope event connection ID. |
| Netskope.Event.count | Number | Netskope event count. |
| Netskope.Event.device | String | Netskope event device. |
| Netskope.Event.device_classification | String | Netskope event device classification. |
| Netskope.Event.dom | String | Netskope event Document Object Model (DOM). |
| Netskope.Event.dst_country | String | Netskope event destination country. |
| Netskope.Event.dst_latitude | Number | Netskope event destination latitude. |
| Netskope.Event.dst_location | String | Netskope event destination location. |
| Netskope.Event.dst_longitude | Number | Netskope event destination longitude. |
| Netskope.Event.dst_region | String | Netskope event destination region. |
| Netskope.Event.dst_timezone | String | Netskope event destination timezone. |
| Netskope.Event.dst_zipcode | String | Netskope event destination zip code. |
| Netskope.Event.dstip | String | Netskope event destination IP. |
| Netskope.Event.hostname | String | Netskope event host name. |
| Netskope.Event.incident_id | Number | Netskope event incident ID. |
| Netskope.Event.ja3 | String | A field indicating JA3 information. |
| Netskope.Event.ja3s | String | A field indicating JA3S information. |
| Netskope.Event.managed_app | String | Netskope event managed app. |
| Netskope.Event.managementID | String | Netskope event management ID. |
| Netskope.Event.netskope_pop | String | Netskope event Netskope POP. |
| Netskope.Event.notify_template | String | Netskope event notify template. |
| Netskope.Event.nsdeviceuid | String | Netskope event Netskope device UID. |
| Netskope.Event.organization_unit | String | Netskope event organization unit. |
| Netskope.Event.os | String | Netskope event operating system. |
| Netskope.Event.os_version | String | Netskope event operating system version. |
| Netskope.Event.other_categories | String | Netskope event other categories. |
| Netskope.Event.page | String | Netskope event page. |
| Netskope.Event.page_site | String | Netskope event page site. |
| Netskope.Event.policy | String | Netskope event policy. |
| Netskope.Event.policy_id | String | Netskope event policy ID. |
| Netskope.Event.port | Number | Netskope event port. |
| Netskope.Event.protocol | String | Netskope event protocol. |
| Netskope.Event.request_id | Number | Netskope event request ID. |
| Netskope.Event.severity | String | Netskope event severity. |
| Netskope.Event.site | String | Netskope event site. |
| Netskope.Event.src_country | String | Netskope event source country. |
| Netskope.Event.src_latitude | Number | Netskope event source latitude. |
| Netskope.Event.src_location | String | Netskope event source location. |
| Netskope.Event.src_longitude | Number | Netskope event source longitude. |
| Netskope.Event.src_region | String | Netskope event source region. |
| Netskope.Event.src_time | Date | Netskope event source time. |
| Netskope.Event.src_timezone | String | Netskope event source timezone. |
| Netskope.Event.src_zipcode | String | Netskope event source zip code. |
| Netskope.Event.srcip | String | Netskope event source IP. |
| Netskope.Event.telemetry_app | String | Netskope event telemetry app. |
| Netskope.Event.timestamp | Number | Netskope event timestamp. |
| Netskope.Event.traffic_type | String | Netskope event traffic type. |
| Netskope.Event.transaction_id | Number | Netskope event transaction ID. |
| Netskope.Event.type | String | Netskope event type. |
| Netskope.Event.ur_normalized | String | All lowercase user email. |
| Netskope.Event.url | String | Netskope event URL. |
| Netskope.Event.user | String | Netskope event user. |
| Netskope.Event.useragent | String | Netskope event user agent. |
| Netskope.Event.userip | String | Netskope event user IP. |
| Netskope.Event.userkey | String | Netskope event user key. |
Command example
!netskope-event-list event_type=page start_time="10 days ago" limit=2
Human Readable Output
Event List
Showing page 1.
Current page size: 2.
No entries.
netskope-url-list-update
Update the URL List with the values provided. please note that this command overrides the list.
Base Command
netskope-url-list-update
Input
| Argument Name | Description | Required |
|---|---|---|
| url_list_id | The URL list ID to update (use netskope-url-list-list command to get URL list ID). | Required |
| name | The updated URL list name. | Required |
| urls | The updated URL list items (For Exact - Enter URLs like .example.com, or IP addresses, separated by a new line. For Regex - Enter URLs like ^client[0-9]\.google\.com , ^app\.slack\.com/./netskope, or ^google.com, separated by a new line). | Required |
| list_type | The updated URL list type. Possible values are: exact, regex. | Required |
| deploy | Whether to deploy URL list changes or not. Default is False. Possible values are: True, False. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.URLList.id | Number | Netskope URL list ID. |
| Netskope.URLList.name | String | Netskope URL list name. |
| Netskope.URLList.data.urls | String | Netskope URL list data URLs. |
| Netskope.URLList.data.type | String | Netskope URL list data type. |
| Netskope.URLList.data.json_version | Number | Netskope URL list data JSON version. |
| Netskope.URLList.modify_by | String | Netskope URL list modify by. |
| Netskope.URLList.modify_time | Date | Netskope URL list modify time. |
| Netskope.URLList.modify_type | String | Netskope URL list modify type. |
| Netskope.URLList.pending | String | Netskope URL list pending status. |
Command example
!netskope-url-list-update url_list_id=11 name="QMASTERS list" urls="google.com" list_type=regex deploy=false
Context Example
{
"Netskope": {
"URLList": {
"id": 11,
"json_version": 2,
"modify_by": "Tal New Token",
"modify_time": "2023-07-18",
"modify_type": "Edited",
"name": "QMASTERS list",
"pending": "pending",
"type": "regex",
"urls": ["google.com"]
}
}
}
Human Readable Output
URL List
Id Json Version Modify By Modify Time Modify Type Name Pending Type Urls 11 2 Tal New Token 2023-07-18 Edited QMASTERS list pending regex google.com
netskope-url-list-create
Create a new URL list.
Base Command
netskope-url-list-create
Input
| Argument Name | Description | Required |
|---|---|---|
| name | The unique name for the URL list. | Required |
| urls | The URL list items (For Exact - Enter URLs like .example.com, or IP addresses, separated by a new line. For Regex - Enter URLs like ^client[0-9]\.google\.com , ^app\.slack\.com/./netskope, or ^google.com, separated by a new line). | Required |
| list_type | The URL list type. Possible values are: exact, regex. | Required |
| deploy | Whether to deploy URL list changes or not. Default is False. Possible values are: True, False. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.URLList.id | Number | Netskope URL list ID. |
| Netskope.URLList.name | String | Netskope URL list name. |
| Netskope.URLList.data.urls | String | Netskope URL list data URLs. |
| Netskope.URLList.data.type | String | Netskope URL list data type. |
| Netskope.URLList.data.json_version | Number | Netskope URL list data JSON version. |
| Netskope.URLList.modify_type | String | Netskope URL list modify type. |
| Netskope.URLList.modify_by | String | Netskope URL list modify by. |
| Netskope.URLList.modify_time | Date | Netskope URL list modify time. |
| Netskope.URLList.pending | String | Netskope URL list pending status. |
Command example
!netskope-url-list-create name="New QMASTERS list" urls="xsoar.com,qmasters.com,google.com" list_type=regex deploy=false
Context Example
{
"Netskope": {
"URLList": {
"id": 12,
"json_version": 2,
"modify_by": "Tal New Token",
"modify_time": "2023-07-18",
"modify_type": "Created",
"name": "New QMASTERS list",
"pending": "pending",
"type": "regex",
"urls": ["xsoar.com", "qmasters.com", "google.com"]
}
}
}
Human Readable Output
URL List
Id Json Version Modify By Modify Time Modify Type Name Pending Type Urls 12 2 Tal New Token 2023-07-18 Created New QMASTERS list pending regex xsoar.com,
qmasters.com,
google.com
netskope-url-lists-list
Get all URL Lists or a specific by specifying the list ID.
Base Command
netskope-url-lists-list
Input
| Argument Name | Description | Required |
|---|---|---|
| url_list_id | The URL list ID to get. | Optional |
| pending | Get a list of only applied or pending URL lists. Possible values are: applied, pending. | Optional |
| field | Comma separated data values to return in response call (for example: name, id, data, modify_by, modify_time, modify_type, pending). Defaults to all values. | Optional |
| all_results | Whether to retrieve all results or not. Defaults is false. Possible values are: True, False. | Optional |
| limit | The maximum number of records to retrieve. Default is 50. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.URLList.id | Number | Netskope URL list ID. |
| Netskope.URLList.name | String | Netskope URL list name. |
| Netskope.URLList.data.urls | String | Netskope URL list data URLs. |
| Netskope.URLList.modify_by | String | Netskope URL list modify by. |
| Netskope.URLList.modify_time | Date | Netskope URL list modify time. |
| Netskope.URLList.modify_type | String | Netskope URL list modify type. |
| Netskope.URLList.pending | String | Netskope URL list pending status. |
Command example
!netskope-url-lists-list
Context Example
{
"Netskope": {
"URLList": [
{
"data": {
"json_version": 2,
"type": "exact",
"urls": ["g.g"]
},
"id": 1,
"modify_by": "example@qmasters.co",
"modify_time": "2023-07-16T00:00:00.000Z",
"modify_type": "Edited",
"name": "myList",
"pending": 0
},
{
"data": {
"json_version": 2,
"type": "regex",
"urls": ["google.com"]
},
"id": 2,
"modify_by": "Tal New Token",
"modify_time": "2023-07-18T00:00:00.000Z",
"modify_type": "Edited",
"name": "NewURLList",
"pending": 0
},
{
"data": {
"json_version": 2,
"type": "exact",
"urls": ["google.com", "www.abc.com", "example.com", "lulu.com"]
},
"id": 4,
"modify_by": "Netskope REST API",
"modify_time": "2023-07-05T10:24:57.000Z",
"modify_type": "Edited",
"name": "Tal-newURLlist",
"pending": 0
},
{
"data": {
"json_version": 2,
"type": "exact",
"urls": ["google.com", "example.com", "lulu.com"]
},
"id": 5,
"modify_by": "Netskope REST API",
"modify_time": "2023-07-05T00:00:00.000Z",
"modify_type": "Created",
"name": "New URL list",
"pending": 0
},
{
"data": {
"json_version": 2,
"type": "exact",
"urls": ["google.com", "example.com", "lulu.com"]
},
"id": 6,
"modify_by": "Netskope REST API",
"modify_time": "2023-07-05T00:00:00.000Z",
"modify_type": "Created",
"name": "New URL list 2",
"pending": 0
},
{
"data": {
"json_version": 2,
"type": "regex",
"urls": ["xsoar.com", "qmasters.com"]
},
"id": 8,
"modify_by": "Netskope REST API",
"modify_time": "2023-07-17T00:00:00.000Z",
"modify_type": "Created",
"name": "NewNewURLlist",
"pending": 0
},
{
"data": {
"json_version": 2,
"type": "regex",
"urls": ["xsoar.com", "qmasters.com"]
},
"id": 9,
"modify_by": "Netskope REST API",
"modify_time": "2023-07-17T00:00:00.000Z",
"modify_type": "Created",
"name": "NewNewURLlist1",
"pending": 0
}
]
}
}
Human Readable Output
URL List
Id Json Version Modify By Modify Time Modify Type Name Pending Type Urls 1 2 example@qmasters.co 2023-07-16T00:00:00.000Z Edited myList applied exact g.g 2 2 Tal New Token 2023-07-18T00:00:00.000Z Edited NewURLList applied regex google.com 4 2 Netskope REST API 2023-07-05T10:24:57.000Z Edited Tal-newURLlist applied exact google.com,
www.abc.com,
example.com,
lulu.com5 2 Netskope REST API 2023-07-05T00:00:00.000Z Created New URL list applied exact google.com,
example.com,
lulu.com6 2 Netskope REST API 2023-07-05T00:00:00.000Z Created New URL list 2 applied exact google.com,
example.com,
lulu.com8 2 Netskope REST API 2023-07-17T00:00:00.000Z Created NewNewURLlist applied regex xsoar.com,
qmasters.com9 2 Netskope REST API 2023-07-17T00:00:00.000Z Created NewNewURLlist1 applied regex xsoar.com,
qmasters.com
netskope-url-list-delete
Delete a URL list by the list ID.
Base Command
netskope-url-list-delete
Input
| Argument Name | Description | Required |
|---|---|---|
| url_list_id | The URL list ID to delete (use netskope-url-list-list to get the URL list ID). | Required |
| deploy | Whether to deploy URL list changes or not. Default is False. Possible values are: True, False. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.URLList.id | Number | Netskope URL list ID. |
| Netskope.URLList.name | String | Netskope URL list name. |
Command example
!netskope-url-list-delete url_list_id=10
Context Example
{
"Netskope": {
"URLList": {
"data": {
"json_version": 2,
"type": "regex",
"urls": ["xsoar.com", "qmasters.com"]
},
"id": 10,
"modify_by": "Netskope REST API",
"modify_time": "2023-07-17T00:00:00.000Z",
"modify_type": "Deleted",
"name": "TalURLlist",
"pending": 1
}
}
}
Human Readable Output
The URL list 10 was deleted successfully
netskope-client-list
Get information about Netskope SCIM users. The command provides a list of users who have been imported into the Netskope tenant through SCIM integration. Users imported through other methods, such as manual CSV import or manual creation, will not be included in the returned results.
Base Command
netskope-client-list
Input
| Argument Name | Description | Required |
|---|---|---|
| filter | Filter the Netskope user by ‘key eq value’ template. For example: userName eq “someUserName” OR externalId eq “User-Ext_id”. | Optional |
| page | Page number of paginated results. Minimum value: 1. | Optional |
| limit | The maximum number of records to retrieve. Default is 50. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.Client.id | Number | Netskope client ID. |
| Netskope.Client.name | String | Netskope client name. |
| Netskope.Client.userName | String | Netskope client username. |
| Netskope.Client.externalId | String | Netskope client external ID. |
| Netskope.Client.active | Boolean | Netskope client activate. |
| Netskope.Client.emails | String | Netskope client emails. |
Command example
!netskope-client-list page=1 limit=2
Context Example
{
"Netskope": {
"Client": [
{
"active": true,
"client_id": "6a4dbb07-f465-4a6c-8af2-1c84ced65010",
"emails": ["email1@netskope.local"],
"family_name": "last_name",
"given_name": "first_name",
"user_name": "upn1"
},
{
"active": true,
"client_id": "f8d26597-e4a4-400d-a24b-40318a9e80e5",
"emails": ["email11@netskope.local"],
"family_name": "last_name1",
"given_name": "first_name1",
"user_name": "upn2"
}
]
}
}
Human Readable Output
Client List
Showing page 1.
Current page size: 2.
Client Id User Name Given Name Family Name Emails Active 6a4dbb07-f465-4a6c-8af2-1c84ced65010 upn1 first_name last_name email1@netskope.local true f8d26597-e4a4-400d-a24b-40318a9e80e5 upn2 first_name1 last_name1 email11@netskope.local true
netskope-url-list-add
Update the URL list with the values provided. Note that this command appends the list.
Base Command
netskope-url-list-add
Input
| Argument Name | Description | Required |
|---|---|---|
| url_list_id | The URL list ID to update (use netskope-url-list-list command to get URL list ID). | Required |
| urls | The updated URL list items (For Exact - Enter URLs like .example.com, or IP addresses, separated by a new line. For Regex - Enter URLs like ^client[0-9]\.google\.com , ^app\.slack\.com/./netskope, or ^google.com, separated by a new line). | Required |
| list_type | The updated URL list type. Possible values are: exact, regex. | Required |
| deploy | Whether to deploy URL list changes or not. Possible values are: True, False. Default is false. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.URLList.id | Number | Netskope URL list ID. |
| Netskope.URLList.name | String | Netskope URL list name. |
| Netskope.URLList.data.urls | String | Netskope URL list data URLs. |
| Netskope.URLList.data.type | String | Netskope URL list data type. |
| Netskope.URLList.data.json_version | Number | Netskope URL list data JSON version. |
| Netskope.URLList.modify_by | String | Netskope URL list modify by. |
| Netskope.URLList.modify_time | Date | Netskope URL list modify time. |
| Netskope.URLList.modify_type | String | Netskope URL list modify type. |
| Netskope.URLList.pending | Number | Netskope URL list pending. |
netskope-incident-dlp-list
Fetch DLP incidents.
Base Command
netskope-incident-dlp-list
Input
| Argument Name | Description | Required |
|---|---|---|
| start_time | Restrict incidents to those that have updated dates greater than the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). Default is ‘1 hour ago’. Default is 1 hour ago. | Optional |
| end_time | Restrict incidents to those that have updated dates less than or equal to the provided date string (for example “YYYY-MM-DDThh:mm”, “1 min ago”, “2 weeks ago”). Default is ‘now’. Default is now. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| Netskope.Incident._id | String | |
| Netskope.Incident.access_method | String | |
| Netskope.Incident.acting_user | String | |
| Netskope.Incident.activity | String | |
| Netskope.Incident.app | String | |
| Netskope.Incident.app_session_id | Number | |
| Netskope.Incident.assignee | String | |
| Netskope.Incident.connection_id | Number | |
| Netskope.Incident.dlp_incident_id | Number | |
| Netskope.Incident.dlp_match_info | Unknown | |
| Netskope.Incident.dlp_match_info.dlp_action | String | |
| Netskope.Incident.dlp_match_info.dlp_forensic_id | Number | |
| Netskope.Incident.dlp_match_info.dlp_policy | String | |
| Netskope.Incident.dlp_match_info.dlp_profile_name | String | |
| Netskope.Incident.dlp_match_info.dlp_rules | Unknown | |
| Netskope.Incident.dlp_match_info.dlp_rules.dlp_incident_rule_count | Number | |
| Netskope.Incident.dlp_match_info.dlp_rules.dlp_match_type | String | |
| Netskope.Incident.dlp_match_info.dlp_rules.dlp_rule_name | String | |
| Netskope.Incident.dlp_match_info.dlp_rules.dlp_rule_severity | String | |
| Netskope.Incident.dlp_parent_id | Number | |
| Netskope.Incident.dst_location | String | |
| Netskope.Incident.file_lang | String | |
| Netskope.Incident.file_size | Number | |
| Netskope.Incident.file_type | String | |
| Netskope.Incident.from_user | String | |
| Netskope.Incident.instance_id | String | |
| Netskope.Incident.md5 | String | |
| Netskope.Incident.object | String | |
| Netskope.Incident.object_id | String | |
| Netskope.Incident.object_type | String | |
| Netskope.Incident.severity | String | |
| Netskope.Incident.site | String | |
| Netskope.Incident.src_location | String | |
| Netskope.Incident.status | String | |
| Netskope.Incident.timestamp | Number | |
| Netskope.Incident.title | String | |
| Netskope.Incident.true_obj_category | String | |
| Netskope.Incident.true_obj_type | String | |
| Netskope.Incident.url | String | |
| Netskope.Incident.user | String | |
| Netskope.Incident.owner_pdl | String | |
| Netskope.Incident.classification | String | |
| Netskope.Incident.to_user | String | |
| Netskope.Incident.cc | String | |
| Netskope.Incident.owner | String | |
| Netskope.Incident.destination_site | String | |
| Netskope.Incident.user_id | String | |
| Netskope.Incident.instance | String | |
| Netskope.Incident.channel | String | |
| Netskope.Incident.bcc | String | |
| Netskope.Incident.inline_dlp_match_info | Unknown | |
| Netskope.Incident.exposure | String | |
| Netskope.Incident.file_path | String | |
| Netskope.Incident.original_file_snapshot_id | String | |
| Netskope.Incident.destination_app | String | |
| Netskope.Incident.latest_incident_id | Number | |
| Netskope.Incident.dlp_file | String | |
| Netskope.Incident.zip_file_id | String | |
| Netskope.Incident.referer | String | |
| Netskope.Incident.destination_instance_id | String |
Command example
!netskope-incident-dlp-list
Context Example
{
"Netskope": {
"Incident": [
{
"_id": "dg",
"access_method": "Client",
"acting_user": "d@d.co",
"activity": "Upload",
"app": "Microsoft Office 365 OneDrive for Business",
"app_session_id": 6089117609268013425,
"assignee": "d@d.co",
"connection_id": 1888383367374049276,
"dlp_incident_id": 7061311227778495851,
"dlp_match_info": [
{
"dlp_action": "block",
"dlp_forensic_id": 7061311227778495851,
"dlp_policy": "DLP test policy - Beni",
"dlp_profile_name": "test dlp profile -beni",
"dlp_rules": [
{
"dlp_incident_rule_count": 1,
"dlp_match_type": "FileFilter",
"dlp_rule_name": "test dlp profile - beni",
"dlp_rule_severity": "Medium"
}
]
}
],
"dlp_parent_id": 7061311227778495851,
"dst_location": "Redmond",
"file_lang": "Unknown",
"file_size": 10,
"file_type": "text/plain",
"from_user": "d@d.co",
"instance_id": "d",
"md5": "fsd",
"object": "d.txt",
"object_id": "01",
"object_type": "File",
"severity": "Critical",
"site": "Microsoft Office 365 OneDrive for Business",
"src_location": "Tel Aviv",
"status": "in_progress",
"timestamp": 1710928898,
"title": "d.txt",
"true_obj_category": "Text",
"true_obj_type": "Plain Text file",
"url": "v1.g.f",
"user": "sdf",
"owner_pdl": "",
"classification": "",
"to_user": "",
"cc": "",
"owner": "",
"destination_site": "",
"user_id": "",
"instance": "",
"channel": "",
"bcc": "",
"inline_dlp_match_info": [],
"exposure": "",
"file_path": "",
"original_file_snapshot_id": "",
"destination_app": "",
"latest_incident_id": 0,
"dlp_file": "",
"zip_file_id": "",
"referer": "",
"destination_instance_id": ""
}
]
}
}
Human Readable Output
Client List
Showing page 1.
Current page size: 2.
Object Id Status Severity Activity Assignee Timestamp Acting User App Instance Id Object Type 12 new High FormPost None 1725903291 None Form
get-mapping-fields
Returns the list of fields for an incident type.
Base Command
get-mapping-fields
Input
| Argument Name | Description | Required |
| —————– | ————— | ———— |
Context Output
There is no context output for this command.
update-remote-system
Updates the remote incident or detection with local incident or detection changes. This method is only used for debugging purposes and will not update the current incident or detection.
Base Command
update-remote-system
Input
| Argument Name | Description | Required |
| —————– | ————— | ———— |
Context Output
There is no context output for this command.
get-remote-data
Gets remote data from a remote incident. This method does not update the current incident, and should be used for debugging purposes.
Base Command
get-remote-data
Input
| Argument Name | Description | Required |
|---|---|---|
| id | The ticket ID. | Required |
| lastUpdate | Retrieves entries that were created after lastUpdate. | Required |
Context Output
There is no context output for this command.
get-modified-remote-data
Gets the list of incidents that were modified since the last update time. Note that this method is here for debugging purposes. The get-modified-remote-data command is used as part of a Mirroring feature, which is available in Cortex XSAIM/XSOAR from version 6.1.
Base Command
get-modified-remote-data
Input
| Argument Name | Description | Required |
|---|---|---|
| lastUpdate | A date string in local time representing the last time the incident was updated. The incident is only returned if it was modified after the last update time. | Optional |
Context Output
There is no context output for this command.
Incident Mirroring
You can enable incident mirroring between Cortex XSAIM/XSOAR incidents and Netskope (API v2) LOCAL corresponding events (available from Cortex XSAIM/XSOAR version 6.0.0).
To set up the mirroring:
- Enable Fetching incidents in your instance configuration.
-
In the Mirroring Direction integration parameter, select in which direction the incidents should be mirrored:
Option Description None Turns off incident mirroring. Incoming Any changes in Netskope (API v2) LOCAL events (mirroring incoming fields) will be reflected in Cortex XSOAR incidents. Outgoing Any changes in Cortex XSAIM/XSOAR incidents will be reflected in Netskope (API v2) LOCAL events (outgoing mirrored fields). Incoming and Outgoing - Optional: Check the Close Mirrored XSAIM/XSOAR Incident integration parameter to close the Cortex XSAIM/XSOAR incident when the corresponding event is closed in Netskope (API v2) LOCAL.
Newly fetched incidents will be mirrored in the chosen direction. However, this selection does not affect existing incidents.
Important Note: To ensure the mirroring works as expected, mappers are required, both for incoming and outgoing, to map the expected fields in Cortex XSAIM/XSOAR and Netskope (API v2) LOCAL.
Configuration parameters
url— Server URL (required)proxy— Use system proxy settingsinsecure— Trust any certificate (not secure)credentials— (required)first_fetch— First fetch timestampmax_fetch— Maximum incidents per fetchmax_events_fetch— Maximum Netskope events per fetch. Max value is 200.max_dlp_incidents_fetch— Maximum Netskope DLP incidents per fetch. Max value is 200.fetch_events— Fetch Eventsfetch_dlp_incidents— Fetch DLP incidentsevent_types— Event types to fetch.alerts_query— Alerts Queryevents_query— Events QueryincidentType— Incident typeisFetch— Fetch incidentsuser_email— User EmailincidentFetchInterval— Incidents Fetch Intervalmirror_direction— Incident Mirroring Directionclose_incident— Close Mirrored XSOAR Incidentclose_netskope_incident— Close Mirrored Netskope Incident
Commands (13)
-
get-mapping-fieldsReturns the list of fields for an incident type.
-
get-modified-remote-dataGets the list of incidents that were modified since the last update time. Note that this method is here for debugging purposes. The get-modified-remote-data command is used as part of a Mirroring feature, which is available in Cortex XSOAR from version 6.1.
-
get-remote-dataGets remote data from a remote incident. This method does not update the current incident, and should be used for debugging purposes.
-
netskope-alert-listGet alerts generated by Netskope. You may choose what alerts to receive with the alert_type parameter. You must provide start_time and end_time, or insertion_start_time and insertion_end_time. (Note that if end_time or insertion_end_time aren't provided. the date time would be set as now.) You cannot provide a combination of the options mentioned above.
-
netskope-client-listGet information about Netskope SCIM users. The command provides a list of users who have been imported into the Netskope tenant through SCIM integration. Users imported through other methods, such as manual CSV import or manual creation, will not be included in the returned results.
-
netskope-event-listGet events extracted from SaaS traffic. You may choose what events to receive with the event_type parameter. You must provide start_time and end_time, or insertion_start_time and insertion_end_time. (Note that if end_time or insertion_end_time aren't provided, the date time would be set as now.) You cannot provide a combination of the options mentioned above.
-
netskope-incident-dlp-listFetch DLP incidents by update time. The maximum recommended time range should be no more from 3 days.
-
netskope-url-list-addUpdate the URL list with the values provided. Note that this command appends the list.
-
netskope-url-list-createCreate a new URL list.
-
netskope-url-list-deleteDelete a URL list by the list ID.
-
netskope-url-list-updateUpdate the URL list with the values provided. Note that this command overrides the list.
-
netskope-url-lists-listGet all URL lists or a specific URL list by specifying the list ID.
-
update-remote-systemUpdates the remote incident or detection with local incident or detection changes. This method is only used for debugging purposes and will not update the current incident or detection.
import json import os from unittest.mock import patch import freezegun import pytest from CommonServerPython import * from NetskopeAPIv2 import Client SERVER_URL = "https://test_url.com/" API_TOKEN = "api_token" def util_load_json(file_name): with open(os.path.join("test_data", f"{file_name}.json"), encoding="utf-8") as mock_file: return json.loads(mock_file.read()) @pytest.fixture() def client(): return Client(server_url=SERVER_URL, verify=False, proxy=False, api_token=API_TOKEN) @pytest.mark.parametrize( "url, args", [ ( f"{SERVER_URL}api/v2/events/data/page", { "event_type": "page", "limit": 20, "start_time": "11-05-2023 14:30", }, ), ( f"{SERVER_URL}api/v2/events/data/application", { "event_type": "application", "page": 1, "limit": 4, "start_time": "11-05-2023 14:30", }, ), ( f"{SERVER_URL}api/v2/events/data/network", { "event_type": "network", "start_time": "11-05-2023 14:30", "end_time": "11-05-2023 14:30", }, ), ( f"{SERVER_URL}api/v2/events/data/infrastructure", { "event_type": "infrastructure", "query": "app eq Dropbox", "page": 2, "limit": 10, "insertion_start_time": "11-05-2023 14:30", }, ), ( f"{SERVER_URL}api/v2/events/data/audit", { "event_type": "audit", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", }, ), ], ) def test_list_event(client, requests_mock, url, args): """ Scenario: List events extracted from SaaS traffic and or logs. Given: - User has provided valid credentials. When: - netskope-event-list command is called. Then: - Ensure outputs prefix is correct. - Ensure a sample value from the API matches what is generated in the context. """ from NetskopeAPIv2 import list_event_command mock_response = util_load_json("events") requests_mock.get(url, json=mock_response) result = list_event_command(client, args) assert len(result.outputs) == 1 assert result.outputs_prefix == "Netskope.Event" assert result.outputs[0]["_id"] == "c4a0ad0684b73c3746e205a0" assert result.outputs[0]["timestamp"] == "2023-07-05T17:14:52.000Z" assert result.outputs[0]["type"] == "nspolicy" assert result.outputs[0]["access_method"] == "Client" @pytest.mark.parametrize( "args", [ ( { "alert_type": "anomaly", "limit": 20, "start_time": "11-05-2023 14:30", } ), ( { "alert_type": "Compromised Credential", "page": 1, "limit": 4, "start_time": "11-05-2023 14:30", } ), ( { "alert_type": "policy", "start_time": "11-05-2023 14:30", "end_time": "11-05-2023 14:30", } ), ( { "alert_type": "Legal Hold", "query": "app eq Dropbox", "page": 2, "limit": 10, "insertion_start_time": "11-05-2023 14:30", } ), ( { "alert_type": "malsite", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ( { "alert_type": "Malware", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ( { "alert_type": "DLP", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ( { "alert_type": "Security Assessment", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ( { "alert_type": "watchlist", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ( { "alert_type": "quarantine", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ( { "alert_type": "Remediation", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ( { "alert_type": "uba", "page": 1, "limit": 5, "insertion_start_time": "11-05-2023 14:30", "insertion_end_time": "11-05-2023 14:30", } ), ], ) def test_list_alert(client, requests_mock, args): """ Scenario: List alerts generated by Netskope, including policy, DLP, and watch list alerts. Given: - User has provided valid credentials. When: - netskope-alert-list command is called. Then: - Ensure outputs prefix is correct. - Ensure a sample value from the API matches what is generated in the context. """ from NetskopeAPIv2 import list_alert_command mock_response = util_load_json("alerts") requests_mock.get(f"{SERVER_URL}api/v2/events/data/alert", json=mock_response) result = list_alert_command(client, args) assert len(result.outputs) == 1 assert result.outputs_prefix == "Netskope.Alert" assert result.outputs[0]["alert_id"] == "7a30814339c73cf437653b22" assert result.outputs[0]["timestamp"] == "2023-07-05T17:14:52.000Z" assert result.outputs[0]["action"] == "block" assert result.outputs[0]["alert_name"] == "365 block" def test_update_url_list(client, requests_mock): """ Scenario: Update the URL List with the values provided. Given: - User has provided valid credentials. When: - netskope-url-list-update command is called. Then: - Ensure number of items is correct. - Ensure outputs prefix is correct. - Ensure a sample value from the API matches what is generated in the context. """ from NetskopeAPIv2 import update_url_list_command mock_response = util_load_json("url_list") requests_mock.put(f"{SERVER_URL}api/v2/policy/urllist/1", json=mock_response) result = update_url_list_command( client, { "url_list_id": "1", "name": "new_url_list", "urls": ["www.google.com"], "list_type": "Regex", "is_overwrite": True, "deploy": False, }, ) assert result.outputs_prefix == "Netskope.URLList" assert result.outputs[0]["name"] == "new_url_list" assert result.outputs[0]["urls"][0] == "www.google.com" def test_create_url_list(client, requests_mock): """ Scenario: create the URL List with the values provided. Given: - User has provided valid credentials. When: - netskope-url-list-create command is called. Then: - Ensure number of items is correct. - Ensure outputs prefix is correct. - Ensure a sample value from the API matches what is generated in the context. """ from NetskopeAPIv2 import create_url_list_command mock_response = util_load_json("url_list") requests_mock.post(f"{SERVER_URL}api/v2/policy/urllist", json=mock_response) result = create_url_list_command( client, { "name": "new_url_list", "urls": ["www.google.com"], "list_type": "Regex", "deploy": False, }, ) assert result.outputs_prefix == "Netskope.URLList" assert result.outputs[0]["name"] == "new_url_list" assert result.outputs[0]["urls"][0] == "www.google.com" def test_delete_url_list(client, requests_mock): """ Scenario: delete the URL List with the values provided. Given: - User has provided valid credentials. When: - netskope-url-list-delete command is called. Then: - Ensure number of items is correct. - Ensure outputs prefix is correct. - Ensure a sample value from the API matches what is generated in the context. """ from NetskopeAPIv2 import delete_url_list_command mock_response = util_load_json("url_list") requests_mock.delete(f"{SERVER_URL}api/v2/policy/urllist/1", json=mock_response) result = delete_url_list_command(client, {"url_list_id": "1", "deploy": False}) assert result.outputs_prefix == "Netskope.URLList" assert result.readable_output == "The URL list 1 was deleted successfully" def test_list_client(client, requests_mock): """ Scenario: Get information about the Netskope clients. Given: - User has provided valid credentials. When: - netskope-client-list command is called. Then: - Ensure number of items is correct. - Ensure outputs prefix is correct. - Ensure a sample value from the API matches what is generated in the context. """ from NetskopeAPIv2 import list_client_command mock_response = util_load_json("clients") requests_mock.get(f"{SERVER_URL}api/v2/scim/Users", json=mock_response) result = list_client_command(client, {"filter": "userName eq someUserName", "limit": 5}) assert result.outputs_prefix == "Netskope.Client" assert result.outputs[0]["client_id"] == "TESTXSOAR" assert result.outputs[0]["active"] is True assert result.outputs[0]["emails"][0] == "example@tal.gu" def test_list_dlp_incident(client, requests_mock): """ Scenario: Update the URL List with the values provided. Given: - User has provided valid credentials. When: - netskope-url-list-update command is called. Then: - Ensure number of items is correct. - Ensure outputs prefix is correct. - Ensure a sample value from the API matches what is generated in the context. """ from NetskopeAPIv2 import list_dlp_incident_command mock_response = util_load_json("dlp_incidents") requests_mock.get(f"{SERVER_URL}api/v2/events/dataexport/events/incident", json=mock_response) result = list_dlp_incident_command( client, { "start_time": "1 day ago", "end_time": "now", }, ) assert result.outputs_prefix == "Netskope.Incident" assert result.outputs[0]["object_id"] == "01" assert result.outputs[0]["status"] == "in_progress" assert result.outputs[0]["severity"] == "Critical" def test_convert_client_filter(): """ Scenario: Convert client filter to support Netskope template. Given: - Response from Netskope. When: - Arguments include client filter. Then: - Ensure value string is correct 'key eq "value"'. """ from NetskopeAPIv2 import convert_client_filter result = convert_client_filter("userName eq someUserName") assert result == 'userName eq "someUserName"' def test_convert_client_filter_error(): """ Scenario: Convert client filter to support Netskope template. Given: - Response from Netskope. When: - Arguments include client filter. Then: - Ensure value string is correct 'key eq "value"'. """ from NetskopeAPIv2 import convert_client_filter with pytest.raises(DemistoException) as de: convert_client_filter("someUserName") assert de.message == "Filter must contain 'key' eq 'value'" def test_get_updated_client_list(): """ Scenario: Test the get_updated_client_list function. Given: - Response from the API containing client lists. When: - Calling get_updated_client_list function with the API response. Then: - Ensure the function returns the expected updated client list. """ from NetskopeAPIv2 import get_updated_list_client mock_response = util_load_json("clients") expected_output = [ { "client_id": "TESTXSOAR", "given_name": "first_name", "family_name": "last_name", "user_name": "upn1", "external_id": "User-Ext_id", "active": True, "emails": ["example@tal.gu"], } ] assert get_updated_list_client(mock_response["Resources"]) == expected_output def test_get_updated_url_list(): """ Scenario: Test the get_updated_url_list function. Given: - Response from the API containing URL lists. When: - Calling get_updated_url_list function with the API response. Then: - Ensure the function returns the expected updated URL list. """ from NetskopeAPIv2 import get_updated_url_list mock_response = util_load_json("url_list") expected_output = [ { "id": 1, "name": "new_url_list", "urls": ["www.google.com", "www.abc.com"], "type": "exact", "json_version": 2, "modify_by": "modify_by", "modify_type": "Edited", "modify_time": "modify_time", "pending": "applied", } ] assert get_updated_url_list(mock_response) == expected_output @pytest.mark.parametrize( "args, expected_output", [ ( { "start_time": "01-07-2023 00:00", "end_time": None, "insertion_start_time": None, "insertion_end_time": None, }, (1673049600, 1690891200, None, None), ), ], ) @freezegun.freeze_time(datetime(2023, 8, 1, 12)) def test_convert_time_args_to_num(args, expected_output): """ Scenario: Test the convert_time_args_to_num function. Given: - Command arguments containing time-related arguments. When: - Calling convert_time_args_to_num function with the command arguments. Then: - Ensure the function returns the expected updated time arguments. """ from NetskopeAPIv2 import TimeArgs, convert_time_args_to_num assert convert_time_args_to_num(args) == TimeArgs(*expected_output) def test_convert_number_to_str_date(): """ Scenario: Test the convert_number_to_str_date function. Given: - A date number. When: - Calling convert_number_to_str_date function with the date number. Then: - Ensure the function returns the expected date string. """ from NetskopeAPIv2 import convert_number_to_str_date date_number = 1677756000 expected_output = "02-03-2023 11:20" assert convert_number_to_str_date(date_number) == expected_output def test_fetch_incidents(client, requests_mock): """ Scenario: Fetch incidents. Given: -XSOAR arguments. When: - fetch-incident called. Then: - Ensure last run and incident are correct. """ from NetskopeAPIv2 import fetch_incidents alert_mock_response = util_load_json("alerts") event_mock_response = util_load_json("events") dlp_incidents_mock_response = util_load_json("dlp_incidents") requests_mock.get(f"{SERVER_URL}api/v2/events/data/alert", json=alert_mock_response) requests_mock.get(f"{SERVER_URL}api/v2/events/data/application", json=event_mock_response) requests_mock.get(f"{SERVER_URL}api/v2/events/data/page", json=event_mock_response) requests_mock.get(f"{SERVER_URL}api/v2/events/dataexport/events/incident", json=dlp_incidents_mock_response) last_run, incidents = fetch_incidents( client, { "max_fetch": 10, "fetch_events": True, "fetch_dlp_incidents": True, "first_fetch": "2023-01-01 15:00", "max_events_fetch": 10, "max_dlp_incidents_fetch": 10, "event_types": ["application", "page"], "mirror_direction": "Incoming and Outgoing", }, ) last_run["dlp_incident"]["date"] = "11-09-2024 08:00" last_run["dlp_incident"]["time"] = 1726041600 assert incidents == [ { "name": "application-event ID: c4a0ad0684b73c3746e205a0", "occurred": "2023-07-05T17:14:00Z", "incident_type": "application-event", "mirror_direction": "Both", "mirror_instance": "", "rawJSON": json.dumps( event_mock_response["result"][0] | { "incident_type": "application-event", "mirror_direction": "Both", "mirror_instance": "", "app_session_id": "8465907469530832528", "browser_session_id": "4306403352624265077", "incident_id": "5842546291106376750", "request_id": "2613596205044864769", "transaction_id": "5842546291106376750", } ), }, { "name": "page-event ID: c4a0ad0684b73c3746e205a0", "occurred": "2023-07-05T17:14:00Z", "incident_type": "page-event", "mirror_direction": "Both", "mirror_instance": "", "rawJSON": json.dumps( event_mock_response["result"][0] | { "incident_type": "page-event", "mirror_direction": "Both", "mirror_instance": "", "app_session_id": "8465907469530832528", "browser_session_id": "4306403352624265077", "incident_id": "5842546291106376750", "request_id": "2613596205044864769", "transaction_id": "5842546291106376750", } ), }, { "name": "dlp_incident ID: 01", "occurred": "2024-03-20T10:01:00Z", "incident_type": "dlp_incident", "mirror_direction": "Both", "mirror_instance": "", "rawJSON": json.dumps( dlp_incidents_mock_response["result"][0] | { "incident_type": "dlp_incident", "mirror_direction": "Both", "mirror_instance": "", } ), }, { "name": "alert ID: 7a30814339c73cf437653b22", "occurred": "2023-07-05T17:14:00Z", "incident_type": "alert", "mirror_direction": "Both", "mirror_instance": "", "rawJSON": json.dumps( alert_mock_response["result"][0] | { "incident_type": "alert", "mirror_direction": "Both", "mirror_instance": "", "app_session_id": "8638023457299261081", "browser_session_id": "4014571231818143674", "connection_id": "8594277971962832463", "incident_id": "6443216183026877636", "request_id": "2598159462674082048", "transaction_id": "6443216183026877636", } ), }, ] assert last_run == { "alert": { "date": "01-01-2023 15:00", "id": "7a30814339c73cf437653b22", "time": 1688577293, }, "application": { "date": "01-01-2023 15:00", "id": "c4a0ad0684b73c3746e205a0", "time": 1688577293, }, "dlp_incident": { "date": "11-09-2024 08:00", "id": "01", "time": 1726041600, }, "page": { "date": "01-01-2023 15:00", "id": "c4a0ad0684b73c3746e205a0", "time": 1688577293, }, } def test_fetch_incidents_no_event_type(client, requests_mock): """ Scenario: Fetch incidents and event type was not set. Given: -XSOAR arguments. When: - fetch-incident called. Then: - Ensure last run and incident are correct. """ from NetskopeAPIv2 import fetch_incidents alert_mock_response = util_load_json("alerts") event_mock_response = util_load_json("events") dlp_incidents_mock_response = util_load_json("dlp_incidents") requests_mock.get(f"{SERVER_URL}api/v2/events/data/alert", json=alert_mock_response) requests_mock.get(f"{SERVER_URL}api/v2/events/data/application", json=event_mock_response) requests_mock.get(f"{SERVER_URL}api/v2/events/data/page", json=event_mock_response) requests_mock.get(f"{SERVER_URL}api/v2/events/dataexport/events/incident", json=dlp_incidents_mock_response) last_run, incidents = fetch_incidents( client, { "max_fetch": 10, "fetch_events": True, "fetch_dlp_incidents": True, "first_fetch": "2023-01-01 15:00", "max_events_fetch": 10, "max_dlp_incidents_fetch": 10, "mirror_direction": "Incoming and Outgoing", }, ) last_run["dlp_incident"]["date"] = "11-09-2024 08:00" last_run["dlp_incident"]["time"] = 1726041600 assert incidents == [ { "name": "dlp_incident ID: 01", "occurred": "2024-03-20T10:01:00Z", "incident_type": "dlp_incident", "mirror_direction": "Both", "mirror_instance": "", "rawJSON": json.dumps( dlp_incidents_mock_response["result"][0] | { "incident_type": "dlp_incident", "mirror_direction": "Both", "mirror_instance": "", } ), }, { "name": "alert ID: 7a30814339c73cf437653b22", "occurred": "2023-07-05T17:14:00Z", "incident_type": "alert", "mirror_direction": "Both", "mirror_instance": "", "rawJSON": json.dumps( alert_mock_response["result"][0] | { "incident_type": "alert", "mirror_direction": "Both", "mirror_instance": "", "app_session_id": "8638023457299261081", "browser_session_id": "4014571231818143674", "connection_id": "8594277971962832463", "incident_id": "6443216183026877636", "request_id": "2598159462674082048", "transaction_id": "6443216183026877636", } ), }, ] assert last_run == { "alert": { "date": "01-01-2023 15:00", "id": "7a30814339c73cf437653b22", "time": 1688577293, }, "dlp_incident": { "date": "11-09-2024 08:00", "id": "01", "time": 1726041600, }, } def test_set_and_get_demisto_integration_context(): """ Scenario: Test the set_demisto_integration_context function. Given: - A key to be updated with new values. - An action to append or replace the values for the key. When: - Calling set_demisto_integration_context with an action 'append'. - Calling set_demisto_integration_context with an action 'replace'. Then: - Ensure the key is correctly updated in the integration context. - Ensure the append action adds values to the existing list. """ from NetskopeAPIv2 import get_demisto_integration_context, set_demisto_integration_context # Mocking get_integration_context and set_integration_context set_demisto_integration_context("existing_key", [1, 2, 3], "append") # Test append action mock_context = get_demisto_integration_context("existing_key", []) assert mock_context == [1, 2, 3] def test_remove_duplicates(): """ Scenario: Test the remove_duplicates function. Given: - A list of dictionaries where some dictionaries have duplicate keys. When: - Calling remove_duplicates function with the key to check for duplicates. Then: - Ensure the function returns a list with duplicates removed. """ from NetskopeAPIv2 import remove_duplicates dicts_list = [ {"object_id": "1", "value": "A"}, {"object_id": "2", "value": "B"}, {"object_id": "1", "value": "C"}, # Duplicate object_id {"object_id": "3", "value": "D"}, ] expected_output = [ {"object_id": "1", "value": "C"}, # Last occurrence of object_id "1" {"object_id": "2", "value": "B"}, {"object_id": "3", "value": "D"}, ] result = remove_duplicates(dicts_list, key="object_id") assert result == expected_output def test_get_hourly_timestamps(): """ Scenario: Test the get_hourly_timestamps function. Given: - A valid start and end timestamp. When: - Calling get_hourly_timestamps function. Then: - Ensure the function returns a list of hourly timestamps between start and end. """ from NetskopeAPIv2 import get_hourly_timestamps start_time = 1609459200 # 2021-01-01 00:00:00 UTC end_time = 1609480800 # 2021-01-01 06:00:00 UTC expected_output = [ 1609459200, # 2021-01-01 00:00:00 1609462800, # 2021-01-01 01:00:00 1609466400, # 2021-01-01 02:00:00 1609470000, # 2021-01-01 03:00:00 1609473600, # 2021-01-01 04:00:00 1609477200, # 2021-01-01 05:00:00 1609480800, # 2021-01-01 06:00:00 ] result = get_hourly_timestamps(start_time, end_time) assert result == expected_output def test_get_modified_remote_data(client): """ Scenario: Verify getting modified remote data. Given: - A valid Netskope API client. - Valid command arguments. - Mocked response from the client. When: - Calling the function to get modified remote data. Then: - Ensure that the returned response matches the expected format. """ from NetskopeAPIv2 import get_modified_remote_data mock_response = {"result": [{"object_id": "1"}, {"object_id": "2"}]} with patch("NetskopeAPIv2.Client") as MockClient: client_instance = MockClient.return_value client_instance.list_dlp_incident.return_value = mock_response with patch("NetskopeAPIv2.get_demisto_integration_context") as mock_get_context: mock_get_context.return_value = 123456789 with patch("NetskopeAPIv2.get_hourly_timestamps") as mock_get_hourly_timestamps: mock_get_hourly_timestamps.return_value = [123456789] result = get_modified_remote_data(client_instance) expected_response = GetModifiedRemoteDataResponse(["1", "2"]) assert result.modified_incident_ids == expected_response.modified_incident_ids def test_get_mapping_fields_command(): """ Scenario: Verify fetching mapping fields. Given: - No specific input required for this function. When: - Calling the function to fetch mapping fields. Then: - Ensure that the returned response matches the expected format. """ from NetskopeAPIv2 import MIRRORING_FIELDS, get_mapping_fields_command result = get_mapping_fields_command() expected_response = GetMappingFieldsResponse() incident_type_scheme = SchemeTypeMapping(type_name="Netskope Incident") for field in MIRRORING_FIELDS: incident_type_scheme.add_field(field) expected_response.add_scheme_type(incident_type_scheme) assert result.scheme_types_mappings[0].type_name == expected_response.scheme_types_mappings[0].type_name assert result.scheme_types_mappings[0].fields == expected_response.scheme_types_mappings[0].fields def test_get_remote_data_command(): """ Scenario: Verify fetching remote data. Given: - A valid Netskope API client. - Valid command arguments. - Mocked response from the client. When: - Calling the function to fetch remote data. Then: - Ensure that the returned response matches the expected format. """ from NetskopeAPIv2 import get_remote_data_command args = { "id": "incident123", "lastUpdate": "2023-02-14 12:30:45", } with patch("NetskopeAPIv2.get_demisto_integration_context") as mock_get_context: mock_get_context.return_value = [{"incident_type": "dlp_incident", "object_id": "incident123", "status": "closed"}] result = get_remote_data_command(args, {"close_incident": True}) expected_response = GetRemoteDataResponse( {"incident_type": "dlp_incident", "object_id": "incident123", "status": "closed"}, [ { "Type": 1, "Contents": {"dbotIncidentClose": True, "closeReason": "Closed from Netskope."}, "ContentsFormat": "json", } ], ) assert result.mirrored_object == expected_response.mirrored_object assert result.entries == expected_response.entries def test_update_remote_system(): """ Scenario: Verify updating the remote system. Given: - A valid Netskope API client. - Valid command arguments. - Mocked response from the client. When: - Calling the function to update the remote system. Then: - Ensure that the remote incident ID is returned. """ from NetskopeAPIv2 import update_remote_system mock_response = { "result": "success", } with patch("NetskopeAPIv2.Client") as MockClient: client_instance = MockClient.return_value client_instance.update_dlp_incident.return_value = mock_response args = { "data": { "incident_key": "incident123", "status": "closed", }, "entries": [], "incidentChanged": True, "remoteId": "incident123", "delta": { "status": "closed", }, } with patch("NetskopeAPIv2.UpdateRemoteSystemArgs") as mock_UpdateRemoteSystemArgs: mock_UpdateRemoteSystemArgs.return_value = UpdateRemoteSystemArgs(args) result = update_remote_system(client_instance, args, {"close_netskope_incident": True}) assert result == "incident123" @pytest.mark.parametrize( "data, expected_output", [ # Test case 1: No large integers ( {"id": 123, "name": "test", "count": 1000}, {"id": 123, "name": "test", "count": 1000}, ), # Test case 2: Single large integer exceeding JS_NUMBER_LIMIT ( {"id": 9007199254740992, "name": "test"}, {"id": "9007199254740992", "name": "test"}, ), # Test case 3: Multiple large integers ( { "object_id": 9007199254740993, "incident_id": 9007199254740994, "timestamp": 1234567890, "name": "test", }, { "object_id": "9007199254740993", "incident_id": "9007199254740994", "timestamp": 1234567890, "name": "test", }, ), # Test case 4: Integer exactly at JS_NUMBER_LIMIT (should not convert) ( {"id": 9007199254740991, "name": "test"}, {"id": 9007199254740991, "name": "test"}, ), # Test case 5: Mixed data types with large integers ( { "large_id": 9007199254740995, "small_id": 100, "name": "test", "active": True, "score": 99.5, }, { "large_id": "9007199254740995", "small_id": 100, "name": "test", "active": True, "score": 99.5, }, ), ], ) def test_convert_large_integers_to_strings(data, expected_output): """ Scenario: Test the convert_large_integers_to_strings function. Given: - A dictionary containing various integer values, some exceeding JavaScript's MAX_SAFE_INTEGER. When: - Calling convert_large_integers_to_strings function with the dictionary. Then: - Ensure integers larger than 2^53-1 are converted to strings. - Ensure integers at or below 2^53-1 remain as integers. - Ensure other data types remain unchanged. - Ensure the function modifies the dictionary in-place. """ from NetskopeAPIv2 import convert_large_integers_to_strings original_id = id(data) convert_large_integers_to_strings(data) # Verify the data was modified correctly assert data == expected_output # Verify it's the same object (in-place modification) assert id(data) == original_id