Session statistics
The api/audit/sessions/stats endpoint provides statistics about recorded sessions (active and closed).
URL
GET https://<IP-address-of-SPS>/api/audit/sessions/stats?field=<field-name>
Sample request
The following command retrieves statistical data about sessions.
curl --cookie cookies https://<IP-address-of-SPS>/api/audit/sessions/stats?field=<field-name>
Request parameters
Use the following parameters to fine-tune your request for statistics:
-
?q: Narrow down the scope of statistics using one or more properties (elements) of the sessions.
-
?field: Request statistics for the selected properties (elements and values) of sessions (for example, protocol).
Using this parameter is mandatory.
-
?sub_fields: Request sub statistics for the selected properties (elements and values) of sessions (for example, protocol).
This parameter only accepts a single parameter. If more than one parameter is listed, only the first will be considered.
-
?size: Limit the range of values displayed in the statistics for a given field. Statistics will be shown only for the top size number of most frequently occurring values (that is, values with the highest number of counts).
Take the following example. If you query "/api/audit/sessions/stats?field=protocol&size=2", and the following sessions were recorded:
...
{
"Alpha": {
"protocol": "http"
},
"Bravo": {
"protocol": "ssh"
},
"Charlie": {
"protocol": "rdp"
},
"Delta": {
"protocol": "rdp"
},
"Echo": {
"protocol": "rdp"
},
"Foxtrot": {
"protocol": "http"
},
"Golf": {
"protocol": "http"
}
}
...
The response contains:
...
{
"meta": {
"href": "/api/audit/sessions/stats",
"parent": "/api/audit/sessions",
"others": 1,
"field": "protocol",
"size": 2
}
}
...
And the response items look like the snippet below. That is, in this example, there will be no statistics for "protocol": "ssh". The top 2 values are "rdp" and "http", with a count of 3 each. "ssh" occurred only once, so it did not make it to the top 2 most frequent values.
...
[
{"count": 3, "value": "http"},
{"count": 3, "value": "rdp"}
...
-
?start: Statistics are returned for sessions that started after the specified date. Use the ISO 8601 format for the date, for example, 2017-01-25T10:00.
-
?end: Statistics are returned for sessions that ended before the specified date. Use the ISO 8601 format for the date, for example, 2017-01-25T11:00.
-
?q=screen.content: Statistics are returned for indexed sessions that contain the type of content specified.
NOTE: When performing a content query, the maximum number of results returned is 10000. When this limit is exceeded, the scope of statistics is limited to the first 10000 sessions.
Response
The following snippet is a sample response received when retrieving statistics about the protocol field.
Those fields of the meta object that are specific to statistics are collected in table Element .
{
"items": [
{
"count": 7,
"value": "ssh"
}
],
"meta": {
"field": "protocol",
"href": "/api/audit/sessions/stats",
"others": 0,
"parent": "/api/audit/sessions",
"remaining_seconds": 600,
"size": 10
}
}
body, or items when a list is returned |
|
Top-level element (string) |
Contains the properties that are in the scope of the requested statistics. |
|
count |
integer |
Indicates the number of sessions included in the scope of statistics. |
|
value |
string |
Contains the value of the field that you requested statistics about. |
meta |
|
Top-level element |
Contains links to different parts of the REST service. |
|
field |
string |
Contains the name of the field that you requested statistics about. |
|
sub_fields |
string |
Contains the name of the sub field that you requested statistics about. |
|
others |
integer |
Some values of the field that you specified in your query are not included in the scope of statitics. This happens when a specific value occurs fewer times in the examined sessions than the aggregation size.
The others field indicates the number of those distinct values that are not included in the statistics.
For a detailed explanation with an example, see ?size. |
|
size |
integer |
The size that you specified in your query. |
Example 1:
If you query "/api/audit/sessions/stats?field=protocol", and the following sessions were recorded:
...
{
"Alpha": {
"protocol": "ssh"
},
"Bravo": {
"protocol": "ssh"
},
"Charlie": {
"protocol": "rdp"
},
"Delta": {
"protocol": "rdp"
},
"Echo": {
"protocol": "rdp"
},
"Foxtrot": {
"protocol": "ssh"
},
"Golf": {
"protocol": "ssh"
}
}
...
The response contains:
...
{
"meta": {
"href": "/api/audit/sessions/stats",
"parent": "/api/audit/sessions",
"others": 0,
"field": "protocol"
}
}
...
The response items contain:
...
[
{"count": 4, "value": "ssh"},
{"count": 3, "value": "rdp"}
...
Example 2:
If you query "/api/audit/sessions/stats?field=protocol&content=login&start=2017-01-02&end=2017-01-03&q=psm.content_reference_id%3A%5B3%20TO%206%5D", and the following sessions were recorded:
{
"Alpha": {
"protocol": "ssh",
"start_time": "2017-01-01",
"end_time": "2017-01-02",
"recording": {
"content_reference_id": 1
}
},
"Bravo": {
"protocol": "ssh",
"start_time": "2017-01-01",
"end_time": "2017-01-02",
"recording": {
"content_reference_id": 2
}
},
"Charlie": {
"protocol": "rdp",
"start_time": "2017-01-01",
"end_time": "2017-01-02",
"recording": {
"content_reference_id": 3
}
},
"Delta": {
"protocol": "rdp",
"start_time": "2017-01-03",
"end_time": "2017-01-04",
"psm": {
"content_reference_id": 4
}
},
"Echo": {
"protocol": "rdp",
"start_time": "2017-01-03",
"end_time": "2017-01-04",
"recording": {
"content_reference_id": 5
}
},
"Foxtrot": {
"protocol": "ssh",
"start_time": "2017-01-04",
"end_time": "2017-01-06",
"recording": {
"content_reference_id": 6
}
},
"Golf": {
"protocol": "ssh",
"start_time": "2017-01-02",
"end_time": "2017-01-10",
"recording": {
"content_reference_id": 7
}
}
}
And the following sessions match when running the content query:
| trail_id | rank | hits_count |
| 1 | 1.555 | 1 |
| 2 | 1.555 | 1 |
| 3 | 1.555 | 1 |
| 4 | 1.555 | 1 |
| 6 | 1.555 | 1 |
The response contains:
...
{
"meta": {
"href": "/api/audit/sessions/stats",
"parent": "/api/audit/sessions",
"others": 0,
"field": "protocol"
}
}
...
The response items contain:
...
[
{"count": 2, "value": "rdp"}
...
Example 3:
If you query "/api/audit/sessions/stats?field=user.gateway_username&?sub_fields=protocol&?size=1", and the following sessions were recorded:
...
{
"Alpha": {
"protocol": "ssh",
"user": {
"gateway_username": "user-Alpha"
}
},
"Bravo": {
"protocol": "ssh",
"user": {
"gateway_username": "user-Bravo"
}
},
"Charlie": {
"protocol": "rdp",
"user": {
"gateway_username": "user-Charlie"
}
},
"Delta": {
"protocol": "rdp",
"user": {
"gateway_username": "user-Alpha"
}
},
"Echo": {
"protocol": "rdp",
"user": {
"gateway_username": "user-Alpha"
}
},
"Foxtrot": {
"protocol": "ssh",
"user": {
"gateway_username": "user-Alpha"
}
},
"Golf": {
"protocol": "ssh",
"user": {
"gateway_username": "user-Alpha"
}
},
"Hotel": {
"protocol": "ssh",
"user": {
"gateway_username": "user-Delta"
}
}
}
...
The response contains:
...
{
"meta": {
"href": "/api/audit/sessions/stats",
"parent": "/api/audit/sessions",
"others": 3
}
}
...
The response items contain:
...
[
{
"buckets": [
{
"count": 3,
"value": "ssh"
}
],
"count": 5,
"others": 2,
"value": "user-Alpha"
}
]
...
200 |
OK |
The query was well-formed and statistics have been successfully retrieved. |
400 |
InvalidQueryValue |
The query is invalid, for example, it has an invalid value. |
500 |
SearchUnavailable |
The search backend is inaccessible. |
Session histogram
The api/audit/sessions/histogram endpoint provides a histogram about the recorded sessions.
URL
GET https://<IP-address-of-SPS>/api/audit/sessions/histogram
Sample request
The following command retrieves statistical data about sessions.
curl --cookie cookies https://<IP-address-of-SPS>/api/audit/sessions/histogram
Request parameters
Use the following query parameters to fine-tune your request for statistics:
-
?q: Narrow down the scope of the histogram using one or more properties (elements) of the sessions.
-
?field: Create a histogram for the selected properties (elements and values) of sessions (for example, protocol).
Using this parameter is mandatory.
-
?bin-size: Determines the size of the unit for the histogram, for example, hour. SPS splits the queried period to intervals of this unit, and returns the number of sessions to each interval. For example, if you query an histogram from 2018-02-12:14:40 to 2018-02-16:14:40, and you set the bin-size to day, then SPS will return five datasets (one for each day). If you set the bin-size to week, then SPS will return only one dataset.
-
?start: Create a histogram from the sessions that started after the specified date. Use the ISO 8601 format for the date, for example, 2017-01-25T10:00. By default, this is the one month before the date of the request.
-
?end: Create a histogram from the sessions that ended before the specified date. Use the ISO 8601 format for the date, for example, 2017-01-25T11:00. By default, this is the date of the request.
-
?size: Limit the range of values displayed in the histogram for a given field. The histogram will only be created for the top size number of most frequently occurring values (that is, values with the highest number of counts).
Response
The following snippet is a sample response received when retrieving a histogram about the audited sessions.
Those fields of the meta object that are specific to histograms are described in table Element .
{
"body": {
"buckets": [
{ "active_count": 61, "id": "2018-01-15T12:00:00.000Z", "start_count": 61 },
{ "active_count": 99, "id": "2018-01-15T13:00:00.000Z", "start_count": 89 },
{ "active_count": 39, "id": "2018-01-15T14:00:00.000Z", "start_count": 24 },
{ "active_count": 62, "id": "2018-01-15T15:00:00.000Z", "start_count": 62 },
{ "active_count": 92, "id": "2018-01-15T16:00:00.000Z", "start_count": 81 },
{ "active_count": 27, "id": "2018-01-15T17:00:00.000Z", "start_count": 19 }
]
},
"key": "histogram",
"meta":
{
"bin_size": "month",
"field": "recording.connection_policy",
"href": "/api/audit/sessions/histogram",
"parent": "/api/audit/sessions",
"remaining_seconds": 599,
"time_zone": "Etc/UTC",
"size": "10"
}
}
body |
|
|
Top-level element (string) |
Contains the properties that are in the scope of the requested histogram. |
|
buckets |
|
list |
Contains the details of the histogram. |
|
|
active_count |
integer |
The number of sessions that were active in this interval. |
|
|
id |
date |
The starting date of the interval in ISO 8601 format. |
|
|
start_count |
integer |
The number of sessions that were started in this interval. |
meta |
|
|
Top-level element (JSON object) |
Contains metadata about the endpoint and the histogram. |
|
bin_size |
|
string |
The size of the intervals used to create the histogram. You can change this using the ?bin_size parameter of the request. Default value: month. Possible values: second, minute, hour, day, week, month, year |
|
field |
|
string |
Contains the name of the field that you requested statistics about. |
|
end |
|
date |
The date set in the ?end parameter of the request. By default, this is the date of the request. |
|
start |
|
date |
The date set in the ?start parameter of the request. By default, this is one month before the date of the request. |
|
time_zone |
|
string |
The time zone to use when calculating the intervals of the histogram, for example, Etc/UTC. By default, SPS uses UTC+0 (Zulu Time Zone). For the list of available time zones, see Element . |
|
size |
|
integer |
The size that you specified in your query. |
200 |
OK |
The query was well-formed and the histogram has been successfully retrieved. |
400 |
TooMuchBucketsInResult |
Using the requested bin_size would result in too many intervals for the queried period. |
400 |
NotSupportedContentOption |
This endpoint does not support filtering in the content of sessions. |
Session alerts
The api/audit/sessions/<session-id>/alerts endpoint lists the alerts triggered in a session (if any). For details on configuring alerts, see Real-time content monitoring with Content Policies.
An event is listed as alert only if the Actions > Store in Connection Database option is selected in the Content Policy used to handle the session.
URL
GET https://<IP-address-of-SPS>/api/audit/sessions/<session-id>/alerts
Sample request
The following command lists the alerts of a session.
curl --cookie cookies "https://<IP-address-of-SPS>/api/audit/sessions/<session-id>/alerts"
Response
The following is a sample response received when listing the alerts of a session.
{
"items": [
{
"alert_type": "adp.event.command",
"channel_id": "0",
"matched_action": "ls",
"matched_content": "[myuser@examplehost ~]$ ls",
"matched_regexp": "ls",
"record_id": 94,
"rule_name": "PatternMatcherRule",
"time": "2017-04-25T13:26:39.144356"
},
{
"alert_type": "adp.event.command",
"channel_id": "0",
"matched_action": "man man",
"matched_content": "[myuser@examplehost ~]$ man man",
"matched_regexp": "man",
"record_id": 197,
"rule_name": "PatternMatcherRule",
"time": "2017-04-25T13:34:15.265411"
}
],
"meta": {
"first": "/api/audit/sessions/c7e51cebad1a3e2ade480909f7687b16/alerts?limit=500&offset=0",
"href": "/api/audit/sessions/c7e51cebad1a3e2ade480909f7687b16/alerts",
"last": "/api/audit/sessions/c7e51cebad1a3e2ade480909f7687b16/alerts?limit=500&offset=0",
"limit": 500,
"match_count": 3,
"next": null,
"offset": 0,
"parent": "/api/audit/sessions/c7e51cebad1a3e2ade480909f7687b16",
"previous": null,
"remaining_seconds": 600
}
}
items |
|
list |
Top level element, a list containing the alerts of the session. |
|
alert_type |
string |
The type of the event that triggered the alert. Possible values:
-
adp.event.command: A command entered in SSH or Telnet.
-
adp.event.screen.content: Alert triggered by the screen content.
-
adp.event.screen.creditcard: Credit card numbers detected. Displayed only as an alert, not visible in the events.
-
adp.event.screen.windowtitle: The title of the window in graphic protocols. |
|
channel_id |
string |
The regular expression that matched the command line without prompt. |
|
matched_action |
integer |
A reference to the ID of the channel in the session where the event occurred. |
|
matched_content |
text |
The content that occurred in the session and triggered the alert. Note that this value contains the context of the match as well. For example, if a Content Policy triggers an alert if a user types the sudo command, then the psm.alerts.matched_content value contains the entire command line, including the command prompt, for example, myuser@examplehost:~$ man sudo |
|
matched_regexp |
text |
The regular expression (match field) of the Content Policy that matched a part of the content and triggered the alert. For details, see Real-time content monitoring with Content Policies. |
|
record_id |
integer |
The ID number of the alert within the session. |
|
rule_name |
string |
The name of the content policy rule that triggered the alert. Note that this is not the name of the Content Policy. |
|
time |
string |
The timestamp when the alert was triggered, for example, 2017-04-25T13:26:39.144356. |
Sorting and filtering
Sorting and filtering alerts is currently not supported. The items are automatically sorted by the record ID. The response includes every available field.
Session events
The api/audit/sessions/<session-id>/events endpoint lists the events extracted from a session (if any). Events are available only if the session is indexed. For details on configuring indexing, see Local services: configuring the indexer.
URL
GET https://<IP-address-of-SPS>/api/audit/sessions/<session-id>/events
Sample request
The following command lists the events of a session.
curl --cookie cookies "https://<IP-address-of-SPS>/api/audit/sessions/<session-id>/events"
Response
The following is a sample response received when listing the events of a session.
{
"items": [
{
"action": "ls",
"channels_id": "0",
"content": "myuser@examplehost:~$ ls",
"record_id": 46,
"time": "2017-04-11T09:21:10.832",
"type": "command"
},
{
"action": "cd",
"channels_id": "0",
"content": "myuser@examplehost:~$ cd /cd",
"record_id": 64,
"time": "2017-04-11T09:21:15.488",
"type": "command"
},
{
"action": "cat 24hrs.txt",
"channels_id": "0",
"content": "myuser@examplehost:/var$ cat 24hrs.txt",
"record_id": 78,
"time": "2017-04-11T09:21:18.017",
"type": "command"
},
{
"action": "ls -la",
"channels_id": "0",
"content": "myuser@examplehost:/var$ ls -la",
"record_id": 95,
"time": "2017-04-11T09:21:21.04",
"type": "command"
},
{
"action": "echo example.txt",
"channels_id": "0",
"content": "myuser@examplehost:/var$ echo example.txt",
"record_id": 113,
"time": "2017-04-11T09:21:23.353",
"type": "command"
},
{
"action": "ls",
"channels_id": "0",
"content": "myuser@examplehost:/var$ man sudo",
"record_id": 148,
"time": "2017-04-11T09:21:27.017",
"type": "command"
}
],
"meta": {
"first": "/api/audit/sessions/7930f4308efe8aecd710202d815b76ff/events?limit=500&offset=0",
"href": "/api/audit/sessions/7930f4308efe8aecd710202d815b76ff/events",
"last": "/api/audit/sessions/7930f4308efe8aecd710202d815b76ff/events?limit=500&offset=0",
"limit": 500,
"next": null,
"offset": 0,
"parent": "/api/audit/sessions/7930f4308efe8aecd710202d815b76ff",
"previous": null
}
}
items |
|
list |
Top level element, a list containing the alerts of the session. |
|
action |
string |
The command line without prompt in commands. |
|
channels_id |
integer |
A reference to the ID of the channel in the session where the event occurred. |
|
content |
text |
The event that occurred in the session. Note that this value contains the context of the event as well. For example, for command events in terminal sessions, the value contains the entire command line, including the command prompt. For example, myuser@examplehost:~$ man sudo |
|
record_id |
integer |
The ID number of the event within the session. |
|
type |
string |
The type of the event. Possible values:
-
command: A command entered in SSH or Telnet.
-
file_transfer: A file transfer event.
-
http_request: An HTTP request initiated during the session.
-
window_title: The title of the window in graphic protocols. |
|
time |
string |
The timestamp when the event occurred, for example, 2017-04-25T13:26:39.144356. |
Filtering
You can filter events at the /api/audit/sessions/<session-id>/events endpoint. Use the ?q option to filter the list using one or more properties (elements) of the sessions.
?q=screen.content:sudo
You can escape special characters using the backslash character.
?q=screen.content:\"Copying Files\"
To add multiple elements to the filter, you can use the AND, AND NOT, and OR operators.
content:ls AND content:cp AND NOT content:mv
You can create groups using () (parentheses).
?q=(content:rm OR content:mv) AND channels_id:5
You can also use () (parentheses) to add multiple possible values for a property.
?q=screen.content:(sudo rm)
You can use the * (asterisk) and ? (question mark) wildcards for string-type values.
?q=screen.content:?dmi*
You can define ranges using [] (brackets) or {} (braces) and the TO operator. This only works for numeric (int) values.
-
[ means equal or higher than the following value
-
] means equal or lower than the preceding value
-
{ means higher than the following value
-
}means lower than the preceding value
For example, the following range resolves to 2:
?q=channels_id:{1 TO 3}
You can also use the * (asterisk) wildcard in the range.
?q=channels_id:[* TO 5]
Note that not all connection data can be used for filtering. The available elements are:
-
channels_id: [integer] The channel in the session where the event occurred.
-
record_id: [integer] The identifier of the event in the session.
-
time: [string] The timestamp when the event occurred.
-
type: [string] The type of the event:
-
command: A command entered in SSH or Telnet.
-
screen.content: Text that appears on the screen in the session.
-
screen.creditcard: Credit card numbers detected. Displayed only as an alert, not visible in the events.
-
screen.windowtitle: The title of the window in graphic protocols.