ExpanseAggregateAttributionUser Deprecated

Deprecated. No available replacement. > Aggregate entries from multiple sources into AttributionUser.

python · Cortex Xpanse by Palo Alto Networks (Deprecated)

Source

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401
"""ExpanseAggregateAttributionUser

"""

from CommonServerUserPython import *  # noqa

from typing import Dict, List, Any, Tuple, Optional


''' STANDALONE FUNCTION '''


def deconstruct_entry(entry: Dict[str, str],
                      username_fields: List[str],
                      sightings_fields: List[str]) -> Tuple[Optional[str],
                                                            Optional[str],
                                                            Optional[int]]:
    """
    deconstruct_entry
    Extracts device relevant fields from a log entry.

    :type entry: ``Dict[str, str]``
    :param entry: Log entry as dictionary of fields.

    :type sightings_fields: ``List[str]``
    :param sightings_fields: List of possible field names in log entry to be considered as number of occurences.

    :type username_fields: ``List[str]``
    :param username_fields: List of possible field names in log entry to be considered as username.

    :return: Tuple where the first element is the username or None, the second is the domain extracted from the
        username field and the third element is the number of occurences of the event.
    :rtype: ``Tuple[Optional[str], Optional[str], Optional[int]]``
    """
    username = next((entry[field] for field in username_fields if field in entry), None)
    sightings = next((int(entry[field]) for field in sightings_fields if field in entry), 1)

    domain = None
    if username is not None and "\\" in username:
        domain, username = username.split("\\", 1)

    return username, domain, sightings


''' COMMAND FUNCTION '''


def aggregate_command(args: Dict[str, Any]) -> CommandResults:
    input_list = argToList(args.get('input', []))
    current_list = argToList(args.get('current', []))

    username_fields = argToList(args.get('username_fields', "source_user,srcuser,user"))
    sightings_fields = argToList(args.get('sightings_fields', "count"))

    current_users = {
        f"{d['username']}::{d['domain']}": d
        for d in current_list if d is not None
    }

    for entry in input_list:
        if not isinstance(entry, dict):
            continue

        username, domain, sightings = deconstruct_entry(
            entry,
            username_fields=username_fields,
            sightings_fields=sightings_fields
        )

        if username is None:
            continue
        if domain is None:
            domain = ""

        user_key = f"{username}::{domain}"
        current_state = current_users.get(user_key, None)
        if current_state is None:
            current_state = {
                'username': username,
                'domain': domain,
                'sightings': 0,
                'groups': [],
                'description': None,
            }
            current_users[user_key] = current_state

        if sightings is not None:
            current_state['sightings'] += sightings

    markdown = '## ExpanseAggregateAttributionUser'
    outputs = list(current_users.values())

    return CommandResults(
        readable_output=markdown,
        outputs=outputs or None,
        outputs_prefix="Expanse.AttributionUser",
        outputs_key_field=["username", "domain"]
    )


''' MAIN FUNCTION '''


def main():
    try:
        return_results(aggregate_command(demisto.args()))
    except Exception as ex:
        return_error(f'Failed to execute ExpanseAggregateAttributionUser. Error: {str(ex)}')


''' ENTRY POINT '''


if __name__ in ('__main__', '__builtin__', 'builtins'):
    main()

README

Aggregate entries from multiple sources into AttributionUser

Script Data


Name Description
Script Type python3
Tags  
Cortex XSOAR Version 6.0.0

Used In


This script is used in the following playbooks and scripts.

  • Expanse Attribution Subplaybook

Inputs


Argument Name Description
input Input list.
current Current aggregation state.
username_fields Comma separated list of fields to treat as serial number.
sightings_fields Comma separated list of field names to be considered sighting counts.

Outputs


Path Description Type
Expanse.AttributionUser.username Username of the user string
Expanse.AttributionUser.domain Domain of the user string
Expanse.AttributionUser.groups List of groups the user is member of Unknown
Expanse.AttributionUser.display-name Display Name string
Expanse.AttributionUser.description Description of the user string
Expanse.AttributionUser.sightings Number of sessions seen on this device number