diff --git a/packages/gcp/1.4.1/changelog.yml b/packages/gcp/1.4.1/changelog.yml
new file mode 100755
index 0000000000..7b51c177e4
--- /dev/null
+++ b/packages/gcp/1.4.1/changelog.yml
@@ -0,0 +1,99 @@
+# newer versions go on top
+- version: "1.4.1"
+ changes:
+ - description: Fix quoting of the credentials_json value in policy templates.
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2712
+- version: "1.4.0"
+ changes:
+ - description: Add gcp.dns integration
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/2624
+- version: "1.3.1"
+ changes:
+ - description: Add Ingest Pipeline script to map IANA Protocol Numbers
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2470
+- version: "1.3.0"
+ changes:
+ - description: Update to ECS 8.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/2406
+- version: "1.2.2"
+ changes:
+ - description: Regenerate test files using the new GeoIP database
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2339
+- version: "1.2.1"
+ changes:
+ - description: Change test public IPs to the supported subset
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2327
+- version: "1.2.0"
+ changes:
+ - description: Add 8.0.0 version constraint
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/2251
+- version: "1.1.2"
+ changes:
+ - description: Update Title and Description.
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1965
+- version: "1.1.1"
+ changes:
+ - description: Fix logic that checks for the 'forwarded' tag
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/1818
+- version: "1.1.0"
+ changes:
+ - description: Update to ECS 1.12.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1661
+- version: "1.0.0"
+ changes:
+ - description: Move from experimental to GA
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1568
+ - description: remove experimental from data_sets
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1717
+- version: "0.3.3"
+ changes:
+ - description: Convert to generated ECS fields
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1478
+- version: '0.3.2'
+ changes:
+ - description: update to ECS 1.11.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1385
+- version: "0.3.1"
+ changes:
+ - description: Escape special characters in docs
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1405
+- version: "0.3.0"
+ changes:
+ - description: Update integration description
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1364
+- version: "0.2.0"
+ changes:
+ - description: Set "event.module" and "event.dataset"
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1240
+- version: "0.1.0"
+ changes:
+ - description: update to ECS 1.10.0 and adding event.original options
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1045
+- version: "0.0.2"
+ changes:
+ - description: update to ECS 1.9.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/846
+- version: "0.0.1"
+ changes:
+ - description: initial release
+ type: enhancement # can be one of: enhancement, bugfix, breaking-change
+ link: https://github.com/elastic/integrations/pull/459
diff --git a/packages/gcp/1.4.1/data_stream/audit/agent/stream/gcp-pubsub.yml.hbs b/packages/gcp/1.4.1/data_stream/audit/agent/stream/gcp-pubsub.yml.hbs
new file mode 100755
index 0000000000..d582de0a80
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/agent/stream/gcp-pubsub.yml.hbs
@@ -0,0 +1,27 @@
+project_id: {{project_id}}
+topic: {{topic}}
+subscription.name: {{subscription_name}}
+{{#if credentials_file}}
+credentials_file: {{credentials_file}}
+{{/if}}
+{{#if credentials_json}}
+credentials_json: '{{credentials_json}}'
+{{/if}}
+{{#if alternative_host}}
+alternative_host: {{alternative_host}}
+{{/if}}
+subscription.create: {{subscription_create}}
+tags:
+{{#if preserve_original_event}}
+ - preserve_original_event
+{{/if}}
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+{{#if processors}}
+processors:
+{{processors}}
+{{/if}}
diff --git a/packages/gcp/1.4.1/data_stream/audit/elasticsearch/ingest_pipeline/default.yml b/packages/gcp/1.4.1/data_stream/audit/elasticsearch/ingest_pipeline/default.yml
new file mode 100755
index 0000000000..306383af01
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/elasticsearch/ingest_pipeline/default.yml
@@ -0,0 +1,261 @@
+---
+description: Pipeline for Google Cloud audit logs
+
+processors:
+ - set:
+ field: event.ingested
+ value: "{{_ingest.timestamp}}"
+ - set:
+ field: ecs.version
+ value: '8.0.0'
+ - rename:
+ field: message
+ target_field: event.original
+ ignore_missing: true
+ - json:
+ field: event.original
+ target_field: json
+ - set:
+ field: event.kind
+ value: event
+ - date:
+ field: json.timestamp
+ timezone: UTC
+ formats:
+ - ISO8601
+ - rename:
+ field: json.logName
+ target_field: log.logger
+ ignore_missing: true
+ - set:
+ field: event.id
+ copy_from: json.insertId
+ ignore_empty_value: true
+ ignore_failure: true
+ - convert:
+ field: json.resource.labels.project_id
+ target_field: cloud.project.id
+ type: string
+ ignore_missing: true
+ ignore_failure: true
+ - convert:
+ field: json.resource.labels.instance_id
+ target_field: cloud.instance.id
+ type: string
+ ignore_missing: true
+ ignore_failure: true
+ - rename:
+ field: "json.protoPayload.@type"
+ target_field: gcp.audit.type
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.authenticationInfo.principalEmail
+ target_field: gcp.audit.authentication_info.principal_email
+ ignore_missing: true
+ - set:
+ field: user.email
+ value: "{{gcp.audit.authentication_info.principal_email}}"
+ if: ctx?.gcp?.audit?.authentication_info?.principal_email != null
+ - rename:
+ field: json.protoPayload.authenticationInfo.authoritySelector
+ target_field: gcp.audit.authentication_info.authority_selector
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.authorizationInfo
+ target_field: gcp.audit.authorization_info
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.methodName
+ target_field: gcp.audit.method_name
+ ignore_missing: true
+ - set:
+ field: event.action
+ value: "{{gcp.audit.method_name}}"
+ if: ctx?.gcp?.audit?.method_name != null
+ - convert:
+ field: json.protoPayload.numResponseItems
+ target_field: gcp.audit.num_response_items
+ type: long
+ ignore_missing: true
+ - rename:
+ field: "json.protoPayload.request.@type"
+ target_field: gcp.audit.request.proto_name
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.request.filter
+ target_field: gcp.audit.request.filter
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.request.name
+ target_field: gcp.audit.request.name
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.request.resourceName
+ target_field: gcp.audit.request.resource_name
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.requestMetadata.callerIp
+ target_field: gcp.audit.request_metadata.caller_ip
+ ignore_missing: true
+ - set:
+ field: source.ip
+ value: "{{gcp.audit.request_metadata.caller_ip}}"
+ if: ctx?.gcp?.audit?.request_metadata?.caller_ip != null
+ - rename:
+ field: json.protoPayload.requestMetadata.callerSuppliedUserAgent
+ target_field: gcp.audit.request_metadata.caller_supplied_user_agent
+ ignore_missing: true
+ - set:
+ field: user_agent.original
+ value: "{{gcp.audit.request_metadata.caller_supplied_user_agent}}"
+ if: ctx?.gcp?.audit?.request_metadata?.caller_supplied_user_agent != null
+ - rename:
+ field: "json.protoPayload.response.@type"
+ target_field: gcp.audit.response.proto_name
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.response.status
+ target_field: gcp.audit.response.status
+ ignore_missing: true
+ - rename:
+ field: gcp.audit.response.status
+ target_field: gcp.audit.response.status.value
+ if: ctx?.gcp?.audit?.response?.status instanceof String
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.response.details.group
+ target_field: gcp.audit.response.details.group
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.response.details.kind
+ target_field: gcp.audit.response.details.kind
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.response.details.name
+ target_field: gcp.audit.response.details.name
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.response.details.uid
+ target_field: gcp.audit.response.details.uid
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.resourceName
+ target_field: gcp.audit.resource_name
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.resourceLocation.currentLocations
+ target_field: gcp.audit.resource_location.current_locations
+ ignore_missing: true
+ - rename:
+ field: json.protoPayload.serviceName
+ target_field: gcp.audit.service_name
+ ignore_missing: true
+ - set:
+ field: service.name
+ value: "{{gcp.audit.service_name}}"
+ if: ctx?.gcp?.audit?.service_name != null
+ - convert:
+ field: json.protoPayload.status.code
+ target_field: gcp.audit.status.code
+ type: long
+ ignore_missing: true
+ - foreach:
+ field: gcp.audit.authorization_info
+ ignore_missing: true
+ ignore_failure: true
+ processor:
+ rename:
+ field: _ingest._value.resourceAttributes
+ target_field: _ingest._value.resource_attributes
+ if: ctx?.gcp?.audit?.authorization_info != null && ctx?.gcp?.audit?.authorization_info instanceof List
+ - set:
+ field: event.outcome
+ value: success
+ if: ctx?.gcp?.audit?.status?.code != null && ctx?.gcp?.audit?.status?.code == 0
+ - set:
+ field: event.outcome
+ value: failure
+ if: ctx?.gcp?.audit?.status?.code != null && ctx?.gcp?.audit?.status?.code != 0
+ - set:
+ field: event.outcome
+ value: success
+ if: ctx?.gcp?.audit?.status?.code == null && ctx?.gcp?.audit?.authorization_info != null && ctx?.gcp?.audit?.authorization_info instanceof List && ctx?.gcp?.audit?.authorization_info.size() == 1 && ctx?.gcp?.audit?.authorization_info[0].granted
+ - set:
+ field: event.outcome
+ value: failure
+ if: ctx?.gcp?.audit?.status?.code == null && ctx?.gcp?.audit?.authorization_info != null && ctx?.gcp?.audit?.authorization_info instanceof List && ctx?.gcp?.audit?.authorization_info.size() == 1 && !ctx?.gcp?.audit?.authorization_info[0].granted
+ - set:
+ field: event.outcome
+ value: unknown
+ if: ctx?.event?.outcome == null
+ - rename:
+ field: json.protoPayload.status.message
+ target_field: gcp.audit.status.message
+ ignore_missing: true
+ - user_agent:
+ field: user_agent.original
+ ignore_missing: true
+ # Orchestrator fields
+ - set:
+ field: orchestrator.type
+ value: kubernetes
+ if: ctx.json?.resource?.type == 'k8s_cluster'
+ - rename:
+ field: json.resource.labels.cluster_name
+ target_field: orchestrator.cluster.name
+ ignore_missing: true
+ if: ctx.json?.resource?.type == 'k8s_cluster'
+ - rename:
+ field: json.protoPayload.resourceName
+ target_field: orchestrator.resource.type_temp
+ ignore_missing: true
+ if: ctx.json?.resource?.type == 'k8s_cluster'
+ - grok:
+ field: orchestrator.resource.type_temp
+ patterns:
+ - '%{DATA}/%{API_VERSION:orchestrator.api_version}/namespaces/%{DATA:orchestrator.namespace}/%{RESOURCE_TYPE:orchestrator.resource.type}(/%{HOSTNAME:orchestrator.resource.name})?'
+ - '%{DATA}/%{API_VERSION:orchestrator.api_version}/%{RESOURCE_TYPE:orchestrator.resource.type}'
+ - 'apis/%{RESOURCE_TYPE:orchestrator.resource.type}/%{API_VERSION:orchestrator.api_version}'
+ - 'api/%{API_VERSION:orchestrator.api_version}'
+ - '%{RESOURCE_TYPE:orchestrator.resource.type}'
+ pattern_definitions:
+ API_VERSION: (v\d+([a-z]+)?(\d+)?)
+ RESOURCE_TYPE: ([a-z]+((\.[a-z0-9]+)+)?)
+ ignore_missing: true
+ - remove:
+ field: orchestrator.resource.type_temp
+ ignore_missing: true
+ - remove:
+ field: json
+ ignore_missing: true
+ # IP Geolocation Lookup
+ - geoip:
+ field: source.ip
+ target_field: source.geo
+ ignore_missing: true
+ # IP Autonomous System (AS) Lookup
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: source.ip
+ target_field: source.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - rename:
+ field: source.as.asn
+ target_field: source.as.number
+ ignore_missing: true
+ - rename:
+ field: source.as.organization_name
+ target_field: source.as.organization.name
+ ignore_missing: true
+ - remove:
+ field: event.original
+ if: "ctx?.tags == null || !(ctx.tags.contains('preserve_original_event'))"
+ ignore_failure: true
+ ignore_missing: true
+on_failure:
+ - set:
+ field: error.message
+ value: "{{ _ingest.on_failure_message }}"
diff --git a/packages/gcp/1.4.1/data_stream/audit/fields/agent.yml b/packages/gcp/1.4.1/data_stream/audit/fields/agent.yml
new file mode 100755
index 0000000000..e313ec8287
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/fields/agent.yml
@@ -0,0 +1,204 @@
+- name: cloud
+ title: Cloud
+ group: 2
+ description: Fields related to the cloud or infrastructure the events are coming from.
+ footnote: 'Examples: If Metricbeat is running on an EC2 host and fetches data from its host, the cloud info contains the data about this machine. If Metricbeat runs on a remote machine outside the cloud and fetches data from a service running in the cloud, the field contains cloud data from the machine the service is running on.'
+ type: group
+ fields:
+ - name: account.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment.
+
+ Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.'
+ example: 666777888999
+ - name: availability_zone
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Availability zone in which this host is running.
+ example: us-east-1c
+ - name: instance.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance ID of the host machine.
+ example: i-1234567890abcdef0
+ - name: instance.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance name of the host machine.
+ - name: machine.type
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Machine type of the host machine.
+ example: t2.medium
+ - name: provider
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean.
+ example: aws
+ - name: region
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Region in which this host is running.
+ example: us-east-1
+ - name: project.id
+ type: keyword
+ description: Name of the project in Google Cloud.
+ - name: image.id
+ type: keyword
+ description: Image ID for the cloud instance.
+- name: container
+ title: Container
+ group: 2
+ description: 'Container fields are used for meta information about the specific container that is the source of information.
+
+ These fields help correlate data based containers from any runtime.'
+ type: group
+ fields:
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Unique container id.
+ - name: image.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the image the container was built on.
+ - name: labels
+ level: extended
+ type: object
+ object_type: keyword
+ description: Image labels.
+ - name: name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Container name.
+- name: host
+ title: Host
+ group: 2
+ description: 'A host is defined as a general computing instance.
+
+ ECS host.* fields should be populated with details about the host on which the event happened, or from which the measurement was taken. Host types include hardware, virtual machines, Docker containers, and Kubernetes nodes.'
+ type: group
+ fields:
+ - name: architecture
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Operating system architecture.
+ example: x86_64
+ - name: domain
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the domain of which the host is a member.
+
+ For example, on Windows this could be the host''s Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host''s LDAP provider.'
+ example: CONTOSO
+ default_field: false
+ - name: hostname
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Hostname of the host.
+
+ It normally contains what the `hostname` command returns on the host machine.'
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Unique host id.
+
+ As hostname is not always unique, use values that are meaningful in your environment.
+
+ Example: The current usage of `beat.name`.'
+ - name: ip
+ level: core
+ type: ip
+ description: Host ip addresses.
+ - name: mac
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Host mac addresses.
+ - name: name
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the host.
+
+ It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.'
+ - name: os.family
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: OS family (such as redhat, debian, freebsd, windows).
+ example: debian
+ - name: os.kernel
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system kernel version as a raw string.
+ example: 4.4.0-112-generic
+ - name: os.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ multi_fields:
+ - name: text
+ type: text
+ norms: false
+ default_field: false
+ description: Operating system name, without the version.
+ example: Mac OS X
+ - name: os.platform
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system platform (such centos, ubuntu, windows).
+ example: darwin
+ - name: os.version
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system version as a raw string.
+ example: 10.14.1
+ - name: type
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Type of host.
+
+ For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment.'
+ - name: containerized
+ type: boolean
+ description: >
+ If the host is a container.
+
+ - name: os.build
+ type: keyword
+ example: "18D109"
+ description: >
+ OS build information.
+
+ - name: os.codename
+ type: keyword
+ example: "stretch"
+ description: >
+ OS codename, if any.
+
+- name: input.type
+ type: keyword
+ description: Input type
+- name: log.offset
+ type: long
+ description: Log offset
diff --git a/packages/gcp/1.4.1/data_stream/audit/fields/base-fields.yml b/packages/gcp/1.4.1/data_stream/audit/fields/base-fields.yml
new file mode 100755
index 0000000000..4a7da76510
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/fields/base-fields.yml
@@ -0,0 +1,20 @@
+- name: data_stream.type
+ type: constant_keyword
+ description: Data stream type.
+- name: data_stream.dataset
+ type: constant_keyword
+ description: Data stream dataset.
+- name: data_stream.namespace
+ type: constant_keyword
+ description: Data stream namespace.
+- name: '@timestamp'
+ type: date
+ description: Event timestamp.
+- name: event.module
+ type: constant_keyword
+ description: Event module
+ value: gcp
+- name: event.dataset
+ type: constant_keyword
+ description: Event dataset
+ value: gcp.audit
diff --git a/packages/gcp/1.4.1/data_stream/audit/fields/ecs.yml b/packages/gcp/1.4.1/data_stream/audit/fields/ecs.yml
new file mode 100755
index 0000000000..ceedc4d273
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/fields/ecs.yml
@@ -0,0 +1,144 @@
+- description: Container name.
+ name: container.name
+ type: keyword
+- description: Runtime managing this container.
+ name: container.runtime
+ type: keyword
+- description: |-
+ ECS version this event conforms to. `ecs.version` is a required field and must exist in all events.
+ When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events.
+ name: ecs.version
+ type: keyword
+- description: |-
+ The action captured by the event.
+ This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.
+ name: event.action
+ type: keyword
+- description: |-
+ Timestamp when an event arrived in the central data store.
+ This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event.
+ In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` < `event.created` < `event.ingested`.
+ name: event.ingested
+ type: date
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy.
+ `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.
+ Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective.
+ Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer.
+ Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense.
+ name: event.outcome
+ type: keyword
+- description: |-
+ Full path to the log file this event came from, including the file name. It should include the drive letter, when appropriate.
+ If the event wasn't read from a log file, do not populate this field.
+ name: log.file.path
+ type: keyword
+- description: The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name.
+ name: log.logger
+ type: keyword
+- description: |-
+ For log events the message field contains the log message, optimized for viewing in a log viewer.
+ For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event.
+ If multiple messages exist, they can be combined into one message.
+ name: message
+ type: match_only_text
+- description: API version being used to carry out the action
+ name: orchestrator.api_version
+ type: keyword
+- description: Name of the cluster.
+ name: orchestrator.cluster.name
+ type: keyword
+- description: URL of the API used to manage the cluster.
+ name: orchestrator.cluster.url
+ type: keyword
+- description: The version of the cluster.
+ name: orchestrator.cluster.version
+ type: keyword
+- description: Namespace in which the action is taking place.
+ name: orchestrator.namespace
+ type: keyword
+- description: Organization affected by the event (for multi-tenant orchestrator setups).
+ name: orchestrator.organization
+ type: keyword
+- description: Name of the resource being acted upon.
+ name: orchestrator.resource.name
+ type: keyword
+- description: Type of resource being acted upon.
+ name: orchestrator.resource.type
+ type: keyword
+- description: Orchestrator cluster type (e.g. kubernetes, nomad or cloudfoundry).
+ name: orchestrator.type
+ type: keyword
+- description: |-
+ Name of the service data is collected from.
+ The name of the service is normally user given. This allows for distributed services that run on multiple hosts to correlate the related instances based on the name.
+ In the case of Elasticsearch the `service.name` could contain the cluster name. For Beats the `service.name` is by default a copy of the `service.type` field if no name is specified.
+ name: service.name
+ type: keyword
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: source.as.number
+ type: long
+- description: Organization name.
+ name: source.as.organization.name
+ type: keyword
+- description: City name.
+ name: source.geo.city_name
+ type: keyword
+- description: Name of the continent.
+ name: source.geo.continent_name
+ type: keyword
+- description: Country ISO code.
+ name: source.geo.country_iso_code
+ type: keyword
+- description: Country name.
+ name: source.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: source.geo.location
+ type: geo_point
+- description: Region ISO code.
+ name: source.geo.region_iso_code
+ type: keyword
+- description: Region name.
+ name: source.geo.region_name
+ type: keyword
+- description: IP address of the source (IPv4 or IPv6).
+ name: source.ip
+ type: ip
+- description: List of keywords used to tag each event.
+ name: tags
+ type: keyword
+- description: User email address.
+ name: user.email
+ type: keyword
+- description: Name of the device.
+ name: user_agent.device.name
+ type: keyword
+- description: Name of the user agent.
+ name: user_agent.name
+ type: keyword
+- description: Unparsed user_agent string.
+ name: user_agent.original
+ type: keyword
+- description: OS family (such as redhat, debian, freebsd, windows).
+ name: user_agent.os.family
+ type: keyword
+- description: Operating system name, including the version or code name.
+ name: user_agent.os.full
+ type: keyword
+- description: Operating system kernel version as a raw string.
+ name: user_agent.os.kernel
+ type: keyword
+- description: Operating system name, without the version.
+ name: user_agent.os.name
+ type: keyword
+- description: Operating system platform (such centos, ubuntu, windows).
+ name: user_agent.os.platform
+ type: keyword
+- description: Operating system version as a raw string.
+ name: user_agent.os.version
+ type: keyword
+- description: Version of the user agent.
+ name: user_agent.version
+ type: keyword
diff --git a/packages/gcp/1.4.1/data_stream/audit/fields/fields.yml b/packages/gcp/1.4.1/data_stream/audit/fields/fields.yml
new file mode 100755
index 0000000000..a0951af4e6
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/fields/fields.yml
@@ -0,0 +1,133 @@
+- name: gcp.audit
+ type: group
+ fields:
+ - name: type
+ type: keyword
+ description: |
+ Type property.
+ - name: authentication_info
+ type: group
+ fields:
+ - name: principal_email
+ type: keyword
+ description: "The email address of the authenticated user making the request. \n"
+ - name: authority_selector
+ type: keyword
+ description: "The authority selector specified by the requestor, if any. It is not guaranteed that the principal was allowed to use this authority. \n"
+ - name: authorization_info
+ type: array
+ description: |
+ Authorization information for the operation.
+ fields:
+ - name: permission
+ type: keyword
+ description: "The required IAM permission. \n"
+ - name: granted
+ type: boolean
+ description: "Whether or not authorization for resource and permission was granted. \n"
+ - name: resource_attributes
+ type: group
+ fields:
+ - name: service
+ type: keyword
+ description: |
+ The name of the service.
+ - name: name
+ type: keyword
+ description: |
+ The name of the resource.
+ - name: type
+ type: keyword
+ description: |
+ The type of the resource.
+ - name: method_name
+ type: keyword
+ description: |
+ The name of the service method or operation. For API calls, this should be the name of the API method. For example, 'google.datastore.v1.Datastore.RunQuery'.
+ - name: num_response_items
+ type: long
+ description: |
+ The number of items returned from a List or Query API method, if applicable.
+ - name: request
+ type: group
+ fields:
+ - name: proto_name
+ type: keyword
+ description: |
+ Type property of the request.
+ - name: filter
+ type: keyword
+ description: |
+ Filter of the request.
+ - name: name
+ type: keyword
+ description: "Name of the request. \n"
+ - name: resource_name
+ type: keyword
+ description: "Name of the request resource. \n"
+ - name: request_metadata
+ type: group
+ fields:
+ - name: caller_ip
+ type: ip
+ description: "The IP address of the caller. \n"
+ - name: caller_supplied_user_agent
+ type: keyword
+ description: |
+ The user agent of the caller. This information is not authenticated and should be treated accordingly.
+ - name: response
+ type: group
+ fields:
+ - name: proto_name
+ type: keyword
+ description: |
+ Type property of the response.
+ - name: details
+ type: group
+ fields:
+ - name: group
+ type: keyword
+ description: |
+ The name of the group.
+ - name: kind
+ type: keyword
+ description: |
+ The kind of the response details.
+ - name: name
+ type: keyword
+ description: |
+ The name of the response details.
+ - name: uid
+ type: keyword
+ description: |
+ The uid of the response details.
+ - name: status.allowed
+ type: boolean
+ - name: status.reason
+ type: keyword
+ - name: status.value
+ type: keyword
+ - name: resource_name
+ type: keyword
+ description: |
+ The resource or collection that is the target of the operation. The name is a scheme-less URI, not including the API service name. For example, 'shelves/SHELF_ID/books'.
+ - name: resource_location
+ type: group
+ fields:
+ - name: current_locations
+ type: keyword
+ description: |
+ Current locations of the resource.
+ - name: service_name
+ type: keyword
+ description: |
+ The name of the API service performing the operation. For example, datastore.googleapis.com.
+ - name: status
+ type: group
+ fields:
+ - name: code
+ type: integer
+ description: "The status code, which should be an enum value of google.rpc.Code. \n"
+ - name: message
+ type: keyword
+ description: "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client. \n"
diff --git a/packages/gcp/1.4.1/data_stream/audit/fields/package-fields.yml b/packages/gcp/1.4.1/data_stream/audit/fields/package-fields.yml
new file mode 100755
index 0000000000..88482fd9c1
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/fields/package-fields.yml
@@ -0,0 +1,63 @@
+- name: gcp
+ type: group
+ fields:
+ - name: destination.instance
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: region
+ type: keyword
+ description: |
+ Region of the VM.
+ - name: zone
+ type: keyword
+ description: |
+ Zone of the VM.
+ - name: destination.vpc
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: vpc_name
+ type: keyword
+ description: |
+ VPC on which the VM is operating.
+ - name: subnetwork_name
+ type: keyword
+ description: |
+ Subnetwork on which the VM is operating.
+ - name: source.instance
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: region
+ type: keyword
+ description: |
+ Region of the VM.
+ - name: zone
+ type: keyword
+ description: |
+ Zone of the VM.
+ - name: source.vpc
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: vpc_name
+ type: keyword
+ description: |
+ VPC on which the VM is operating.
+ - name: subnetwork_name
+ type: keyword
+ description: |
+ Subnetwork on which the VM is operating.
diff --git a/packages/gcp/1.4.1/data_stream/audit/manifest.yml b/packages/gcp/1.4.1/data_stream/audit/manifest.yml
new file mode 100755
index 0000000000..bc65390c11
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/manifest.yml
@@ -0,0 +1,56 @@
+type: logs
+title: Google Cloud Platform (GCP) audit logs
+streams:
+ - input: gcp-pubsub
+ vars:
+ - name: topic
+ type: text
+ title: Topic
+ multi: false
+ required: true
+ show_user: true
+ default: stackdriver-audit
+ - name: subscription_name
+ type: text
+ title: Subscription Name
+ multi: false
+ required: true
+ show_user: true
+ default: filebeat-gcp-audit
+ - name: subscription_create
+ type: bool
+ title: Subscription Create
+ description: If true, the integration will create the subscription on start.
+ multi: false
+ required: true
+ show_user: false
+ default: false
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - forwarded
+ - gcp-audit
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ description: >
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
+
+ template_path: gcp-pubsub.yml.hbs
+ title: Google Cloud Platform (GCP) audit logs (gcp-pubsub)
+ description: Collect Google Cloud Platform (GCP) audit logs using gcp-pubsub input
diff --git a/packages/gcp/1.4.1/data_stream/audit/sample_event.json b/packages/gcp/1.4.1/data_stream/audit/sample_event.json
new file mode 100755
index 0000000000..f94bbc8980
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/audit/sample_event.json
@@ -0,0 +1,117 @@
+{
+ "@timestamp": "2019-12-19T00:44:25.051Z",
+ "agent": {
+ "ephemeral_id": "0365945c-c25a-4f02-b62c-a94a0b661f02",
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "cloud": {
+ "project": {
+ "id": "elastic-beats"
+ }
+ },
+ "data_stream": {
+ "dataset": "gcp.audit",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "action": "beta.compute.instances.aggregatedList",
+ "agent_id_status": "verified",
+ "created": "2021-12-31T03:10:44.655Z",
+ "dataset": "gcp.audit",
+ "id": "yonau2dg2zi",
+ "ingested": "2021-12-31T03:10:45Z",
+ "kind": "event",
+ "outcome": "success"
+ },
+ "gcp": {
+ "audit": {
+ "authentication_info": {
+ "principal_email": "xxx@xxx.xxx"
+ },
+ "authorization_info": [
+ {
+ "granted": true,
+ "permission": "compute.instances.list",
+ "resource_attributes": {
+ "name": "projects/elastic-beats",
+ "service": "resourcemanager",
+ "type": "resourcemanager.projects"
+ }
+ }
+ ],
+ "method_name": "beta.compute.instances.aggregatedList",
+ "num_response_items": 61,
+ "request": {
+ "proto_name": "type.googleapis.com/compute.instances.aggregatedList"
+ },
+ "request_metadata": {
+ "caller_ip": "192.168.1.1",
+ "caller_supplied_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:71.0) Gecko/20100101 Firefox/71.0,gzip(gfe),gzip(gfe)"
+ },
+ "resource_location": {
+ "current_locations": [
+ "global"
+ ]
+ },
+ "resource_name": "projects/elastic-beats/global/instances",
+ "response": {
+ "details": {
+ "group": "batch",
+ "kind": "jobs",
+ "name": "gsuite-exporter-1589294700",
+ "uid": "2beff34a-945f-11ea-bacf-42010a80007f"
+ },
+ "proto_name": "core.k8s.io/v1.Status",
+ "status": {
+ "value": "Success"
+ }
+ },
+ "service_name": "compute.googleapis.com",
+ "type": "type.googleapis.com/google.cloud.audit.AuditLog"
+ }
+ },
+ "input": {
+ "type": "gcp-pubsub"
+ },
+ "log": {
+ "logger": "projects/elastic-beats/logs/cloudaudit.googleapis.com%2Fdata_access"
+ },
+ "service": {
+ "name": "compute.googleapis.com"
+ },
+ "source": {
+ "ip": "192.168.1.1"
+ },
+ "tags": [
+ "forwarded",
+ "gcp-audit"
+ ],
+ "user": {
+ "email": "xxx@xxx.xxx"
+ },
+ "user_agent": {
+ "device": {
+ "name": "Mac"
+ },
+ "name": "Firefox",
+ "original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:71.0) Gecko/20100101 Firefox/71.0,gzip(gfe),gzip(gfe)",
+ "os": {
+ "full": "Mac OS X 10.15",
+ "name": "Mac OS X",
+ "version": "10.15"
+ },
+ "version": "71.0."
+ }
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/data_stream/dns/agent/stream/gcp-pubsub.yml.hbs b/packages/gcp/1.4.1/data_stream/dns/agent/stream/gcp-pubsub.yml.hbs
new file mode 100755
index 0000000000..d582de0a80
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/agent/stream/gcp-pubsub.yml.hbs
@@ -0,0 +1,27 @@
+project_id: {{project_id}}
+topic: {{topic}}
+subscription.name: {{subscription_name}}
+{{#if credentials_file}}
+credentials_file: {{credentials_file}}
+{{/if}}
+{{#if credentials_json}}
+credentials_json: '{{credentials_json}}'
+{{/if}}
+{{#if alternative_host}}
+alternative_host: {{alternative_host}}
+{{/if}}
+subscription.create: {{subscription_create}}
+tags:
+{{#if preserve_original_event}}
+ - preserve_original_event
+{{/if}}
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+{{#if processors}}
+processors:
+{{processors}}
+{{/if}}
diff --git a/packages/gcp/1.4.1/data_stream/dns/elasticsearch/ingest_pipeline/default.yml b/packages/gcp/1.4.1/data_stream/dns/elasticsearch/ingest_pipeline/default.yml
new file mode 100755
index 0000000000..eca01434a2
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/elasticsearch/ingest_pipeline/default.yml
@@ -0,0 +1,240 @@
+---
+description: Pipeline for Google Cloud DNS logs
+
+processors:
+ - set:
+ field: ecs.version
+ value: '8.0.0'
+ - rename:
+ field: message
+ target_field: event.original
+ ignore_missing: true
+ - json:
+ field: event.original
+ target_field: json
+ - set:
+ field: event.kind
+ value: event
+ - date:
+ field: json.timestamp
+ timezone: UTC
+ formats:
+ - ISO8601
+ - rename:
+ field: json.logName
+ target_field: log.logger
+ ignore_missing: true
+ - set:
+ field: event.id
+ copy_from: json.insertId
+ ignore_empty_value: true
+ ignore_failure: true
+ - convert:
+ field: json.resource.labels.project_id
+ target_field: cloud.project.id
+ type: string
+ ignore_failure: true
+ - convert:
+ field: json.resource.labels.location
+ target_field: cloud.region
+ type: string
+ ignore_failure: true
+ - rename:
+ field: json.jsonPayload.authAnswer
+ target_field: gcp.dns.auth_answer
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.destinationIP
+ target_field: gcp.dns.destination_ip
+ ignore_missing: true
+ - set:
+ field: destination.address
+ copy_from: gcp.dns.destination_ip
+ ignore_failure: true
+ - convert:
+ field: gcp.dns.destination_ip
+ target_field: destination.ip
+ type: ip
+ ignore_failure: true
+ - rename:
+ field: json.jsonPayload.egressError
+ target_field: gcp.dns.egress_error
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.protocol
+ target_field: gcp.dns.protocol
+ ignore_missing: true
+ - set:
+ field: network.transport
+ copy_from: gcp.dns.protocol
+ ignore_failure: true
+ - lowercase:
+ field: network.transport
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.queryName
+ target_field: gcp.dns.query_name
+ ignore_missing: true
+ - set:
+ field: dns.question.name
+ copy_from: gcp.dns.query_name
+ ignore_failure: true
+ - gsub:
+ field: dns.question.name
+ pattern: "[.]$"
+ replacement: ""
+ ignore_failure: true
+ - registered_domain:
+ field: dns.question.name
+ target_field: dns.question
+ - remove:
+ field: dns.question.domain
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.queryType
+ target_field: gcp.dns.query_type
+ ignore_missing: true
+ - set:
+ field: dns.question.type
+ copy_from: gcp.dns.query_type
+ ignore_failure: true
+ - rename:
+ field: json.jsonPayload.rdata
+ target_field: gcp.dns.rdata
+ ignore_missing: true
+ - script:
+ if: ctx?.gcp?.dns?.rdata != null
+ lang: painless
+ tag: Process DNS RData
+ description: This script processes the DNS RData into `dns.answers` and `dns.resolved_ip`.
+ source: |
+ def rdata = ctx.gcp.dns.rdata;
+
+ def dns_answers = [];
+ def dns_resolved_ip = [];
+
+ // Check for truncated answers.
+ def truncated = rdata.endsWith("...") ? 1 : 0;
+
+ // Process answers.
+ def rdata_answers = /\n/.split(rdata);
+
+ for (def i = 0; i < rdata_answers.length - truncated; i++) {
+ def answer_parts = /\t/.split(rdata_answers[i]);
+
+ // Assign answer parts.
+ def name = answer_parts[0];
+ def ttl = answer_parts[1];
+ def cls = answer_parts[2];
+ def type = answer_parts[3];
+ def data = answer_parts[4];
+
+ // Remove trailing fullstop.
+ if (name.endsWith(".")) {
+ name = name.substring(0, name.length() - 1);
+ }
+
+ if (data.endsWith(".")) {
+ data = data.substring(0, data.length() - 1);
+ }
+
+ // Uppercase type.
+ type = type.toUpperCase();
+
+ dns_answers.add([
+ "name": name,
+ "ttl": ttl,
+ "class": cls,
+ "type": type,
+ "data": data
+ ]);
+
+ if (type == "A" || type == "AAAA") {
+ dns_resolved_ip.add(data);
+ }
+ }
+
+ ctx.dns.answers = dns_answers;
+ ctx.dns.resolved_ip = dns_resolved_ip;
+ - rename:
+ field: json.jsonPayload.responseCode
+ target_field: gcp.dns.response_code
+ ignore_missing: true
+ - set:
+ field: dns.response_code
+ copy_from: gcp.dns.response_code
+ ignore_failure: true
+ - set:
+ field: event.outcome
+ value: success
+ if: ctx?.gcp?.dns?.response_code != null && ctx?.gcp?.dns?.response_code == "NOERROR"
+ - set:
+ field: event.outcome
+ value: failure
+ if: ctx?.gcp?.dns?.response_code != null && ctx?.gcp?.dns?.response_code != "NOERROR"
+ - rename:
+ field: json.jsonPayload.serverLatency
+ target_field: gcp.dns.server_latency
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.sourceIP
+ target_field: gcp.dns.source_ip
+ ignore_missing: true
+ - set:
+ field: source.address
+ copy_from: gcp.dns.source_ip
+ ignore_failure: true
+ - convert:
+ field: gcp.dns.source_ip
+ target_field: source.ip
+ type: ip
+ ignore_failure: true
+ - rename:
+ field: json.jsonPayload.sourceNetwork
+ target_field: gcp.dns.source_network
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.vmInstanceIdString
+ target_field: gcp.dns.vm_instance_id
+ ignore_missing: true
+ - set:
+ field: cloud.instance.id
+ copy_from: gcp.dns.vm_instance_id
+ ignore_failure: true
+ - rename:
+ field: json.jsonPayload.vmInstanceName
+ target_field: gcp.dns.vm_instance_name
+ ignore_missing: true
+ - set:
+ field: cloud.instance.name
+ copy_from: gcp.dns.vm_instance_name
+ ignore_failure: true
+ - gsub:
+ field: cloud.instance.name
+ pattern: "^.*[.]"
+ replacement: ""
+ ignore_failure: true
+ - rename:
+ field: json.jsonPayload.vmProjectId
+ target_field: gcp.dns.vm_project_id
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.vmZoneName
+ target_field: gcp.dns.vm_zone_name
+ ignore_missing: true
+ - set:
+ field: cloud.availability_zone
+ copy_from: gcp.dns.vm_zone_name
+ ignore_failure: true
+ - remove:
+ field: json
+ ignore_missing: true
+ - remove:
+ field: event.original
+ if: "ctx?.tags == null || !(ctx.tags.contains('preserve_original_event'))"
+ ignore_failure: true
+ ignore_missing: true
+on_failure:
+ - set:
+ field: error.message
+ value: "{{ _ingest.on_failure_message }}"
diff --git a/packages/gcp/1.4.1/data_stream/dns/fields/agent.yml b/packages/gcp/1.4.1/data_stream/dns/fields/agent.yml
new file mode 100755
index 0000000000..e313ec8287
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/fields/agent.yml
@@ -0,0 +1,204 @@
+- name: cloud
+ title: Cloud
+ group: 2
+ description: Fields related to the cloud or infrastructure the events are coming from.
+ footnote: 'Examples: If Metricbeat is running on an EC2 host and fetches data from its host, the cloud info contains the data about this machine. If Metricbeat runs on a remote machine outside the cloud and fetches data from a service running in the cloud, the field contains cloud data from the machine the service is running on.'
+ type: group
+ fields:
+ - name: account.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment.
+
+ Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.'
+ example: 666777888999
+ - name: availability_zone
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Availability zone in which this host is running.
+ example: us-east-1c
+ - name: instance.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance ID of the host machine.
+ example: i-1234567890abcdef0
+ - name: instance.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance name of the host machine.
+ - name: machine.type
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Machine type of the host machine.
+ example: t2.medium
+ - name: provider
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean.
+ example: aws
+ - name: region
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Region in which this host is running.
+ example: us-east-1
+ - name: project.id
+ type: keyword
+ description: Name of the project in Google Cloud.
+ - name: image.id
+ type: keyword
+ description: Image ID for the cloud instance.
+- name: container
+ title: Container
+ group: 2
+ description: 'Container fields are used for meta information about the specific container that is the source of information.
+
+ These fields help correlate data based containers from any runtime.'
+ type: group
+ fields:
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Unique container id.
+ - name: image.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the image the container was built on.
+ - name: labels
+ level: extended
+ type: object
+ object_type: keyword
+ description: Image labels.
+ - name: name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Container name.
+- name: host
+ title: Host
+ group: 2
+ description: 'A host is defined as a general computing instance.
+
+ ECS host.* fields should be populated with details about the host on which the event happened, or from which the measurement was taken. Host types include hardware, virtual machines, Docker containers, and Kubernetes nodes.'
+ type: group
+ fields:
+ - name: architecture
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Operating system architecture.
+ example: x86_64
+ - name: domain
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the domain of which the host is a member.
+
+ For example, on Windows this could be the host''s Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host''s LDAP provider.'
+ example: CONTOSO
+ default_field: false
+ - name: hostname
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Hostname of the host.
+
+ It normally contains what the `hostname` command returns on the host machine.'
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Unique host id.
+
+ As hostname is not always unique, use values that are meaningful in your environment.
+
+ Example: The current usage of `beat.name`.'
+ - name: ip
+ level: core
+ type: ip
+ description: Host ip addresses.
+ - name: mac
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Host mac addresses.
+ - name: name
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the host.
+
+ It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.'
+ - name: os.family
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: OS family (such as redhat, debian, freebsd, windows).
+ example: debian
+ - name: os.kernel
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system kernel version as a raw string.
+ example: 4.4.0-112-generic
+ - name: os.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ multi_fields:
+ - name: text
+ type: text
+ norms: false
+ default_field: false
+ description: Operating system name, without the version.
+ example: Mac OS X
+ - name: os.platform
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system platform (such centos, ubuntu, windows).
+ example: darwin
+ - name: os.version
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system version as a raw string.
+ example: 10.14.1
+ - name: type
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Type of host.
+
+ For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment.'
+ - name: containerized
+ type: boolean
+ description: >
+ If the host is a container.
+
+ - name: os.build
+ type: keyword
+ example: "18D109"
+ description: >
+ OS build information.
+
+ - name: os.codename
+ type: keyword
+ example: "stretch"
+ description: >
+ OS codename, if any.
+
+- name: input.type
+ type: keyword
+ description: Input type
+- name: log.offset
+ type: long
+ description: Log offset
diff --git a/packages/gcp/1.4.1/data_stream/dns/fields/base-fields.yml b/packages/gcp/1.4.1/data_stream/dns/fields/base-fields.yml
new file mode 100755
index 0000000000..bc80931b38
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/fields/base-fields.yml
@@ -0,0 +1,20 @@
+- name: data_stream.type
+ type: constant_keyword
+ description: Data stream type.
+- name: data_stream.dataset
+ type: constant_keyword
+ description: Data stream dataset.
+- name: data_stream.namespace
+ type: constant_keyword
+ description: Data stream namespace.
+- name: '@timestamp'
+ type: date
+ description: Event timestamp.
+- name: event.module
+ type: constant_keyword
+ description: Event module
+ value: gcp
+- name: event.dataset
+ type: constant_keyword
+ description: Event dataset
+ value: gcp.dns
diff --git a/packages/gcp/1.4.1/data_stream/dns/fields/ecs.yml b/packages/gcp/1.4.1/data_stream/dns/fields/ecs.yml
new file mode 100755
index 0000000000..d714c83a48
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/fields/ecs.yml
@@ -0,0 +1,103 @@
+- description: |-
+ An array containing an object for each answer section returned by the server.
+ The main keys that should be present in these objects are defined by ECS. Records that have more information may contain more keys than what ECS defines.
+ Not all DNS data sources give all details about DNS answers. At minimum, answer objects must contain the `data` key. If more information is available, map as much of it to ECS as possible, and add any additional fields to the answer objects as custom fields.
+ name: dns.answers
+ type: object
+- description: The class of DNS data contained in this resource record.
+ name: dns.answers.class
+ type: keyword
+- description: |-
+ The data describing the resource.
+ The meaning of this data depends on the type and class of the resource record.
+ name: dns.answers.data
+ type: keyword
+- description: |-
+ The domain name to which this resource record pertains.
+ If a chain of CNAME is being resolved, each answer's `name` should be the one that corresponds with the answer's `data`. It should not simply be the original `question.name` repeated.
+ name: dns.answers.name
+ type: keyword
+- description: The time interval in seconds that this resource record may be cached before it should be discarded. Zero values mean that the data should not be cached.
+ name: dns.answers.ttl
+ type: long
+- description: The type of data contained in this resource record.
+ name: dns.answers.type
+ type: keyword
+- description: |-
+ The name being queried.
+ If the name field contains non-printable characters (below 32 or above 126), those characters should be represented as escaped base 10 integers (\DDD). Back slashes and quotes should be escaped. Tabs, carriage returns, and line feeds should be converted to \t, \r, and \n respectively.
+ name: dns.question.name
+ type: keyword
+- description: The type of record being queried.
+ name: dns.question.type
+ type: keyword
+- description: |-
+ The highest registered domain, stripped of the subdomain.
+ For example, the registered domain for "foo.example.com" is "example.com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk".
+ name: dns.question.registered_domain
+ type: keyword
+- description: |-
+ The subdomain is all of the labels under the registered_domain.
+ If the domain has multiple levels of subdomain, such as "sub2.sub1.example.com", the subdomain field should contain "sub2.sub1", with no trailing period.
+ name: dns.question.subdomain
+ type: keyword
+- description: |-
+ The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk".
+ name: dns.question.top_level_domain
+ type: keyword
+- description: |-
+ Array containing all IPs seen in `answers.data`.
+ The `answers` array can be difficult to use, because of the variety of data formats it can contain. Extracting all IP addresses seen in there to `dns.resolved_ip` makes it possible to index them as IP addresses, and makes them easier to visualize and query for.
+ name: dns.resolved_ip
+ type: ip
+- description: The DNS response code.
+ name: dns.response_code
+ type: keyword
+- description: |-
+ ECS version this event conforms to. `ecs.version` is a required field and must exist in all events.
+ When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events.
+ name: ecs.version
+ type: keyword
+- description: |-
+ Timestamp when an event arrived in the central data store.
+ This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event.
+ In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` < `event.created` < `event.ingested`.
+ name: event.ingested
+ type: date
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy.
+ `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.
+ Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective.
+ Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer.
+ Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense.
+ name: event.outcome
+ type: keyword
+- description: The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name.
+ name: log.logger
+ type: keyword
+- description: |-
+ Same as network.iana_number, but instead using the Keyword name of the transport layer (udp, tcp, ipv6-icmp, etc.)
+ The field value must be normalized to lowercase for querying.
+ name: network.transport
+ type: keyword
+- description: |-
+ Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: source.address
+ type: keyword
+- description: IP address of the source (IPv4 or IPv6).
+ name: source.ip
+ type: ip
+- description: |-
+ Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: destination.address
+ type: keyword
+- description: IP address of the destination (IPv4 or IPv6).
+ name: destination.ip
+ type: ip
+- description: List of keywords used to tag each event.
+ name: tags
+ type: keyword
diff --git a/packages/gcp/1.4.1/data_stream/dns/fields/fields.yml b/packages/gcp/1.4.1/data_stream/dns/fields/fields.yml
new file mode 100755
index 0000000000..c0a98003d6
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/fields/fields.yml
@@ -0,0 +1,48 @@
+- name: gcp.dns
+ type: group
+ fields:
+ - name: auth_answer
+ type: boolean
+ description: Authoritative answer.
+ - name: destination_ip
+ type: ip
+ description: Destination IP address, only applicable for forwarding cases.
+ - name: egress_error
+ type: keyword
+ description: Egress proxy error.
+ - name: protocol
+ type: keyword
+ description: Protocol TCP or UDP.
+ - name: query_name
+ type: keyword
+ description: DNS query name.
+ - name: query_type
+ type: keyword
+ description: DNS query type.
+ - name: rdata
+ type: keyword
+ description: DNS answer in presentation format, truncated to 260 bytes.
+ - name: response_code
+ type: keyword
+ description: Response code.
+ - name: server_latency
+ type: integer
+ description: Server latency.
+ - name: source_ip
+ type: ip
+ description: Source IP address of the query.
+ - name: source_network
+ type: keyword
+ description: Source network of the query.
+ - name: vm_instance_id
+ type: keyword
+ description: Compute Engine VM instance ID, only applicable to queries initiated by Compute Engine VMs.
+ - name: vm_instance_name
+ type: keyword
+ description: Compute Engine VM instance name, only applicable to queries initiated by Compute Engine VMs.
+ - name: vm_project_id
+ type: keyword
+ description: Google Cloud project ID, only applicable to queries initiated by Compute Engine VMs.
+ - name: vm_zone_name
+ type: keyword
+ description: Google Cloud VM zone, only applicable to queries initiated by Compute Engine VMs.
diff --git a/packages/gcp/1.4.1/data_stream/dns/manifest.yml b/packages/gcp/1.4.1/data_stream/dns/manifest.yml
new file mode 100755
index 0000000000..668b7e2350
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/manifest.yml
@@ -0,0 +1,56 @@
+type: logs
+title: Google Cloud Platform (GCP) DNS logs
+streams:
+ - input: gcp-pubsub
+ vars:
+ - name: topic
+ type: text
+ title: Topic
+ multi: false
+ required: true
+ show_user: true
+ default: stackdriver-dns
+ - name: subscription_name
+ type: text
+ title: Subscription Name
+ multi: false
+ required: true
+ show_user: true
+ default: filebeat-gcp-dns
+ - name: subscription_create
+ type: bool
+ title: Subscription Create
+ description: If true, the integration will create the subscription on start.
+ multi: false
+ required: true
+ show_user: false
+ default: false
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - forwarded
+ - gcp-dns
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ description: >
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
+
+ template_path: gcp-pubsub.yml.hbs
+ title: Google Cloud Platform (GCP) DNS logs (gcp-pubsub)
+ description: Collect Google Cloud Platform (GCP) DNS logs using gcp-pubsub input
diff --git a/packages/gcp/1.4.1/data_stream/dns/sample_event.json b/packages/gcp/1.4.1/data_stream/dns/sample_event.json
new file mode 100755
index 0000000000..9cd568cf68
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/dns/sample_event.json
@@ -0,0 +1,74 @@
+{
+ "@timestamp": "2022-01-23T09:16:05.341Z",
+ "cloud": {
+ "availability_zone": "europe-west2-a",
+ "instance": {
+ "id": "8340998530665147",
+ "name": "instance"
+ },
+ "project": {
+ "id": "project"
+ },
+ "region": "europe-west2"
+ },
+ "dns": {
+ "answers": [
+ {
+ "class": "IN",
+ "data": "127.0.0.1",
+ "name": "elastic.co",
+ "ttl": "300",
+ "type": "A"
+ }
+ ],
+ "question": {
+ "name": "elastic.co",
+ "registered_domain": "elastic.co",
+ "top_level_domain": "co",
+ "type": "A"
+ },
+ "resolved_ip": [
+ "127.0.0.1"
+ ],
+ "response_code": "NOERROR"
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "event": {
+ "id": "vwroyze8pg7y",
+ "kind": "event",
+ "outcome": "success",
+ "original": "{\"insertId\":\"vwroyze8pg7y\",\"jsonPayload\":{\"authAnswer\":true,\"protocol\":\"UDP\",\"queryName\":\"elastic.co.\",\"queryType\":\"A\",\"rdata\":\"elastic.co.\\t300\\tIN\\ta\\t127.0.0.1\",\"responseCode\":\"NOERROR\",\"serverLatency\":14,\"sourceIP\":\"10.154.0.3\",\"sourceNetwork\":\"default\",\"vmInstanceId\":8340998530665147,\"vmInstanceIdString\":\"8340998530665147\",\"vmInstanceName\":\"694119234537.instance\",\"vmProjectId\":\"project\",\"vmZoneName\":\"europe-west2-a\"},\"logName\":\"projects/project/logs/dns.googleapis.com%2Fdns_queries\",\"receiveTimestamp\":\"2022-01-23T09:16:05.502805637Z\",\"resource\":{\"labels\":{\"location\":\"europe-west2\",\"project_id\":\"project\",\"source_type\":\"gce-vm\",\"target_name\":\"\",\"target_type\":\"external\"},\"type\":\"dns_query\"},\"severity\":\"INFO\",\"timestamp\":\"2022-01-23T09:16:05.341873447Z\"}"
+ },
+ "gcp": {
+ "dns": {
+ "auth_answer": true,
+ "protocol": "UDP",
+ "query_name": "elastic.co.",
+ "query_type": "A",
+ "rdata": "elastic.co.\t300\tIN\ta\t127.0.0.1",
+ "response_code": "NOERROR",
+ "server_latency": 14,
+ "source_ip": "10.154.0.3",
+ "source_network": "default",
+ "vm_instance_id": "8340998530665147",
+ "vm_instance_name": "694119234537.instance",
+ "vm_project_id": "project",
+ "vm_zone_name": "europe-west2-a"
+ }
+ },
+ "log": {
+ "logger": "projects/project/logs/dns.googleapis.com%2Fdns_queries"
+ },
+ "network": {
+ "transport": "udp"
+ },
+ "source": {
+ "address": "10.154.0.3",
+ "ip": "10.154.0.3"
+ },
+ "tags": [
+ "preserve_original_event"
+ ]
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/data_stream/firewall/agent/stream/gcp-pubsub.yml.hbs b/packages/gcp/1.4.1/data_stream/firewall/agent/stream/gcp-pubsub.yml.hbs
new file mode 100755
index 0000000000..d582de0a80
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/agent/stream/gcp-pubsub.yml.hbs
@@ -0,0 +1,27 @@
+project_id: {{project_id}}
+topic: {{topic}}
+subscription.name: {{subscription_name}}
+{{#if credentials_file}}
+credentials_file: {{credentials_file}}
+{{/if}}
+{{#if credentials_json}}
+credentials_json: '{{credentials_json}}'
+{{/if}}
+{{#if alternative_host}}
+alternative_host: {{alternative_host}}
+{{/if}}
+subscription.create: {{subscription_create}}
+tags:
+{{#if preserve_original_event}}
+ - preserve_original_event
+{{/if}}
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+{{#if processors}}
+processors:
+{{processors}}
+{{/if}}
diff --git a/packages/gcp/1.4.1/data_stream/firewall/elasticsearch/ingest_pipeline/default.yml b/packages/gcp/1.4.1/data_stream/firewall/elasticsearch/ingest_pipeline/default.yml
new file mode 100755
index 0000000000..a23c18f27e
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/elasticsearch/ingest_pipeline/default.yml
@@ -0,0 +1,407 @@
+---
+description: Pipeline for Google Cloud Firewall Logs
+
+processors:
+ - set:
+ field: ecs.version
+ value: '8.0.0'
+ - rename:
+ field: message
+ target_field: event.original
+ ignore_missing: true
+ - json:
+ field: event.original
+ target_field: json
+ - community_id:
+ source_ip: json.jsonPayload.connection.src_ip
+ source_port: json.jsonPayload.connection.src_port
+ destination_ip: json.jsonPayload.connection.dest_ip
+ destination_port: json.jsonPayload.connection.dest_port
+ iana_number: json.jsonPayload.connection.protocol
+ - date:
+ field: json.timestamp
+ timezone: UTC
+ formats:
+ - ISO8601
+ - set:
+ field: event.kind
+ value: event
+ - set:
+ field: event.category
+ value: network
+ - set:
+ field: event.action
+ value: firewall-rule
+ - rename:
+ field: json.logName
+ target_field: log.logger
+ ignore_missing: true
+ - rename:
+ field: json.resource.labels.subnetwork_name
+ target_field: network.name
+ ignore_missing: true
+ - set:
+ field: event.id
+ copy_from: json.insertId
+ ignore_empty_value: true
+ ignore_failure: true
+ - rename:
+ field: json.jsonPayload.disposition
+ target_field: event.type
+ if: ctx?.json?.jsonPayload?.disposition != null
+ - set:
+ field: event.type
+ value: connection
+ if: ctx?.event?.type != null
+ - lowercase:
+ field: event.type
+ - set:
+ field: network.direction
+ value: inbound
+ if: ctx?.json?.jsonPayload?.rule_details?.direction == "INGRESS"
+ - set:
+ field: network.direction
+ value: outbound
+ if: ctx?.json?.jsonPayload?.rule_details?.direction == "EGRESS"
+ - set:
+ field: network.direction
+ value: unknown
+ if: ctx?.network?.direction == null
+ - rename:
+ field: json.jsonPayload.vpc
+ target_field: json.jsonPayload.src_vpc
+ if: ctx?.network?.direction == "outbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.instance
+ target_field: json.jsonPayload.src_instance
+ if: ctx?.network?.direction == "outbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.location
+ target_field: json.jsonPayload.src_location
+ if: ctx?.network?.direction == "outbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.remote_vpc
+ target_field: json.jsonPayload.dest_vpc
+ if: ctx?.network?.direction == "outbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.remote_instance
+ target_field: json.jsonPayload.dest_instance
+ if: ctx?.network?.direction == "outbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.remote_location
+ target_field: json.jsonPayload.dest_location
+ if: ctx?.network?.direction == "outbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.vpc
+ target_field: json.jsonPayload.dest_vpc
+ if: ctx?.network?.direction == "inbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.instance
+ target_field: json.jsonPayload.dest_instance
+ if: ctx?.network?.direction == "inbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.location
+ target_field: json.jsonPayload.dest_location
+ if: ctx?.network?.direction == "inbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.remote_vpc
+ target_field: json.jsonPayload.src_vpc
+ if: ctx?.network?.direction == "inbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.remote_instance
+ target_field: json.jsonPayload.src_instance
+ if: ctx?.network?.direction == "inbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.remote_location
+ target_field: json.jsonPayload.src_location
+ if: ctx?.network?.direction == "inbound"
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.protocol
+ target_field: network.iana_number
+ ignore_missing: true
+ - convert:
+ field: network.iana_number
+ type: string
+ ignore_missing: true
+ - script:
+ lang: painless
+ ignore_failure: true
+ if: ctx?.network?.iana_number != null
+ source: |
+ def iana_number = ctx.network.iana_number;
+ if (iana_number == '0') {
+ ctx.network.transport = 'hopopt';
+ } else if (iana_number == '1') {
+ ctx.network.transport = 'icmp';
+ } else if (iana_number == '2') {
+ ctx.network.transport = 'igmp';
+ } else if (iana_number == '6') {
+ ctx.network.transport = 'tcp';
+ } else if (iana_number == '8') {
+ ctx.network.transport = 'egp';
+ } else if (iana_number == '17') {
+ ctx.network.transport = 'udp';
+ } else if (iana_number == '47') {
+ ctx.network.transport = 'gre';
+ } else if (iana_number == '50') {
+ ctx.network.transport = 'esp';
+ } else if (iana_number == '58') {
+ ctx.network.transport = 'ipv6-icmp';
+ } else if (iana_number == '112') {
+ ctx.network.transport = 'vrrp';
+ } else if (iana_number == '132') {
+ ctx.network.transport = 'sctp';
+ }
+ - rename:
+ field: json.jsonPayload.connection.dest_ip
+ target_field: destination.address
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.dest_port
+ target_field: destination.port
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.src_ip
+ target_field: source.address
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.src_port
+ target_field: source.port
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_instance.vm_name
+ target_field: source.domain
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_instance.vm_name
+ target_field: destination.domain
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.asn
+ target_field: destination.as.number
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.continent
+ target_field: destination.geo.continent_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.country
+ target_field: destination.geo.country_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.region
+ target_field: destination.geo.region_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.city
+ target_field: destination.geo.city_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.asn
+ target_field: source.as.number
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.continent
+ target_field: source.geo.continent_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.country
+ target_field: source.geo.country_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.region
+ target_field: source.geo.region_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.city
+ target_field: source.geo.city_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_instance
+ target_field: gcp.destination.instance
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_vpc
+ target_field: gcp.destination.vpc
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_instance
+ target_field: gcp.source.instance
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_vpc
+ target_field: gcp.source.vpc
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.rule_details.reference
+ target_field: rule.name
+ ignore_missing: true
+ - set:
+ field: source.ip
+ value: "{{source.address}}"
+ if: ctx?.source?.address != null
+ ignore_failure: true
+ - set:
+ field: destination.ip
+ value: "{{destination.address}}"
+ if: ctx?.destination?.address != null
+ ignore_failure: true
+ - convert:
+ field: gcp.source.instance.project_id
+ target_field: cloud.project.id
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "outbound"
+ - convert:
+ field: gcp.source.instance.vm_name
+ target_field: cloud.instance.name
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "outbound"
+ - convert:
+ field: gcp.source.instance.region
+ target_field: cloud.region
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "outbound"
+ - convert:
+ field: gcp.source.instance.zone
+ target_field: cloud.availability_zone
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "outbound"
+ - convert:
+ field: gcp.source.vpc.subnetwork_name
+ target_field: network.name
+ type: string
+ ignore_missing: true
+ ignore_failure: true
+ if: ctx?.network?.direction == "outbound"
+ - convert:
+ field: gcp.destination.instance.project_id
+ target_field: cloud.project.id
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "inbound"
+ - convert:
+ field: gcp.destination.instance.vm_name
+ target_field: cloud.instance.name
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "inbound"
+ - convert:
+ field: gcp.destination.instance.region
+ target_field: cloud.region
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "inbound"
+ - convert:
+ field: gcp.destination.instance.zone
+ target_field: cloud.availability_zone
+ type: string
+ ignore_missing: true
+ if: ctx?.network?.direction == "inbound"
+ - convert:
+ field: gcp.destination.vpc.subnetwork_name
+ target_field: network.name
+ type: string
+ ignore_missing: true
+ ignore_failure: true
+ if: ctx?.network?.direction == "inbound"
+ - set:
+ field: network.direction
+ value: internal
+ if: ctx?.gcp?.source?.instance == ctx?.gcp?.destination?.instance
+ - set:
+ field: network.type
+ value: ipv4
+ if: ctx?.source?.ip != null && ctx?.source?.ip.contains(".")
+ - set:
+ field: network.type
+ value: ipv6
+ if: ctx?.source?.ip != null && !ctx?.source?.ip.contains(".")
+ - rename:
+ field: json.jsonPayload.rule_details
+ target_field: gcp.firewall.rule_details
+ ignore_missing: true
+ - append:
+ field: related.ip
+ value: "{{source.ip}}"
+ allow_duplicates: false
+ if: ctx?.source?.ip != null && ctx?.source?.ip != ""
+ - append:
+ field: related.ip
+ value: "{{destination.ip}}"
+ allow_duplicates: false
+ if: ctx?.destination?.ip != null && ctx?.destination?.ip != ""
+ - remove:
+ field:
+ - gcp.firewall.connection
+ - gcp.firewall.dest_location
+ - gcp.firewall.disposition
+ - gcp.firewall.src_location
+ - json
+ ignore_missing: true
+ # IP Geolocation Lookup
+ - geoip:
+ field: source.ip
+ target_field: source.geo
+ ignore_missing: true
+ - geoip:
+ field: destination.ip
+ target_field: destination.geo
+ ignore_missing: true
+ # IP Autonomous System (AS) Lookup
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: source.ip
+ target_field: source.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: destination.ip
+ target_field: destination.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - rename:
+ field: source.as.asn
+ target_field: source.as.number
+ ignore_missing: true
+ - rename:
+ field: source.as.organization_name
+ target_field: source.as.organization.name
+ ignore_missing: true
+ - rename:
+ field: destination.as.asn
+ target_field: destination.as.number
+ ignore_missing: true
+ - rename:
+ field: destination.as.organization_name
+ target_field: destination.as.organization.name
+ ignore_missing: true
+ - remove:
+ field: event.original
+ if: "ctx?.tags == null || !(ctx.tags.contains('preserve_original_event'))"
+ ignore_failure: true
+ ignore_missing: true
+on_failure:
+ - set:
+ field: error.message
+ value: "{{ _ingest.on_failure_message }}"
diff --git a/packages/gcp/1.4.1/data_stream/firewall/fields/agent.yml b/packages/gcp/1.4.1/data_stream/firewall/fields/agent.yml
new file mode 100755
index 0000000000..e313ec8287
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/fields/agent.yml
@@ -0,0 +1,204 @@
+- name: cloud
+ title: Cloud
+ group: 2
+ description: Fields related to the cloud or infrastructure the events are coming from.
+ footnote: 'Examples: If Metricbeat is running on an EC2 host and fetches data from its host, the cloud info contains the data about this machine. If Metricbeat runs on a remote machine outside the cloud and fetches data from a service running in the cloud, the field contains cloud data from the machine the service is running on.'
+ type: group
+ fields:
+ - name: account.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment.
+
+ Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.'
+ example: 666777888999
+ - name: availability_zone
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Availability zone in which this host is running.
+ example: us-east-1c
+ - name: instance.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance ID of the host machine.
+ example: i-1234567890abcdef0
+ - name: instance.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance name of the host machine.
+ - name: machine.type
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Machine type of the host machine.
+ example: t2.medium
+ - name: provider
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean.
+ example: aws
+ - name: region
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Region in which this host is running.
+ example: us-east-1
+ - name: project.id
+ type: keyword
+ description: Name of the project in Google Cloud.
+ - name: image.id
+ type: keyword
+ description: Image ID for the cloud instance.
+- name: container
+ title: Container
+ group: 2
+ description: 'Container fields are used for meta information about the specific container that is the source of information.
+
+ These fields help correlate data based containers from any runtime.'
+ type: group
+ fields:
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Unique container id.
+ - name: image.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the image the container was built on.
+ - name: labels
+ level: extended
+ type: object
+ object_type: keyword
+ description: Image labels.
+ - name: name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Container name.
+- name: host
+ title: Host
+ group: 2
+ description: 'A host is defined as a general computing instance.
+
+ ECS host.* fields should be populated with details about the host on which the event happened, or from which the measurement was taken. Host types include hardware, virtual machines, Docker containers, and Kubernetes nodes.'
+ type: group
+ fields:
+ - name: architecture
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Operating system architecture.
+ example: x86_64
+ - name: domain
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the domain of which the host is a member.
+
+ For example, on Windows this could be the host''s Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host''s LDAP provider.'
+ example: CONTOSO
+ default_field: false
+ - name: hostname
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Hostname of the host.
+
+ It normally contains what the `hostname` command returns on the host machine.'
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Unique host id.
+
+ As hostname is not always unique, use values that are meaningful in your environment.
+
+ Example: The current usage of `beat.name`.'
+ - name: ip
+ level: core
+ type: ip
+ description: Host ip addresses.
+ - name: mac
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Host mac addresses.
+ - name: name
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the host.
+
+ It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.'
+ - name: os.family
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: OS family (such as redhat, debian, freebsd, windows).
+ example: debian
+ - name: os.kernel
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system kernel version as a raw string.
+ example: 4.4.0-112-generic
+ - name: os.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ multi_fields:
+ - name: text
+ type: text
+ norms: false
+ default_field: false
+ description: Operating system name, without the version.
+ example: Mac OS X
+ - name: os.platform
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system platform (such centos, ubuntu, windows).
+ example: darwin
+ - name: os.version
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system version as a raw string.
+ example: 10.14.1
+ - name: type
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Type of host.
+
+ For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment.'
+ - name: containerized
+ type: boolean
+ description: >
+ If the host is a container.
+
+ - name: os.build
+ type: keyword
+ example: "18D109"
+ description: >
+ OS build information.
+
+ - name: os.codename
+ type: keyword
+ example: "stretch"
+ description: >
+ OS codename, if any.
+
+- name: input.type
+ type: keyword
+ description: Input type
+- name: log.offset
+ type: long
+ description: Log offset
diff --git a/packages/gcp/1.4.1/data_stream/firewall/fields/base-fields.yml b/packages/gcp/1.4.1/data_stream/firewall/fields/base-fields.yml
new file mode 100755
index 0000000000..93e2a6ab3b
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/fields/base-fields.yml
@@ -0,0 +1,20 @@
+- name: data_stream.type
+ type: constant_keyword
+ description: Data stream type.
+- name: data_stream.dataset
+ type: constant_keyword
+ description: Data stream dataset.
+- name: data_stream.namespace
+ type: constant_keyword
+ description: Data stream namespace.
+- name: '@timestamp'
+ type: date
+ description: Event timestamp.
+- name: event.module
+ type: constant_keyword
+ description: Event module
+ value: gcp
+- name: event.dataset
+ type: constant_keyword
+ description: Event dataset
+ value: gcp.firewall
diff --git a/packages/gcp/1.4.1/data_stream/firewall/fields/ecs.yml b/packages/gcp/1.4.1/data_stream/firewall/fields/ecs.yml
new file mode 100755
index 0000000000..db6f5e0d91
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/fields/ecs.yml
@@ -0,0 +1,199 @@
+- description: Container name.
+ name: container.name
+ type: keyword
+- description: Runtime managing this container.
+ name: container.runtime
+ type: keyword
+- description: |-
+ Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: destination.address
+ type: keyword
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: destination.as.number
+ type: long
+- description: Organization name.
+ name: destination.as.organization.name
+ type: keyword
+- description: |-
+ The domain name of the destination system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: destination.domain
+ type: keyword
+- description: City name.
+ name: destination.geo.city_name
+ type: keyword
+- description: Name of the continent.
+ name: destination.geo.continent_name
+ type: keyword
+- description: Country ISO code.
+ name: destination.geo.country_iso_code
+ type: keyword
+- description: Country name.
+ name: destination.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: destination.geo.location
+ type: geo_point
+- description: |-
+ User-defined description of a location, at the level of granularity they care about.
+ Could be the name of their data centers, the floor number, if this describes a local physical entity, city names.
+ Not typically used in automated geolocation.
+ name: destination.geo.name
+ type: keyword
+- description: Region ISO code.
+ name: destination.geo.region_iso_code
+ type: keyword
+- description: Region name.
+ name: destination.geo.region_name
+ type: keyword
+- description: IP address of the destination (IPv4 or IPv6).
+ name: destination.ip
+ type: ip
+- description: Port of the destination.
+ name: destination.port
+ type: long
+- description: |-
+ ECS version this event conforms to. `ecs.version` is a required field and must exist in all events.
+ When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events.
+ name: ecs.version
+ type: keyword
+- description: |-
+ The action captured by the event.
+ This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.
+ name: event.action
+ type: keyword
+- description: |-
+ Timestamp when an event arrived in the central data store.
+ This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event.
+ In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` < `event.created` < `event.ingested`.
+ name: event.ingested
+ type: date
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy.
+ `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.
+ Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective.
+ Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer.
+ Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense.
+ name: event.outcome
+ type: keyword
+- description: |-
+ Full path to the log file this event came from, including the file name. It should include the drive letter, when appropriate.
+ If the event wasn't read from a log file, do not populate this field.
+ name: log.file.path
+ type: keyword
+- description: The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name.
+ name: log.logger
+ type: keyword
+- description: |-
+ For log events the message field contains the log message, optimized for viewing in a log viewer.
+ For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event.
+ If multiple messages exist, they can be combined into one message.
+ name: message
+ type: match_only_text
+- description: |-
+ A hash of source and destination IPs and ports, as well as the protocol used in a communication. This is a tool-agnostic standard to identify flows.
+ Learn more at https://github.com/corelight/community-id-spec.
+ name: network.community_id
+ type: keyword
+- description: |-
+ Direction of the network traffic.
+ Recommended values are:
+ * ingress
+ * egress
+ * inbound
+ * outbound
+ * internal
+ * external
+ * unknown
+
+ When mapping events from a host-based monitoring context, populate this field from the host's point of view, using the values "ingress" or "egress".
+ When mapping events from a network or perimeter-based monitoring context, populate this field from the point of view of the network perimeter, using the values "inbound", "outbound", "internal" or "external".
+ Note that "internal" is not crossing perimeter boundaries, and is meant to describe communication between two hosts within the perimeter. Note also that "external" is meant to describe traffic between two hosts that are external to the perimeter. This could for example be useful for ISPs or VPN service providers.
+ name: network.direction
+ type: keyword
+- description: IANA Protocol Number (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). Standardized list of protocols. This aligns well with NetFlow and sFlow related logs which use the IANA Protocol Number.
+ name: network.iana_number
+ type: keyword
+- description: Name given by operators to sections of their network.
+ name: network.name
+ type: keyword
+- description: |-
+ Same as network.iana_number, but instead using the Keyword name of the transport layer (udp, tcp, ipv6-icmp, etc.)
+ The field value must be normalized to lowercase for querying.
+ name: network.transport
+ type: keyword
+- description: |-
+ In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc
+ The field value must be normalized to lowercase for querying.
+ name: network.type
+ type: keyword
+- description: All the hashes seen on your event. Populating this field, then using it to search for hashes can help in situations where you're unsure what the hash algorithm is (and therefore which key name to search).
+ name: related.hash
+ type: keyword
+- description: All hostnames or other host identifiers seen on your event. Example identifiers include FQDNs, domain names, workstation names, or aliases.
+ name: related.hosts
+ type: keyword
+- description: All of the IPs seen on your event.
+ name: related.ip
+ type: ip
+- description: All the user names or other user identifiers seen on the event.
+ name: related.user
+ type: keyword
+- description: The name of the rule or signature generating the event.
+ name: rule.name
+ type: keyword
+- description: |-
+ Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: source.address
+ type: keyword
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: source.as.number
+ type: long
+- description: Organization name.
+ name: source.as.organization.name
+ type: keyword
+- description: |-
+ The domain name of the source system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: source.domain
+ type: keyword
+- description: City name.
+ name: source.geo.city_name
+ type: keyword
+- description: Name of the continent.
+ name: source.geo.continent_name
+ type: keyword
+- description: Country ISO code.
+ name: source.geo.country_iso_code
+ type: keyword
+- description: Country name.
+ name: source.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: source.geo.location
+ type: geo_point
+- description: |-
+ User-defined description of a location, at the level of granularity they care about.
+ Could be the name of their data centers, the floor number, if this describes a local physical entity, city names.
+ Not typically used in automated geolocation.
+ name: source.geo.name
+ type: keyword
+- description: Region ISO code.
+ name: source.geo.region_iso_code
+ type: keyword
+- description: Region name.
+ name: source.geo.region_name
+ type: keyword
+- description: IP address of the source (IPv4 or IPv6).
+ name: source.ip
+ type: ip
+- description: Port of the source.
+ name: source.port
+ type: long
+- description: List of keywords used to tag each event.
+ name: tags
+ type: keyword
diff --git a/packages/gcp/1.4.1/data_stream/firewall/fields/fields.yml b/packages/gcp/1.4.1/data_stream/firewall/fields/fields.yml
new file mode 100755
index 0000000000..98681562b2
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/fields/fields.yml
@@ -0,0 +1,44 @@
+- name: gcp.firewall
+ type: group
+ fields:
+ - name: rule_details
+ type: group
+ fields:
+ - name: priority
+ type: long
+ description: The priority for the firewall rule.
+ - name: action
+ type: keyword
+ description: Action that the rule performs on match.
+ - name: direction
+ type: keyword
+ description: Direction of traffic that matches this rule.
+ - name: reference
+ type: keyword
+ description: Reference to the firewall rule.
+ - name: source_range
+ type: keyword
+ description: List of source ranges that the firewall rule applies to.
+ - name: destination_range
+ type: keyword
+ description: List of destination ranges that the firewall applies to.
+ - name: source_tag
+ type: keyword
+ description: |
+ List of all the source tags that the firewall rule applies to.
+ - name: target_tag
+ type: keyword
+ description: |
+ List of all the target tags that the firewall rule applies to.
+ - name: ip_port_info
+ type: array
+ description: |
+ List of ip protocols and applicable port ranges for rules.
+ - name: source_service_account
+ type: keyword
+ description: |
+ List of all the source service accounts that the firewall rule applies to.
+ - name: target_service_account
+ type: keyword
+ description: |
+ List of all the target service accounts that the firewall rule applies to.
diff --git a/packages/gcp/1.4.1/data_stream/firewall/fields/package-fields.yml b/packages/gcp/1.4.1/data_stream/firewall/fields/package-fields.yml
new file mode 100755
index 0000000000..88482fd9c1
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/fields/package-fields.yml
@@ -0,0 +1,63 @@
+- name: gcp
+ type: group
+ fields:
+ - name: destination.instance
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: region
+ type: keyword
+ description: |
+ Region of the VM.
+ - name: zone
+ type: keyword
+ description: |
+ Zone of the VM.
+ - name: destination.vpc
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: vpc_name
+ type: keyword
+ description: |
+ VPC on which the VM is operating.
+ - name: subnetwork_name
+ type: keyword
+ description: |
+ Subnetwork on which the VM is operating.
+ - name: source.instance
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: region
+ type: keyword
+ description: |
+ Region of the VM.
+ - name: zone
+ type: keyword
+ description: |
+ Zone of the VM.
+ - name: source.vpc
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: vpc_name
+ type: keyword
+ description: |
+ VPC on which the VM is operating.
+ - name: subnetwork_name
+ type: keyword
+ description: |
+ Subnetwork on which the VM is operating.
diff --git a/packages/gcp/1.4.1/data_stream/firewall/manifest.yml b/packages/gcp/1.4.1/data_stream/firewall/manifest.yml
new file mode 100755
index 0000000000..1262782381
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/manifest.yml
@@ -0,0 +1,56 @@
+type: logs
+title: Google Cloud Platform (GCP) firewall logs
+streams:
+ - input: gcp-pubsub
+ vars:
+ - name: topic
+ type: text
+ title: Topic
+ multi: false
+ required: true
+ show_user: true
+ default: stackdriver-firewall
+ - name: subscription_name
+ type: text
+ title: Subscription Name
+ multi: false
+ required: true
+ show_user: true
+ default: filebeat-gcp-firewall
+ - name: subscription_create
+ type: bool
+ title: Subscription Create
+ description: If true, the integration will create the subscription on start.
+ multi: false
+ required: true
+ show_user: false
+ default: false
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - forwarded
+ - gcp-firewall
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ description: >
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
+
+ template_path: gcp-pubsub.yml.hbs
+ title: Google Cloud Platform (GCP) firewall logs (gcp-pubsub)
+ description: Collect Google Cloud Platform (GCP) firewall logs using gcp-pubsub input
diff --git a/packages/gcp/1.4.1/data_stream/firewall/sample_event.json b/packages/gcp/1.4.1/data_stream/firewall/sample_event.json
new file mode 100755
index 0000000000..34c5396a1d
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/firewall/sample_event.json
@@ -0,0 +1,118 @@
+{
+ "@timestamp": "2019-10-30T13:52:42.191Z",
+ "agent": {
+ "ephemeral_id": "4fed48b9-0848-4ceb-88b1-30fb7da99604",
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "cloud": {
+ "availability_zone": "us-east1-b",
+ "project": {
+ "id": "test-beats"
+ },
+ "region": "us-east1"
+ },
+ "data_stream": {
+ "dataset": "gcp.firewall",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "destination": {
+ "address": "10.42.0.2",
+ "domain": "test-windows",
+ "ip": "10.42.0.2",
+ "port": 3389
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "action": "firewall-rule",
+ "agent_id_status": "verified",
+ "category": "network",
+ "created": "2021-12-31T03:11:30.136Z",
+ "dataset": "gcp.firewall",
+ "id": "1f21ciqfpfssuo",
+ "ingested": "2021-12-31T03:11:31Z",
+ "kind": "event",
+ "type": "connection"
+ },
+ "gcp": {
+ "destination": {
+ "instance": {
+ "project_id": "test-beats",
+ "region": "us-east1",
+ "zone": "us-east1-b"
+ },
+ "vpc": {
+ "project_id": "test-beats",
+ "subnetwork_name": "windows-isolated",
+ "vpc_name": "windows-isolated"
+ }
+ },
+ "firewall": {
+ "rule_details": {
+ "action": "ALLOW",
+ "direction": "INGRESS",
+ "ip_port_info": [
+ {
+ "ip_protocol": "TCP",
+ "port_range": [
+ "3389"
+ ]
+ }
+ ],
+ "priority": 1000,
+ "source_range": [
+ "0.0.0.0/0"
+ ],
+ "target_tag": [
+ "allow-rdp"
+ ]
+ }
+ }
+ },
+ "input": {
+ "type": "gcp-pubsub"
+ },
+ "log": {
+ "logger": "projects/test-beats/logs/compute.googleapis.com%2Ffirewall"
+ },
+ "network": {
+ "community_id": "1:OdLB9eXsBDLz8m97ao4LepX6q+4=",
+ "direction": "inbound",
+ "iana_number": "6",
+ "name": "windows-isolated",
+ "transport": "tcp",
+ "type": "ipv4"
+ },
+ "related": {
+ "ip": [
+ "192.168.2.126",
+ "10.42.0.2"
+ ]
+ },
+ "rule": {
+ "name": "network:windows-isolated/firewall:windows-isolated-allow-rdp"
+ },
+ "source": {
+ "address": "192.168.2.126",
+ "geo": {
+ "continent_name": "Asia",
+ "country_name": "omn"
+ },
+ "ip": "192.168.2.126",
+ "port": 64853
+ },
+ "tags": [
+ "forwarded",
+ "gcp-firewall"
+ ]
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/agent/stream/gcp-pubsub.yml.hbs b/packages/gcp/1.4.1/data_stream/vpcflow/agent/stream/gcp-pubsub.yml.hbs
new file mode 100755
index 0000000000..d582de0a80
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/agent/stream/gcp-pubsub.yml.hbs
@@ -0,0 +1,27 @@
+project_id: {{project_id}}
+topic: {{topic}}
+subscription.name: {{subscription_name}}
+{{#if credentials_file}}
+credentials_file: {{credentials_file}}
+{{/if}}
+{{#if credentials_json}}
+credentials_json: '{{credentials_json}}'
+{{/if}}
+{{#if alternative_host}}
+alternative_host: {{alternative_host}}
+{{/if}}
+subscription.create: {{subscription_create}}
+tags:
+{{#if preserve_original_event}}
+ - preserve_original_event
+{{/if}}
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+{{#if processors}}
+processors:
+{{processors}}
+{{/if}}
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/elasticsearch/ingest_pipeline/default.yml b/packages/gcp/1.4.1/data_stream/vpcflow/elasticsearch/ingest_pipeline/default.yml
new file mode 100755
index 0000000000..2370c3e3c9
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/elasticsearch/ingest_pipeline/default.yml
@@ -0,0 +1,368 @@
+---
+description: Pipeline for Google Cloud VPC Flow Logs
+
+processors:
+ - set:
+ field: ecs.version
+ value: '8.0.0'
+ - rename:
+ field: message
+ target_field: event.original
+ ignore_missing: true
+ - json:
+ field: event.original
+ target_field: json
+ - community_id:
+ source_ip: json.jsonPayload.connection.src_ip
+ source_port: json.jsonPayload.connection.src_port
+ destination_ip: json.jsonPayload.connection.dest_ip
+ destination_port: json.jsonPayload.connection.dest_port
+ iana_number: json.jsonPayload.connection.protocol
+ - date:
+ field: json.timestamp
+ timezone: UTC
+ formats:
+ - ISO8601
+ - set:
+ field: event.kind
+ value: event
+ - set:
+ field: event.category
+ value: network
+ - set:
+ field: event.type
+ value: connection
+ - set:
+ field: event.id
+ copy_from: json.insertId
+ ignore_empty_value: true
+ ignore_failure: true
+ - rename:
+ field: json.logName
+ target_field: log.logger
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.dest_ip
+ target_field: destination.address
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.dest_port
+ target_field: destination.port
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.protocol
+ target_field: network.iana_number
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.src_ip
+ target_field: source.address
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.connection.src_port
+ target_field: source.port
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_instance.vm_name
+ target_field: source.domain
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_instance.vm_name
+ target_field: destination.domain
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.bytes_sent
+ target_field: source.bytes
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.packets_sent
+ target_field: source.packets
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.start_time
+ target_field: event.start
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.end_time
+ target_field: event.end
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.asn
+ target_field: destination.as.number
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.continent
+ target_field: destination.geo.continent_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.country
+ target_field: destination.geo.country_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.region
+ target_field: destination.geo.region_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_location.city
+ target_field: destination.geo.city_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.asn
+ target_field: source.as.number
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.continent
+ target_field: source.geo.continent_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.country
+ target_field: source.geo.country_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.region
+ target_field: source.geo.region_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_location.city
+ target_field: source.geo.city_name
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_instance
+ target_field: gcp.destination.instance
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.dest_vpc
+ target_field: gcp.destination.vpc
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_instance
+ target_field: gcp.source.instance
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload.src_vpc
+ target_field: gcp.source.vpc
+ ignore_missing: true
+ - convert:
+ field: json.jsonPayload.rtt_msec
+ target_field: json.jsonPayload.rtt.ms
+ type: long
+ ignore_missing: true
+ - rename:
+ field: json.jsonPayload
+ target_field: gcp.vpcflow
+ ignore_missing: true
+ - convert:
+ field: source.bytes
+ type: long
+ ignore_missing: true
+ - convert:
+ field: source.packets
+ type: long
+ ignore_missing: true
+ - convert:
+ field: network.iana_number
+ type: string
+ ignore_missing: true
+ - script:
+ lang: painless
+ ignore_failure: true
+ if: ctx?.network?.iana_number != null
+ source: |
+ def iana_number = ctx.network.iana_number;
+ if (iana_number == '0') {
+ ctx.network.transport = 'hopopt';
+ } else if (iana_number == '1') {
+ ctx.network.transport = 'icmp';
+ } else if (iana_number == '2') {
+ ctx.network.transport = 'igmp';
+ } else if (iana_number == '6') {
+ ctx.network.transport = 'tcp';
+ } else if (iana_number == '8') {
+ ctx.network.transport = 'egp';
+ } else if (iana_number == '17') {
+ ctx.network.transport = 'udp';
+ } else if (iana_number == '47') {
+ ctx.network.transport = 'gre';
+ } else if (iana_number == '50') {
+ ctx.network.transport = 'esp';
+ } else if (iana_number == '58') {
+ ctx.network.transport = 'ipv6-icmp';
+ } else if (iana_number == '112') {
+ ctx.network.transport = 'vrrp';
+ } else if (iana_number == '132') {
+ ctx.network.transport = 'sctp';
+ }
+ - remove:
+ field:
+ - gcp.vpcflow.rtt_msec
+ - gcp.vpcflow.connection
+ - gcp.vpcflow.dest_location
+ - gcp.vpcflow.src_location
+ - json
+ ignore_missing: true
+ - set:
+ field: source.ip
+ value: "{{source.address}}"
+ ignore_failure: true
+ if: ctx?.source?.address != null
+ - set:
+ field: destination.ip
+ value: "{{destination.address}}"
+ ignore_failure: true
+ if: ctx?.destination?.address != null
+ - convert:
+ field: gcp.source.instance.project_id
+ target_field: cloud.project.id
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "DEST"
+ - convert:
+ field: gcp.source.instance.vm_name
+ target_field: cloud.instance.name
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "DEST"
+ - convert:
+ field: gcp.source.instance.region
+ target_field: cloud.region
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "DEST"
+ - convert:
+ field: gcp.source.instance.zone
+ target_field: cloud.availability_zone
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "DEST"
+ - convert:
+ field: gcp.source.vpc.subnetwork_name
+ target_field: network.name
+ type: string
+ ignore_missing: true
+ ignore_failure: true
+ if: ctx?.gcp?.vpcflow?.reporter == "DEST"
+ - convert:
+ field: gcp.destination.instance.project_id
+ target_field: cloud.project.id
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "SRC"
+ - convert:
+ field: gcp.destination.instance.vm_name
+ target_field: cloud.instance.name
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "SRC"
+ - convert:
+ field: gcp.destination.instance.region
+ target_field: cloud.region
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "SRC"
+ - convert:
+ field: gcp.destination.instance.zone
+ target_field: cloud.availability_zone
+ type: string
+ ignore_missing: true
+ if: ctx?.gcp?.vpcflow?.reporter == "SRC"
+ - convert:
+ field: gcp.destination.vpc.subnetwork_name
+ target_field: network.name
+ type: string
+ ignore_missing: true
+ ignore_failure: true
+ if: ctx?.gcp?.vpcflow?.reporter == "SRC"
+ - convert:
+ field: source.bytes
+ type: long
+ target_field: network.bytes
+ ignore_missing: true
+ - convert:
+ field: source.packets
+ type: long
+ target_field: network.packets
+ ignore_missing: true
+ - set:
+ field: network.direction
+ value: internal
+ if: ctx?.gcp?.source?.instance != null && ctx?.gcp?.destination?.instance != null
+ - set:
+ field: network.direction
+ value: outbound
+ if: ctx?.gcp?.source?.instance != null && ctx?.gcp?.destination?.instance == null
+ - set:
+ field: network.direction
+ value: inbound
+ if: ctx?.gcp?.source?.instance == null && ctx?.gcp?.destination?.instance != null
+ - set:
+ field: network.direction
+ value: unknown
+ if: ctx?.network?.direction == null
+ - set:
+ field: network.type
+ value: ipv4
+ if: ctx?.source?.ip != null && ctx?.source?.ip.contains(".")
+ - set:
+ field: network.type
+ value: ipv6
+ if: ctx?.source?.ip != null && !ctx?.source?.ip.contains(".")
+ - append:
+ field: related.ip
+ value: "{{source.ip}}"
+ allow_duplicates: false
+ if: ctx?.source?.ip != null && ctx?.source?.ip != ""
+ - append:
+ field: related.ip
+ value: "{{destination.ip}}"
+ allow_duplicates: false
+ if: ctx?.destination?.ip != null && ctx?.destination?.ip != ""
+ # IP Geolocation Lookup
+ - geoip:
+ field: source.ip
+ target_field: source.geo
+ ignore_missing: true
+ - geoip:
+ field: destination.ip
+ target_field: destination.geo
+ ignore_missing: true
+ # IP Autonomous System (AS) Lookup
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: source.ip
+ target_field: source.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: destination.ip
+ target_field: destination.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - rename:
+ field: source.as.asn
+ target_field: source.as.number
+ ignore_missing: true
+ - rename:
+ field: source.as.organization_name
+ target_field: source.as.organization.name
+ ignore_missing: true
+ - rename:
+ field: destination.as.asn
+ target_field: destination.as.number
+ ignore_missing: true
+ - rename:
+ field: destination.as.organization_name
+ target_field: destination.as.organization.name
+ ignore_missing: true
+ - remove:
+ field: event.original
+ if: "ctx?.tags == null || !(ctx.tags.contains('preserve_original_event'))"
+ ignore_failure: true
+ ignore_missing: true
+on_failure:
+ - set:
+ field: error.message
+ value: '{{ _ingest.on_failure_message }}'
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/fields/agent.yml b/packages/gcp/1.4.1/data_stream/vpcflow/fields/agent.yml
new file mode 100755
index 0000000000..e313ec8287
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/fields/agent.yml
@@ -0,0 +1,204 @@
+- name: cloud
+ title: Cloud
+ group: 2
+ description: Fields related to the cloud or infrastructure the events are coming from.
+ footnote: 'Examples: If Metricbeat is running on an EC2 host and fetches data from its host, the cloud info contains the data about this machine. If Metricbeat runs on a remote machine outside the cloud and fetches data from a service running in the cloud, the field contains cloud data from the machine the service is running on.'
+ type: group
+ fields:
+ - name: account.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment.
+
+ Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.'
+ example: 666777888999
+ - name: availability_zone
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Availability zone in which this host is running.
+ example: us-east-1c
+ - name: instance.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance ID of the host machine.
+ example: i-1234567890abcdef0
+ - name: instance.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance name of the host machine.
+ - name: machine.type
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Machine type of the host machine.
+ example: t2.medium
+ - name: provider
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean.
+ example: aws
+ - name: region
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Region in which this host is running.
+ example: us-east-1
+ - name: project.id
+ type: keyword
+ description: Name of the project in Google Cloud.
+ - name: image.id
+ type: keyword
+ description: Image ID for the cloud instance.
+- name: container
+ title: Container
+ group: 2
+ description: 'Container fields are used for meta information about the specific container that is the source of information.
+
+ These fields help correlate data based containers from any runtime.'
+ type: group
+ fields:
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Unique container id.
+ - name: image.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the image the container was built on.
+ - name: labels
+ level: extended
+ type: object
+ object_type: keyword
+ description: Image labels.
+ - name: name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Container name.
+- name: host
+ title: Host
+ group: 2
+ description: 'A host is defined as a general computing instance.
+
+ ECS host.* fields should be populated with details about the host on which the event happened, or from which the measurement was taken. Host types include hardware, virtual machines, Docker containers, and Kubernetes nodes.'
+ type: group
+ fields:
+ - name: architecture
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Operating system architecture.
+ example: x86_64
+ - name: domain
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the domain of which the host is a member.
+
+ For example, on Windows this could be the host''s Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host''s LDAP provider.'
+ example: CONTOSO
+ default_field: false
+ - name: hostname
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Hostname of the host.
+
+ It normally contains what the `hostname` command returns on the host machine.'
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Unique host id.
+
+ As hostname is not always unique, use values that are meaningful in your environment.
+
+ Example: The current usage of `beat.name`.'
+ - name: ip
+ level: core
+ type: ip
+ description: Host ip addresses.
+ - name: mac
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Host mac addresses.
+ - name: name
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the host.
+
+ It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.'
+ - name: os.family
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: OS family (such as redhat, debian, freebsd, windows).
+ example: debian
+ - name: os.kernel
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system kernel version as a raw string.
+ example: 4.4.0-112-generic
+ - name: os.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ multi_fields:
+ - name: text
+ type: text
+ norms: false
+ default_field: false
+ description: Operating system name, without the version.
+ example: Mac OS X
+ - name: os.platform
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system platform (such centos, ubuntu, windows).
+ example: darwin
+ - name: os.version
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system version as a raw string.
+ example: 10.14.1
+ - name: type
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Type of host.
+
+ For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment.'
+ - name: containerized
+ type: boolean
+ description: >
+ If the host is a container.
+
+ - name: os.build
+ type: keyword
+ example: "18D109"
+ description: >
+ OS build information.
+
+ - name: os.codename
+ type: keyword
+ example: "stretch"
+ description: >
+ OS codename, if any.
+
+- name: input.type
+ type: keyword
+ description: Input type
+- name: log.offset
+ type: long
+ description: Log offset
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/fields/base-fields.yml b/packages/gcp/1.4.1/data_stream/vpcflow/fields/base-fields.yml
new file mode 100755
index 0000000000..09f5a3a04a
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/fields/base-fields.yml
@@ -0,0 +1,20 @@
+- name: data_stream.type
+ type: constant_keyword
+ description: Data stream type.
+- name: data_stream.dataset
+ type: constant_keyword
+ description: Data stream dataset.
+- name: data_stream.namespace
+ type: constant_keyword
+ description: Data stream namespace.
+- name: '@timestamp'
+ type: date
+ description: Event timestamp.
+- name: event.module
+ type: constant_keyword
+ description: Event module
+ value: gcp
+- name: event.dataset
+ type: constant_keyword
+ description: Event dataset
+ value: gcp.vpcflow
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/fields/ecs.yml b/packages/gcp/1.4.1/data_stream/vpcflow/fields/ecs.yml
new file mode 100755
index 0000000000..d5927f4874
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/fields/ecs.yml
@@ -0,0 +1,215 @@
+- description: Container name.
+ name: container.name
+ type: keyword
+- description: Runtime managing this container.
+ name: container.runtime
+ type: keyword
+- description: |-
+ Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: destination.address
+ type: keyword
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: destination.as.number
+ type: long
+- description: Organization name.
+ name: destination.as.organization.name
+ type: keyword
+- description: |-
+ The domain name of the destination system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: destination.domain
+ type: keyword
+- description: City name.
+ name: destination.geo.city_name
+ type: keyword
+- description: Name of the continent.
+ name: destination.geo.continent_name
+ type: keyword
+- description: Country ISO code.
+ name: destination.geo.country_iso_code
+ type: keyword
+- description: Country name.
+ name: destination.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: destination.geo.location
+ type: geo_point
+- description: |-
+ User-defined description of a location, at the level of granularity they care about.
+ Could be the name of their data centers, the floor number, if this describes a local physical entity, city names.
+ Not typically used in automated geolocation.
+ name: destination.geo.name
+ type: keyword
+- description: Region ISO code.
+ name: destination.geo.region_iso_code
+ type: keyword
+- description: Region name.
+ name: destination.geo.region_name
+ type: keyword
+- description: IP address of the destination (IPv4 or IPv6).
+ name: destination.ip
+ type: ip
+- description: Port of the destination.
+ name: destination.port
+ type: long
+- description: |-
+ ECS version this event conforms to. `ecs.version` is a required field and must exist in all events.
+ When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events.
+ name: ecs.version
+ type: keyword
+- description: |-
+ The action captured by the event.
+ This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.
+ name: event.action
+ type: keyword
+- description: |-
+ Timestamp when an event arrived in the central data store.
+ This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event.
+ In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` < `event.created` < `event.ingested`.
+ name: event.ingested
+ type: date
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy.
+ `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.
+ Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective.
+ Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer.
+ Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense.
+ name: event.outcome
+ type: keyword
+- description: |-
+ Full path to the log file this event came from, including the file name. It should include the drive letter, when appropriate.
+ If the event wasn't read from a log file, do not populate this field.
+ name: log.file.path
+ type: keyword
+- description: The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name.
+ name: log.logger
+ type: keyword
+- description: |-
+ For log events the message field contains the log message, optimized for viewing in a log viewer.
+ For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event.
+ If multiple messages exist, they can be combined into one message.
+ name: message
+ type: match_only_text
+- description: |-
+ Total bytes transferred in both directions.
+ If `source.bytes` and `destination.bytes` are known, `network.bytes` is their sum.
+ name: network.bytes
+ type: long
+- description: |-
+ A hash of source and destination IPs and ports, as well as the protocol used in a communication. This is a tool-agnostic standard to identify flows.
+ Learn more at https://github.com/corelight/community-id-spec.
+ name: network.community_id
+ type: keyword
+- description: |-
+ Direction of the network traffic.
+ Recommended values are:
+ * ingress
+ * egress
+ * inbound
+ * outbound
+ * internal
+ * external
+ * unknown
+
+ When mapping events from a host-based monitoring context, populate this field from the host's point of view, using the values "ingress" or "egress".
+ When mapping events from a network or perimeter-based monitoring context, populate this field from the point of view of the network perimeter, using the values "inbound", "outbound", "internal" or "external".
+ Note that "internal" is not crossing perimeter boundaries, and is meant to describe communication between two hosts within the perimeter. Note also that "external" is meant to describe traffic between two hosts that are external to the perimeter. This could for example be useful for ISPs or VPN service providers.
+ name: network.direction
+ type: keyword
+- description: IANA Protocol Number (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). Standardized list of protocols. This aligns well with NetFlow and sFlow related logs which use the IANA Protocol Number.
+ name: network.iana_number
+ type: keyword
+- description: Name given by operators to sections of their network.
+ name: network.name
+ type: keyword
+- description: |-
+ Total packets transferred in both directions.
+ If `source.packets` and `destination.packets` are known, `network.packets` is their sum.
+ name: network.packets
+ type: long
+- description: |-
+ Same as network.iana_number, but instead using the Keyword name of the transport layer (udp, tcp, ipv6-icmp, etc.)
+ The field value must be normalized to lowercase for querying.
+ name: network.transport
+ type: keyword
+- description: |-
+ In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc
+ The field value must be normalized to lowercase for querying.
+ name: network.type
+ type: keyword
+- description: All the hashes seen on your event. Populating this field, then using it to search for hashes can help in situations where you're unsure what the hash algorithm is (and therefore which key name to search).
+ name: related.hash
+ type: keyword
+- description: All hostnames or other host identifiers seen on your event. Example identifiers include FQDNs, domain names, workstation names, or aliases.
+ name: related.hosts
+ type: keyword
+- description: All of the IPs seen on your event.
+ name: related.ip
+ type: ip
+- description: All the user names or other user identifiers seen on the event.
+ name: related.user
+ type: keyword
+- description: The name of the rule or signature generating the event.
+ name: rule.name
+ type: keyword
+- description: |-
+ Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: source.address
+ type: keyword
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: source.as.number
+ type: long
+- description: Organization name.
+ name: source.as.organization.name
+ type: keyword
+- description: Bytes sent from the source to the destination.
+ name: source.bytes
+ type: long
+- description: |-
+ The domain name of the source system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: source.domain
+ type: keyword
+- description: City name.
+ name: source.geo.city_name
+ type: keyword
+- description: Name of the continent.
+ name: source.geo.continent_name
+ type: keyword
+- description: Country ISO code.
+ name: source.geo.country_iso_code
+ type: keyword
+- description: Country name.
+ name: source.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: source.geo.location
+ type: geo_point
+- description: |-
+ User-defined description of a location, at the level of granularity they care about.
+ Could be the name of their data centers, the floor number, if this describes a local physical entity, city names.
+ Not typically used in automated geolocation.
+ name: source.geo.name
+ type: keyword
+- description: Region ISO code.
+ name: source.geo.region_iso_code
+ type: keyword
+- description: Region name.
+ name: source.geo.region_name
+ type: keyword
+- description: IP address of the source (IPv4 or IPv6).
+ name: source.ip
+ type: ip
+- description: Packets sent from the source to the destination.
+ name: source.packets
+ type: long
+- description: Port of the source.
+ name: source.port
+ type: long
+- description: List of keywords used to tag each event.
+ name: tags
+ type: keyword
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/fields/fields.yml b/packages/gcp/1.4.1/data_stream/vpcflow/fields/fields.yml
new file mode 100755
index 0000000000..afd0aca3fa
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/fields/fields.yml
@@ -0,0 +1,11 @@
+- name: gcp.vpcflow
+ type: group
+ fields:
+ - name: reporter
+ type: keyword
+ description: |
+ The side which reported the flow. Can be either 'SRC' or 'DEST'.
+ - name: rtt.ms
+ type: long
+ description: |
+ Latency as measured (for TCP flows only) during the time interval. This is the time elapsed between sending a SEQ and receiving a corresponding ACK and it contains the network RTT as well as the application related delay.
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/fields/package-fields.yml b/packages/gcp/1.4.1/data_stream/vpcflow/fields/package-fields.yml
new file mode 100755
index 0000000000..88482fd9c1
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/fields/package-fields.yml
@@ -0,0 +1,63 @@
+- name: gcp
+ type: group
+ fields:
+ - name: destination.instance
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: region
+ type: keyword
+ description: |
+ Region of the VM.
+ - name: zone
+ type: keyword
+ description: |
+ Zone of the VM.
+ - name: destination.vpc
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: vpc_name
+ type: keyword
+ description: |
+ VPC on which the VM is operating.
+ - name: subnetwork_name
+ type: keyword
+ description: |
+ Subnetwork on which the VM is operating.
+ - name: source.instance
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: region
+ type: keyword
+ description: |
+ Region of the VM.
+ - name: zone
+ type: keyword
+ description: |
+ Zone of the VM.
+ - name: source.vpc
+ type: group
+ fields:
+ - name: project_id
+ type: keyword
+ description: |
+ ID of the project containing the VM.
+ - name: vpc_name
+ type: keyword
+ description: |
+ VPC on which the VM is operating.
+ - name: subnetwork_name
+ type: keyword
+ description: |
+ Subnetwork on which the VM is operating.
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/manifest.yml b/packages/gcp/1.4.1/data_stream/vpcflow/manifest.yml
new file mode 100755
index 0000000000..5b4ca90446
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/manifest.yml
@@ -0,0 +1,56 @@
+type: logs
+title: Google Cloud Platform (GCP) vpcflow logs
+streams:
+ - input: gcp-pubsub
+ vars:
+ - name: topic
+ type: text
+ title: Topic
+ multi: false
+ required: true
+ show_user: true
+ default: stackdriver-vpcflow
+ - name: subscription_name
+ type: text
+ title: Subscription Name
+ multi: false
+ required: true
+ show_user: true
+ default: filebeat-gcp-vpcflow
+ - name: subscription_create
+ type: bool
+ title: Subscription Create
+ description: If true, the integration will create the subscription on start.
+ multi: false
+ required: true
+ show_user: false
+ default: false
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - forwarded
+ - gcp-vpcflow
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ description: >
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
+
+ template_path: gcp-pubsub.yml.hbs
+ title: Google Cloud Platform (GCP) vpcflow logs (gcp-pubsub)
+ description: Collect Google Cloud Platform (GCP) vpcflow logs using gcp-pubsub input
diff --git a/packages/gcp/1.4.1/data_stream/vpcflow/sample_event.json b/packages/gcp/1.4.1/data_stream/vpcflow/sample_event.json
new file mode 100755
index 0000000000..1fc30d133a
--- /dev/null
+++ b/packages/gcp/1.4.1/data_stream/vpcflow/sample_event.json
@@ -0,0 +1,105 @@
+{
+ "@timestamp": "2019-06-14T03:50:10.845Z",
+ "agent": {
+ "ephemeral_id": "e58d02a0-e7a0-45c0-aba6-a8c983782744",
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "data_stream": {
+ "dataset": "gcp.vpcflow",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "destination": {
+ "address": "67.43.156.13",
+ "as": {
+ "number": 35908
+ },
+ "geo": {
+ "continent_name": "Asia",
+ "country_iso_code": "BT",
+ "country_name": "Bhutan",
+ "location": {
+ "lat": 27.5,
+ "lon": 90.5
+ }
+ },
+ "ip": "67.43.156.13",
+ "port": 33478
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "agent_id_status": "verified",
+ "category": "network",
+ "created": "2021-12-31T03:12:25.823Z",
+ "dataset": "gcp.vpcflow",
+ "end": "2019-06-14T03:45:37.301953198Z",
+ "id": "ut8lbrffooxyw",
+ "ingested": "2021-12-31T03:12:26Z",
+ "kind": "event",
+ "start": "2019-06-14T03:45:37.186193305Z",
+ "type": "connection"
+ },
+ "gcp": {
+ "source": {
+ "instance": {
+ "project_id": "my-sample-project",
+ "region": "us-east1",
+ "zone": "us-east1-b"
+ },
+ "vpc": {
+ "project_id": "my-sample-project",
+ "subnetwork_name": "default",
+ "vpc_name": "default"
+ }
+ },
+ "vpcflow": {
+ "reporter": "SRC",
+ "rtt": {
+ "ms": 36
+ }
+ }
+ },
+ "input": {
+ "type": "gcp-pubsub"
+ },
+ "log": {
+ "logger": "projects/my-sample-project/logs/compute.googleapis.com%2Fvpc_flows"
+ },
+ "network": {
+ "bytes": 1776,
+ "community_id": "1:Wa+aonxAQZ59AWtNdQD0CH6FnsM=",
+ "direction": "outbound",
+ "iana_number": "6",
+ "packets": 7,
+ "transport": "tcp",
+ "type": "ipv4"
+ },
+ "related": {
+ "ip": [
+ "10.87.40.76",
+ "67.43.156.13"
+ ]
+ },
+ "source": {
+ "address": "10.87.40.76",
+ "bytes": 1776,
+ "domain": "kibana",
+ "ip": "10.87.40.76",
+ "packets": 7,
+ "port": 5601
+ },
+ "tags": [
+ "forwarded",
+ "gcp-vpcflow"
+ ]
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/docs/README.md b/packages/gcp/1.4.1/docs/README.md
new file mode 100755
index 0000000000..2a4c113d07
--- /dev/null
+++ b/packages/gcp/1.4.1/docs/README.md
@@ -0,0 +1,884 @@
+# Google Cloud Integration
+
+The Google Cloud integration collects and parses Google Cloud audit, VPC flow,
+and firewall logs that have been exported from Stackdriver to a Google Pub/Sub topic sink.
+
+## Logs
+
+### Audit
+
+This is the `audit` dataset.
+
+An example event for `audit` looks as following:
+
+```json
+{
+ "@timestamp": "2019-12-19T00:44:25.051Z",
+ "agent": {
+ "ephemeral_id": "0365945c-c25a-4f02-b62c-a94a0b661f02",
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "cloud": {
+ "project": {
+ "id": "elastic-beats"
+ }
+ },
+ "data_stream": {
+ "dataset": "gcp.audit",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "action": "beta.compute.instances.aggregatedList",
+ "agent_id_status": "verified",
+ "created": "2021-12-31T03:10:44.655Z",
+ "dataset": "gcp.audit",
+ "id": "yonau2dg2zi",
+ "ingested": "2021-12-31T03:10:45Z",
+ "kind": "event",
+ "outcome": "success"
+ },
+ "gcp": {
+ "audit": {
+ "authentication_info": {
+ "principal_email": "xxx@xxx.xxx"
+ },
+ "authorization_info": [
+ {
+ "granted": true,
+ "permission": "compute.instances.list",
+ "resource_attributes": {
+ "name": "projects/elastic-beats",
+ "service": "resourcemanager",
+ "type": "resourcemanager.projects"
+ }
+ }
+ ],
+ "method_name": "beta.compute.instances.aggregatedList",
+ "num_response_items": 61,
+ "request": {
+ "proto_name": "type.googleapis.com/compute.instances.aggregatedList"
+ },
+ "request_metadata": {
+ "caller_ip": "192.168.1.1",
+ "caller_supplied_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:71.0) Gecko/20100101 Firefox/71.0,gzip(gfe),gzip(gfe)"
+ },
+ "resource_location": {
+ "current_locations": [
+ "global"
+ ]
+ },
+ "resource_name": "projects/elastic-beats/global/instances",
+ "response": {
+ "details": {
+ "group": "batch",
+ "kind": "jobs",
+ "name": "gsuite-exporter-1589294700",
+ "uid": "2beff34a-945f-11ea-bacf-42010a80007f"
+ },
+ "proto_name": "core.k8s.io/v1.Status",
+ "status": {
+ "value": "Success"
+ }
+ },
+ "service_name": "compute.googleapis.com",
+ "type": "type.googleapis.com/google.cloud.audit.AuditLog"
+ }
+ },
+ "input": {
+ "type": "gcp-pubsub"
+ },
+ "log": {
+ "logger": "projects/elastic-beats/logs/cloudaudit.googleapis.com%2Fdata_access"
+ },
+ "service": {
+ "name": "compute.googleapis.com"
+ },
+ "source": {
+ "ip": "192.168.1.1"
+ },
+ "tags": [
+ "forwarded",
+ "gcp-audit"
+ ],
+ "user": {
+ "email": "xxx@xxx.xxx"
+ },
+ "user_agent": {
+ "device": {
+ "name": "Mac"
+ },
+ "name": "Firefox",
+ "original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:71.0) Gecko/20100101 Firefox/71.0,gzip(gfe),gzip(gfe)",
+ "os": {
+ "full": "Mac OS X 10.15",
+ "name": "Mac OS X",
+ "version": "10.15"
+ },
+ "version": "71.0."
+ }
+}
+```
+
+**Exported fields**
+
+| Field | Description | Type |
+|---|---|---|
+| @timestamp | Event timestamp. | date |
+| cloud.account.id | The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier. | keyword |
+| cloud.availability_zone | Availability zone in which this host is running. | keyword |
+| cloud.image.id | Image ID for the cloud instance. | keyword |
+| cloud.instance.id | Instance ID of the host machine. | keyword |
+| cloud.instance.name | Instance name of the host machine. | keyword |
+| cloud.machine.type | Machine type of the host machine. | keyword |
+| cloud.project.id | Name of the project in Google Cloud. | keyword |
+| cloud.provider | Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean. | keyword |
+| cloud.region | Region in which this host is running. | keyword |
+| container.id | Unique container id. | keyword |
+| container.image.name | Name of the image the container was built on. | keyword |
+| container.labels | Image labels. | object |
+| container.name | Container name. | keyword |
+| container.runtime | Runtime managing this container. | keyword |
+| data_stream.dataset | Data stream dataset. | constant_keyword |
+| data_stream.namespace | Data stream namespace. | constant_keyword |
+| data_stream.type | Data stream type. | constant_keyword |
+| ecs.version | ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events. | keyword |
+| event.action | The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer. | keyword |
+| event.dataset | Event dataset | constant_keyword |
+| event.ingested | Timestamp when an event arrived in the central data store. This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event. In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` \< `event.created` \< `event.ingested`. | date |
+| event.module | Event module | constant_keyword |
+| event.outcome | This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy. `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective. Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer. Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense. | keyword |
+| gcp.audit.authentication_info.authority_selector | The authority selector specified by the requestor, if any. It is not guaranteed that the principal was allowed to use this authority. | keyword |
+| gcp.audit.authentication_info.principal_email | The email address of the authenticated user making the request. | keyword |
+| gcp.audit.authorization_info.granted | Whether or not authorization for resource and permission was granted. | boolean |
+| gcp.audit.authorization_info.permission | The required IAM permission. | keyword |
+| gcp.audit.authorization_info.resource_attributes.name | The name of the resource. | keyword |
+| gcp.audit.authorization_info.resource_attributes.service | The name of the service. | keyword |
+| gcp.audit.authorization_info.resource_attributes.type | The type of the resource. | keyword |
+| gcp.audit.method_name | The name of the service method or operation. For API calls, this should be the name of the API method. For example, 'google.datastore.v1.Datastore.RunQuery'. | keyword |
+| gcp.audit.num_response_items | The number of items returned from a List or Query API method, if applicable. | long |
+| gcp.audit.request.filter | Filter of the request. | keyword |
+| gcp.audit.request.name | Name of the request. | keyword |
+| gcp.audit.request.proto_name | Type property of the request. | keyword |
+| gcp.audit.request.resource_name | Name of the request resource. | keyword |
+| gcp.audit.request_metadata.caller_ip | The IP address of the caller. | ip |
+| gcp.audit.request_metadata.caller_supplied_user_agent | The user agent of the caller. This information is not authenticated and should be treated accordingly. | keyword |
+| gcp.audit.resource_location.current_locations | Current locations of the resource. | keyword |
+| gcp.audit.resource_name | The resource or collection that is the target of the operation. The name is a scheme-less URI, not including the API service name. For example, 'shelves/SHELF_ID/books'. | keyword |
+| gcp.audit.response.details.group | The name of the group. | keyword |
+| gcp.audit.response.details.kind | The kind of the response details. | keyword |
+| gcp.audit.response.details.name | The name of the response details. | keyword |
+| gcp.audit.response.details.uid | The uid of the response details. | keyword |
+| gcp.audit.response.proto_name | Type property of the response. | keyword |
+| gcp.audit.response.status.allowed | | boolean |
+| gcp.audit.response.status.reason | | keyword |
+| gcp.audit.response.status.value | | keyword |
+| gcp.audit.service_name | The name of the API service performing the operation. For example, datastore.googleapis.com. | keyword |
+| gcp.audit.status.code | The status code, which should be an enum value of google.rpc.Code. | integer |
+| gcp.audit.status.message | A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client. | keyword |
+| gcp.audit.type | Type property. | keyword |
+| gcp.destination.instance.project_id | ID of the project containing the VM. | keyword |
+| gcp.destination.instance.region | Region of the VM. | keyword |
+| gcp.destination.instance.zone | Zone of the VM. | keyword |
+| gcp.destination.vpc.project_id | ID of the project containing the VM. | keyword |
+| gcp.destination.vpc.subnetwork_name | Subnetwork on which the VM is operating. | keyword |
+| gcp.destination.vpc.vpc_name | VPC on which the VM is operating. | keyword |
+| gcp.source.instance.project_id | ID of the project containing the VM. | keyword |
+| gcp.source.instance.region | Region of the VM. | keyword |
+| gcp.source.instance.zone | Zone of the VM. | keyword |
+| gcp.source.vpc.project_id | ID of the project containing the VM. | keyword |
+| gcp.source.vpc.subnetwork_name | Subnetwork on which the VM is operating. | keyword |
+| gcp.source.vpc.vpc_name | VPC on which the VM is operating. | keyword |
+| host.architecture | Operating system architecture. | keyword |
+| host.containerized | If the host is a container. | boolean |
+| host.domain | Name of the domain of which the host is a member. For example, on Windows this could be the host's Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host's LDAP provider. | keyword |
+| host.hostname | Hostname of the host. It normally contains what the `hostname` command returns on the host machine. | keyword |
+| host.id | Unique host id. As hostname is not always unique, use values that are meaningful in your environment. Example: The current usage of `beat.name`. | keyword |
+| host.ip | Host ip addresses. | ip |
+| host.mac | Host mac addresses. | keyword |
+| host.name | Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. | keyword |
+| host.os.build | OS build information. | keyword |
+| host.os.codename | OS codename, if any. | keyword |
+| host.os.family | OS family (such as redhat, debian, freebsd, windows). | keyword |
+| host.os.kernel | Operating system kernel version as a raw string. | keyword |
+| host.os.name | Operating system name, without the version. | keyword |
+| host.os.platform | Operating system platform (such centos, ubuntu, windows). | keyword |
+| host.os.version | Operating system version as a raw string. | keyword |
+| host.type | Type of host. For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. | keyword |
+| input.type | Input type | keyword |
+| log.file.path | Full path to the log file this event came from, including the file name. It should include the drive letter, when appropriate. If the event wasn't read from a log file, do not populate this field. | keyword |
+| log.logger | The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name. | keyword |
+| log.offset | Log offset | long |
+| message | For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message. | match_only_text |
+| orchestrator.api_version | API version being used to carry out the action | keyword |
+| orchestrator.cluster.name | Name of the cluster. | keyword |
+| orchestrator.cluster.url | URL of the API used to manage the cluster. | keyword |
+| orchestrator.cluster.version | The version of the cluster. | keyword |
+| orchestrator.namespace | Namespace in which the action is taking place. | keyword |
+| orchestrator.organization | Organization affected by the event (for multi-tenant orchestrator setups). | keyword |
+| orchestrator.resource.name | Name of the resource being acted upon. | keyword |
+| orchestrator.resource.type | Type of resource being acted upon. | keyword |
+| orchestrator.type | Orchestrator cluster type (e.g. kubernetes, nomad or cloudfoundry). | keyword |
+| service.name | Name of the service data is collected from. The name of the service is normally user given. This allows for distributed services that run on multiple hosts to correlate the related instances based on the name. In the case of Elasticsearch the `service.name` could contain the cluster name. For Beats the `service.name` is by default a copy of the `service.type` field if no name is specified. | keyword |
+| source.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| source.as.organization.name | Organization name. | keyword |
+| source.geo.city_name | City name. | keyword |
+| source.geo.continent_name | Name of the continent. | keyword |
+| source.geo.country_iso_code | Country ISO code. | keyword |
+| source.geo.country_name | Country name. | keyword |
+| source.geo.location | Longitude and latitude. | geo_point |
+| source.geo.region_iso_code | Region ISO code. | keyword |
+| source.geo.region_name | Region name. | keyword |
+| source.ip | IP address of the source (IPv4 or IPv6). | ip |
+| tags | List of keywords used to tag each event. | keyword |
+| user.email | User email address. | keyword |
+| user_agent.device.name | Name of the device. | keyword |
+| user_agent.name | Name of the user agent. | keyword |
+| user_agent.original | Unparsed user_agent string. | keyword |
+| user_agent.os.family | OS family (such as redhat, debian, freebsd, windows). | keyword |
+| user_agent.os.full | Operating system name, including the version or code name. | keyword |
+| user_agent.os.kernel | Operating system kernel version as a raw string. | keyword |
+| user_agent.os.name | Operating system name, without the version. | keyword |
+| user_agent.os.platform | Operating system platform (such centos, ubuntu, windows). | keyword |
+| user_agent.os.version | Operating system version as a raw string. | keyword |
+| user_agent.version | Version of the user agent. | keyword |
+
+
+### Firewall
+
+This is the `firewall` dataset.
+
+An example event for `firewall` looks as following:
+
+```json
+{
+ "@timestamp": "2019-10-30T13:52:42.191Z",
+ "agent": {
+ "ephemeral_id": "4fed48b9-0848-4ceb-88b1-30fb7da99604",
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "cloud": {
+ "availability_zone": "us-east1-b",
+ "project": {
+ "id": "test-beats"
+ },
+ "region": "us-east1"
+ },
+ "data_stream": {
+ "dataset": "gcp.firewall",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "destination": {
+ "address": "10.42.0.2",
+ "domain": "test-windows",
+ "ip": "10.42.0.2",
+ "port": 3389
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "action": "firewall-rule",
+ "agent_id_status": "verified",
+ "category": "network",
+ "created": "2021-12-31T03:11:30.136Z",
+ "dataset": "gcp.firewall",
+ "id": "1f21ciqfpfssuo",
+ "ingested": "2021-12-31T03:11:31Z",
+ "kind": "event",
+ "type": "connection"
+ },
+ "gcp": {
+ "destination": {
+ "instance": {
+ "project_id": "test-beats",
+ "region": "us-east1",
+ "zone": "us-east1-b"
+ },
+ "vpc": {
+ "project_id": "test-beats",
+ "subnetwork_name": "windows-isolated",
+ "vpc_name": "windows-isolated"
+ }
+ },
+ "firewall": {
+ "rule_details": {
+ "action": "ALLOW",
+ "direction": "INGRESS",
+ "ip_port_info": [
+ {
+ "ip_protocol": "TCP",
+ "port_range": [
+ "3389"
+ ]
+ }
+ ],
+ "priority": 1000,
+ "source_range": [
+ "0.0.0.0/0"
+ ],
+ "target_tag": [
+ "allow-rdp"
+ ]
+ }
+ }
+ },
+ "input": {
+ "type": "gcp-pubsub"
+ },
+ "log": {
+ "logger": "projects/test-beats/logs/compute.googleapis.com%2Ffirewall"
+ },
+ "network": {
+ "community_id": "1:OdLB9eXsBDLz8m97ao4LepX6q+4=",
+ "direction": "inbound",
+ "iana_number": "6",
+ "name": "windows-isolated",
+ "transport": "tcp",
+ "type": "ipv4"
+ },
+ "related": {
+ "ip": [
+ "192.168.2.126",
+ "10.42.0.2"
+ ]
+ },
+ "rule": {
+ "name": "network:windows-isolated/firewall:windows-isolated-allow-rdp"
+ },
+ "source": {
+ "address": "192.168.2.126",
+ "geo": {
+ "continent_name": "Asia",
+ "country_name": "omn"
+ },
+ "ip": "192.168.2.126",
+ "port": 64853
+ },
+ "tags": [
+ "forwarded",
+ "gcp-firewall"
+ ]
+}
+```
+
+**Exported fields**
+
+| Field | Description | Type |
+|---|---|---|
+| @timestamp | Event timestamp. | date |
+| cloud.account.id | The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier. | keyword |
+| cloud.availability_zone | Availability zone in which this host is running. | keyword |
+| cloud.image.id | Image ID for the cloud instance. | keyword |
+| cloud.instance.id | Instance ID of the host machine. | keyword |
+| cloud.instance.name | Instance name of the host machine. | keyword |
+| cloud.machine.type | Machine type of the host machine. | keyword |
+| cloud.project.id | Name of the project in Google Cloud. | keyword |
+| cloud.provider | Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean. | keyword |
+| cloud.region | Region in which this host is running. | keyword |
+| container.id | Unique container id. | keyword |
+| container.image.name | Name of the image the container was built on. | keyword |
+| container.labels | Image labels. | object |
+| container.name | Container name. | keyword |
+| container.runtime | Runtime managing this container. | keyword |
+| data_stream.dataset | Data stream dataset. | constant_keyword |
+| data_stream.namespace | Data stream namespace. | constant_keyword |
+| data_stream.type | Data stream type. | constant_keyword |
+| destination.address | Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| destination.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| destination.as.organization.name | Organization name. | keyword |
+| destination.domain | The domain name of the destination system. This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment. | keyword |
+| destination.geo.city_name | City name. | keyword |
+| destination.geo.continent_name | Name of the continent. | keyword |
+| destination.geo.country_iso_code | Country ISO code. | keyword |
+| destination.geo.country_name | Country name. | keyword |
+| destination.geo.location | Longitude and latitude. | geo_point |
+| destination.geo.name | User-defined description of a location, at the level of granularity they care about. Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. Not typically used in automated geolocation. | keyword |
+| destination.geo.region_iso_code | Region ISO code. | keyword |
+| destination.geo.region_name | Region name. | keyword |
+| destination.ip | IP address of the destination (IPv4 or IPv6). | ip |
+| destination.port | Port of the destination. | long |
+| ecs.version | ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events. | keyword |
+| event.action | The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer. | keyword |
+| event.dataset | Event dataset | constant_keyword |
+| event.ingested | Timestamp when an event arrived in the central data store. This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event. In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` \< `event.created` \< `event.ingested`. | date |
+| event.module | Event module | constant_keyword |
+| event.outcome | This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy. `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective. Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer. Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense. | keyword |
+| gcp.destination.instance.project_id | ID of the project containing the VM. | keyword |
+| gcp.destination.instance.region | Region of the VM. | keyword |
+| gcp.destination.instance.zone | Zone of the VM. | keyword |
+| gcp.destination.vpc.project_id | ID of the project containing the VM. | keyword |
+| gcp.destination.vpc.subnetwork_name | Subnetwork on which the VM is operating. | keyword |
+| gcp.destination.vpc.vpc_name | VPC on which the VM is operating. | keyword |
+| gcp.firewall.rule_details.action | Action that the rule performs on match. | keyword |
+| gcp.firewall.rule_details.destination_range | List of destination ranges that the firewall applies to. | keyword |
+| gcp.firewall.rule_details.direction | Direction of traffic that matches this rule. | keyword |
+| gcp.firewall.rule_details.ip_port_info | List of ip protocols and applicable port ranges for rules. | array |
+| gcp.firewall.rule_details.priority | The priority for the firewall rule. | long |
+| gcp.firewall.rule_details.reference | Reference to the firewall rule. | keyword |
+| gcp.firewall.rule_details.source_range | List of source ranges that the firewall rule applies to. | keyword |
+| gcp.firewall.rule_details.source_service_account | List of all the source service accounts that the firewall rule applies to. | keyword |
+| gcp.firewall.rule_details.source_tag | List of all the source tags that the firewall rule applies to. | keyword |
+| gcp.firewall.rule_details.target_service_account | List of all the target service accounts that the firewall rule applies to. | keyword |
+| gcp.firewall.rule_details.target_tag | List of all the target tags that the firewall rule applies to. | keyword |
+| gcp.source.instance.project_id | ID of the project containing the VM. | keyword |
+| gcp.source.instance.region | Region of the VM. | keyword |
+| gcp.source.instance.zone | Zone of the VM. | keyword |
+| gcp.source.vpc.project_id | ID of the project containing the VM. | keyword |
+| gcp.source.vpc.subnetwork_name | Subnetwork on which the VM is operating. | keyword |
+| gcp.source.vpc.vpc_name | VPC on which the VM is operating. | keyword |
+| host.architecture | Operating system architecture. | keyword |
+| host.containerized | If the host is a container. | boolean |
+| host.domain | Name of the domain of which the host is a member. For example, on Windows this could be the host's Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host's LDAP provider. | keyword |
+| host.hostname | Hostname of the host. It normally contains what the `hostname` command returns on the host machine. | keyword |
+| host.id | Unique host id. As hostname is not always unique, use values that are meaningful in your environment. Example: The current usage of `beat.name`. | keyword |
+| host.ip | Host ip addresses. | ip |
+| host.mac | Host mac addresses. | keyword |
+| host.name | Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. | keyword |
+| host.os.build | OS build information. | keyword |
+| host.os.codename | OS codename, if any. | keyword |
+| host.os.family | OS family (such as redhat, debian, freebsd, windows). | keyword |
+| host.os.kernel | Operating system kernel version as a raw string. | keyword |
+| host.os.name | Operating system name, without the version. | keyword |
+| host.os.platform | Operating system platform (such centos, ubuntu, windows). | keyword |
+| host.os.version | Operating system version as a raw string. | keyword |
+| host.type | Type of host. For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. | keyword |
+| input.type | Input type | keyword |
+| log.file.path | Full path to the log file this event came from, including the file name. It should include the drive letter, when appropriate. If the event wasn't read from a log file, do not populate this field. | keyword |
+| log.logger | The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name. | keyword |
+| log.offset | Log offset | long |
+| message | For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message. | match_only_text |
+| network.community_id | A hash of source and destination IPs and ports, as well as the protocol used in a communication. This is a tool-agnostic standard to identify flows. Learn more at https://github.com/corelight/community-id-spec. | keyword |
+| network.direction | Direction of the network traffic. Recommended values are: \* ingress \* egress \* inbound \* outbound \* internal \* external \* unknown When mapping events from a host-based monitoring context, populate this field from the host's point of view, using the values "ingress" or "egress". When mapping events from a network or perimeter-based monitoring context, populate this field from the point of view of the network perimeter, using the values "inbound", "outbound", "internal" or "external". Note that "internal" is not crossing perimeter boundaries, and is meant to describe communication between two hosts within the perimeter. Note also that "external" is meant to describe traffic between two hosts that are external to the perimeter. This could for example be useful for ISPs or VPN service providers. | keyword |
+| network.iana_number | IANA Protocol Number (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). Standardized list of protocols. This aligns well with NetFlow and sFlow related logs which use the IANA Protocol Number. | keyword |
+| network.name | Name given by operators to sections of their network. | keyword |
+| network.transport | Same as network.iana_number, but instead using the Keyword name of the transport layer (udp, tcp, ipv6-icmp, etc.) The field value must be normalized to lowercase for querying. | keyword |
+| network.type | In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc The field value must be normalized to lowercase for querying. | keyword |
+| related.hash | All the hashes seen on your event. Populating this field, then using it to search for hashes can help in situations where you're unsure what the hash algorithm is (and therefore which key name to search). | keyword |
+| related.hosts | All hostnames or other host identifiers seen on your event. Example identifiers include FQDNs, domain names, workstation names, or aliases. | keyword |
+| related.ip | All of the IPs seen on your event. | ip |
+| related.user | All the user names or other user identifiers seen on the event. | keyword |
+| rule.name | The name of the rule or signature generating the event. | keyword |
+| source.address | Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| source.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| source.as.organization.name | Organization name. | keyword |
+| source.domain | The domain name of the source system. This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment. | keyword |
+| source.geo.city_name | City name. | keyword |
+| source.geo.continent_name | Name of the continent. | keyword |
+| source.geo.country_iso_code | Country ISO code. | keyword |
+| source.geo.country_name | Country name. | keyword |
+| source.geo.location | Longitude and latitude. | geo_point |
+| source.geo.name | User-defined description of a location, at the level of granularity they care about. Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. Not typically used in automated geolocation. | keyword |
+| source.geo.region_iso_code | Region ISO code. | keyword |
+| source.geo.region_name | Region name. | keyword |
+| source.ip | IP address of the source (IPv4 or IPv6). | ip |
+| source.port | Port of the source. | long |
+| tags | List of keywords used to tag each event. | keyword |
+
+
+### VPC Flow
+
+This is the `VPC Flow` dataset.
+
+An example event for `vpcflow` looks as following:
+
+```json
+{
+ "@timestamp": "2019-06-14T03:50:10.845Z",
+ "agent": {
+ "ephemeral_id": "e58d02a0-e7a0-45c0-aba6-a8c983782744",
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "data_stream": {
+ "dataset": "gcp.vpcflow",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "destination": {
+ "address": "67.43.156.13",
+ "as": {
+ "number": 35908
+ },
+ "geo": {
+ "continent_name": "Asia",
+ "country_iso_code": "BT",
+ "country_name": "Bhutan",
+ "location": {
+ "lat": 27.5,
+ "lon": 90.5
+ }
+ },
+ "ip": "67.43.156.13",
+ "port": 33478
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "c53ddea2-61ac-4643-8676-0c70ebf51c91",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "agent_id_status": "verified",
+ "category": "network",
+ "created": "2021-12-31T03:12:25.823Z",
+ "dataset": "gcp.vpcflow",
+ "end": "2019-06-14T03:45:37.301953198Z",
+ "id": "ut8lbrffooxyw",
+ "ingested": "2021-12-31T03:12:26Z",
+ "kind": "event",
+ "start": "2019-06-14T03:45:37.186193305Z",
+ "type": "connection"
+ },
+ "gcp": {
+ "source": {
+ "instance": {
+ "project_id": "my-sample-project",
+ "region": "us-east1",
+ "zone": "us-east1-b"
+ },
+ "vpc": {
+ "project_id": "my-sample-project",
+ "subnetwork_name": "default",
+ "vpc_name": "default"
+ }
+ },
+ "vpcflow": {
+ "reporter": "SRC",
+ "rtt": {
+ "ms": 36
+ }
+ }
+ },
+ "input": {
+ "type": "gcp-pubsub"
+ },
+ "log": {
+ "logger": "projects/my-sample-project/logs/compute.googleapis.com%2Fvpc_flows"
+ },
+ "network": {
+ "bytes": 1776,
+ "community_id": "1:Wa+aonxAQZ59AWtNdQD0CH6FnsM=",
+ "direction": "outbound",
+ "iana_number": "6",
+ "packets": 7,
+ "transport": "tcp",
+ "type": "ipv4"
+ },
+ "related": {
+ "ip": [
+ "10.87.40.76",
+ "67.43.156.13"
+ ]
+ },
+ "source": {
+ "address": "10.87.40.76",
+ "bytes": 1776,
+ "domain": "kibana",
+ "ip": "10.87.40.76",
+ "packets": 7,
+ "port": 5601
+ },
+ "tags": [
+ "forwarded",
+ "gcp-vpcflow"
+ ]
+}
+```
+
+**Exported fields**
+
+| Field | Description | Type |
+|---|---|---|
+| @timestamp | Event timestamp. | date |
+| cloud.account.id | The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier. | keyword |
+| cloud.availability_zone | Availability zone in which this host is running. | keyword |
+| cloud.image.id | Image ID for the cloud instance. | keyword |
+| cloud.instance.id | Instance ID of the host machine. | keyword |
+| cloud.instance.name | Instance name of the host machine. | keyword |
+| cloud.machine.type | Machine type of the host machine. | keyword |
+| cloud.project.id | Name of the project in Google Cloud. | keyword |
+| cloud.provider | Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean. | keyword |
+| cloud.region | Region in which this host is running. | keyword |
+| container.id | Unique container id. | keyword |
+| container.image.name | Name of the image the container was built on. | keyword |
+| container.labels | Image labels. | object |
+| container.name | Container name. | keyword |
+| container.runtime | Runtime managing this container. | keyword |
+| data_stream.dataset | Data stream dataset. | constant_keyword |
+| data_stream.namespace | Data stream namespace. | constant_keyword |
+| data_stream.type | Data stream type. | constant_keyword |
+| destination.address | Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| destination.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| destination.as.organization.name | Organization name. | keyword |
+| destination.domain | The domain name of the destination system. This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment. | keyword |
+| destination.geo.city_name | City name. | keyword |
+| destination.geo.continent_name | Name of the continent. | keyword |
+| destination.geo.country_iso_code | Country ISO code. | keyword |
+| destination.geo.country_name | Country name. | keyword |
+| destination.geo.location | Longitude and latitude. | geo_point |
+| destination.geo.name | User-defined description of a location, at the level of granularity they care about. Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. Not typically used in automated geolocation. | keyword |
+| destination.geo.region_iso_code | Region ISO code. | keyword |
+| destination.geo.region_name | Region name. | keyword |
+| destination.ip | IP address of the destination (IPv4 or IPv6). | ip |
+| destination.port | Port of the destination. | long |
+| ecs.version | ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events. | keyword |
+| event.action | The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer. | keyword |
+| event.dataset | Event dataset | constant_keyword |
+| event.ingested | Timestamp when an event arrived in the central data store. This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event. In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` \< `event.created` \< `event.ingested`. | date |
+| event.module | Event module | constant_keyword |
+| event.outcome | This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy. `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective. Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer. Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense. | keyword |
+| gcp.destination.instance.project_id | ID of the project containing the VM. | keyword |
+| gcp.destination.instance.region | Region of the VM. | keyword |
+| gcp.destination.instance.zone | Zone of the VM. | keyword |
+| gcp.destination.vpc.project_id | ID of the project containing the VM. | keyword |
+| gcp.destination.vpc.subnetwork_name | Subnetwork on which the VM is operating. | keyword |
+| gcp.destination.vpc.vpc_name | VPC on which the VM is operating. | keyword |
+| gcp.source.instance.project_id | ID of the project containing the VM. | keyword |
+| gcp.source.instance.region | Region of the VM. | keyword |
+| gcp.source.instance.zone | Zone of the VM. | keyword |
+| gcp.source.vpc.project_id | ID of the project containing the VM. | keyword |
+| gcp.source.vpc.subnetwork_name | Subnetwork on which the VM is operating. | keyword |
+| gcp.source.vpc.vpc_name | VPC on which the VM is operating. | keyword |
+| gcp.vpcflow.reporter | The side which reported the flow. Can be either 'SRC' or 'DEST'. | keyword |
+| gcp.vpcflow.rtt.ms | Latency as measured (for TCP flows only) during the time interval. This is the time elapsed between sending a SEQ and receiving a corresponding ACK and it contains the network RTT as well as the application related delay. | long |
+| host.architecture | Operating system architecture. | keyword |
+| host.containerized | If the host is a container. | boolean |
+| host.domain | Name of the domain of which the host is a member. For example, on Windows this could be the host's Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host's LDAP provider. | keyword |
+| host.hostname | Hostname of the host. It normally contains what the `hostname` command returns on the host machine. | keyword |
+| host.id | Unique host id. As hostname is not always unique, use values that are meaningful in your environment. Example: The current usage of `beat.name`. | keyword |
+| host.ip | Host ip addresses. | ip |
+| host.mac | Host mac addresses. | keyword |
+| host.name | Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. | keyword |
+| host.os.build | OS build information. | keyword |
+| host.os.codename | OS codename, if any. | keyword |
+| host.os.family | OS family (such as redhat, debian, freebsd, windows). | keyword |
+| host.os.kernel | Operating system kernel version as a raw string. | keyword |
+| host.os.name | Operating system name, without the version. | keyword |
+| host.os.platform | Operating system platform (such centos, ubuntu, windows). | keyword |
+| host.os.version | Operating system version as a raw string. | keyword |
+| host.type | Type of host. For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. | keyword |
+| input.type | Input type | keyword |
+| log.file.path | Full path to the log file this event came from, including the file name. It should include the drive letter, when appropriate. If the event wasn't read from a log file, do not populate this field. | keyword |
+| log.logger | The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name. | keyword |
+| log.offset | Log offset | long |
+| message | For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message. | match_only_text |
+| network.bytes | Total bytes transferred in both directions. If `source.bytes` and `destination.bytes` are known, `network.bytes` is their sum. | long |
+| network.community_id | A hash of source and destination IPs and ports, as well as the protocol used in a communication. This is a tool-agnostic standard to identify flows. Learn more at https://github.com/corelight/community-id-spec. | keyword |
+| network.direction | Direction of the network traffic. Recommended values are: \* ingress \* egress \* inbound \* outbound \* internal \* external \* unknown When mapping events from a host-based monitoring context, populate this field from the host's point of view, using the values "ingress" or "egress". When mapping events from a network or perimeter-based monitoring context, populate this field from the point of view of the network perimeter, using the values "inbound", "outbound", "internal" or "external". Note that "internal" is not crossing perimeter boundaries, and is meant to describe communication between two hosts within the perimeter. Note also that "external" is meant to describe traffic between two hosts that are external to the perimeter. This could for example be useful for ISPs or VPN service providers. | keyword |
+| network.iana_number | IANA Protocol Number (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). Standardized list of protocols. This aligns well with NetFlow and sFlow related logs which use the IANA Protocol Number. | keyword |
+| network.name | Name given by operators to sections of their network. | keyword |
+| network.packets | Total packets transferred in both directions. If `source.packets` and `destination.packets` are known, `network.packets` is their sum. | long |
+| network.transport | Same as network.iana_number, but instead using the Keyword name of the transport layer (udp, tcp, ipv6-icmp, etc.) The field value must be normalized to lowercase for querying. | keyword |
+| network.type | In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc The field value must be normalized to lowercase for querying. | keyword |
+| related.hash | All the hashes seen on your event. Populating this field, then using it to search for hashes can help in situations where you're unsure what the hash algorithm is (and therefore which key name to search). | keyword |
+| related.hosts | All hostnames or other host identifiers seen on your event. Example identifiers include FQDNs, domain names, workstation names, or aliases. | keyword |
+| related.ip | All of the IPs seen on your event. | ip |
+| related.user | All the user names or other user identifiers seen on the event. | keyword |
+| rule.name | The name of the rule or signature generating the event. | keyword |
+| source.address | Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| source.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| source.as.organization.name | Organization name. | keyword |
+| source.bytes | Bytes sent from the source to the destination. | long |
+| source.domain | The domain name of the source system. This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment. | keyword |
+| source.geo.city_name | City name. | keyword |
+| source.geo.continent_name | Name of the continent. | keyword |
+| source.geo.country_iso_code | Country ISO code. | keyword |
+| source.geo.country_name | Country name. | keyword |
+| source.geo.location | Longitude and latitude. | geo_point |
+| source.geo.name | User-defined description of a location, at the level of granularity they care about. Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. Not typically used in automated geolocation. | keyword |
+| source.geo.region_iso_code | Region ISO code. | keyword |
+| source.geo.region_name | Region name. | keyword |
+| source.ip | IP address of the source (IPv4 or IPv6). | ip |
+| source.packets | Packets sent from the source to the destination. | long |
+| source.port | Port of the source. | long |
+| tags | List of keywords used to tag each event. | keyword |
+
+
+### DNS
+
+This is the `DNS` dataset.
+
+An example event for `dns` looks as following:
+
+```json
+{
+ "@timestamp": "2022-01-23T09:16:05.341Z",
+ "cloud": {
+ "availability_zone": "europe-west2-a",
+ "instance": {
+ "id": "8340998530665147",
+ "name": "instance"
+ },
+ "project": {
+ "id": "project"
+ },
+ "region": "europe-west2"
+ },
+ "dns": {
+ "answers": [
+ {
+ "class": "IN",
+ "data": "127.0.0.1",
+ "name": "elastic.co",
+ "ttl": "300",
+ "type": "A"
+ }
+ ],
+ "question": {
+ "name": "elastic.co",
+ "registered_domain": "elastic.co",
+ "top_level_domain": "co",
+ "type": "A"
+ },
+ "resolved_ip": [
+ "127.0.0.1"
+ ],
+ "response_code": "NOERROR"
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "event": {
+ "id": "vwroyze8pg7y",
+ "kind": "event",
+ "outcome": "success",
+ "original": "{\"insertId\":\"vwroyze8pg7y\",\"jsonPayload\":{\"authAnswer\":true,\"protocol\":\"UDP\",\"queryName\":\"elastic.co.\",\"queryType\":\"A\",\"rdata\":\"elastic.co.\\t300\\tIN\\ta\\t127.0.0.1\",\"responseCode\":\"NOERROR\",\"serverLatency\":14,\"sourceIP\":\"10.154.0.3\",\"sourceNetwork\":\"default\",\"vmInstanceId\":8340998530665147,\"vmInstanceIdString\":\"8340998530665147\",\"vmInstanceName\":\"694119234537.instance\",\"vmProjectId\":\"project\",\"vmZoneName\":\"europe-west2-a\"},\"logName\":\"projects/project/logs/dns.googleapis.com%2Fdns_queries\",\"receiveTimestamp\":\"2022-01-23T09:16:05.502805637Z\",\"resource\":{\"labels\":{\"location\":\"europe-west2\",\"project_id\":\"project\",\"source_type\":\"gce-vm\",\"target_name\":\"\",\"target_type\":\"external\"},\"type\":\"dns_query\"},\"severity\":\"INFO\",\"timestamp\":\"2022-01-23T09:16:05.341873447Z\"}"
+ },
+ "gcp": {
+ "dns": {
+ "auth_answer": true,
+ "protocol": "UDP",
+ "query_name": "elastic.co.",
+ "query_type": "A",
+ "rdata": "elastic.co.\t300\tIN\ta\t127.0.0.1",
+ "response_code": "NOERROR",
+ "server_latency": 14,
+ "source_ip": "10.154.0.3",
+ "source_network": "default",
+ "vm_instance_id": "8340998530665147",
+ "vm_instance_name": "694119234537.instance",
+ "vm_project_id": "project",
+ "vm_zone_name": "europe-west2-a"
+ }
+ },
+ "log": {
+ "logger": "projects/project/logs/dns.googleapis.com%2Fdns_queries"
+ },
+ "network": {
+ "transport": "udp"
+ },
+ "source": {
+ "address": "10.154.0.3",
+ "ip": "10.154.0.3"
+ },
+ "tags": [
+ "preserve_original_event"
+ ]
+}
+```
+
+**Exported fields**
+
+| Field | Description | Type |
+|---|---|---|
+| @timestamp | Event timestamp. | date |
+| cloud.account.id | The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier. | keyword |
+| cloud.availability_zone | Availability zone in which this host is running. | keyword |
+| cloud.image.id | Image ID for the cloud instance. | keyword |
+| cloud.instance.id | Instance ID of the host machine. | keyword |
+| cloud.instance.name | Instance name of the host machine. | keyword |
+| cloud.machine.type | Machine type of the host machine. | keyword |
+| cloud.project.id | Name of the project in Google Cloud. | keyword |
+| cloud.provider | Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean. | keyword |
+| cloud.region | Region in which this host is running. | keyword |
+| container.id | Unique container id. | keyword |
+| container.image.name | Name of the image the container was built on. | keyword |
+| container.labels | Image labels. | object |
+| container.name | Container name. | keyword |
+| data_stream.dataset | Data stream dataset. | constant_keyword |
+| data_stream.namespace | Data stream namespace. | constant_keyword |
+| data_stream.type | Data stream type. | constant_keyword |
+| destination.address | Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| destination.ip | IP address of the destination (IPv4 or IPv6). | ip |
+| dns.answers | An array containing an object for each answer section returned by the server. The main keys that should be present in these objects are defined by ECS. Records that have more information may contain more keys than what ECS defines. Not all DNS data sources give all details about DNS answers. At minimum, answer objects must contain the `data` key. If more information is available, map as much of it to ECS as possible, and add any additional fields to the answer objects as custom fields. | object |
+| dns.answers.class | The class of DNS data contained in this resource record. | keyword |
+| dns.answers.data | The data describing the resource. The meaning of this data depends on the type and class of the resource record. | keyword |
+| dns.answers.name | The domain name to which this resource record pertains. If a chain of CNAME is being resolved, each answer's `name` should be the one that corresponds with the answer's `data`. It should not simply be the original `question.name` repeated. | keyword |
+| dns.answers.ttl | The time interval in seconds that this resource record may be cached before it should be discarded. Zero values mean that the data should not be cached. | long |
+| dns.answers.type | The type of data contained in this resource record. | keyword |
+| dns.question.name | The name being queried. If the name field contains non-printable characters (below 32 or above 126), those characters should be represented as escaped base 10 integers (\DDD). Back slashes and quotes should be escaped. Tabs, carriage returns, and line feeds should be converted to \t, \r, and \n respectively. | keyword |
+| dns.question.registered_domain | The highest registered domain, stripped of the subdomain. For example, the registered domain for "foo.example.com" is "example.com". This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk". | keyword |
+| dns.question.subdomain | The subdomain is all of the labels under the registered_domain. If the domain has multiple levels of subdomain, such as "sub2.sub1.example.com", the subdomain field should contain "sub2.sub1", with no trailing period. | keyword |
+| dns.question.top_level_domain | The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com". This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk". | keyword |
+| dns.question.type | The type of record being queried. | keyword |
+| dns.resolved_ip | Array containing all IPs seen in `answers.data`. The `answers` array can be difficult to use, because of the variety of data formats it can contain. Extracting all IP addresses seen in there to `dns.resolved_ip` makes it possible to index them as IP addresses, and makes them easier to visualize and query for. | ip |
+| dns.response_code | The DNS response code. | keyword |
+| ecs.version | ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events. | keyword |
+| event.dataset | Event dataset | constant_keyword |
+| event.ingested | Timestamp when an event arrived in the central data store. This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event. In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` \< `event.created` \< `event.ingested`. | date |
+| event.module | Event module | constant_keyword |
+| event.outcome | This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy. `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective. Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer. Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense. | keyword |
+| gcp.dns.auth_answer | Authoritative answer. | boolean |
+| gcp.dns.destination_ip | Destination IP address, only applicable for forwarding cases. | ip |
+| gcp.dns.egress_error | Egress proxy error. | keyword |
+| gcp.dns.protocol | Protocol TCP or UDP. | keyword |
+| gcp.dns.query_name | DNS query name. | keyword |
+| gcp.dns.query_type | DNS query type. | keyword |
+| gcp.dns.rdata | DNS answer in presentation format, truncated to 260 bytes. | keyword |
+| gcp.dns.response_code | Response code. | keyword |
+| gcp.dns.server_latency | Server latency. | integer |
+| gcp.dns.source_ip | Source IP address of the query. | ip |
+| gcp.dns.source_network | Source network of the query. | keyword |
+| gcp.dns.vm_instance_id | Compute Engine VM instance ID, only applicable to queries initiated by Compute Engine VMs. | keyword |
+| gcp.dns.vm_instance_name | Compute Engine VM instance name, only applicable to queries initiated by Compute Engine VMs. | keyword |
+| gcp.dns.vm_project_id | Google Cloud project ID, only applicable to queries initiated by Compute Engine VMs. | keyword |
+| gcp.dns.vm_zone_name | Google Cloud VM zone, only applicable to queries initiated by Compute Engine VMs. | keyword |
+| host.architecture | Operating system architecture. | keyword |
+| host.containerized | If the host is a container. | boolean |
+| host.domain | Name of the domain of which the host is a member. For example, on Windows this could be the host's Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host's LDAP provider. | keyword |
+| host.hostname | Hostname of the host. It normally contains what the `hostname` command returns on the host machine. | keyword |
+| host.id | Unique host id. As hostname is not always unique, use values that are meaningful in your environment. Example: The current usage of `beat.name`. | keyword |
+| host.ip | Host ip addresses. | ip |
+| host.mac | Host mac addresses. | keyword |
+| host.name | Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. | keyword |
+| host.os.build | OS build information. | keyword |
+| host.os.codename | OS codename, if any. | keyword |
+| host.os.family | OS family (such as redhat, debian, freebsd, windows). | keyword |
+| host.os.kernel | Operating system kernel version as a raw string. | keyword |
+| host.os.name | Operating system name, without the version. | keyword |
+| host.os.platform | Operating system platform (such centos, ubuntu, windows). | keyword |
+| host.os.version | Operating system version as a raw string. | keyword |
+| host.type | Type of host. For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. | keyword |
+| input.type | Input type | keyword |
+| log.logger | The name of the logger inside an application. This is usually the name of the class which initialized the logger, or can be a custom name. | keyword |
+| log.offset | Log offset | long |
+| network.transport | Same as network.iana_number, but instead using the Keyword name of the transport layer (udp, tcp, ipv6-icmp, etc.) The field value must be normalized to lowercase for querying. | keyword |
+| source.address | Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| source.ip | IP address of the source (IPv4 or IPv6). | ip |
+| tags | List of keywords used to tag each event. | keyword |
+
diff --git a/packages/gcp/1.4.1/img/filebeat-gcp-audit.png b/packages/gcp/1.4.1/img/filebeat-gcp-audit.png
new file mode 100755
index 0000000000..4f68932e9f
Binary files /dev/null and b/packages/gcp/1.4.1/img/filebeat-gcp-audit.png differ
diff --git a/packages/gcp/1.4.1/img/logo_gcp.svg b/packages/gcp/1.4.1/img/logo_gcp.svg
new file mode 100755
index 0000000000..75e139f9b2
--- /dev/null
+++ b/packages/gcp/1.4.1/img/logo_gcp.svg
@@ -0,0 +1,19 @@
+
diff --git a/packages/gcp/1.4.1/kibana/dashboard/gcp-6576c480-73a2-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/dashboard/gcp-6576c480-73a2-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..be9430439a
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/dashboard/gcp-6576c480-73a2-11ea-a345-f985c61fe654.json
@@ -0,0 +1,59 @@
+{
+ "attributes": {
+ "description": "Overview of audit events from Google Cloud.",
+ "hits": 0,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"query\":{\"language\":\"kuery\",\"query\":\"data_stream.dataset:gcp.audit\"}}"
+ },
+ "optionsJSON": "{\"hidePanelTitles\":false,\"useMargins\":true}",
+ "panelsJSON": "[{\"embeddableConfig\":{\"enhancements\":{},\"hiddenLayers\":[],\"isLayerTOCOpen\":false,\"mapCenter\":{\"lat\":32.1625,\"lon\":-48.67493,\"zoom\":1.97},\"openTOCDetails\":[]},\"gridData\":{\"h\":15,\"i\":\"a808a985-5cf3-463a-9aad-5159cb64cef1\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"a808a985-5cf3-463a-9aad-5159cb64cef1\",\"panelRefName\":\"panel_0\",\"version\":\"8.0.0-SNAPSHOT\"},{\"embeddableConfig\":{\"enhancements\":{}},\"gridData\":{\"h\":15,\"i\":\"9e7025b6-c3bf-424f-b541-d22d00e1fa64\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"9e7025b6-c3bf-424f-b541-d22d00e1fa64\",\"panelRefName\":\"panel_1\",\"version\":\"8.0.0-SNAPSHOT\"},{\"embeddableConfig\":{\"enhancements\":{}},\"gridData\":{\"h\":14,\"i\":\"5b6a8479-2c18-495e-88fa-9e3239277e3d\",\"w\":12,\"x\":0,\"y\":15},\"panelIndex\":\"5b6a8479-2c18-495e-88fa-9e3239277e3d\",\"panelRefName\":\"panel_2\",\"version\":\"8.0.0-SNAPSHOT\"},{\"embeddableConfig\":{\"enhancements\":{}},\"gridData\":{\"h\":14,\"i\":\"46da4e61-e0bb-4595-a2c7-05210bfbea64\",\"w\":12,\"x\":12,\"y\":15},\"panelIndex\":\"46da4e61-e0bb-4595-a2c7-05210bfbea64\",\"panelRefName\":\"panel_3\",\"version\":\"8.0.0-SNAPSHOT\"},{\"embeddableConfig\":{\"enhancements\":{}},\"gridData\":{\"h\":14,\"i\":\"4d698f07-2caf-45c0-bd48-51ea72ea79b0\",\"w\":12,\"x\":24,\"y\":15},\"panelIndex\":\"4d698f07-2caf-45c0-bd48-51ea72ea79b0\",\"panelRefName\":\"panel_4\",\"version\":\"8.0.0-SNAPSHOT\"},{\"embeddableConfig\":{\"enhancements\":{}},\"gridData\":{\"h\":14,\"i\":\"c5e31da0-d4c8-4554-ab32-61da2495ab6c\",\"w\":12,\"x\":36,\"y\":15},\"panelIndex\":\"c5e31da0-d4c8-4554-ab32-61da2495ab6c\",\"panelRefName\":\"panel_5\",\"version\":\"8.0.0-SNAPSHOT\"},{\"embeddableConfig\":{\"enhancements\":{}},\"gridData\":{\"h\":9,\"i\":\"95ebbda8-9b00-4b23-b116-72569ea031e3\",\"w\":48,\"x\":0,\"y\":29},\"panelIndex\":\"95ebbda8-9b00-4b23-b116-72569ea031e3\",\"panelRefName\":\"panel_6\",\"version\":\"8.0.0-SNAPSHOT\"}]",
+ "timeRestore": false,
+ "title": "[Logs GCP] Audit",
+ "version": 1
+ },
+ "id": "gcp-6576c480-73a2-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "dashboard": "7.11.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "gcp-a97de660-73a5-11ea-a345-f985c61fe654",
+ "name": "panel_0",
+ "type": "map"
+ },
+ {
+ "id": "gcp-4627efa0-73a2-11ea-a345-f985c61fe654",
+ "name": "panel_1",
+ "type": "visualization"
+ },
+ {
+ "id": "gcp-eb5bf570-73a2-11ea-a345-f985c61fe654",
+ "name": "panel_2",
+ "type": "visualization"
+ },
+ {
+ "id": "gcp-33ee1320-73a5-11ea-a345-f985c61fe654",
+ "name": "panel_3",
+ "type": "visualization"
+ },
+ {
+ "id": "gcp-a8e40240-73a3-11ea-a345-f985c61fe654",
+ "name": "panel_4",
+ "type": "visualization"
+ },
+ {
+ "id": "gcp-6d90d320-73a4-11ea-a345-f985c61fe654",
+ "name": "panel_5",
+ "type": "visualization"
+ },
+ {
+ "id": "gcp-d88364c0-73a1-11ea-a345-f985c61fe654",
+ "name": "panel_6",
+ "type": "search"
+ }
+ ],
+ "type": "dashboard"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/kibana/map/gcp-a97de660-73a5-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/map/gcp-a97de660-73a5-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..c3709277c6
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/map/gcp-a97de660-73a5-11ea-a345-f985c61fe654.json
@@ -0,0 +1,24 @@
+{
+ "attributes": {
+ "description": "",
+ "layerListJSON": "[{\"alpha\":1,\"id\":\"866b5ce1-6ca0-47db-a6f2-54c5e0dcd2f0\",\"label\":null,\"maxZoom\":24,\"minZoom\":0,\"sourceDescriptor\":{\"isAutoSelect\":true,\"type\":\"EMS_TMS\"},\"style\":{},\"type\":\"VECTOR_TILE\",\"visible\":true},{\"alpha\":0.75,\"id\":\"279da950-e9a7-4287-ab37-25906e448455\",\"joins\":[],\"label\":\"Source Locations\",\"maxZoom\":24,\"minZoom\":0,\"query\":{\"language\":\"kuery\",\"query\":\"data_stream.dataset:gcp.audit\"},\"sourceDescriptor\":{\"applyGlobalQuery\":true,\"filterByMapBounds\":true,\"geoField\":\"source.geo.location\",\"id\":\"79ec6461-7561-45e4-a6a2-9d6fbd4cf986\",\"indexPatternRefName\":\"layer_1_source_index_pattern\",\"scalingType\":\"LIMIT\",\"sortField\":\"\",\"sortOrder\":\"desc\",\"tooltipProperties\":[],\"topHitsSize\":1,\"type\":\"ES_SEARCH\"},\"style\":{\"isTimeAware\":true,\"properties\":{\"fillColor\":{\"options\":{\"color\":\"#54B399\"},\"type\":\"STATIC\"},\"icon\":{\"options\":{\"value\":\"marker\"},\"type\":\"STATIC\"},\"iconOrientation\":{\"options\":{\"orientation\":0},\"type\":\"STATIC\"},\"iconSize\":{\"options\":{\"size\":6},\"type\":\"STATIC\"},\"labelBorderColor\":{\"options\":{\"color\":\"#FFFFFF\"},\"type\":\"STATIC\"},\"labelBorderSize\":{\"options\":{\"size\":\"SMALL\"}},\"labelColor\":{\"options\":{\"color\":\"#000000\"},\"type\":\"STATIC\"},\"labelSize\":{\"options\":{\"size\":14},\"type\":\"STATIC\"},\"labelText\":{\"options\":{\"value\":\"\"},\"type\":\"STATIC\"},\"lineColor\":{\"options\":{\"color\":\"#41937c\"},\"type\":\"STATIC\"},\"lineWidth\":{\"options\":{\"size\":1},\"type\":\"STATIC\"},\"symbolizeAs\":{\"options\":{\"value\":\"circle\"}}},\"type\":\"VECTOR\"},\"type\":\"VECTOR\",\"visible\":true}]",
+ "mapStateJSON": "{\"center\":{\"lat\":19.94277,\"lon\":0},\"filters\":[],\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"refreshConfig\":{\"interval\":0,\"isPaused\":false},\"settings\":{\"autoFitToDataBounds\":false},\"timeFilters\":{\"from\":\"now-7d\",\"to\":\"now\"},\"zoom\":1.97}",
+ "title": "Audit Source Locations [Logs GCP]",
+ "uiStateJSON": "{\"isLayerTOCOpen\":true,\"openTOCDetails\":[]}"
+ },
+ "id": "gcp-a97de660-73a5-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "map": "7.10.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "logs-*",
+ "name": "layer_1_source_index_pattern",
+ "type": "index-pattern"
+ }
+ ],
+ "type": "map"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/kibana/search/gcp-d88364c0-73a1-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/search/gcp-d88364c0-73a1-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..e1a7679578
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/search/gcp-d88364c0-73a1-11ea-a345-f985c61fe654.json
@@ -0,0 +1,41 @@
+{
+ "attributes": {
+ "columns": [
+ "user.email",
+ "service.name",
+ "gcp.audit.type",
+ "event.action",
+ "event.outcome",
+ "source.ip",
+ "source.geo.region_name"
+ ],
+ "description": "",
+ "hits": 0,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\",\"key\":\"data_stream.dataset\",\"negate\":false,\"params\":{\"query\":\"gcp.audit\"},\"type\":\"phrase\"},\"query\":{\"match_phrase\":{\"data_stream.dataset\":\"gcp.audit\"}}}],\"highlightAll\":true,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"version\":true}"
+ },
+ "sort": [],
+ "title": "Audit [Logs GCP]",
+ "version": 1
+ },
+ "id": "gcp-d88364c0-73a1-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "search": "7.9.3"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
+ "type": "index-pattern"
+ },
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index",
+ "type": "index-pattern"
+ }
+ ],
+ "type": "search"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/kibana/visualization/gcp-33ee1320-73a5-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/visualization/gcp-33ee1320-73a5-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..2bb80adfad
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/visualization/gcp-33ee1320-73a5-11ea-a345-f985c61fe654.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"query\":{\"language\":\"kuery\",\"query\":\"\"}}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Audit Top User Email [Logs GCP]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"user.email\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":15},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"maxFontSize\":72,\"minFontSize\":18,\"orientation\":\"single\",\"scale\":\"linear\",\"showLabel\":true},\"title\":\"Audit Top User Email [Logs GCP]\",\"type\":\"tagcloud\"}"
+ },
+ "id": "gcp-33ee1320-73a5-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "gcp-d88364c0-73a1-11ea-a345-f985c61fe654",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/kibana/visualization/gcp-4627efa0-73a2-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/visualization/gcp-4627efa0-73a2-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..181dcb280b
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/visualization/gcp-4627efa0-73a2-11ea-a345-f985c61fe654.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"query\":{\"language\":\"kuery\",\"query\":\"\"}}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Audit Events Outcome over time [Logs GCP]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"drop_partials\":false,\"extended_bounds\":{},\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1,\"scaleMetricValues\":false,\"timeRange\":{\"from\":\"now-7d\",\"to\":\"now\"},\"useNormalizedEsInterval\":true},\"schema\":\"segment\",\"type\":\"date_histogram\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"field\":\"event.outcome\",\"missingBucket\":true,\"missingBucketLabel\":\"[unknown]\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":5},\"schema\":\"group\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":true,\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false},\"labels\":{\"show\":false},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"mode\":\"stacked\",\"show\":true,\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"thresholdLine\":{\"color\":\"#E7664C\",\"show\":false,\"style\":\"full\",\"value\":10,\"width\":1},\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"title\":\"Audit Event Outcome over time [Logs GCP]\",\"type\":\"histogram\"}"
+ },
+ "id": "gcp-4627efa0-73a2-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "gcp-d88364c0-73a1-11ea-a345-f985c61fe654",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/kibana/visualization/gcp-6d90d320-73a4-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/visualization/gcp-6d90d320-73a4-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..55d894cb52
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/visualization/gcp-6d90d320-73a4-11ea-a345-f985c61fe654.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"query\":{\"language\":\"kuery\",\"query\":\"\"}}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Audit Resource Name [Logs GCP]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"gcp.audit.resource_name\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":20},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTooltip\":true,\"isDonut\":true,\"labels\":{\"last_level\":true,\"show\":false,\"truncate\":100,\"values\":true},\"legendPosition\":\"right\",\"type\":\"pie\"},\"title\":\"Audit Resource Name [Logs GCP]\",\"type\":\"pie\"}"
+ },
+ "id": "gcp-6d90d320-73a4-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "gcp-d88364c0-73a1-11ea-a345-f985c61fe654",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/kibana/visualization/gcp-a8e40240-73a3-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/visualization/gcp-a8e40240-73a3-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..1fb78e641e
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/visualization/gcp-a8e40240-73a3-11ea-a345-f985c61fe654.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"query\":{\"language\":\"kuery\",\"query\":\"\"}}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Audit User Agent [Logs GCP]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"user_agent.name\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":20},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTooltip\":true,\"isDonut\":true,\"labels\":{\"last_level\":true,\"show\":false,\"truncate\":100,\"values\":true},\"legendPosition\":\"right\",\"type\":\"pie\"},\"title\":\"Audit User Agent [Logs GCP]\",\"type\":\"pie\"}"
+ },
+ "id": "gcp-a8e40240-73a3-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "gcp-d88364c0-73a1-11ea-a345-f985c61fe654",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/kibana/visualization/gcp-eb5bf570-73a2-11ea-a345-f985c61fe654.json b/packages/gcp/1.4.1/kibana/visualization/gcp-eb5bf570-73a2-11ea-a345-f985c61fe654.json
new file mode 100755
index 0000000000..00dddace37
--- /dev/null
+++ b/packages/gcp/1.4.1/kibana/visualization/gcp-eb5bf570-73a2-11ea-a345-f985c61fe654.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"query\":{\"language\":\"kuery\",\"query\":\"\"}}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Audit Event Action [Logs GCP]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"event.action\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":20},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTooltip\":true,\"isDonut\":true,\"labels\":{\"last_level\":true,\"show\":false,\"truncate\":100,\"values\":true},\"legendPosition\":\"right\",\"type\":\"pie\"},\"title\":\"Audit Event Action [Logs GCP]\",\"type\":\"pie\"}"
+ },
+ "id": "gcp-eb5bf570-73a2-11ea-a345-f985c61fe654",
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "gcp-d88364c0-73a1-11ea-a345-f985c61fe654",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/gcp/1.4.1/manifest.yml b/packages/gcp/1.4.1/manifest.yml
new file mode 100755
index 0000000000..058fbd056b
--- /dev/null
+++ b/packages/gcp/1.4.1/manifest.yml
@@ -0,0 +1,61 @@
+name: gcp
+title: Google Cloud Platform
+version: 1.4.1
+release: ga
+description: Collect logs from Google Cloud Platform with Elastic Agent.
+type: integration
+icons:
+ - src: /img/logo_gcp.svg
+ title: logo gcp
+ size: 32x32
+ type: image/svg+xml
+format_version: 1.0.0
+license: basic
+categories:
+ - google_cloud
+ - cloud
+ - network
+ - security
+conditions:
+ kibana.version: ^7.16.3 || ^8.0.0
+screenshots:
+ - src: /img/filebeat-gcp-audit.png
+ title: filebeat gcp audit
+ size: 1702x996
+ type: image/png
+policy_templates:
+ - name: gcp
+ title: Google Cloud Platform (GCP) logs
+ description: Collect logs from Google Cloud Platform (GCP) instances
+ inputs:
+ - type: gcp-pubsub
+ vars:
+ - name: alternative_host
+ type: text
+ title: Alternative host
+ multi: false
+ required: false
+ show_user: false
+ - name: project_id
+ type: text
+ title: Project Id
+ multi: false
+ required: true
+ show_user: true
+ default: SET_PROJECT_NAME
+ - name: credentials_file
+ type: text
+ title: Credentials File
+ multi: false
+ required: false
+ show_user: true
+ - name: credentials_json
+ type: text
+ title: Credentials Json
+ multi: false
+ required: false
+ show_user: true
+ title: "Collect Google Cloud Platform (GCP) audit, firewall and vpcflow logs (input: gcp-pubsub)"
+ description: "Collecting audit, firewall and vpcflow logs from Google Cloud Platform (GCP) instances (input: gcp-pubsub)"
+owner:
+ github: elastic/security-external-integrations
diff --git a/packages/o365/1.4.1/changelog.yml b/packages/o365/1.4.1/changelog.yml
new file mode 100755
index 0000000000..e92e2b4f07
--- /dev/null
+++ b/packages/o365/1.4.1/changelog.yml
@@ -0,0 +1,132 @@
+# newer versions go on top
+- version: "1.4.1"
+ changes:
+ - description: Fix grok parsing errors due to invalid IP addresses.
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2669
+- version: "1.4.0"
+ changes:
+ - description: Update to ECS 8.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/2427
+- version: "1.3.2"
+ changes:
+ - description: Regenerate test files using the new GeoIP database
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2339
+- version: "1.3.1"
+ changes:
+ - description: Change test public IPs to the supported subset
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2327
+- version: "1.3.0"
+ changes:
+ - description: Add 8.0.0 version constraint
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/2252
+- version: "1.2.4"
+ changes:
+ - description: Uniform with guidelines
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/2096
+- version: "1.2.3"
+ changes:
+ - description: Fix processors configuration
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2113
+- version: "1.2.2"
+ changes:
+ - description: Update Title and Description.
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1976
+- version: "1.2.1"
+ changes:
+ - description: Fix logic that checks for the 'forwarded' tag
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/1837
+- version: "1.2.0"
+ changes:
+ - description: Update to ECS 1.12.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1670
+- version: "1.1.4"
+ changes:
+ - description: additional type assertions in painless scripts
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/1642
+- version: "1.1.3"
+ changes:
+ - description: Convert to generated ECS fields
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1493
+- version: '1.1.2'
+ changes:
+ - description: update to ECS 1.11.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1402
+- version: "1.1.1"
+ changes:
+ - description: Escape special characters in docs
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1405
+- version: "1.1.0"
+ changes:
+ - description: Update integration description
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1364
+- version: "1.0.0"
+ changes:
+ - description: make GA
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1219
+ - description: Set "event.module" and "event.dataset"
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1219
+- version: "0.6.2"
+ changes:
+ - description: Use `wildcard` field type for the relevant ECS fields.
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1180
+- version: "0.6.1"
+ changes:
+ - description: small pipeline fix for parameters when they are string instead of objects
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1136
+- version: "0.6.0"
+ changes:
+ - description: add system tests
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1119
+ - description: fixes o365audit config file
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1119
+- version: "0.5.0"
+ changes:
+ - description: update to ECS 1.10.0 and adding event.original options
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1117
+- version: "0.4.0"
+ changes:
+ - description: moving edge processing to ingest pipelines
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/983
+- version: "0.3.2"
+ changes:
+ - description: update to ECS 1.9.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/860
+- version: "0.3.1"
+ changes:
+ - description: Change kibana.version constraint to be more conservative.
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/749
+- version: "0.3.0"
+ changes:
+ - description: Add changes to use ECS 1.8 fields.
+ type: enhancement # can be one of: enhancement, bugfix, breaking-change
+ link: https://github.com/elastic/integrations/pull/716
+- version: "0.1.0"
+ changes:
+ - description: initial release
+ type: enhancement # can be one of: enhancement, bugfix, breaking-change
+ link: https://github.com/elastic/integrations/pull/230
diff --git a/packages/o365/1.4.1/data_stream/audit/agent/stream/o365audit.yml.hbs b/packages/o365/1.4.1/data_stream/audit/agent/stream/o365audit.yml.hbs
new file mode 100755
index 0000000000..8656c87842
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/agent/stream/o365audit.yml.hbs
@@ -0,0 +1,39 @@
+{{#if application_id}}application_id: {{application_id}}{{/if}}
+tenant_id:
+{{#each tenants}}
+ - "{{this}}"
+{{/each}}
+{{#if certificate}}certificate: {{certificate}}{{/if}}
+{{#if key}}key: {{key}}{{/if}}
+{{#if key_passphrase}}key_passphrase: {{key_passphrase}}{{/if}}
+{{#if client_secret}}client_secret: {{client_secret}}{{/if}}
+content_type:
+{{#each content_type}}
+ - "{{this}}"
+{{/each}}
+{{#if api}}
+api:
+ {{api}}
+{{/if}}
+tags:
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+{{#if preserve_original_event}}
+ - preserve_original_event
+api.preserve_original_event: true
+{{/if}}
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+processors:
+- add_fields:
+ target: "_conf"
+ fields:
+ tenants:
+ {{#each tenant_names}}
+ {{this}}
+ {{/each}}
+{{#if processors}}
+{{processors}}
+{{/if}}
diff --git a/packages/o365/1.4.1/data_stream/audit/elasticsearch/ingest_pipeline/default.yml b/packages/o365/1.4.1/data_stream/audit/elasticsearch/ingest_pipeline/default.yml
new file mode 100755
index 0000000000..2ad3797c4e
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/elasticsearch/ingest_pipeline/default.yml
@@ -0,0 +1,1041 @@
+---
+description: Pipeline for Office 365 Audit logs
+
+processors:
+ - set:
+ field: ecs.version
+ value: '8.0.0'
+ - set:
+ field: event.kind
+ value: event
+ - append:
+ field: event.type
+ value: info
+ - append:
+ field: event.category
+ value: web
+ # General Schema
+ - date:
+ field: o365audit.CreationTime
+ formats:
+ - ISO8601
+ - rename:
+ field: o365audit.Id
+ target_field: event.id
+ ignore_missing: true
+ - rename:
+ field: o365audit.ClientIPAddress
+ target_field: client._temp
+ ignore_missing: true
+ - rename:
+ field: o365audit.ClientIP
+ target_field: client._temp
+ ignore_missing: true
+ if: ctx.client?._temp == null
+ - rename:
+ field: o365audit.ActorIpAddress
+ target_field: client._temp
+ ignore_missing: true
+ if: ctx.client?._temp == null
+ - convert:
+ field: o365audit.UserId
+ target_field: user.id
+ type: string
+ ignore_missing: true
+ - rename:
+ field: o365audit.Workload
+ target_field: event.provider
+ ignore_missing: true
+ - rename:
+ field: o365audit.Operation
+ target_field: event.action
+ ignore_missing: true
+ - rename:
+ field: o365audit.OrganizationId
+ target_field: organization.id
+ ignore_missing: true
+ - rename:
+ field: o365audit.UserAgent
+ target_field: user_agent.original
+ ignore_missing: true
+ - script:
+ if: ctx.o365audit?.RecordType != null
+ lang: painless
+ params:
+ "1": "ExchangeAdmin"
+ "2": "ExchangeItem"
+ "3": "ExchangeItemGroup"
+ "4": "SharePoint"
+ "6": "SharePointFileOperation"
+ "8": "AzureActiveDirectory"
+ "9": "AzureActiveDirectoryAccountLogon"
+ "10": "DataCenterSecurityCmdlet"
+ "11": "ComplianceDLPSharePoint"
+ "12": "Sway"
+ "13": "ComplianceDLPExchange"
+ "14": "SharePointSharingOperation"
+ "15": "AzureActiveDirectoryStsLogon"
+ "18": "SecurityComplianceCenterEOPCmdlet"
+ "20": "PowerBIAudit"
+ "21": "CRM"
+ "22": "Yammer"
+ "23": "SkypeForBusinessCmdlets"
+ "24": "Discovery"
+ "25": "MicrosoftTeams"
+ "28": "ThreatIntelligence"
+ "30": "MicrosoftFlow"
+ "31": "AeD"
+ "32": "MicrosoftStream"
+ "33": "ComplianceDLPSharePointClassification"
+ "35": "Project"
+ "36": "SharePointListOperation"
+ "38": "DataGovernance"
+ "40": "SecurityComplianceAlerts"
+ "41": "ThreatIntelligenceUrl"
+ "42": "SecurityComplianceInsights"
+ "44": "WorkplaceAnalytics"
+ "45": "PowerAppsApp"
+ "47": "ThreatIntelligenceAtpContent"
+ "49": "TeamsHealthcare"
+ "52": "DataInsightsRestApiAudit"
+ "54": "SharePointListItemOperation"
+ "55": "SharePointContentTypeOperation"
+ "56": "SharePointFieldOperation"
+ "64": "AirInvestigation"
+ "66": "MicrosoftForms"
+ source: >
+ def schemaId = ctx.o365audit.RecordType.toString();
+ def schema = params[schemaId];
+ if (schema != null) {
+ if (ctx.event == null) {
+ ctx.event = new HashMap();
+ }
+ ctx.event.code = schema;
+ }
+ - set:
+ field: event.outcome
+ value: success
+ if: 'ctx.o365audit?.ResultStatus != null && ["succeeded", "success", "partiallysucceeded", "true"].contains(ctx.o365audit?.ResultStatus.toLowerCase())'
+ - set:
+ field: event.outcome
+ value: failure
+ if: 'ctx.o365audit?.ResultStatus != null && ["failed", "false"].contains(ctx.o365audit?.ResultStatus.toLowerCase())'
+ - set:
+ field: event.outcome
+ value: success
+ if: ctx.event?.outcome == null
+ - script:
+ lang: painless
+ if: 'ctx.o365audit?.Parameters != null && ctx.o365audit?.Parameters instanceof List'
+ source: >
+ def newparams = new HashMap();
+ def oldparams = ctx.o365audit.Parameters;
+ for (int i = 0; i < oldparams.length; ++i) {
+ if (oldparams[i]["Value"] != null) {
+ newparams[oldparams[i]["Name"]] = oldparams[i]["Value"];
+ }
+ }
+ ctx.o365audit.Parameters = newparams;
+ - rename:
+ field: o365audit.Parameters
+ target_field: o365audit.Parameters._raw
+ if: 'ctx.o365audit?.Parameters != null && ctx.o365audit?.Parameters instanceof String'
+ - script:
+ lang: painless
+ if: 'ctx.o365audit?.ExtendedProperties != null && ctx.o365audit?.ExtendedProperties instanceof List'
+ source: >
+ def newparams = new HashMap();
+ def oldparams = ctx.o365audit.ExtendedProperties;
+ for (int i = 0; i < oldparams.length; ++i) {
+ if (oldparams[i]["Value"] != null) {
+ newparams[oldparams[i]["Name"]] = oldparams[i]["Value"];
+ }
+ }
+ ctx.o365audit.ExtendedProperties = newparams;
+ - rename:
+ field: o365audit.ExtendedProperties
+ target_field: o365audit.ExtendedProperties._raw
+ if: 'ctx.o365audit?.ExtendedProperties != null && ctx.o365audit?.ExtendedProperties instanceof String'
+ - script:
+ lang: painless
+ if: 'ctx.o365audit?.ModifiedProperties != null && ctx.o365audit?.ModifiedProperties instanceof List'
+ source: >
+ def newparams = new HashMap();
+ def oldparams = ctx.o365audit.ModifiedProperties;
+ for (int i = 0; i < oldparams.length; ++i) {
+ if (oldparams[i]["OldValue"] != null && oldparams[i]["NewValue"] != null) {
+ def validname = oldparams[i]["Name"].replace(" ","_").replace(".","_");
+ newparams[validname] = new HashMap();
+ newparams[validname]["NewValue"] = oldparams[i]["NewValue"];
+ newparams[validname]["OldValue"] = oldparams[i]["OldValue"];
+ }
+ }
+ if (newparams == null) {
+ ctx.o365audit.remove("ModifiedProperties");
+ return;
+ }
+ ctx.o365audit.ModifiedProperties = newparams;
+ - rename:
+ field: o365audit.ModifiedProperties
+ target_field: o365audit.ModifiedProperties._raw
+ if: 'ctx.o365audit?.ModifiedProperties != null && ctx.o365audit?.ModifiedProperties instanceof String'
+ - script:
+ lang: painless
+ if: 'ctx.o365audit?.AlertLinks != null && ctx.o365audit?.AlertLinks instanceof List'
+ source: >
+ def list = ctx.o365audit.AlertLinks;
+ def links = new ArrayList();
+ for (int i = 0; i < list.length; ++i) {
+ if (list[i] instanceof Map && list[i].containsKey("AlertLinkHref") && list[i]["AlertLinkHref"] != null && list[i]["AlertLinkHref"] instanceof String) {
+ links.add(list[i]["AlertLinkHref"]);
+ }
+ }
+ if (links.length == 0) {
+ ctx.o365audit.remove("AlertLinks");
+ return;
+ }
+ ctx.o365audit.AlertLinks = links;
+ - set:
+ field: event.severity
+ value: 1
+ if: ctx.o365audit?.Severity == "informational"
+ - set:
+ field: event.severity
+ value: 2
+ if: ctx.o365audit?.Severity == "low"
+ - set:
+ field: event.severity
+ value: 3
+ if: ctx.o365audit?.Severity == "medium"
+ - set:
+ field: event.severity
+ value: 4
+ if: ctx.o365audit?.Severity == "high"
+ # ExchangeAdmin Schema
+ - rename:
+ field: o365audit.OrganizationName
+ target_field: organization.name
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeAdmin"
+ - rename:
+ field: o365audit.OriginatingServer
+ target_field: server._temp
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeAdmin"
+ # ExchangeItem Schema
+ - rename:
+ field: o365audit.MailboxOwnerUPN
+ target_field: user.email
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeItem"
+ - convert:
+ field: o365audit.LogonUserSid
+ target_field: user.id
+ type: string
+ ignore_missing: true
+ if: 'ctx.user?.id == null && ctx.o365audit?.LogonUserSid != null && ctx.event?.code == "ExchangeItem"'
+ - rename:
+ field: o365audit.LogonUserDisplayName
+ target_field: user.full_name
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeItem"
+ - rename:
+ field: o365audit.OrganizationName
+ target_field: organization.name
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeItem"
+ - rename:
+ field: o365audit.OriginatingServer
+ target_field: server._temp
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeItem"
+ - rename:
+ field: o365audit.ClientIPAddress
+ target_field: client._temp
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeItem"
+ - rename:
+ field: o365audit.ClientProcessName
+ target_field: process.name
+ ignore_missing: true
+ if: ctx.event?.code == "ExchangeItem"
+ # AzureActiveDirectory Schema
+ - set:
+ field: user.target.id
+ copy_from: o365audit.ObjectId
+ if: ctx.event?.code == "AzureActiveDirectory"
+ ## AzureActiveDirectory Schema new user
+ - set:
+ field: event.action
+ value: added-user-account
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "Add user."'
+ - append:
+ field: event.category
+ value: iam
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "added-user-account"'
+ - append:
+ field: event.type
+ value: user
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "added-user-account"'
+ - append:
+ field: event.type
+ value: creation
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "added-user-account"'
+ ## AzureActiveDirectory Schema update user
+ - set:
+ field: event.action
+ value: modified-user-account
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "Update user."'
+ - append:
+ field: event.category
+ value: iam
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "modified-user-account"'
+ - append:
+ field: event.type
+ value: user
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "modified-user-account"'
+ - append:
+ field: event.type
+ value: change
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "modified-user-account"'
+ ## AzureActiveDirectory Schema delete user
+ - set:
+ field: event.action
+ value: deleted-user-account
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "Delete user."'
+ - append:
+ field: event.category
+ value: iam
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "deleted-user-account"'
+ - append:
+ field: event.type
+ value: user
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "deleted-user-account"'
+ - append:
+ field: event.type
+ value: deletion
+ if: 'ctx.event?.code == "AzureActiveDirectory" && ctx.event?.action == "deleted-user-account"'
+ # AzureActiveDirectoryStsLogon Schema
+ - append:
+ field: event.category
+ value: authentication
+ if: ctx.event?.code == "AzureActiveDirectoryStsLogon"
+ - append:
+ field: event.type
+ value: start
+ if: ctx.event?.code == "AzureActiveDirectoryStsLogon"
+ - append:
+ field: event.type
+ value: "authentication_{{event.outcome}}"
+ if: 'ctx.event?.code == "AzureActiveDirectoryStsLogon" && ctx.event?.outcome != null && ctx.event?.outcome != "unknown"'
+ # SharePointFileOperation Schema
+ - rename:
+ field: o365audit.ObjectId
+ target_field: url.original
+ ignore_missing: true
+ if: ctx.event?.code == "SharePointFileOperation"
+ - rename:
+ field: o365audit.SourceRelativeUrl
+ target_field: file.directory
+ ignore_missing: true
+ if: ctx.event?.code == "SharePointFileOperation"
+ - rename:
+ field: o365audit.SourceFileName
+ target_field: file.name
+ ignore_missing: true
+ if: ctx.event?.code == "SharePointFileOperation"
+ - rename:
+ field: o365audit.SourceFileExtension
+ target_field: file.extension
+ ignore_missing: true
+ if: ctx.event?.code == "SharePointFileOperation"
+ - append:
+ field: event.category
+ value: file
+ if: 'ctx.event?.action != null && ["FileAccessed", "FileDeleted", "FileDownloaded", "FileModified", "FileMoved", "FileRenamed", "FileRestored", "FileUploaded", "FolderCopied", "FolderCreated", "FolderDeleted", "FolderModified", "FolderMoved", "FolderRenamed", "FolderRestored"].contains(ctx.event?.action)'
+ - append:
+ field: event.category
+ value: configuration
+ if: ctx.event?.action == "ComplianceSettingChanged"
+ - append:
+ field: event.type
+ value: access
+ if: 'ctx.event?.action != null && ["FileAccessed", "FileDownloaded"].contains(ctx.event?.action)'
+ - append:
+ field: event.type
+ value: change
+ if: 'ctx.event?.action != null && ["ComplianceSettingChanged", "FileModified", "FileMoved", "FileRenamed", "FileRestored", "FolderModified", "FolderMoved", "FolderRenamed", "FolderRestored"].contains(ctx.event?.action)'
+ - append:
+ field: event.type
+ value: deletion
+ if: 'ctx.event?.action != null && ["FileDeleted", "FolderDeleted"].contains(ctx.event?.action)'
+ - append:
+ field: event.type
+ value: creation
+ if: 'ctx.event?.action != null && ["FileUploaded", "FolderCopied", "FolderCreated"].contains(ctx.event?.action)'
+ # SecurityComplianceAlerts Schema
+ - rename:
+ field: o365audit.Comments
+ target_field: message
+ ignore_missing: true
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - rename:
+ field: o365audit.Name
+ target_field: rule.name
+ ignore_missing: true
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - rename:
+ field: o365audit.PolicyId
+ target_field: rule.id
+ ignore_missing: true
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - rename:
+ field: o365audit.Category
+ target_field: rule.category
+ ignore_missing: true
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - rename:
+ field: o365audit.EntityType
+ target_field: rule.ruleset
+ ignore_missing: true
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - rename:
+ field: o365audit.AlertEntityId
+ target_field: rule.description
+ ignore_missing: true
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - rename:
+ field: o365audit.AlertLinks
+ target_field: rule.reference
+ ignore_missing: true
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - set:
+ field: event.kind
+ value: alert
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - append:
+ field: event.category
+ value: authentication
+ if: 'ctx.event?.code == "SecurityComplianceAlerts" && ctx.o365audit?.Category == "AccessGovernance"'
+ - append:
+ field: event.category
+ value: file
+ if: 'ctx.event?.code == "SecurityComplianceAlerts" && ctx.o365audit?.Category != null && ["DataGovernance", "DataLossPrevention"].contains(ctx.o365audit?.Category)'
+ - append:
+ field: event.category
+ value: malware
+ if: 'ctx.event?.code == "SecurityComplianceAlerts" && ctx.o365audit?.Category == "ThreatManagement"'
+ - append:
+ field: event.category
+ value: authentication
+ allow_duplicates: false
+ if: 'ctx.event?.code == "SecurityComplianceAlerts" && ctx.o365audit?.Category != null && !["DataGovernance", "DataLossPrevention", "ThreatManagement", "AccessGovernance"].contains(ctx.o365audit?.Category)'
+ - append:
+ field: event.category
+ value: web
+ allow_duplicates: false
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - append:
+ field: event.type
+ value: info
+ allow_duplicates: false
+ if: ctx.event?.code == "SecurityComplianceAlerts"
+ - convert:
+ field: o365audit.AlertEntityId
+ target_field: user.id
+ type: string
+ ignore_missing: true
+ if: 'ctx.user?.id == null && ctx.event?.code == "SecurityComplianceAlerts" && ctx.rule?.ruleset == "User"'
+ - rename:
+ field: o365audit.AlertEntityId
+ target_field: user.email
+ ignore_missing: true
+ if: 'ctx.event?.code == "SecurityComplianceAlerts" && ctx.rule?.ruleset != null && ["Recipients", "Sender"].contains(ctx.rule?.ruleset)'
+ - rename:
+ field: o365audit.AlertEntityId
+ target_field: threat.technique.id
+ ignore_missing: true
+ if: 'ctx.event?.code == "SecurityComplianceAlerts" && ctx.rule?.ruleset == "MalwareFamily"'
+ # DLP Schema
+ - set:
+ field: event.kind
+ value: alert
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - append:
+ field: event.category
+ value: file
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - append:
+ field: event.type
+ value: access
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.SharePointMetaData.From
+ target_field: user.id
+ ignore_missing: true
+ if: 'ctx.user?.id == null && ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.SharePointMetaData.FileName
+ target_field: file.name
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.SharePointMetaData.FilePathUrl
+ target_field: url.original
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.SharePointMetaData.UniqueId
+ target_field: file.inode
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.SharePointMetaData.UniqueID
+ target_field: file.inode
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.SharePointMetaData.FileOwner
+ target_field: file.owner
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.ExchangeMetaData.From
+ target_field: source.user.email
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.ExchangeMetaData.Subject
+ target_field: message
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.PolicyId
+ target_field: rule.id
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - rename:
+ field: o365audit.PolicyName
+ target_field: rule.name
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ - date:
+ field: o365audit.SharePointMetaData.LastModifiedTime
+ target_field: file.mtime
+ formats:
+ - ISO8601
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code) && ctx.o365audit?.SharePointMetaData?.LastModifiedTime != null'
+ - script:
+ lang: painless
+ if: 'ctx.event?.code != null && ctx.o365audit?.ExchangeMetaData!= null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code)'
+ source: >
+ def fields = new def[] {"To", "CC", "BCC"};
+ if (ctx.destination == null) {
+ ctx.destination = new HashMap();
+ }
+ if (ctx.destination.user == null) {
+ ctx.destination.user = new HashMap();
+ }
+ ctx.destination.user.email = new ArrayList();
+ for (int i = 0; i < fields.length; ++i) {
+ if (ctx.o365audit.ExchangeMetaData instanceof Map && ctx.o365audit.ExchangeMetaData.containsKey(fields[i])) {
+ def emails = ctx.o365audit.ExchangeMetaData[fields[i]];
+ if (emails instanceof List){
+ for (int e = 0; e < emails.length; ++e) {
+ ctx.destination.user.email.add(emails[e]);
+ }
+ }
+ if (emails instanceof String){
+ ctx.destination.user.email.add(emails);
+ }
+ }
+ }
+ - rename:
+ field: o365audit.ExceptionInfo
+ target_field: o365audit.ExceptionInfo.Reason
+ ignore_missing: true
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code) && ctx.o365audit?.ExceptionInfo != null && ctx.o365audit?.ExceptionInfo instanceof String'
+ - script:
+ lang: painless
+ if: 'ctx.event?.code != null && ["ComplianceDLPSharePoint", "ComplianceDLPExchange"].contains(ctx.event?.code) && ctx.o365audit?.PolicyDetails != null'
+ source: >
+ int severityToCode(def x) {
+ if (x.toLowerCase() == "informational") {
+ return 1;
+ }
+ if (x.toLowerCase() == "low") {
+ return 2;
+ }
+ if (x.toLowerCase() == "medium") {
+ return 3;
+ }
+ if (x.toLowerCase() == "high") {
+ return 4;
+ }
+ return 0;
+ }
+ def policies = ctx.o365audit.PolicyDetails;
+ if (policies == null) {
+ return;
+ }
+ if (ctx.rule == null) {
+ ctx.rule = new HashMap();
+ }
+ if (ctx.rule.id == null) {
+ ctx.rule.id = new ArrayList();
+ }
+ if (ctx.rule.name == null) {
+ ctx.rule.name = new ArrayList();
+ }
+ def maxSeverity = 0;
+ def allowed = true;
+ for (int i = 0; i < policies.length && policies instanceof List; ++i) {
+ def rules = policies[i].Rules;
+ if (rules == null) {
+ continue;
+ }
+ for (int j = 0; j < rules.length; ++j) {
+ def rule = rules[j];
+ def id = rule.RuleId;
+ def name = rule.RuleName;
+ def sev = severityToCode(rule.Severity);
+ if (id != null && name != null) {
+ ctx.rule.id.add(id);
+ ctx.rule.name.add(name);
+ }
+ if (sev > maxSeverity) {
+ maxSeverity = sev;
+ }
+ if (allowed) {
+ if (rule.Actions != null && rule.Actions.contains("BlockAccess")) {
+ allowed = false;
+ }
+ }
+ }
+ }
+ if (maxSeverity > -1) {
+ ctx.event.severity = maxSeverity;
+ }
+ if (allowed) {
+ ctx.event.outcome = "success";
+ return;
+ }
+ if (ctx.event?.action == "DlpRuleUndo") {
+ ctx.event.outcome = "success";
+ return;
+ }
+ if (ctx.event?.action == "DlpInfo") {
+ ctx.event.outcome = "failure";
+ return;
+ }
+ if (ctx.o365audit?.ExceptionInfo != null && !ctx.o365audit?.ExceptionInfo.isEmpty()) {
+ ctx.event.outcome = "success";
+ return;
+ }
+ ctx.event.outcome = "failure";
+ # Yammer Schema
+ - rename:
+ field: o365audit.ActorUserId
+ target_field: user.email
+ ignore_missing: true
+ if: ctx.event?.code == "Yammer"
+ - convert:
+ field: o365audit.ActorYammerUserId
+ target_field: user.id
+ type: string
+ ignore_missing: true
+ if: 'ctx.user?.id == null && ctx.event?.code == "Yammer"'
+ - rename:
+ field: o365audit.FileId
+ target_field: file.inode
+ ignore_missing: true
+ if: ctx.event?.code == "Yammer"
+ - rename:
+ field: o365audit.FileName
+ target_field: file.name
+ ignore_missing: true
+ if: ctx.event?.code == "Yammer"
+ - rename:
+ field: o365audit.GroupName
+ target_field: group.name
+ ignore_missing: true
+ if: ctx.event?.code == "Yammer"
+ - rename:
+ field: o365audit.TargetUserId
+ target_field: destination.user.email
+ ignore_missing: true
+ if: ctx.event?.code == "Yammer"
+ - rename:
+ field: o365audit.TargetYammerUserId
+ target_field: destination.user.id
+ ignore_missing: true
+ if: ctx.event?.code == "Yammer"
+ - append:
+ field: event.category
+ value: configuration
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action != null && ["NetworkConfigurationUpdated", "NetworkSecurityConfigurationUpdated", "SoftDeleteSettingsUpdated", "ProcessProfileFields", "SupervisorAdminToggled"].contains(ctx.event?.action)'
+ - append:
+ field: event.category
+ value: iam
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action != null && ["NetworkSecurityConfigurationUpdated", "GroupCreation", "GroupDeletion", "NetworkUserSuspended", "UserSuspension"].contains(ctx.event?.action)'
+ - append:
+ field: event.category
+ value: file
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action != null && ["FileCreated", "FileDownloaded", "FileShared", "FileUpdateDescription", "FileUpdateName", "FileVisited"].contains(ctx.event?.action)'
+ - append:
+ field: event.type
+ value: change
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action != null && ["NetworkConfigurationUpdated", "NetworkSecurityConfigurationUpdated", "SoftDeleteSettingsUpdated", "ProcessProfileFields", "SupervisorAdminToggled"].contains(ctx.event?.action)'
+ - append:
+ field: event.type
+ value: admin
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action == "NetworkSecurityConfigurationUpdated"'
+ - append:
+ field: event.type
+ value: creation
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action != null && ["FileCreated", "GroupCreation", "FileUpdateName"].contains(ctx.event?.action)'
+ - append:
+ field: event.type
+ value: deletion
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action == "GroupDeletion"'
+ - append:
+ field: event.type
+ value: access
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action != null && ["FileDownloaded", "FileShared", "FileUpdateDescription", "FileVisited"].contains(ctx.event?.action)'
+ - append:
+ field: event.type
+ value: group
+ if: 'ctx.event?.code == "Yammer" && ctx.event?.action != null && ["GroupCreation", "GroupDeletion"].contains(ctx.event?.action)'
+ # Teams Schema
+ - set:
+ field: event.action
+ value: added-group-account-to
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "TeamCreated"'
+ - append:
+ field: event.category
+ value: iam
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "added-group-account-to"'
+ - append:
+ field: event.type
+ value: group
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "added-group-account-to"'
+ - append:
+ field: event.type
+ value: creation
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "added-group-account-to"'
+ - rename:
+ field: o365audit.TeamName
+ target_field: group.name
+ ignore_missing: true
+ if: ctx.event?.code == "MicrosoftTeams"
+ - set:
+ field: event.action
+ value: added-users-to-group
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "MemberAdded"'
+ - append:
+ field: event.category
+ value: iam
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "added-users-to-group"'
+ - append:
+ field: event.type
+ value: group
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "added-users-to-group"'
+ - append:
+ field: event.type
+ value: change
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "added-users-to-group"'
+ - set:
+ field: event.action
+ value: deleted-user-account
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "Delete user."'
+ - append:
+ field: event.category
+ value: iam
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "deleted-user-account"'
+ - append:
+ field: event.type
+ value: user
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "deleted-user-account"'
+ - append:
+ field: event.type
+ value: deletion
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "deleted-user-account"'
+ - rename:
+ field: o365audit.ObjectId
+ target_field: user.target.id
+ ignore_missing: true
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.event?.action == "deleted-user-account"'
+ - script:
+ lang: painless
+ if: 'ctx.event?.code == "MicrosoftTeams" && ctx.o365audit?.Members != null && ctx.o365audit.Members instanceof List'
+ source: >
+ def members = ctx.o365audit?.Members;
+ if (ctx.related == null) {
+ ctx.related = new HashMap();
+ }
+ if (ctx.related.user == null) {
+ ctx.related.user = new ArrayList();
+ }
+ for (int i = 0; i < members.length; ++i) {
+ if (members[i] instanceof Map && members[i].containsKey("UPN") && !members[i]["UPN"].isEmpty()) {
+ ctx.related.user.add(members[i]["UPN"]);
+ }
+ }
+ - gsub:
+ field: client._temp
+ pattern: '::ffff:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)'
+ replacement: '$1'
+ ignore_missing: true
+ - grok:
+ field: client._temp
+ patterns:
+ - '%{IPANDPORTBRACKETS}'
+ - '^%{IP:client.address}$'
+ - '^\[%{IP:client.address}\]$'
+ - '%{IPANDPORT}'
+ - '^%{NOTSPACE:client.domain}$'
+ - '%{HOSTNAMEANDPORTBRACKETS}'
+ - '%{HOSTNAMEANDPORT}'
+ - '^\[%{HOSTNAMEANDIP}\]$'
+ - '^%{HOSTNAMEANDIP}$'
+ - '%{GREEDYDATA:client.address}'
+ pattern_definitions:
+ IPANDPORTBRACKETS: '^\[%{IP:client.address}\]:%{POSINT:client._port}'
+ IPANDPORT: '^%{IP:client.address}:%{POSINT:client._port}'
+ HOSTNAMEANDPORTBRACKETS: '^\[%{NOTSPACE:client.domain}\]:%{POSINT:client._port}'
+ HOSTNAMEANDPORT: '^%{NOTSPACE:client.domain}:%{POSINT:client._port}'
+ NOTCLOSINGPARENS: '[^)]*'
+ HOSTNAMEANDIP: '%{NOTSPACE:client.domain} \(%{NOTCLOSINGPARENS:client.address}\)'
+ if: 'ctx.client?._temp != null && !ctx.client?._temp.isEmpty()'
+ - gsub:
+ field: server._temp
+ pattern: "[\n\r]"
+ replacement: ""
+ ignore_missing: true
+ - grok:
+ field: server._temp
+ patterns:
+ - '^\[%{HOSTNAMEANDIP}\]$'
+ - '%{HOSTNAMEANDIP}'
+ - '%{GREEDYDATA:server.address}'
+ pattern_definitions:
+ NOTCLOSINGPARENS: '[^)]*'
+ HOSTNAMEANDIP: '%{NOTSPACE:server.domain} \(%{NOTCLOSINGPARENS:server.address}\)'
+ if: 'ctx.server?._temp != null && !ctx.server?._temp.isEmpty()'
+ ignore_failure: true
+ - convert:
+ field: client.address
+ target_field: client.ip
+ type: ip
+ ignore_failure: true
+ - convert:
+ field: client._port
+ target_field: client.port
+ type: long
+ ignore_missing: true
+ - convert:
+ field: server.address
+ target_field: server.ip
+ type: ip
+ ignore_failure: true
+ - remove:
+ field:
+ - client._port
+ - client._temp
+ - server._temp
+ ignore_missing: true
+ - set:
+ field: source.ip
+ copy_from: client.ip
+ if: ctx.client?.ip != null
+ - set:
+ field: source.port
+ copy_from: client.port
+ if: ctx.client?.port != null
+ - set:
+ field: destination.ip
+ copy_from: server.ip
+ if: ctx.server?.ip != null
+ - script:
+ lang: painless
+ if: 'ctx.user?.id != null && ctx.user?.id.contains("@")'
+ source: >
+ String[] splitmail = ctx.user.id.splitOnToken("@");
+ if (splitmail.length != 2) {
+ return;
+ }
+ ctx.user.email = ctx.user.id;
+ ctx.user.domain = splitmail[1];
+ ctx.user.name = splitmail[0];
+ - script:
+ lang: painless
+ if: 'ctx.user?.target?.id != null && ctx.user?.target?.id.contains("@")'
+ source: >
+ String[] splitmail = ctx.user.target.id.splitOnToken("@");
+ if (splitmail.length != 2) {
+ return;
+ }
+ ctx.user.target.email = ctx.user.target.id;
+ ctx.user.target.domain = splitmail[1];
+ ctx.user.target.name = splitmail[0];
+ - script:
+ lang: painless
+ if: 'ctx.source?.user?.id != null && ctx.source?.user?.id.contains("@")'
+ source: >
+ String[] splitmail = ctx.source.user.id.splitOnToken("@");
+ if (splitmail.length != 2) {
+ return;
+ }
+ ctx.source.user.email = ctx.source.user.id;
+ ctx.source.user.domain = splitmail[1];
+ ctx.source.user.name = splitmail[0];
+ - script:
+ lang: painless
+ if: 'ctx.destination?.user?.id != null && ctx.destination?.user?.id.contains("@")'
+ source: >
+ String[] splitmail = ctx.destination.user.id.splitOnToken("@");
+ if (splitmail.length != 2) {
+ return;
+ }
+ ctx.destination.user.email = ctx.destination.user.id;
+ ctx.destination.user.domain = splitmail[1];
+ ctx.destination.user.name = splitmail[0];
+ - set:
+ field: network.type
+ value: ipv6
+ if: 'ctx.client?.ip != null && ctx.client?.ip.contains(":")'
+ - set:
+ field: network.type
+ value: ipv4
+ if: 'ctx.network?.type == null && ctx.client?.ip != null'
+ - append:
+ field: related.ip
+ value: "{{client.ip}}"
+ allow_duplicates: false
+ if: ctx.client?.ip != null
+ - append:
+ field: related.ip
+ value: "{{server.ip}}"
+ allow_duplicates: false
+ if: ctx.server?.ip != null
+ - append:
+ field: related.user
+ value: "{{user.name}}"
+ allow_duplicates: false
+ if: ctx.user?.name != null
+ - append:
+ field: related.user
+ value: "{{user.target.name}}"
+ allow_duplicates: false
+ if: ctx.user?.target?.name != null
+ - append:
+ field: related.user
+ value: "{{file.owner}}"
+ allow_duplicates: false
+ if: ctx.file?.owner != null
+ - rename:
+ field: o365audit.ExtendedProperties.UserAgent
+ target_field: user_agent.original
+ ignore_missing: true
+ if: ctx.o365audit?.ExtendedProperties?.UserAgent != null
+ # Add Host and Organization fields
+ - lowercase:
+ field: organization.id
+ ignore_missing: true
+ - set:
+ field: host.id
+ copy_from: organization.id
+ if: ctx.organization?.id != null
+ - script:
+ lang: painless
+ if: 'ctx.organization?.id != null && ctx._conf?.tenants != null'
+ source: >
+ def conftenants = ctx._conf.tenants;
+ def orgid = ctx.organization.id;
+ if (conftenants instanceof Map && conftenants.containsKey(orgid)) {
+ ctx.organization.name = conftenants[orgid];
+ ctx.host.name = conftenants[orgid];
+ }
+ - set:
+ field: host.name
+ copy_from: organization.name
+ if: ctx.organization?.name != null && ctx.host?.name == null
+ - set:
+ field: host.name
+ copy_from: user.domain
+ if: ctx.user?.domain != null && ctx.host?.name == null
+ # Convert field values
+ - convert:
+ field: o365audit.AzureActiveDirectoryEventType
+ type: string
+ ignore_missing: true
+ - convert:
+ field: o365audit.RecordType
+ type: string
+ ignore_missing: true
+ - convert:
+ field: o365audit.UserType
+ type: string
+ ignore_missing: true
+ - convert:
+ field: o365audit.Version
+ type: string
+ ignore_missing: true
+ - convert:
+ field: o365audit.InternalLogonType
+ type: string
+ ignore_missing: true
+ - convert:
+ field: o365audit.LogonType
+ type: string
+ ignore_missing: true
+ - convert:
+ field: o365audit.ActorYammerUserId
+ type: string
+ ignore_missing: true
+ - convert:
+ field: o365audit.YammerNetworkId
+ type: string
+ ignore_missing: true
+ - rename:
+ field: o365audit
+ target_field: o365.audit
+ ignore_missing: true
+ - user_agent:
+ field: user_agent.original
+ ignore_missing: true
+ # IP Geolocation Lookup
+ - geoip:
+ field: source.ip
+ target_field: source.geo
+ ignore_missing: true
+ # IP Autonomous System (AS) Lookup
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: source.ip
+ target_field: source.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - rename:
+ field: source.as.asn
+ target_field: source.as.number
+ ignore_missing: true
+ - rename:
+ field: source.as.organization_name
+ target_field: source.as.organization.name
+ ignore_missing: true
+ - remove:
+ field:
+ - _conf
+ ignore_missing: true
+ - remove:
+ field: event.original
+ if: "ctx?.tags == null || !(ctx.tags.contains('preserve_original_event'))"
+ ignore_failure: true
+ ignore_missing: true
+on_failure:
+ - set:
+ field: error.message
+ value: '{{ _ingest.on_failure_message }}'
diff --git a/packages/o365/1.4.1/data_stream/audit/fields/agent.yml b/packages/o365/1.4.1/data_stream/audit/fields/agent.yml
new file mode 100755
index 0000000000..da4e652c53
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/fields/agent.yml
@@ -0,0 +1,198 @@
+- name: cloud
+ title: Cloud
+ group: 2
+ description: Fields related to the cloud or infrastructure the events are coming from.
+ footnote: 'Examples: If Metricbeat is running on an EC2 host and fetches data from its host, the cloud info contains the data about this machine. If Metricbeat runs on a remote machine outside the cloud and fetches data from a service running in the cloud, the field contains cloud data from the machine the service is running on.'
+ type: group
+ fields:
+ - name: account.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'The cloud account or organization id used to identify different entities in a multi-tenant environment.
+
+ Examples: AWS account id, Google Cloud ORG Id, or other unique identifier.'
+ example: 666777888999
+ - name: availability_zone
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Availability zone in which this host is running.
+ example: us-east-1c
+ - name: instance.id
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance ID of the host machine.
+ example: i-1234567890abcdef0
+ - name: instance.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Instance name of the host machine.
+ - name: machine.type
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Machine type of the host machine.
+ example: t2.medium
+ - name: provider
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean.
+ example: aws
+ - name: region
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Region in which this host is running.
+ example: us-east-1
+ - name: project.id
+ type: keyword
+ description: Name of the project in Google Cloud.
+ - name: image.id
+ type: keyword
+ description: Image ID for the cloud instance.
+- name: container
+ title: Container
+ group: 2
+ description: 'Container fields are used for meta information about the specific container that is the source of information.
+
+ These fields help correlate data based containers from any runtime.'
+ type: group
+ fields:
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Unique container id.
+ - name: image.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Name of the image the container was built on.
+ - name: labels
+ level: extended
+ type: object
+ object_type: keyword
+ description: Image labels.
+ - name: name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Container name.
+- name: host
+ title: Host
+ group: 2
+ description: 'A host is defined as a general computing instance.
+
+ ECS host.* fields should be populated with details about the host on which the event happened, or from which the measurement was taken. Host types include hardware, virtual machines, Docker containers, and Kubernetes nodes.'
+ type: group
+ fields:
+ - name: architecture
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Operating system architecture.
+ example: x86_64
+ - name: domain
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the domain of which the host is a member.
+
+ For example, on Windows this could be the host''s Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host''s LDAP provider.'
+ example: CONTOSO
+ default_field: false
+ - name: hostname
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Hostname of the host.
+
+ It normally contains what the `hostname` command returns on the host machine.'
+ - name: id
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Unique host id.
+
+ As hostname is not always unique, use values that are meaningful in your environment.
+
+ Example: The current usage of `beat.name`.'
+ - name: ip
+ level: core
+ type: ip
+ description: Host ip addresses.
+ - name: mac
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: Host mac addresses.
+ - name: name
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Name of the host.
+
+ It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.'
+ - name: os.family
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: OS family (such as redhat, debian, freebsd, windows).
+ example: debian
+ - name: os.kernel
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system kernel version as a raw string.
+ example: 4.4.0-112-generic
+ - name: os.name
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ multi_fields:
+ - name: text
+ type: text
+ norms: false
+ default_field: false
+ description: Operating system name, without the version.
+ example: Mac OS X
+ - name: os.platform
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system platform (such centos, ubuntu, windows).
+ example: darwin
+ - name: os.version
+ level: extended
+ type: keyword
+ ignore_above: 1024
+ description: Operating system version as a raw string.
+ example: 10.14.1
+ - name: type
+ level: core
+ type: keyword
+ ignore_above: 1024
+ description: 'Type of host.
+
+ For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment.'
+ - name: containerized
+ type: boolean
+ description: >
+ If the host is a container.
+
+ - name: os.build
+ type: keyword
+ example: "18D109"
+ description: >
+ OS build information.
+
+ - name: os.codename
+ type: keyword
+ example: "stretch"
+ description: >
+ OS codename, if any.
+
diff --git a/packages/o365/1.4.1/data_stream/audit/fields/base-fields.yml b/packages/o365/1.4.1/data_stream/audit/fields/base-fields.yml
new file mode 100755
index 0000000000..f43cebe668
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/fields/base-fields.yml
@@ -0,0 +1,20 @@
+- name: data_stream.type
+ type: constant_keyword
+ description: Data stream type.
+- name: data_stream.dataset
+ type: constant_keyword
+ description: Data stream dataset name.
+- name: data_stream.namespace
+ type: constant_keyword
+ description: Data stream namespace.
+- name: event.module
+ type: constant_keyword
+ description: Event module
+ value: o365
+- name: event.dataset
+ type: constant_keyword
+ description: Event dataset
+ value: o365.audit
+- name: "@timestamp"
+ type: date
+ description: Event timestamp.
diff --git a/packages/o365/1.4.1/data_stream/audit/fields/beats.yml b/packages/o365/1.4.1/data_stream/audit/fields/beats.yml
new file mode 100755
index 0000000000..cb44bb2944
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/fields/beats.yml
@@ -0,0 +1,12 @@
+- name: input.type
+ type: keyword
+ description: Type of Filebeat input.
+- name: log.flags
+ type: keyword
+ description: Flags for the log file.
+- name: log.offset
+ type: long
+ description: Offset of the entry in the log file.
+- name: log.file.path
+ type: keyword
+ description: Path to the log file.
diff --git a/packages/o365/1.4.1/data_stream/audit/fields/ecs.yml b/packages/o365/1.4.1/data_stream/audit/fields/ecs.yml
new file mode 100755
index 0000000000..86eae982d2
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/fields/ecs.yml
@@ -0,0 +1,305 @@
+- description: |-
+ Some event client addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: client.address
+ type: keyword
+- description: |-
+ The domain name of the client system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: client.domain
+ type: keyword
+- description: IP address of the client (IPv4 or IPv6).
+ name: client.ip
+ type: ip
+- description: Port of the client.
+ name: client.port
+ type: long
+- description: Unique container id.
+ name: container.id
+ type: keyword
+- description: IP address of the destination (IPv4 or IPv6).
+ name: destination.ip
+ type: ip
+- description: User email address.
+ name: destination.user.email
+ type: keyword
+- description: Unique identifier of the user.
+ name: destination.user.id
+ type: keyword
+- description: |-
+ ECS version this event conforms to. `ecs.version` is a required field and must exist in all events.
+ When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events.
+ name: ecs.version
+ type: keyword
+- description: |-
+ The action captured by the event.
+ This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.
+ name: event.action
+ type: keyword
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy.
+ `event.category` represents the "big buckets" of ECS categories. For example, filtering on `event.category:process` yields all events relating to process activity. This field is closely related to `event.type`, which is used as a subcategory.
+ This field is an array. This will allow proper categorization of some events that fall in multiple categories.
+ name: event.category
+ type: keyword
+- description: |-
+ Identification code for this event, if one exists.
+ Some event sources use event codes to identify messages unambiguously, regardless of message language or wording adjustments over time. An example of this is the Windows Event ID.
+ name: event.code
+ type: keyword
+- description: Unique ID to describe the event.
+ name: event.id
+ type: keyword
+- description: |-
+ Timestamp when an event arrived in the central data store.
+ This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event.
+ In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` < `event.created` < `event.ingested`.
+ name: event.ingested
+ type: date
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the highest level in the ECS category hierarchy.
+ `event.kind` gives high-level information about what type of information the event contains, without being specific to the contents of the event. For example, values of this field distinguish alert events from metric events.
+ The value of this field can be used to inform how these kinds of events should be handled. They may warrant different retention, different access control, it may also help understand whether the data coming in at a regular interval or not.
+ name: event.kind
+ type: keyword
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy.
+ `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.
+ Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective.
+ Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer.
+ Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense.
+ name: event.outcome
+ type: keyword
+- description: |-
+ Source of the event.
+ Event transports such as Syslog or the Windows Event Log typically mention the source of an event. It can be the name of the software that generated the event (e.g. Sysmon, httpd), or of a subsystem of the operating system (kernel, Microsoft-Windows-Security-Auditing).
+ name: event.provider
+ type: keyword
+- description: |-
+ The numeric severity of the event according to your event source.
+ What the different severity values mean can be different between sources and use cases. It's up to the implementer to make sure severities are consistent across events from the same source.
+ The Syslog severity belongs in `log.syslog.severity.code`. `event.severity` is meant to represent the severity according to the event source (e.g. firewall, IDS). If the event source does not publish its own severity, you may optionally copy the `log.syslog.severity.code` to `event.severity`.
+ name: event.severity
+ type: long
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the third level in the ECS category hierarchy.
+ `event.type` represents a categorization "sub-bucket" that, when used along with the `event.category` field values, enables filtering events down to a level appropriate for single visualization.
+ This field is an array. This will allow proper categorization of some events that fall in multiple event types.
+ name: event.type
+ type: keyword
+- description: Directory where the file is located. It should include the drive letter, when appropriate.
+ name: file.directory
+ type: keyword
+- description: |-
+ File extension, excluding the leading dot.
+ Note that when the file name has multiple extensions (example.tar.gz), only the last one should be captured ("gz", not "tar.gz").
+ name: file.extension
+ type: keyword
+- description: Inode representing the file in the filesystem.
+ name: file.inode
+ type: keyword
+- description: Last time the file content was modified.
+ name: file.mtime
+ type: date
+- description: Name of the file including the extension, without the directory.
+ name: file.name
+ type: keyword
+- description: File owner's username.
+ name: file.owner
+ type: keyword
+- description: Name of the group.
+ name: group.name
+ type: keyword
+- description: |-
+ Unique host id.
+ As hostname is not always unique, use values that are meaningful in your environment.
+ Example: The current usage of `beat.name`.
+ name: host.id
+ type: keyword
+- description: |-
+ Name of the host.
+ It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.
+ name: host.name
+ type: keyword
+- description: |-
+ For log events the message field contains the log message, optimized for viewing in a log viewer.
+ For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event.
+ If multiple messages exist, they can be combined into one message.
+ name: message
+ type: match_only_text
+- description: |-
+ In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc
+ The field value must be normalized to lowercase for querying.
+ name: network.type
+ type: keyword
+- description: Unique identifier for the organization.
+ name: organization.id
+ type: keyword
+- description: Organization name.
+ name: organization.name
+ type: keyword
+- description: |-
+ Process name.
+ Sometimes called program name or similar.
+ name: process.name
+ type: keyword
+- description: All of the IPs seen on your event.
+ name: related.ip
+ type: ip
+- description: All the user names or other user identifiers seen on the event.
+ name: related.user
+ type: keyword
+- description: A categorization value keyword used by the entity using the rule for detection of this event.
+ name: rule.category
+ type: keyword
+- description: The description of the rule generating the event.
+ name: rule.description
+ type: keyword
+- description: A rule ID that is unique within the scope of an agent, observer, or other entity using the rule for detection of this event.
+ name: rule.id
+ type: keyword
+- description: The name of the rule or signature generating the event.
+ name: rule.name
+ type: keyword
+- description: |-
+ Reference URL to additional information about the rule used to generate this event.
+ The URL can point to the vendor's documentation about the rule. If that's not available, it can also be a link to a more general page describing this type of alert.
+ name: rule.reference
+ type: keyword
+- description: Name of the ruleset, policy, group, or parent category in which the rule used to generate this event is a member.
+ name: rule.ruleset
+ type: keyword
+- description: |-
+ Some event server addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: server.address
+ type: keyword
+- description: |-
+ The domain name of the server system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: server.domain
+ type: keyword
+- description: IP address of the server (IPv4 or IPv6).
+ name: server.ip
+ type: ip
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: source.as.number
+ type: long
+- description: Organization name.
+ name: source.as.organization.name
+ type: keyword
+- description: City name.
+ name: source.geo.city_name
+ type: keyword
+- description: Name of the continent.
+ name: source.geo.continent_name
+ type: keyword
+- description: Country ISO code.
+ name: source.geo.country_iso_code
+ type: keyword
+- description: Country name.
+ name: source.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: source.geo.location
+ type: geo_point
+- description: |-
+ User-defined description of a location, at the level of granularity they care about.
+ Could be the name of their data centers, the floor number, if this describes a local physical entity, city names.
+ Not typically used in automated geolocation.
+ name: source.geo.name
+ type: keyword
+- description: Region ISO code.
+ name: source.geo.region_iso_code
+ type: keyword
+- description: Region name.
+ name: source.geo.region_name
+ type: keyword
+- description: IP address of the source (IPv4 or IPv6).
+ name: source.ip
+ type: ip
+- description: Port of the source.
+ name: source.port
+ type: long
+- description: User email address.
+ name: source.user.email
+ type: keyword
+- description: List of keywords used to tag each event.
+ name: tags
+ type: keyword
+- description: The id of technique used by this threat. You can use a MITRE ATT&CK® technique, for example. (ex. https://attack.mitre.org/techniques/T1059/)
+ name: threat.technique.id
+ type: keyword
+- description: |-
+ Unmodified original url as seen in the event source.
+ Note that in network monitoring, the observed URL may be a full URL, whereas in access logs, the URL is often just represented as a path.
+ This field is meant to represent the URL as it was observed, complete or not.
+ name: url.original
+ type: wildcard
+- description: |-
+ Name of the directory the user is a member of.
+ For example, an LDAP or Active Directory domain name.
+ name: user.domain
+ type: keyword
+- description: User email address.
+ name: user.email
+ type: keyword
+- description: User's full name, if available.
+ name: user.full_name
+ type: keyword
+- description: Unique identifier of the user.
+ name: user.id
+ type: keyword
+- description: Short name or login of the user.
+ name: user.name
+ type: keyword
+- description: |-
+ Name of the directory the user is a member of.
+ For example, an LDAP or Active Directory domain name.
+ name: user.target.domain
+ type: keyword
+- description: User email address.
+ name: user.target.email
+ type: keyword
+- description: User's full name, if available.
+ name: user.target.full_name
+ type: keyword
+- description: |-
+ Name of the directory the group is a member of.
+ For example, an LDAP or Active Directory domain name.
+ name: user.target.group.domain
+ type: keyword
+- description: Unique identifier for the group on the system/platform.
+ name: user.target.group.id
+ type: keyword
+- description: Name of the group.
+ name: user.target.group.name
+ type: keyword
+- description: Unique identifier of the user.
+ name: user.target.id
+ type: keyword
+- description: Short name or login of the user.
+ name: user.target.name
+ type: keyword
+- description: Name of the device.
+ name: user_agent.device.name
+ type: keyword
+- description: Name of the user agent.
+ name: user_agent.name
+ type: keyword
+- description: Unparsed user_agent string.
+ name: user_agent.original
+ type: keyword
+- description: Operating system name, including the version or code name.
+ name: user_agent.os.full
+ type: keyword
+- description: Operating system name, without the version.
+ name: user_agent.os.name
+ type: keyword
+- description: Operating system version as a raw string.
+ name: user_agent.os.version
+ type: keyword
+- description: Version of the user agent.
+ name: user_agent.version
+ type: keyword
diff --git a/packages/o365/1.4.1/data_stream/audit/fields/fields.yml b/packages/o365/1.4.1/data_stream/audit/fields/fields.yml
new file mode 100755
index 0000000000..ca908de5ae
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/fields/fields.yml
@@ -0,0 +1,199 @@
+- name: o365.audit
+ type: group
+ fields:
+ - name: Actor
+ type: array
+ fields:
+ - name: ID
+ type: keyword
+ - name: Type
+ type: keyword
+ - name: ActorContextId
+ type: keyword
+ - name: ActorIpAddress
+ type: keyword
+ - name: ActorUserId
+ type: keyword
+ - name: ActorYammerUserId
+ type: keyword
+ - name: AlertEntityId
+ type: keyword
+ - name: AlertId
+ type: keyword
+ - name: AlertLinks
+ type: array
+ - name: AlertType
+ type: keyword
+ - name: AppId
+ type: keyword
+ - name: ApplicationDisplayName
+ type: keyword
+ - name: ApplicationId
+ type: keyword
+ - name: AzureActiveDirectoryEventType
+ type: keyword
+ - name: ExchangeMetaData.*
+ type: object
+ - name: Category
+ type: keyword
+ - name: ClientAppId
+ type: keyword
+ - name: ClientInfoString
+ type: keyword
+ - name: ClientIP
+ type: keyword
+ - name: ClientIPAddress
+ type: keyword
+ - name: Comments
+ type: text
+ - name: CorrelationId
+ type: keyword
+ - name: CreationTime
+ type: keyword
+ - name: CustomUniqueId
+ type: boolean
+ - name: Data
+ type: keyword
+ - name: DataType
+ type: keyword
+ - name: EntityType
+ type: keyword
+ - name: ErrorNumber
+ type: keyword
+ - name: EventData
+ type: keyword
+ - name: EventSource
+ type: keyword
+ - name: ExceptionInfo.*
+ type: object
+ - name: ExtendedProperties.*
+ type: object
+ - name: ExternalAccess
+ type: boolean
+ - name: GroupName
+ type: keyword
+ - name: Id
+ type: keyword
+ - name: ImplicitShare
+ type: keyword
+ - name: IncidentId
+ type: keyword
+ - name: InternalLogonType
+ type: keyword
+ - name: InterSystemsId
+ type: keyword
+ - name: IntraSystemId
+ type: keyword
+ - name: Item.*
+ type: object
+ - name: Item.*.*
+ type: object
+ - name: ItemName
+ type: keyword
+ - name: ItemType
+ type: keyword
+ - name: ListId
+ type: keyword
+ - name: ListItemUniqueId
+ type: keyword
+ - name: LogonError
+ type: keyword
+ - name: LogonType
+ type: keyword
+ - name: LogonUserSid
+ type: keyword
+ - name: MailboxGuid
+ type: keyword
+ - name: MailboxOwnerMasterAccountSid
+ type: keyword
+ - name: MailboxOwnerSid
+ type: keyword
+ - name: MailboxOwnerUPN
+ type: keyword
+ - name: Members
+ type: array
+ - name: Members.*
+ type: object
+ - name: ModifiedProperties.*.*
+ type: object
+ - name: Name
+ type: keyword
+ - name: ObjectId
+ type: keyword
+ - name: Operation
+ type: keyword
+ - name: OrganizationId
+ type: keyword
+ - name: OrganizationName
+ type: keyword
+ - name: OriginatingServer
+ type: keyword
+ - name: Parameters.*
+ type: object
+ - name: PolicyDetails
+ type: array
+ - name: PolicyId
+ type: keyword
+ - name: RecordType
+ type: keyword
+ - name: ResultStatus
+ type: keyword
+ - name: SensitiveInfoDetectionIsIncluded
+ type: boolean
+ - name: SharePointMetaData.*
+ type: object
+ - name: SessionId
+ type: keyword
+ - name: Severity
+ type: keyword
+ - name: Site
+ type: keyword
+ - name: SiteUrl
+ type: keyword
+ - name: Source
+ type: keyword
+ - name: SourceFileExtension
+ type: keyword
+ - name: SourceFileName
+ type: keyword
+ - name: SourceRelativeUrl
+ type: keyword
+ - name: Status
+ type: keyword
+ - name: SupportTicketId
+ type: keyword
+ - name: Target
+ type: array
+ fields:
+ - name: ID
+ type: keyword
+ - name: Type
+ type: keyword
+ - name: TargetContextId
+ type: keyword
+ - name: TargetUserOrGroupName
+ type: keyword
+ - name: TargetUserOrGroupType
+ type: keyword
+ - name: TeamName
+ type: keyword
+ - name: TeamGuid
+ type: keyword
+ - name: UniqueSharingId
+ type: keyword
+ - name: UserAgent
+ type: keyword
+ - name: UserId
+ type: keyword
+ - name: UserKey
+ type: keyword
+ - name: UserType
+ type: keyword
+ - name: Version
+ type: keyword
+ - name: WebId
+ type: keyword
+ - name: Workload
+ type: keyword
+ - name: YammerNetworkId
+ type: keyword
diff --git a/packages/o365/1.4.1/data_stream/audit/manifest.yml b/packages/o365/1.4.1/data_stream/audit/manifest.yml
new file mode 100755
index 0000000000..2c1315f9c1
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/manifest.yml
@@ -0,0 +1,103 @@
+type: logs
+title: Office 365 audit logs
+streams:
+ - input: o365audit
+ title: "Collect Office 365 audit logs"
+ description: "Collect audit logs from Office 365 via the Management Activity API"
+ vars:
+ - name: application_id
+ type: text
+ title: Application (client) ID
+ multi: false
+ required: true
+ show_user: true
+ - name: client_secret
+ title: Client secret (API key)
+ type: password
+ multi: false
+ required: false
+ show_user: true
+ - name: certificate
+ type: text
+ title: Path to certificate file
+ multi: false
+ required: false
+ show_user: true
+ - name: key
+ type: text
+ title: Path to private key file
+ multi: false
+ required: false
+ show_user: true
+ - name: key_passphrase
+ type: text
+ title: Private key passphrase
+ multi: false
+ required: false
+ show_user: true
+ - name: tenants
+ type: text
+ multi: true
+ title: Directory (tenant) IDs
+ required: true
+ show_user: true
+ default:
+ - tenant-id
+ - name: tenant_names
+ type: text
+ multi: true
+ title: Directory (tenant) domains mapping
+ required: true
+ show_user: true
+ default:
+ - "tenant-id: domain-name"
+ - name: content_type
+ type: text
+ title: Content types
+ multi: true
+ default:
+ - "Audit.AzureActiveDirectory"
+ - "Audit.Exchange"
+ - "Audit.SharePoint"
+ - "Audit.General"
+ - "DLP.All"
+ required: true
+ show_user: true
+ - name: api
+ type: yaml
+ title: Advanced API settings
+ multi: false
+ required: false
+ show_user: false
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - forwarded
+ - o365-audit
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ default: |-
+ #- add_fields:
+ # target: foo
+ # fields:
+ # bar: baz
+ description: >
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
+
+ template_path: o365audit.yml.hbs
diff --git a/packages/o365/1.4.1/data_stream/audit/sample_event.json b/packages/o365/1.4.1/data_stream/audit/sample_event.json
new file mode 100755
index 0000000000..e5cd6aba50
--- /dev/null
+++ b/packages/o365/1.4.1/data_stream/audit/sample_event.json
@@ -0,0 +1,111 @@
+{
+ "@timestamp": "2020-02-07T16:43:53.000Z",
+ "agent": {
+ "ephemeral_id": "14ad310a-30bb-45d4-9dd4-20f22267fbd5",
+ "id": "b1d83907-ff3e-464a-b79a-cf843f6f0bba",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "client": {
+ "address": "213.97.47.133",
+ "ip": "213.97.47.133"
+ },
+ "data_stream": {
+ "dataset": "o365.audit",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "b1d83907-ff3e-464a-b79a-cf843f6f0bba",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "action": "PageViewed",
+ "agent_id_status": "verified",
+ "category": [
+ "web"
+ ],
+ "code": "SharePoint",
+ "dataset": "o365.audit",
+ "id": "99d005e6-a4c6-46fd-117c-08d7abeceab5",
+ "ingested": "2022-01-02T03:51:15Z",
+ "kind": "event",
+ "original": "{\"ListItemUniqueId\": \"59a8433d-9bb8-cfef-6edc-4c0fc8b86875\", \"ItemType\": \"Page\", \"Workload\": \"OneDrive\", \"OrganizationId\": \"b86ab9d4-fcf1-4b11-8a06-7a8f91b47fbd\", \"UserId\": \"asr@testsiem.onmicrosoft.com\", \"CreationTime\": \"2020-02-07T16:43:53\", \"Site\": \"d5180cfc-3479-44d6-b410-8c985ac894e3\", \"ClientIP\": \"213.97.47.133\", \"WebId\": \"8c5c94bb-8396-470c-87d7-8999f440cd30\", \"UserType\": 0, \"Version\": 1, \"EventSource\": \"SharePoint\", \"UserAgent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0\", \"UserKey\": \"i:0h.f|membership|1003200096971f55@live.com\", \"CustomUniqueId\": true, \"Operation\": \"PageViewed\", \"ObjectId\": \"https://testsiem-my.sharepoint.com/personal/asr_testsiem_onmicrosoft_com/_layouts/15/onedrive.aspx\", \"Id\": \"99d005e6-a4c6-46fd-117c-08d7abeceab5\", \"CorrelationId\": \"622b339f-4000-a000-f25f-92b3478c7a25\", \"RecordType\": 4}",
+ "outcome": "success",
+ "provider": "OneDrive",
+ "type": [
+ "info"
+ ]
+ },
+ "host": {
+ "id": "b86ab9d4-fcf1-4b11-8a06-7a8f91b47fbd",
+ "name": "testsiem.onmicrosoft.com"
+ },
+ "input": {
+ "type": "o365audit"
+ },
+ "network": {
+ "type": "ipv4"
+ },
+ "o365": {
+ "audit": {
+ "CorrelationId": "622b339f-4000-a000-f25f-92b3478c7a25",
+ "CreationTime": "2020-02-07T16:43:53",
+ "CustomUniqueId": true,
+ "EventSource": "SharePoint",
+ "ItemType": "Page",
+ "ListItemUniqueId": "59a8433d-9bb8-cfef-6edc-4c0fc8b86875",
+ "ObjectId": "https://testsiem-my.sharepoint.com/personal/asr_testsiem_onmicrosoft_com/_layouts/15/onedrive.aspx",
+ "RecordType": "4",
+ "Site": "d5180cfc-3479-44d6-b410-8c985ac894e3",
+ "UserId": "asr@testsiem.onmicrosoft.com",
+ "UserKey": "i:0h.f|membership|1003200096971f55@live.com",
+ "UserType": "0",
+ "Version": "1",
+ "WebId": "8c5c94bb-8396-470c-87d7-8999f440cd30"
+ }
+ },
+ "organization": {
+ "id": "b86ab9d4-fcf1-4b11-8a06-7a8f91b47fbd"
+ },
+ "related": {
+ "ip": [
+ "213.97.47.133"
+ ],
+ "user": [
+ "asr"
+ ]
+ },
+ "source": {
+ "ip": "213.97.47.133"
+ },
+ "tags": [
+ "forwarded",
+ "o365-audit",
+ "preserve_original_event"
+ ],
+ "user": {
+ "domain": "testsiem.onmicrosoft.com",
+ "email": "asr@testsiem.onmicrosoft.com",
+ "id": "asr@testsiem.onmicrosoft.com",
+ "name": "asr"
+ },
+ "user_agent": {
+ "device": {
+ "name": "Mac"
+ },
+ "name": "Firefox",
+ "original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0",
+ "os": {
+ "full": "Mac OS X 10.14",
+ "name": "Mac OS X",
+ "version": "10.14"
+ },
+ "version": "72.0."
+ }
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/docs/README.md b/packages/o365/1.4.1/docs/README.md
new file mode 100755
index 0000000000..c0fec85c7d
--- /dev/null
+++ b/packages/o365/1.4.1/docs/README.md
@@ -0,0 +1,361 @@
+# Microsoft Office 365 Integration
+
+This integration is for Microsoft Office 365. It currently supports user, admin, system, and policy actions and events from Office 365 and Azure AD activity logs exposed by the Office 365 Management Activity API.
+
+## Configuration
+
+To use this package you need to enable _Audit Log Search_ and register an application in Azure AD.
+
+Once this application is registered note the _Application (client) ID_ and the _Directory (tenant) ID._ Then configure the authentication in the _Certificates & Secrets_ section.
+
+To use client-secret authentication, add you secret to the _Client Secret (API key)_ field.
+
+To use certificate-based authentication, set the paths to the certificate and private key files. If the key file is protected with a passphrase, set this passphrase in the _Private key passphrase_ field. Paths must be absolute and files must exist in the host where _Elastic Agent_ is running.
+
+
+Add your tenant ID(s) to the _Directory (tenant) IDs_ field, then add the hostname that this tenant identifies to the _Directory (tenant) domains_ field. For example:
+- Directory IDs: `my-id-a` `my-id-b`
+- Directory domains: `a.onmicrosoft.com` `b.onmicrosoft.com`
+
+## Compatibility
+
+The `ingest-geoip` and `ingest-user_agent` Elasticsearch plugins are required to run this module.
+
+## Logs
+
+### Audit
+
+Uses the Office 365 Management Activity API to retrieve audit messages from Office 365 and Azure AD activity logs. These are the same logs that are available under Audit Log Search in the Security and Compliance Center.
+
+An example event for `audit` looks as following:
+
+```json
+{
+ "@timestamp": "2020-02-07T16:43:53.000Z",
+ "agent": {
+ "ephemeral_id": "14ad310a-30bb-45d4-9dd4-20f22267fbd5",
+ "id": "b1d83907-ff3e-464a-b79a-cf843f6f0bba",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0-beta1"
+ },
+ "client": {
+ "address": "213.97.47.133",
+ "ip": "213.97.47.133"
+ },
+ "data_stream": {
+ "dataset": "o365.audit",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "ecs": {
+ "version": "8.0.0"
+ },
+ "elastic_agent": {
+ "id": "b1d83907-ff3e-464a-b79a-cf843f6f0bba",
+ "snapshot": false,
+ "version": "8.0.0-beta1"
+ },
+ "event": {
+ "action": "PageViewed",
+ "agent_id_status": "verified",
+ "category": [
+ "web"
+ ],
+ "code": "SharePoint",
+ "dataset": "o365.audit",
+ "id": "99d005e6-a4c6-46fd-117c-08d7abeceab5",
+ "ingested": "2022-01-02T03:51:15Z",
+ "kind": "event",
+ "original": "{\"ListItemUniqueId\": \"59a8433d-9bb8-cfef-6edc-4c0fc8b86875\", \"ItemType\": \"Page\", \"Workload\": \"OneDrive\", \"OrganizationId\": \"b86ab9d4-fcf1-4b11-8a06-7a8f91b47fbd\", \"UserId\": \"asr@testsiem.onmicrosoft.com\", \"CreationTime\": \"2020-02-07T16:43:53\", \"Site\": \"d5180cfc-3479-44d6-b410-8c985ac894e3\", \"ClientIP\": \"213.97.47.133\", \"WebId\": \"8c5c94bb-8396-470c-87d7-8999f440cd30\", \"UserType\": 0, \"Version\": 1, \"EventSource\": \"SharePoint\", \"UserAgent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0\", \"UserKey\": \"i:0h.f|membership|1003200096971f55@live.com\", \"CustomUniqueId\": true, \"Operation\": \"PageViewed\", \"ObjectId\": \"https://testsiem-my.sharepoint.com/personal/asr_testsiem_onmicrosoft_com/_layouts/15/onedrive.aspx\", \"Id\": \"99d005e6-a4c6-46fd-117c-08d7abeceab5\", \"CorrelationId\": \"622b339f-4000-a000-f25f-92b3478c7a25\", \"RecordType\": 4}",
+ "outcome": "success",
+ "provider": "OneDrive",
+ "type": [
+ "info"
+ ]
+ },
+ "host": {
+ "id": "b86ab9d4-fcf1-4b11-8a06-7a8f91b47fbd",
+ "name": "testsiem.onmicrosoft.com"
+ },
+ "input": {
+ "type": "o365audit"
+ },
+ "network": {
+ "type": "ipv4"
+ },
+ "o365": {
+ "audit": {
+ "CorrelationId": "622b339f-4000-a000-f25f-92b3478c7a25",
+ "CreationTime": "2020-02-07T16:43:53",
+ "CustomUniqueId": true,
+ "EventSource": "SharePoint",
+ "ItemType": "Page",
+ "ListItemUniqueId": "59a8433d-9bb8-cfef-6edc-4c0fc8b86875",
+ "ObjectId": "https://testsiem-my.sharepoint.com/personal/asr_testsiem_onmicrosoft_com/_layouts/15/onedrive.aspx",
+ "RecordType": "4",
+ "Site": "d5180cfc-3479-44d6-b410-8c985ac894e3",
+ "UserId": "asr@testsiem.onmicrosoft.com",
+ "UserKey": "i:0h.f|membership|1003200096971f55@live.com",
+ "UserType": "0",
+ "Version": "1",
+ "WebId": "8c5c94bb-8396-470c-87d7-8999f440cd30"
+ }
+ },
+ "organization": {
+ "id": "b86ab9d4-fcf1-4b11-8a06-7a8f91b47fbd"
+ },
+ "related": {
+ "ip": [
+ "213.97.47.133"
+ ],
+ "user": [
+ "asr"
+ ]
+ },
+ "source": {
+ "ip": "213.97.47.133"
+ },
+ "tags": [
+ "forwarded",
+ "o365-audit",
+ "preserve_original_event"
+ ],
+ "user": {
+ "domain": "testsiem.onmicrosoft.com",
+ "email": "asr@testsiem.onmicrosoft.com",
+ "id": "asr@testsiem.onmicrosoft.com",
+ "name": "asr"
+ },
+ "user_agent": {
+ "device": {
+ "name": "Mac"
+ },
+ "name": "Firefox",
+ "original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0",
+ "os": {
+ "full": "Mac OS X 10.14",
+ "name": "Mac OS X",
+ "version": "10.14"
+ },
+ "version": "72.0."
+ }
+}
+```
+
+**Exported fields**
+
+| Field | Description | Type |
+|---|---|---|
+| @timestamp | Event timestamp. | date |
+| client.address | Some event client addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| client.domain | The domain name of the client system. This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment. | keyword |
+| client.ip | IP address of the client (IPv4 or IPv6). | ip |
+| client.port | Port of the client. | long |
+| cloud.account.id | The cloud account or organization id used to identify different entities in a multi-tenant environment. Examples: AWS account id, Google Cloud ORG Id, or other unique identifier. | keyword |
+| cloud.availability_zone | Availability zone in which this host is running. | keyword |
+| cloud.image.id | Image ID for the cloud instance. | keyword |
+| cloud.instance.id | Instance ID of the host machine. | keyword |
+| cloud.instance.name | Instance name of the host machine. | keyword |
+| cloud.machine.type | Machine type of the host machine. | keyword |
+| cloud.project.id | Name of the project in Google Cloud. | keyword |
+| cloud.provider | Name of the cloud provider. Example values are aws, azure, gcp, or digitalocean. | keyword |
+| cloud.region | Region in which this host is running. | keyword |
+| container.id | Unique container id. | keyword |
+| container.image.name | Name of the image the container was built on. | keyword |
+| container.labels | Image labels. | object |
+| container.name | Container name. | keyword |
+| data_stream.dataset | Data stream dataset name. | constant_keyword |
+| data_stream.namespace | Data stream namespace. | constant_keyword |
+| data_stream.type | Data stream type. | constant_keyword |
+| destination.ip | IP address of the destination (IPv4 or IPv6). | ip |
+| destination.user.email | User email address. | keyword |
+| destination.user.id | Unique identifier of the user. | keyword |
+| ecs.version | ECS version this event conforms to. `ecs.version` is a required field and must exist in all events. When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events. | keyword |
+| event.action | The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer. | keyword |
+| event.category | This is one of four ECS Categorization Fields, and indicates the second level in the ECS category hierarchy. `event.category` represents the "big buckets" of ECS categories. For example, filtering on `event.category:process` yields all events relating to process activity. This field is closely related to `event.type`, which is used as a subcategory. This field is an array. This will allow proper categorization of some events that fall in multiple categories. | keyword |
+| event.code | Identification code for this event, if one exists. Some event sources use event codes to identify messages unambiguously, regardless of message language or wording adjustments over time. An example of this is the Windows Event ID. | keyword |
+| event.dataset | Event dataset | constant_keyword |
+| event.id | Unique ID to describe the event. | keyword |
+| event.ingested | Timestamp when an event arrived in the central data store. This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event. In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` \< `event.created` \< `event.ingested`. | date |
+| event.kind | This is one of four ECS Categorization Fields, and indicates the highest level in the ECS category hierarchy. `event.kind` gives high-level information about what type of information the event contains, without being specific to the contents of the event. For example, values of this field distinguish alert events from metric events. The value of this field can be used to inform how these kinds of events should be handled. They may warrant different retention, different access control, it may also help understand whether the data coming in at a regular interval or not. | keyword |
+| event.module | Event module | constant_keyword |
+| event.outcome | This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy. `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective. Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer. Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense. | keyword |
+| event.provider | Source of the event. Event transports such as Syslog or the Windows Event Log typically mention the source of an event. It can be the name of the software that generated the event (e.g. Sysmon, httpd), or of a subsystem of the operating system (kernel, Microsoft-Windows-Security-Auditing). | keyword |
+| event.severity | The numeric severity of the event according to your event source. What the different severity values mean can be different between sources and use cases. It's up to the implementer to make sure severities are consistent across events from the same source. The Syslog severity belongs in `log.syslog.severity.code`. `event.severity` is meant to represent the severity according to the event source (e.g. firewall, IDS). If the event source does not publish its own severity, you may optionally copy the `log.syslog.severity.code` to `event.severity`. | long |
+| event.type | This is one of four ECS Categorization Fields, and indicates the third level in the ECS category hierarchy. `event.type` represents a categorization "sub-bucket" that, when used along with the `event.category` field values, enables filtering events down to a level appropriate for single visualization. This field is an array. This will allow proper categorization of some events that fall in multiple event types. | keyword |
+| file.directory | Directory where the file is located. It should include the drive letter, when appropriate. | keyword |
+| file.extension | File extension, excluding the leading dot. Note that when the file name has multiple extensions (example.tar.gz), only the last one should be captured ("gz", not "tar.gz"). | keyword |
+| file.inode | Inode representing the file in the filesystem. | keyword |
+| file.mtime | Last time the file content was modified. | date |
+| file.name | Name of the file including the extension, without the directory. | keyword |
+| file.owner | File owner's username. | keyword |
+| group.name | Name of the group. | keyword |
+| host.architecture | Operating system architecture. | keyword |
+| host.containerized | If the host is a container. | boolean |
+| host.domain | Name of the domain of which the host is a member. For example, on Windows this could be the host's Active Directory domain or NetBIOS domain name. For Linux this could be the domain of the host's LDAP provider. | keyword |
+| host.hostname | Hostname of the host. It normally contains what the `hostname` command returns on the host machine. | keyword |
+| host.id | Unique host id. As hostname is not always unique, use values that are meaningful in your environment. Example: The current usage of `beat.name`. | keyword |
+| host.ip | Host ip addresses. | ip |
+| host.mac | Host mac addresses. | keyword |
+| host.name | Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. | keyword |
+| host.os.build | OS build information. | keyword |
+| host.os.codename | OS codename, if any. | keyword |
+| host.os.family | OS family (such as redhat, debian, freebsd, windows). | keyword |
+| host.os.kernel | Operating system kernel version as a raw string. | keyword |
+| host.os.name | Operating system name, without the version. | keyword |
+| host.os.platform | Operating system platform (such centos, ubuntu, windows). | keyword |
+| host.os.version | Operating system version as a raw string. | keyword |
+| host.type | Type of host. For Cloud providers this can be the machine type like `t2.medium`. If vm, this could be the container, for example, or other information meaningful in your environment. | keyword |
+| input.type | Type of Filebeat input. | keyword |
+| log.file.path | Path to the log file. | keyword |
+| log.flags | Flags for the log file. | keyword |
+| log.offset | Offset of the entry in the log file. | long |
+| message | For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message. | match_only_text |
+| network.type | In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc The field value must be normalized to lowercase for querying. | keyword |
+| o365.audit.Actor.ID | | keyword |
+| o365.audit.Actor.Type | | keyword |
+| o365.audit.ActorContextId | | keyword |
+| o365.audit.ActorIpAddress | | keyword |
+| o365.audit.ActorUserId | | keyword |
+| o365.audit.ActorYammerUserId | | keyword |
+| o365.audit.AlertEntityId | | keyword |
+| o365.audit.AlertId | | keyword |
+| o365.audit.AlertLinks | | array |
+| o365.audit.AlertType | | keyword |
+| o365.audit.AppId | | keyword |
+| o365.audit.ApplicationDisplayName | | keyword |
+| o365.audit.ApplicationId | | keyword |
+| o365.audit.AzureActiveDirectoryEventType | | keyword |
+| o365.audit.Category | | keyword |
+| o365.audit.ClientAppId | | keyword |
+| o365.audit.ClientIP | | keyword |
+| o365.audit.ClientIPAddress | | keyword |
+| o365.audit.ClientInfoString | | keyword |
+| o365.audit.Comments | | text |
+| o365.audit.CorrelationId | | keyword |
+| o365.audit.CreationTime | | keyword |
+| o365.audit.CustomUniqueId | | boolean |
+| o365.audit.Data | | keyword |
+| o365.audit.DataType | | keyword |
+| o365.audit.EntityType | | keyword |
+| o365.audit.ErrorNumber | | keyword |
+| o365.audit.EventData | | keyword |
+| o365.audit.EventSource | | keyword |
+| o365.audit.ExceptionInfo.\* | | object |
+| o365.audit.ExchangeMetaData.\* | | object |
+| o365.audit.ExtendedProperties.\* | | object |
+| o365.audit.ExternalAccess | | boolean |
+| o365.audit.GroupName | | keyword |
+| o365.audit.Id | | keyword |
+| o365.audit.ImplicitShare | | keyword |
+| o365.audit.IncidentId | | keyword |
+| o365.audit.InterSystemsId | | keyword |
+| o365.audit.InternalLogonType | | keyword |
+| o365.audit.IntraSystemId | | keyword |
+| o365.audit.Item.\* | | object |
+| o365.audit.Item.\*.\* | | object |
+| o365.audit.ItemName | | keyword |
+| o365.audit.ItemType | | keyword |
+| o365.audit.ListId | | keyword |
+| o365.audit.ListItemUniqueId | | keyword |
+| o365.audit.LogonError | | keyword |
+| o365.audit.LogonType | | keyword |
+| o365.audit.LogonUserSid | | keyword |
+| o365.audit.MailboxGuid | | keyword |
+| o365.audit.MailboxOwnerMasterAccountSid | | keyword |
+| o365.audit.MailboxOwnerSid | | keyword |
+| o365.audit.MailboxOwnerUPN | | keyword |
+| o365.audit.Members | | array |
+| o365.audit.Members.\* | | object |
+| o365.audit.ModifiedProperties.\*.\* | | object |
+| o365.audit.Name | | keyword |
+| o365.audit.ObjectId | | keyword |
+| o365.audit.Operation | | keyword |
+| o365.audit.OrganizationId | | keyword |
+| o365.audit.OrganizationName | | keyword |
+| o365.audit.OriginatingServer | | keyword |
+| o365.audit.Parameters.\* | | object |
+| o365.audit.PolicyDetails | | array |
+| o365.audit.PolicyId | | keyword |
+| o365.audit.RecordType | | keyword |
+| o365.audit.ResultStatus | | keyword |
+| o365.audit.SensitiveInfoDetectionIsIncluded | | boolean |
+| o365.audit.SessionId | | keyword |
+| o365.audit.Severity | | keyword |
+| o365.audit.SharePointMetaData.\* | | object |
+| o365.audit.Site | | keyword |
+| o365.audit.SiteUrl | | keyword |
+| o365.audit.Source | | keyword |
+| o365.audit.SourceFileExtension | | keyword |
+| o365.audit.SourceFileName | | keyword |
+| o365.audit.SourceRelativeUrl | | keyword |
+| o365.audit.Status | | keyword |
+| o365.audit.SupportTicketId | | keyword |
+| o365.audit.Target.ID | | keyword |
+| o365.audit.Target.Type | | keyword |
+| o365.audit.TargetContextId | | keyword |
+| o365.audit.TargetUserOrGroupName | | keyword |
+| o365.audit.TargetUserOrGroupType | | keyword |
+| o365.audit.TeamGuid | | keyword |
+| o365.audit.TeamName | | keyword |
+| o365.audit.UniqueSharingId | | keyword |
+| o365.audit.UserAgent | | keyword |
+| o365.audit.UserId | | keyword |
+| o365.audit.UserKey | | keyword |
+| o365.audit.UserType | | keyword |
+| o365.audit.Version | | keyword |
+| o365.audit.WebId | | keyword |
+| o365.audit.Workload | | keyword |
+| o365.audit.YammerNetworkId | | keyword |
+| organization.id | Unique identifier for the organization. | keyword |
+| organization.name | Organization name. | keyword |
+| process.name | Process name. Sometimes called program name or similar. | keyword |
+| related.ip | All of the IPs seen on your event. | ip |
+| related.user | All the user names or other user identifiers seen on the event. | keyword |
+| rule.category | A categorization value keyword used by the entity using the rule for detection of this event. | keyword |
+| rule.description | The description of the rule generating the event. | keyword |
+| rule.id | A rule ID that is unique within the scope of an agent, observer, or other entity using the rule for detection of this event. | keyword |
+| rule.name | The name of the rule or signature generating the event. | keyword |
+| rule.reference | Reference URL to additional information about the rule used to generate this event. The URL can point to the vendor's documentation about the rule. If that's not available, it can also be a link to a more general page describing this type of alert. | keyword |
+| rule.ruleset | Name of the ruleset, policy, group, or parent category in which the rule used to generate this event is a member. | keyword |
+| server.address | Some event server addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| server.domain | The domain name of the server system. This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment. | keyword |
+| server.ip | IP address of the server (IPv4 or IPv6). | ip |
+| source.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| source.as.organization.name | Organization name. | keyword |
+| source.geo.city_name | City name. | keyword |
+| source.geo.continent_name | Name of the continent. | keyword |
+| source.geo.country_iso_code | Country ISO code. | keyword |
+| source.geo.country_name | Country name. | keyword |
+| source.geo.location | Longitude and latitude. | geo_point |
+| source.geo.name | User-defined description of a location, at the level of granularity they care about. Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. Not typically used in automated geolocation. | keyword |
+| source.geo.region_iso_code | Region ISO code. | keyword |
+| source.geo.region_name | Region name. | keyword |
+| source.ip | IP address of the source (IPv4 or IPv6). | ip |
+| source.port | Port of the source. | long |
+| source.user.email | User email address. | keyword |
+| tags | List of keywords used to tag each event. | keyword |
+| threat.technique.id | The id of technique used by this threat. You can use a MITRE ATT&CK® technique, for example. (ex. https://attack.mitre.org/techniques/T1059/) | keyword |
+| url.original | Unmodified original url as seen in the event source. Note that in network monitoring, the observed URL may be a full URL, whereas in access logs, the URL is often just represented as a path. This field is meant to represent the URL as it was observed, complete or not. | wildcard |
+| user.domain | Name of the directory the user is a member of. For example, an LDAP or Active Directory domain name. | keyword |
+| user.email | User email address. | keyword |
+| user.full_name | User's full name, if available. | keyword |
+| user.id | Unique identifier of the user. | keyword |
+| user.name | Short name or login of the user. | keyword |
+| user.target.domain | Name of the directory the user is a member of. For example, an LDAP or Active Directory domain name. | keyword |
+| user.target.email | User email address. | keyword |
+| user.target.full_name | User's full name, if available. | keyword |
+| user.target.group.domain | Name of the directory the group is a member of. For example, an LDAP or Active Directory domain name. | keyword |
+| user.target.group.id | Unique identifier for the group on the system/platform. | keyword |
+| user.target.group.name | Name of the group. | keyword |
+| user.target.id | Unique identifier of the user. | keyword |
+| user.target.name | Short name or login of the user. | keyword |
+| user_agent.device.name | Name of the device. | keyword |
+| user_agent.name | Name of the user agent. | keyword |
+| user_agent.original | Unparsed user_agent string. | keyword |
+| user_agent.os.full | Operating system name, including the version or code name. | keyword |
+| user_agent.os.name | Operating system name, without the version. | keyword |
+| user_agent.os.version | Operating system version as a raw string. | keyword |
+| user_agent.version | Version of the user agent. | keyword |
+
diff --git a/packages/o365/1.4.1/img/filebeat-o365-audit.png b/packages/o365/1.4.1/img/filebeat-o365-audit.png
new file mode 100755
index 0000000000..a2413e7b90
Binary files /dev/null and b/packages/o365/1.4.1/img/filebeat-o365-audit.png differ
diff --git a/packages/o365/1.4.1/img/filebeat-o365-azure-permissions.png b/packages/o365/1.4.1/img/filebeat-o365-azure-permissions.png
new file mode 100755
index 0000000000..19a98e687a
Binary files /dev/null and b/packages/o365/1.4.1/img/filebeat-o365-azure-permissions.png differ
diff --git a/packages/o365/1.4.1/img/logo-integrations-microsoft-365.svg b/packages/o365/1.4.1/img/logo-integrations-microsoft-365.svg
new file mode 100755
index 0000000000..3763f267ff
--- /dev/null
+++ b/packages/o365/1.4.1/img/logo-integrations-microsoft-365.svg
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/dashboard/o365-712e2c00-685d-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/dashboard/o365-712e2c00-685d-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..a261099e07
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/dashboard/o365-712e2c00-685d-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,54 @@
+{
+ "attributes": {
+ "description": "Sample dashboard for Office 365 Management Activity events",
+ "hits": 0,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"query\":{\"language\":\"kuery\",\"query\":\"\"}}"
+ },
+ "optionsJSON": "{\"hidePanelTitles\":false,\"useMargins\":true}",
+ "panelsJSON": "[{\"embeddableConfig\":{\"title\":\"Total audit events\"},\"gridData\":{\"h\":6,\"i\":\"b6942e2a-81dc-40e4-a932-8b7a864b28bc\",\"w\":10,\"x\":0,\"y\":0},\"panelIndex\":\"b6942e2a-81dc-40e4-a932-8b7a864b28bc\",\"panelRefName\":\"panel_0\",\"title\":\"Total audit events\",\"version\":\"7.6.0\"},{\"embeddableConfig\":{\"title\":\"Event histogram by service\"},\"gridData\":{\"h\":14,\"i\":\"9673e6df-4b1e-4771-b1c6-c41c9bfc7272\",\"w\":38,\"x\":10,\"y\":0},\"panelIndex\":\"9673e6df-4b1e-4771-b1c6-c41c9bfc7272\",\"panelRefName\":\"panel_1\",\"title\":\"Event histogram by service\",\"version\":\"7.6.0\"},{\"embeddableConfig\":{\"colors\":{\"alert\":\"#EF843C\",\"event\":\"#7EB26D\"},\"legendOpen\":true,\"title\":\"Events by type\",\"vis\":{\"colors\":{\"alert\":\"#E24D42\",\"event\":\"#7EB26D\"},\"legendOpen\":true}},\"gridData\":{\"h\":8,\"i\":\"70ab7239-c65c-41da-8242-da61750745d7\",\"w\":10,\"x\":0,\"y\":6},\"panelIndex\":\"70ab7239-c65c-41da-8242-da61750745d7\",\"panelRefName\":\"panel_2\",\"title\":\"Events by type\",\"version\":\"7.6.0\"},{\"embeddableConfig\":{\"colors\":{\"failure\":\"#E24D42\",\"success\":\"#629E51\"},\"legendOpen\":false,\"title\":\"Top users by authentication failures\",\"vis\":{\"colors\":{\"failure\":\"#E24D42\",\"success\":\"#629E51\"},\"legendOpen\":true}},\"gridData\":{\"h\":17,\"i\":\"775ced7d-7c58-44bc-8d4e-2a757d2c218c\",\"w\":10,\"x\":0,\"y\":14},\"panelIndex\":\"775ced7d-7c58-44bc-8d4e-2a757d2c218c\",\"panelRefName\":\"panel_3\",\"title\":\"Top users by authentication failures\",\"version\":\"7.6.0\"},{\"embeddableConfig\":{\"hiddenLayers\":[],\"isLayerTOCOpen\":false,\"mapCenter\":{\"lat\":42.68781,\"lon\":-48.94209,\"zoom\":1.88},\"openTOCDetails\":[],\"title\":\"Client geolocation map\"},\"gridData\":{\"h\":17,\"i\":\"15fe975b-6b8b-4445-872d-e06c041e2c31\",\"w\":38,\"x\":10,\"y\":14},\"panelIndex\":\"15fe975b-6b8b-4445-872d-e06c041e2c31\",\"panelRefName\":\"panel_4\",\"title\":\"Client geolocation map\",\"version\":\"7.6.0\"},{\"embeddableConfig\":{\"title\":\"Data Loss Prevention alerts\"},\"gridData\":{\"h\":13,\"i\":\"481f1778-caad-4971-b598-bb61c94bf998\",\"w\":48,\"x\":0,\"y\":31},\"panelIndex\":\"481f1778-caad-4971-b598-bb61c94bf998\",\"panelRefName\":\"panel_5\",\"title\":\"Data Loss Prevention alerts\",\"version\":\"7.6.0\"}]",
+ "timeRestore": false,
+ "title": "[Logs o365] Audit Dashboard",
+ "version": 1
+ },
+ "id": "o365-712e2c00-685d-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "dashboard": "7.3.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "o365-0be1adb0-6860-11ea-8d6a-292ef5d68366",
+ "name": "panel_0",
+ "type": "visualization"
+ },
+ {
+ "id": "o365-8b033510-685a-11ea-8d6a-292ef5d68366",
+ "name": "panel_1",
+ "type": "visualization"
+ },
+ {
+ "id": "o365-d43c95a0-6864-11ea-8d6a-292ef5d68366",
+ "name": "panel_2",
+ "type": "visualization"
+ },
+ {
+ "id": "o365-897d0c70-6869-11ea-8d6a-292ef5d68366",
+ "name": "panel_3",
+ "type": "visualization"
+ },
+ {
+ "id": "o365-dbae13c0-685c-11ea-8d6a-292ef5d68366",
+ "name": "panel_4",
+ "type": "map"
+ },
+ {
+ "id": "o365-8b8e5a10-6886-11ea-8d6a-292ef5d68366",
+ "name": "panel_5",
+ "type": "search"
+ }
+ ],
+ "type": "dashboard"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/map/o365-dbae13c0-685c-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/map/o365-dbae13c0-685c-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..d7c061e5c4
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/map/o365-dbae13c0-685c-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,24 @@
+{
+ "attributes": {
+ "description": "",
+ "layerListJSON": "[{\"alpha\":1,\"id\":\"0b910b6c-77c8-4223-892a-1ebf69b0ccb4\",\"label\":null,\"maxZoom\":24,\"minZoom\":0,\"sourceDescriptor\":{\"isAutoSelect\":true,\"type\":\"EMS_TMS\"},\"style\":{},\"type\":\"VECTOR_TILE\",\"visible\":true},{\"alpha\":0.75,\"id\":\"acc53b7b-3411-406b-9371-6fa62b6b9365\",\"label\":null,\"maxZoom\":24,\"minZoom\":0,\"sourceDescriptor\":{\"applyGlobalQuery\":true,\"geoField\":\"source.geo.location\",\"id\":\"3ba31ffc-7051-44bf-96a0-a684020cd2a3\",\"indexPatternRefName\":\"layer_1_source_index_pattern\",\"requestType\":\"point\",\"resolution\":\"FINE\",\"type\":\"ES_GEO_GRID\"},\"style\":{\"isTimeAware\":true,\"properties\":{\"fillColor\":{\"options\":{\"color\":\"Yellow to Red\",\"colorCategory\":\"palette_0\",\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"},\"fieldMetaOptions\":{\"isEnabled\":true,\"sigma\":3},\"type\":\"ORDINAL\",\"useCustomColorRamp\":false},\"type\":\"DYNAMIC\"},\"icon\":{\"options\":{\"value\":\"airfield\"},\"type\":\"STATIC\"},\"iconOrientation\":{\"options\":{\"orientation\":0},\"type\":\"STATIC\"},\"iconSize\":{\"options\":{\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"},\"fieldMetaOptions\":{\"isEnabled\":true,\"sigma\":3},\"maxSize\":32,\"minSize\":8},\"type\":\"DYNAMIC\"},\"labelBorderColor\":{\"options\":{\"color\":\"#FFFFFF\"},\"type\":\"STATIC\"},\"labelBorderSize\":{\"options\":{\"size\":\"SMALL\"}},\"labelColor\":{\"options\":{\"color\":\"#000000\"},\"type\":\"STATIC\"},\"labelSize\":{\"options\":{\"size\":14},\"type\":\"STATIC\"},\"labelText\":{\"options\":{\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"}},\"type\":\"DYNAMIC\"},\"lineColor\":{\"options\":{\"color\":\"#FFF\"},\"type\":\"STATIC\"},\"lineWidth\":{\"options\":{\"size\":0},\"type\":\"STATIC\"},\"symbolizeAs\":{\"options\":{\"value\":\"circle\"}}},\"type\":\"VECTOR\"},\"type\":\"VECTOR\",\"visible\":true}]",
+ "mapStateJSON": "{\"center\":{\"lat\":30.87292,\"lon\":16.67387},\"filters\":[],\"query\":{\"language\":\"kuery\",\"query\":\"data_stream.dataset:\\\"o365.audit\\\" \"},\"refreshConfig\":{\"interval\":0,\"isPaused\":false},\"timeFilters\":{\"from\":\"2020-02-05T03:25:59.045Z\",\"to\":\"2020-02-29T10:59:01.067Z\"},\"zoom\":2.88}",
+ "title": "Client Geo Map [Logs o365 audit]",
+ "uiStateJSON": "{\"isLayerTOCOpen\":true,\"openTOCDetails\":[]}"
+ },
+ "id": "o365-dbae13c0-685c-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "map": "7.9.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "logs-*",
+ "name": "layer_1_source_index_pattern",
+ "type": "index-pattern"
+ }
+ ],
+ "type": "map"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/search/o365-8b8e5a10-6886-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/search/o365-8b8e5a10-6886-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..7c0cb148aa
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/search/o365-8b8e5a10-6886-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,56 @@
+{
+ "attributes": {
+ "columns": [
+ "event.category",
+ "event.type",
+ "event.action",
+ "event.outcome",
+ "user.name",
+ "file.name",
+ "rule.name"
+ ],
+ "description": "",
+ "hits": 0,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\",\"key\":\"data_stream.dataset\",\"negate\":false,\"params\":{\"query\":\"o365.audit\"},\"type\":\"phrase\"},\"query\":{\"match_phrase\":{\"data_stream.dataset\":\"o365.audit\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\",\"key\":\"event.kind\",\"negate\":false,\"params\":{\"query\":\"alert\"},\"type\":\"phrase\"},\"query\":{\"match_phrase\":{\"event.kind\":\"alert\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index\",\"key\":\"event.code\",\"negate\":false,\"params\":[\"ComplianceDLPSharePoint\",\"ComplianceDLPExchange\"],\"type\":\"phrases\",\"value\":\"ComplianceDLPSharePoint, ComplianceDLPExchange\"},\"query\":{\"bool\":{\"minimum_should_match\":1,\"should\":[{\"match_phrase\":{\"event.code\":\"ComplianceDLPSharePoint\"}},{\"match_phrase\":{\"event.code\":\"ComplianceDLPExchange\"}}]}}}],\"highlightAll\":true,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"version\":true}"
+ },
+ "sort": [
+ [
+ "@timestamp",
+ "desc"
+ ]
+ ],
+ "title": "Data Loss Prevention [Logs o365]",
+ "version": 1
+ },
+ "id": "o365-8b8e5a10-6886-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "search": "7.4.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
+ "type": "index-pattern"
+ },
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index",
+ "type": "index-pattern"
+ },
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index",
+ "type": "index-pattern"
+ },
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index",
+ "type": "index-pattern"
+ }
+ ],
+ "type": "search"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/search/o365-fdc14020-6859-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/search/o365-fdc14020-6859-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..aab59e7d3b
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/search/o365-fdc14020-6859-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,35 @@
+{
+ "attributes": {
+ "columns": [
+ "_source"
+ ],
+ "description": "",
+ "hits": 0,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[],\"highlightAll\":true,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"query\":{\"language\":\"kuery\",\"query\":\"data_stream.dataset:\\\"o365.audit\\\" \"},\"version\":true}"
+ },
+ "sort": [
+ [
+ "@timestamp",
+ "desc"
+ ]
+ ],
+ "title": "Audit Events [Logs O365]",
+ "version": 1
+ },
+ "id": "o365-fdc14020-6859-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "search": "7.4.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
+ "type": "index-pattern"
+ }
+ ],
+ "type": "search"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/visualization/o365-0be1adb0-6860-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/visualization/o365-0be1adb0-6860-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..2fdb82d937
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/visualization/o365-0be1adb0-6860-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Audit Event Count [Logs o365]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"}],\"params\":{\"addLegend\":false,\"addTooltip\":true,\"dimensions\":{\"metrics\":[{\"accessor\":0,\"format\":{\"id\":\"number\",\"params\":{}},\"type\":\"vis_dimension\"}]},\"metric\":{\"colorSchema\":\"Green to Red\",\"colorsRange\":[{\"from\":0,\"to\":10000,\"type\":\"range\"}],\"invertColors\":false,\"labels\":{\"show\":true},\"metricColorMode\":\"None\",\"percentageMode\":false,\"style\":{\"bgColor\":false,\"bgFill\":\"#000\",\"fontSize\":40,\"labelColor\":false,\"subText\":\"\"},\"useRanges\":false},\"type\":\"metric\"},\"title\":\"Audit Event Count [Logs o365]\",\"type\":\"metric\"}"
+ },
+ "id": "o365-0be1adb0-6860-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "visualization": "7.8.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "o365-fdc14020-6859-11ea-8d6a-292ef5d68366",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/visualization/o365-897d0c70-6869-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/visualization/o365-897d0c70-6869-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..ba90a63e18
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/visualization/o365-897d0c70-6869-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,33 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\",\"key\":\"event.category\",\"negate\":false,\"params\":{\"query\":\"authentication\"},\"type\":\"phrase\"},\"query\":{\"match_phrase\":{\"event.category\":\"authentication\"}}}],\"query\":{\"language\":\"kuery\",\"query\":\"\"}}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Top Authentication Failures [Logs o365]",
+ "uiStateJSON": "{\"vis\":{\"colors\":{\"failure\":\"#E24D42\",\"success\":\"#629E51\"},\"legendOpen\":true}}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{\"customLabel\":\"\"},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"field\":\"event.outcome\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"asc\",\"orderBy\":\"_key\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":2},\"schema\":\"group\",\"type\":\"terms\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"user.name\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":15},\"schema\":\"split\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":200},\"position\":\"left\",\"scale\":{\"type\":\"linear\"},\"show\":false,\"style\":{},\"title\":{},\"type\":\"category\"}],\"dimensions\":{\"series\":[{\"accessor\":0,\"aggType\":\"terms\",\"format\":{\"id\":\"terms\",\"params\":{\"id\":\"string\",\"missingBucketLabel\":\"Missing\",\"otherBucketLabel\":\"Other\",\"parsedUrl\":{\"basePath\":\"\",\"origin\":\"http://localhost:5601\",\"pathname\":\"/app/kibana\"}}},\"label\":\"event.outcome: Ascending\",\"params\":{}}],\"splitRow\":[{\"accessor\":1,\"aggType\":\"terms\",\"format\":{\"id\":\"terms\",\"params\":{\"id\":\"string\",\"missingBucketLabel\":\"Missing\",\"otherBucketLabel\":\"Other\",\"parsedUrl\":{\"basePath\":\"\",\"origin\":\"http://localhost:5601\",\"pathname\":\"/app/kibana\"}}},\"label\":\"user.name: Descending\",\"params\":{}}],\"x\":null,\"y\":[{\"accessor\":2,\"aggType\":\"count\",\"format\":{\"id\":\"number\"},\"label\":\"Count\",\"params\":{}}]},\"grid\":{\"categoryLines\":false,\"valueAxis\":\"\"},\"labels\":{\"show\":true},\"legendPosition\":\"bottom\",\"orderBucketsBySum\":true,\"row\":true,\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"mode\":\"stacked\",\"show\":true,\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"thresholdLine\":{\"color\":\"#E7664C\",\"show\":false,\"style\":\"full\",\"value\":10,\"width\":1},\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":true,\"rotate\":75,\"show\":false,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"bottom\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":false,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"title\":\"Top Authentication Failures [Logs o365]\",\"type\":\"horizontal_bar\"}"
+ },
+ "id": "o365-897d0c70-6869-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "visualization": "7.8.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "logs-*",
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index",
+ "type": "index-pattern"
+ },
+ {
+ "id": "o365-fdc14020-6859-11ea-8d6a-292ef5d68366",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/visualization/o365-8b033510-685a-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/visualization/o365-8b033510-685a-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..6724878043
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/visualization/o365-8b033510-685a-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Events Histogram [Logs o365]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"event.code\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"size\":50},\"schema\":\"group\",\"type\":\"terms\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"drop_partials\":false,\"extended_bounds\":{},\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1,\"scaleMetricValues\":false,\"timeRange\":{\"from\":\"2020-02-05T03:25:59.045Z\",\"to\":\"2020-02-29T10:59:01.067Z\"},\"useNormalizedEsInterval\":true},\"schema\":\"segment\",\"type\":\"date_histogram\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":true,\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"dimensions\":{\"series\":[{\"accessor\":0,\"aggType\":\"terms\",\"format\":{\"id\":\"terms\",\"params\":{\"id\":\"string\",\"missingBucketLabel\":\"Missing\",\"otherBucketLabel\":\"Other\",\"parsedUrl\":{\"basePath\":\"\",\"origin\":\"http://localhost:5601\",\"pathname\":\"/app/kibana\"}}},\"label\":\"event.code: Descending\",\"params\":{}}],\"x\":{\"accessor\":1,\"aggType\":\"date_histogram\",\"format\":{\"id\":\"date\",\"params\":{\"pattern\":\"YYYY-MM-DD HH:mm\"}},\"label\":\"@timestamp per 12 hours\",\"params\":{\"bounds\":{\"max\":\"2020-02-29T10:59:01.067Z\",\"min\":\"2020-02-05T03:25:59.045Z\"},\"date\":true,\"format\":\"YYYY-MM-DD HH:mm\",\"interval\":\"PT12H\",\"intervalESUnit\":\"h\",\"intervalESValue\":12}},\"y\":[{\"accessor\":2,\"aggType\":\"count\",\"format\":{\"id\":\"number\"},\"label\":\"Count\",\"params\":{}}]},\"grid\":{\"categoryLines\":false},\"labels\":{\"show\":false},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"mode\":\"stacked\",\"show\":true,\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"thresholdLine\":{\"color\":\"#E7664C\",\"show\":false,\"style\":\"full\",\"value\":10,\"width\":1},\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"title\":\"Events Histogram [Logs o365]\",\"type\":\"histogram\"}"
+ },
+ "id": "o365-8b033510-685a-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "visualization": "7.8.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "o365-fdc14020-6859-11ea-8d6a-292ef5d68366",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/kibana/visualization/o365-d43c95a0-6864-11ea-8d6a-292ef5d68366.json b/packages/o365/1.4.1/kibana/visualization/o365-d43c95a0-6864-11ea-8d6a-292ef5d68366.json
new file mode 100755
index 0000000000..ec9ec39027
--- /dev/null
+++ b/packages/o365/1.4.1/kibana/visualization/o365-d43c95a0-6864-11ea-8d6a-292ef5d68366.json
@@ -0,0 +1,28 @@
+{
+ "attributes": {
+ "description": "",
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{}"
+ },
+ "savedSearchRefName": "search_0",
+ "title": "Audit Event Type [Logs o365]",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"field\":\"event.kind\",\"missingBucket\":true,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"size\":5},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTooltip\":true,\"dimensions\":{\"metric\":{\"accessor\":0,\"aggType\":\"count\",\"format\":{\"id\":\"number\"},\"label\":\"Count\",\"params\":{}}},\"isDonut\":true,\"labels\":{\"last_level\":true,\"show\":false,\"truncate\":100,\"values\":true},\"legendPosition\":\"right\",\"type\":\"pie\"},\"title\":\"Audit Event Type [Logs o365]\",\"type\":\"pie\"}"
+ },
+ "id": "o365-d43c95a0-6864-11ea-8d6a-292ef5d68366",
+ "migrationVersion": {
+ "visualization": "7.8.0"
+ },
+ "namespaces": [
+ "default"
+ ],
+ "references": [
+ {
+ "id": "o365-fdc14020-6859-11ea-8d6a-292ef5d68366",
+ "name": "search_0",
+ "type": "search"
+ }
+ ],
+ "type": "visualization"
+}
\ No newline at end of file
diff --git a/packages/o365/1.4.1/manifest.yml b/packages/o365/1.4.1/manifest.yml
new file mode 100755
index 0000000000..9dd4489a3d
--- /dev/null
+++ b/packages/o365/1.4.1/manifest.yml
@@ -0,0 +1,35 @@
+name: o365
+title: Office 365 Logs
+version: 1.4.1
+release: ga
+description: Collect and parse event logs from Office 365 with Elastic Agent.
+type: integration
+format_version: 1.0.0
+license: basic
+categories: [security]
+conditions:
+ kibana.version: ^7.14.0 || ^8.0.0
+icons:
+ - src: /img/logo-integrations-microsoft-365.svg
+ title: Microsoft Office 365
+ size: 216x216
+ type: image/svg+xml
+screenshots:
+ - src: /img/filebeat-o365-audit.png
+ title: Office 365 Dashboard
+ size: 1924x1409
+ type: image/png
+ - src: /img/filebeat-o365-azure-permissions.png
+ title: Azure Permissions
+ size: 2660x1030
+ type: image/png
+policy_templates:
+ - name: o365
+ title: Office 365 logs
+ description: Collect logs from Office 365
+ inputs:
+ - type: o365audit
+ title: "Collect Office 365 audit logs"
+ description: "Collect audit logs from Office 365 via the Management Activity API"
+owner:
+ github: elastic/security-external-integrations
diff --git a/packages/zscaler/0.5.1/changelog.yml b/packages/zscaler/0.5.1/changelog.yml
new file mode 100755
index 0000000000..4de5416f60
--- /dev/null
+++ b/packages/zscaler/0.5.1/changelog.yml
@@ -0,0 +1,82 @@
+# newer versions go on top
+- version: "0.5.1"
+ changes:
+ - description: Mark package as deprecated. Use the zscaler_zia package instead.
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/
+- version: "0.5.0"
+ changes:
+ - description: Update to ECS 8.0.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/2599
+- version: "0.4.5"
+ changes:
+ - description: Regenerate test files using the new GeoIP database
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/2339
+- version: "0.4.4"
+ changes:
+ - description: Uniform with guidelines
+ type: enhancement
+ link: |
+ https://github.com/elastic/integrations/pull/2044
+- version: "0.4.3"
+ changes:
+ - description: Update Title and Description.
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1995
+- version: "0.4.2"
+ changes:
+ - description: Fixed a bug that prevents the package from working in 7.16.
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/1882
+- version: "0.4.1"
+ changes:
+ - description: Fix logic that checks for the 'forwarded' tag
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/1864
+- version: "0.4.0"
+ changes:
+ - description: Update to ECS 1.12.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1684
+- version: "0.3.3"
+ changes:
+ - description: Requires version 7.14.1 of the stack
+ type: bugfix
+ link: https://github.com/elastic/integrations/pull/1541
+- version: "0.3.2"
+ changes:
+ - description: Convert to generated ECS fields
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1513
+- version: '0.3.1'
+ changes:
+ - description: update to ECS 1.11.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1428
+- version: "0.3.0"
+ changes:
+ - description: Update integration description
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1364
+- version: "0.2.0"
+ changes:
+ - description: Set "event.module" and "event.dataset"
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1279
+- version: "0.1.5"
+ changes:
+ - description: update to ECS 1.10.0 and adding event.original options
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/1112
+- version: "0.1.4"
+ changes:
+ - description: update to ECS 1.9.0
+ type: enhancement
+ link: https://github.com/elastic/integrations/pull/878
+- version: "0.1.0"
+ changes:
+ - description: initial release
+ type: enhancement # can be one of: enhancement, bugfix, breaking-change
+ link: https://github.com/elastic/package-storage/pull/181
diff --git a/packages/zscaler/0.5.1/data_stream/zia/agent/stream/stream.yml.hbs b/packages/zscaler/0.5.1/data_stream/zia/agent/stream/stream.yml.hbs
new file mode 100755
index 0000000000..398e8368cd
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/agent/stream/stream.yml.hbs
@@ -0,0 +1,2655 @@
+paths:
+{{#each paths as |path i|}}
+ - {{path}}
+{{/each}}
+exclude_files: [".gz$"]
+tags:
+{{#if preserve_original_event}}
+ - preserve_original_event
+{{/if}}
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+fields_under_root: true
+fields:
+ observer:
+ vendor: "Zscaler"
+ product: "Internet"
+ type: "Configuration"
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+processors:
+{{#if processors}}
+{{processors}}
+{{/if}}
+- script:
+ lang: javascript
+ params:
+ ecs: true
+ rsa: {{rsa_fields}}
+ tz_offset: {{tz_offset}}
+ keep_raw: {{keep_raw_fields}}
+ debug: {{debug}}
+ source: |
+ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ // or more contributor license agreements. Licensed under the Elastic License;
+ // you may not use this file except in compliance with the Elastic License.
+
+ /* jshint -W014,-W016,-W097,-W116 */
+
+ var processor = require("processor");
+ var console = require("console");
+
+ var FLAG_FIELD = "log.flags";
+ var FIELDS_OBJECT = "nwparser";
+ var FIELDS_PREFIX = FIELDS_OBJECT + ".";
+
+ var defaults = {
+ debug: false,
+ ecs: true,
+ rsa: false,
+ keep_raw: false,
+ tz_offset: "local",
+ strip_priority: true
+ };
+
+ var saved_flags = null;
+ var debug;
+ var map_ecs;
+ var map_rsa;
+ var keep_raw;
+ var device;
+ var tz_offset;
+ var strip_priority;
+
+ // Register params from configuration.
+ function register(params) {
+ debug = params.debug !== undefined ? params.debug : defaults.debug;
+ map_ecs = params.ecs !== undefined ? params.ecs : defaults.ecs;
+ map_rsa = params.rsa !== undefined ? params.rsa : defaults.rsa;
+ keep_raw = params.keep_raw !== undefined ? params.keep_raw : defaults.keep_raw;
+ tz_offset = parse_tz_offset(params.tz_offset !== undefined? params.tz_offset : defaults.tz_offset);
+ strip_priority = params.strip_priority !== undefined? params.strip_priority : defaults.strip_priority;
+ device = new DeviceProcessor();
+ }
+
+ function parse_tz_offset(offset) {
+ var date;
+ var m;
+ switch(offset) {
+ // local uses the tz offset from the JS VM.
+ case "local":
+ date = new Date();
+ // Reversing the sign as we the offset from UTC, not to UTC.
+ return parse_local_tz_offset(-date.getTimezoneOffset());
+ // event uses the tz offset from event.timezone (add_locale processor).
+ case "event":
+ return offset;
+ // Otherwise a tz offset in the form "[+-][0-9]{4}" is required.
+ default:
+ m = offset.match(/^([+\-])([0-9]{2}):?([0-9]{2})?$/);
+ if (m === null || m.length !== 4) {
+ throw("bad timezone offset: '" + offset + "'. Must have the form +HH:MM");
+ }
+ return m[1] + m[2] + ":" + (m[3]!==undefined? m[3] : "00");
+ }
+ }
+
+ function parse_local_tz_offset(minutes) {
+ var neg = minutes < 0;
+ minutes = Math.abs(minutes);
+ var min = minutes % 60;
+ var hours = Math.floor(minutes / 60);
+ var pad2digit = function(n) {
+ if (n < 10) { return "0" + n;}
+ return "" + n;
+ };
+ return (neg? "-" : "+") + pad2digit(hours) + ":" + pad2digit(min);
+ }
+
+ function process(evt) {
+ // Function register is only called by the processor when `params` are set
+ // in the processor config.
+ if (device === undefined) {
+ register(defaults);
+ }
+ return device.process(evt);
+ }
+
+ function processor_chain(subprocessors) {
+ var builder = new processor.Chain();
+ subprocessors.forEach(builder.Add);
+ return builder.Build().Run;
+ }
+
+ function linear_select(subprocessors) {
+ return function (evt) {
+ var flags = evt.Get(FLAG_FIELD);
+ var i;
+ for (i = 0; i < subprocessors.length; i++) {
+ evt.Delete(FLAG_FIELD);
+ if (debug) console.warn("linear_select trying entry " + i);
+ subprocessors[i](evt);
+ // Dissect processor succeeded?
+ if (evt.Get(FLAG_FIELD) == null) break;
+ if (debug) console.warn("linear_select failed entry " + i);
+ }
+ if (flags !== null) {
+ evt.Put(FLAG_FIELD, flags);
+ }
+ if (debug) {
+ if (i < subprocessors.length) {
+ console.warn("linear_select matched entry " + i);
+ } else {
+ console.warn("linear_select didn't match");
+ }
+ }
+ };
+ }
+
+ function conditional(opt) {
+ return function(evt) {
+ if (opt.if(evt)) {
+ opt.then(evt);
+ } else if (opt.else) {
+ opt.else(evt);
+ }
+ };
+ }
+
+ var strip_syslog_priority = (function() {
+ var isEnabled = function() { return strip_priority === true; };
+ var fetchPRI = field("_pri");
+ var fetchPayload = field("payload");
+ var removePayload = remove(["payload"]);
+ var cleanup = remove(["_pri", "payload"]);
+ var onMatch = function(evt) {
+ var pri, priStr = fetchPRI(evt);
+ if (priStr != null
+ && 0 < priStr.length && priStr.length < 4
+ && !isNaN((pri = Number(priStr)))
+ && 0 <= pri && pri < 192) {
+ var severity = pri & 7,
+ facility = pri >> 3;
+ setc("_severity", "" + severity)(evt);
+ setc("_facility", "" + facility)(evt);
+ // Replace message with priority stripped.
+ evt.Put("message", fetchPayload(evt));
+ removePayload(evt);
+ } else {
+ // not a valid syslog PRI, cleanup.
+ cleanup(evt);
+ }
+ };
+ return conditional({
+ if: isEnabled,
+ then: cleanup_flags(match(
+ "STRIP_PRI",
+ "message",
+ "<%{_pri}>%{payload}",
+ onMatch
+ ))
+ });
+ })();
+
+ function match(id, src, pattern, on_success) {
+ var dissect = new processor.Dissect({
+ field: src,
+ tokenizer: pattern,
+ target_prefix: FIELDS_OBJECT,
+ ignore_failure: true,
+ overwrite_keys: true,
+ trim_values: "right"
+ });
+ return function (evt) {
+ var msg = evt.Get(src);
+ dissect.Run(evt);
+ var failed = evt.Get(FLAG_FIELD) != null;
+ if (debug) {
+ if (failed) {
+ console.debug("dissect fail: " + id + " field:" + src);
+ } else {
+ console.debug("dissect OK: " + id + " field:" + src);
+ }
+ console.debug(" expr: <<" + pattern + ">>");
+ console.debug(" input: <<" + msg + ">>");
+ }
+ if (on_success != null && !failed) {
+ on_success(evt);
+ }
+ };
+ }
+
+ function match_copy(id, src, dst, on_success) {
+ dst = FIELDS_PREFIX + dst;
+ if (dst === FIELDS_PREFIX || dst === src) {
+ return function (evt) {
+ if (debug) {
+ console.debug("noop OK: " + id + " field:" + src);
+ console.debug(" input: <<" + evt.Get(src) + ">>");
+ }
+ if (on_success != null) on_success(evt);
+ }
+ }
+ return function (evt) {
+ var msg = evt.Get(src);
+ evt.Put(dst, msg);
+ if (debug) {
+ console.debug("copy OK: " + id + " field:" + src);
+ console.debug(" target: '" + dst + "'");
+ console.debug(" input: <<" + msg + ">>");
+ }
+ if (on_success != null) on_success(evt);
+ }
+ }
+
+ function cleanup_flags(processor) {
+ return function(evt) {
+ processor(evt);
+ evt.Delete(FLAG_FIELD);
+ };
+ }
+
+ function all_match(opts) {
+ return function (evt) {
+ var i;
+ for (i = 0; i < opts.processors.length; i++) {
+ evt.Delete(FLAG_FIELD);
+ opts.processors[i](evt);
+ // Dissect processor succeeded?
+ if (evt.Get(FLAG_FIELD) != null) {
+ if (debug) console.warn("all_match failure at " + i);
+ if (opts.on_failure != null) opts.on_failure(evt);
+ return;
+ }
+ if (debug) console.warn("all_match success at " + i);
+ }
+ if (opts.on_success != null) opts.on_success(evt);
+ };
+ }
+
+ function msgid_select(mapping) {
+ return function (evt) {
+ var msgid = evt.Get(FIELDS_PREFIX + "messageid");
+ if (msgid == null) {
+ if (debug) console.warn("msgid_select: no messageid captured!");
+ return;
+ }
+ var next = mapping[msgid];
+ if (next === undefined) {
+ if (debug) console.warn("msgid_select: no mapping for messageid:" + msgid);
+ return;
+ }
+ if (debug) console.info("msgid_select: matched key=" + msgid);
+ return next(evt);
+ };
+ }
+
+ function msg(msg_id, match) {
+ return function (evt) {
+ match(evt);
+ if (evt.Get(FLAG_FIELD) == null) {
+ evt.Put(FIELDS_PREFIX + "msg_id1", msg_id);
+ }
+ };
+ }
+
+ var start;
+
+ function save_flags(evt) {
+ saved_flags = evt.Get(FLAG_FIELD);
+ evt.Put("event.original", evt.Get("message"));
+ }
+
+ function restore_flags(evt) {
+ if (saved_flags !== null) {
+ evt.Put(FLAG_FIELD, saved_flags);
+ }
+ evt.Delete("message");
+ }
+
+ function constant(value) {
+ return function (evt) {
+ return value;
+ };
+ }
+
+ function field(name) {
+ var fullname = FIELDS_PREFIX + name;
+ return function (evt) {
+ return evt.Get(fullname);
+ };
+ }
+
+ function STRCAT(args) {
+ var s = "";
+ var i;
+ for (i = 0; i < args.length; i++) {
+ s += args[i];
+ }
+ return s;
+ }
+
+ // TODO: Implement
+ function DIRCHK(args) {
+ unimplemented("DIRCHK");
+ }
+
+ function strictToInt(str) {
+ return str * 1;
+ }
+
+ function CALC(args) {
+ if (args.length !== 3) {
+ console.warn("skipped call to CALC with " + args.length + " arguments.");
+ return;
+ }
+ var a = strictToInt(args[0]);
+ var b = strictToInt(args[2]);
+ if (isNaN(a) || isNaN(b)) {
+ console.warn("failed evaluating CALC arguments a='" + args[0] + "' b='" + args[2] + "'.");
+ return;
+ }
+ var result;
+ switch (args[1]) {
+ case "+":
+ result = a + b;
+ break;
+ case "-":
+ result = a - b;
+ break;
+ case "*":
+ result = a * b;
+ break;
+ default:
+ // Only * and + seen in the parsers.
+ console.warn("unknown CALC operation '" + args[1] + "'.");
+ return;
+ }
+ // Always return a string
+ return result !== undefined ? "" + result : result;
+ }
+
+ var quoteChars = "\"'`";
+ function RMQ(args) {
+ if(args.length !== 1) {
+ console.warn("RMQ: only one argument expected");
+ return;
+ }
+ var value = args[0].trim();
+ var n = value.length;
+ var char;
+ return n > 1
+ && (char=value.charAt(0)) === value.charAt(n-1)
+ && quoteChars.indexOf(char) !== -1?
+ value.substr(1, n-2)
+ : value;
+ }
+
+ function call(opts) {
+ var args = new Array(opts.args.length);
+ return function (evt) {
+ for (var i = 0; i < opts.args.length; i++)
+ if ((args[i] = opts.args[i](evt)) == null) return;
+ var result = opts.fn(args);
+ if (result != null) {
+ evt.Put(opts.dest, result);
+ }
+ };
+ }
+
+ function nop(evt) {
+ }
+
+ function appendErrorMsg(evt, msg) {
+ var value = evt.Get("error.message");
+ if (value == null) {
+ value = [msg];
+ } else if (msg instanceof Array) {
+ value.push(msg);
+ } else {
+ value = [value, msg];
+ }
+ evt.Put("error.message", value);
+ }
+
+ function unimplemented(name) {
+ appendErrorMsg("unimplemented feature: " + name);
+ }
+
+ function lookup(opts) {
+ return function (evt) {
+ var key = opts.key(evt);
+ if (key == null) return;
+ var value = opts.map.keyvaluepairs[key];
+ if (value === undefined) {
+ value = opts.map.default;
+ }
+ if (value !== undefined) {
+ evt.Put(opts.dest, value(evt));
+ }
+ };
+ }
+
+ function set(fields) {
+ return new processor.AddFields({
+ target: FIELDS_OBJECT,
+ fields: fields,
+ });
+ }
+
+ function setf(dst, src) {
+ return function (evt) {
+ var val = evt.Get(FIELDS_PREFIX + src);
+ if (val != null) evt.Put(FIELDS_PREFIX + dst, val);
+ };
+ }
+
+ function setc(dst, value) {
+ return function (evt) {
+ evt.Put(FIELDS_PREFIX + dst, value);
+ };
+ }
+
+ function set_field(opts) {
+ return function (evt) {
+ var val = opts.value(evt);
+ if (val != null) evt.Put(opts.dest, val);
+ };
+ }
+
+ function dump(label) {
+ return function (evt) {
+ console.log("Dump of event at " + label + ": " + JSON.stringify(evt, null, "\t"));
+ };
+ }
+
+ function date_time_join_args(evt, arglist) {
+ var str = "";
+ for (var i = 0; i < arglist.length; i++) {
+ var fname = FIELDS_PREFIX + arglist[i];
+ var val = evt.Get(fname);
+ if (val != null) {
+ if (str !== "") str += " ";
+ str += val;
+ } else {
+ if (debug) console.warn("in date_time: input arg " + fname + " is not set");
+ }
+ }
+ return str;
+ }
+
+ function to2Digit(num) {
+ return num? (num < 10? "0" + num : num) : "00";
+ }
+
+ // Make two-digit dates 00-69 interpreted as 2000-2069
+ // and dates 70-99 translated to 1970-1999.
+ var twoDigitYearEpoch = 70;
+ var twoDigitYearCentury = 2000;
+
+ // This is to accept dates up to 2 days in the future, only used when
+ // no year is specified in a date. 2 days should be enough to account for
+ // time differences between systems and different tz offsets.
+ var maxFutureDelta = 2*24*60*60*1000;
+
+ // DateContainer stores date fields and then converts those fields into
+ // a Date. Necessary because building a Date using its set() methods gives
+ // different results depending on the order of components.
+ function DateContainer(tzOffset) {
+ this.offset = tzOffset === undefined? "Z" : tzOffset;
+ }
+
+ DateContainer.prototype = {
+ setYear: function(v) {this.year = v;},
+ setMonth: function(v) {this.month = v;},
+ setDay: function(v) {this.day = v;},
+ setHours: function(v) {this.hours = v;},
+ setMinutes: function(v) {this.minutes = v;},
+ setSeconds: function(v) {this.seconds = v;},
+
+ setUNIX: function(v) {this.unix = v;},
+
+ set2DigitYear: function(v) {
+ this.year = v < twoDigitYearEpoch? twoDigitYearCentury + v : twoDigitYearCentury + v - 100;
+ },
+
+ toDate: function() {
+ if (this.unix !== undefined) {
+ return new Date(this.unix * 1000);
+ }
+ if (this.day === undefined || this.month === undefined) {
+ // Can't make a date from this.
+ return undefined;
+ }
+ if (this.year === undefined) {
+ // A date without a year. Set current year, or previous year
+ // if date would be in the future.
+ var now = new Date();
+ this.year = now.getFullYear();
+ var date = this.toDate();
+ if (date.getTime() - now.getTime() > maxFutureDelta) {
+ date.setFullYear(now.getFullYear() - 1);
+ }
+ return date;
+ }
+ var MM = to2Digit(this.month);
+ var DD = to2Digit(this.day);
+ var hh = to2Digit(this.hours);
+ var mm = to2Digit(this.minutes);
+ var ss = to2Digit(this.seconds);
+ return new Date(this.year + "-" + MM + "-" + DD + "T" + hh + ":" + mm + ":" + ss + this.offset);
+ }
+ }
+
+ function date_time_try_pattern(fmt, str, tzOffset) {
+ var date = new DateContainer(tzOffset);
+ var pos = date_time_try_pattern_at_pos(fmt, str, 0, date);
+ return pos !== undefined? date.toDate() : undefined;
+ }
+
+ function date_time_try_pattern_at_pos(fmt, str, pos, date) {
+ var len = str.length;
+ for (var proc = 0; pos !== undefined && pos < len && proc < fmt.length; proc++) {
+ pos = fmt[proc](str, pos, date);
+ }
+ return pos;
+ }
+
+ function date_time(opts) {
+ return function (evt) {
+ var tzOffset = opts.tz || tz_offset;
+ if (tzOffset === "event") {
+ tzOffset = evt.Get("event.timezone");
+ }
+ var str = date_time_join_args(evt, opts.args);
+ for (var i = 0; i < opts.fmts.length; i++) {
+ var date = date_time_try_pattern(opts.fmts[i], str, tzOffset);
+ if (date !== undefined) {
+ evt.Put(FIELDS_PREFIX + opts.dest, date);
+ return;
+ }
+ }
+ if (debug) console.warn("in date_time: id=" + opts.id + " FAILED: " + str);
+ };
+ }
+
+ var uA = 60 * 60 * 24;
+ var uD = 60 * 60 * 24;
+ var uF = 60 * 60;
+ var uG = 60 * 60 * 24 * 30;
+ var uH = 60 * 60;
+ var uI = 60 * 60;
+ var uJ = 60 * 60 * 24;
+ var uM = 60 * 60 * 24 * 30;
+ var uN = 60 * 60;
+ var uO = 1;
+ var uS = 1;
+ var uT = 60;
+ var uU = 60;
+ var uc = dc;
+
+ function duration(opts) {
+ return function(evt) {
+ var str = date_time_join_args(evt, opts.args);
+ for (var i = 0; i < opts.fmts.length; i++) {
+ var seconds = duration_try_pattern(opts.fmts[i], str);
+ if (seconds !== undefined) {
+ evt.Put(FIELDS_PREFIX + opts.dest, seconds);
+ return;
+ }
+ }
+ if (debug) console.warn("in duration: id=" + opts.id + " (s) FAILED: " + str);
+ };
+ }
+
+ function duration_try_pattern(fmt, str) {
+ var secs = 0;
+ var pos = 0;
+ for (var i=0; i [ month_id , how many chars to skip if month in long form ]
+ "Jan": [0, 4],
+ "Feb": [1, 5],
+ "Mar": [2, 2],
+ "Apr": [3, 2],
+ "May": [4, 0],
+ "Jun": [5, 1],
+ "Jul": [6, 1],
+ "Aug": [7, 3],
+ "Sep": [8, 6],
+ "Oct": [9, 4],
+ "Nov": [10, 5],
+ "Dec": [11, 4],
+ "jan": [0, 4],
+ "feb": [1, 5],
+ "mar": [2, 2],
+ "apr": [3, 2],
+ "may": [4, 0],
+ "jun": [5, 1],
+ "jul": [6, 1],
+ "aug": [7, 3],
+ "sep": [8, 6],
+ "oct": [9, 4],
+ "nov": [10, 5],
+ "dec": [11, 4],
+ };
+
+ // var dC = undefined;
+ var dR = dateMonthName(true);
+ var dB = dateMonthName(false);
+ var dM = dateFixedWidthNumber("M", 2, 1, 12, DateContainer.prototype.setMonth);
+ var dG = dateVariableWidthNumber("G", 1, 12, DateContainer.prototype.setMonth);
+ var dD = dateFixedWidthNumber("D", 2, 1, 31, DateContainer.prototype.setDay);
+ var dF = dateVariableWidthNumber("F", 1, 31, DateContainer.prototype.setDay);
+ var dH = dateFixedWidthNumber("H", 2, 0, 24, DateContainer.prototype.setHours);
+ var dI = dateVariableWidthNumber("I", 0, 24, DateContainer.prototype.setHours); // Accept hours >12
+ var dN = dateVariableWidthNumber("N", 0, 24, DateContainer.prototype.setHours);
+ var dT = dateFixedWidthNumber("T", 2, 0, 59, DateContainer.prototype.setMinutes);
+ var dU = dateVariableWidthNumber("U", 0, 59, DateContainer.prototype.setMinutes);
+ var dP = parseAMPM; // AM|PM
+ var dQ = parseAMPM; // A.M.|P.M
+ var dS = dateFixedWidthNumber("S", 2, 0, 60, DateContainer.prototype.setSeconds);
+ var dO = dateVariableWidthNumber("O", 0, 60, DateContainer.prototype.setSeconds);
+ var dY = dateFixedWidthNumber("Y", 2, 0, 99, DateContainer.prototype.set2DigitYear);
+ var dW = dateFixedWidthNumber("W", 4, 1000, 9999, DateContainer.prototype.setYear);
+ var dZ = parseHMS;
+ var dX = dateVariableWidthNumber("X", 0, 0x10000000000, DateContainer.prototype.setUNIX);
+
+ // parseAMPM parses "A.M", "AM", "P.M", "PM" from logs.
+ // Only works if this modifier appears after the hour has been read from logs
+ // which is always the case in the 300 devices.
+ function parseAMPM(str, pos, date) {
+ var n = str.length;
+ var start = skipws(str, pos);
+ if (start + 2 > n) return;
+ var head = str.substr(start, 2).toUpperCase();
+ var isPM = false;
+ var skip = false;
+ switch (head) {
+ case "A.":
+ skip = true;
+ /* falls through */
+ case "AM":
+ break;
+ case "P.":
+ skip = true;
+ /* falls through */
+ case "PM":
+ isPM = true;
+ break;
+ default:
+ if (debug) console.warn("can't parse pos " + start + " as AM/PM: " + str + "(head:" + head + ")");
+ return;
+ }
+ pos = start + 2;
+ if (skip) {
+ if (pos+2 > n || str.substr(pos, 2).toUpperCase() !== "M.") {
+ if (debug) console.warn("can't parse pos " + start + " as AM/PM: " + str + "(tail)");
+ return;
+ }
+ pos += 2;
+ }
+ var hh = date.hours;
+ if (isPM) {
+ // Accept existing hour in 24h format.
+ if (hh < 12) hh += 12;
+ } else {
+ if (hh === 12) hh = 0;
+ }
+ date.setHours(hh);
+ return pos;
+ }
+
+ function parseHMS(str, pos, date) {
+ return date_time_try_pattern_at_pos([dN, dc(":"), dU, dc(":"), dO], str, pos, date);
+ }
+
+ function skipws(str, pos) {
+ for ( var n = str.length;
+ pos < n && str.charAt(pos) === " ";
+ pos++)
+ ;
+ return pos;
+ }
+
+ function skipdigits(str, pos) {
+ var c;
+ for (var n = str.length;
+ pos < n && (c = str.charAt(pos)) >= "0" && c <= "9";
+ pos++)
+ ;
+ return pos;
+ }
+
+ function dSkip(str, pos, date) {
+ var chr;
+ for (;pos < str.length && (chr=str[pos])<'0' || chr>'9'; pos++) {}
+ return pos < str.length? pos : undefined;
+ }
+
+ function dateVariableWidthNumber(fmtChar, min, max, setter) {
+ return function (str, pos, date) {
+ var start = skipws(str, pos);
+ pos = skipdigits(str, start);
+ var s = str.substr(start, pos - start);
+ var value = parseInt(s, 10);
+ if (value >= min && value <= max) {
+ setter.call(date, value);
+ return pos;
+ }
+ return;
+ };
+ }
+
+ function dateFixedWidthNumber(fmtChar, width, min, max, setter) {
+ return function (str, pos, date) {
+ pos = skipws(str, pos);
+ var n = str.length;
+ if (pos + width > n) return;
+ var s = str.substr(pos, width);
+ var value = parseInt(s, 10);
+ if (value >= min && value <= max) {
+ setter.call(date, value);
+ return pos + width;
+ }
+ return;
+ };
+ }
+
+ // Short month name (Jan..Dec).
+ function dateMonthName(long) {
+ return function (str, pos, date) {
+ pos = skipws(str, pos);
+ var n = str.length;
+ if (pos + 3 > n) return;
+ var mon = str.substr(pos, 3);
+ var idx = shortMonths[mon];
+ if (idx === undefined) {
+ idx = shortMonths[mon.toLowerCase()];
+ }
+ if (idx === undefined) {
+ //console.warn("parsing date_time: '" + mon + "' is not a valid short month (%B)");
+ return;
+ }
+ date.setMonth(idx[0]+1);
+ return pos + 3 + (long ? idx[1] : 0);
+ };
+ }
+
+ function url_wrapper(dst, src, fn) {
+ return function(evt) {
+ var value = evt.Get(FIELDS_PREFIX + src), result;
+ if (value != null && (result = fn(value))!== undefined) {
+ evt.Put(FIELDS_PREFIX + dst, result);
+ } else {
+ console.debug(fn.name + " failed for '" + value + "'");
+ }
+ };
+ }
+
+ // The following regular expression for parsing URLs from:
+ // https://github.com/wizard04wsu/URI_Parsing
+ //
+ // The MIT License (MIT)
+ //
+ // Copyright (c) 2014 Andrew Harrison
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a copy of
+ // this software and associated documentation files (the "Software"), to deal in
+ // the Software without restriction, including without limitation the rights to
+ // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ // the Software, and to permit persons to whom the Software is furnished to do so,
+ // subject to the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included in all
+ // copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ var uriRegExp = /^([a-z][a-z0-9+.\-]*):(?:\/\/((?:(?=((?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9A-F]{2})*))(\3)@)?(?=(\[[0-9A-F:.]{2,}\]|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9A-F]{2})*))\5(?::(?=(\d*))\6)?)(\/(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\8)?|(\/?(?!\/)(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\10)?)(?:\?(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\11)?(?:#(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\12)?$/i;
+
+ var uriScheme = 1;
+ var uriDomain = 5;
+ var uriPort = 6;
+ var uriPath = 7;
+ var uriPathAlt = 9;
+ var uriQuery = 11;
+
+ function domain(dst, src) {
+ return url_wrapper(dst, src, extract_domain);
+ }
+
+ function split_url(value) {
+ var m = value.match(uriRegExp);
+ if (m && m[uriDomain]) return m;
+ // Support input in the form "www.example.net/path", but not "/path".
+ m = ("null://" + value).match(uriRegExp);
+ if (m) return m;
+ }
+
+ function extract_domain(value) {
+ var m = split_url(value);
+ if (m && m[uriDomain]) return m[uriDomain];
+ }
+
+ var extFromPage = /\.[^.]+$/;
+ function extract_ext(value) {
+ var page = extract_page(value);
+ if (page) {
+ var m = page.match(extFromPage);
+ if (m) return m[0];
+ }
+ }
+
+ function ext(dst, src) {
+ return url_wrapper(dst, src, extract_ext);
+ }
+
+ function fqdn(dst, src) {
+ // TODO: fqdn and domain(eTLD+1) are currently the same.
+ return domain(dst, src);
+ }
+
+ var pageFromPathRegExp = /\/([^\/]+)$/;
+ var pageName = 1;
+
+ function extract_page(value) {
+ value = extract_path(value);
+ if (!value) return undefined;
+ var m = value.match(pageFromPathRegExp);
+ if (m) return m[pageName];
+ }
+
+ function page(dst, src) {
+ return url_wrapper(dst, src, extract_page);
+ }
+
+ function extract_path(value) {
+ var m = split_url(value);
+ return m? m[uriPath] || m[uriPathAlt] : undefined;
+ }
+
+ function path(dst, src) {
+ return url_wrapper(dst, src, extract_path);
+ }
+
+ // Map common schemes to their default port.
+ // port has to be a string (will be converted at a later stage).
+ var schemePort = {
+ "ftp": "21",
+ "ssh": "22",
+ "http": "80",
+ "https": "443",
+ };
+
+ function extract_port(value) {
+ var m = split_url(value);
+ if (!m) return undefined;
+ if (m[uriPort]) return m[uriPort];
+ if (m[uriScheme]) {
+ return schemePort[m[uriScheme]];
+ }
+ }
+
+ function port(dst, src) {
+ return url_wrapper(dst, src, extract_port);
+ }
+
+ function extract_query(value) {
+ var m = split_url(value);
+ if (m && m[uriQuery]) return m[uriQuery];
+ }
+
+ function query(dst, src) {
+ return url_wrapper(dst, src, extract_query);
+ }
+
+ function extract_root(value) {
+ var m = split_url(value);
+ if (m && m[uriDomain] && m[uriDomain]) {
+ var scheme = m[uriScheme] && m[uriScheme] !== "null"?
+ m[uriScheme] + "://" : "";
+ var port = m[uriPort]? ":" + m[uriPort] : "";
+ return scheme + m[uriDomain] + port;
+ }
+ }
+
+ function root(dst, src) {
+ return url_wrapper(dst, src, extract_root);
+ }
+
+ function tagval(id, src, cfg, keys, on_success) {
+ var fail = function(evt) {
+ evt.Put(FLAG_FIELD, "tagval_parsing_error");
+ }
+ if (cfg.kv_separator.length !== 1) {
+ throw("Invalid TAGVALMAP ValueDelimiter (must have 1 character)");
+ }
+ var quotes_len = cfg.open_quote.length > 0 && cfg.close_quote.length > 0?
+ cfg.open_quote.length + cfg.close_quote.length : 0;
+ var kv_regex = new RegExp('^([^' + cfg.kv_separator + ']*)*' + cfg.kv_separator + ' *(.*)*$');
+ return function(evt) {
+ var msg = evt.Get(src);
+ if (msg === undefined) {
+ console.warn("tagval: input field is missing");
+ return fail(evt);
+ }
+ var pairs = msg.split(cfg.pair_separator);
+ var i;
+ var success = false;
+ var prev = "";
+ for (i=0; i 0 &&
+ value.length >= cfg.open_quote.length + cfg.close_quote.length &&
+ value.substr(0, cfg.open_quote.length) === cfg.open_quote &&
+ value.substr(value.length - cfg.close_quote.length) === cfg.close_quote) {
+ value = value.substr(cfg.open_quote.length, value.length - quotes_len);
+ }
+ evt.Put(FIELDS_PREFIX + field, value);
+ success = true;
+ }
+ if (!success) {
+ return fail(evt);
+ }
+ if (on_success != null) {
+ on_success(evt);
+ }
+ }
+ }
+
+ var ecs_mappings = {
+ "_facility": {convert: to_long, to:[{field: "log.syslog.facility.code", setter: fld_set}]},
+ "_pri": {convert: to_long, to:[{field: "log.syslog.priority", setter: fld_set}]},
+ "_severity": {convert: to_long, to:[{field: "log.syslog.severity.code", setter: fld_set}]},
+ "action": {to:[{field: "event.action", setter: fld_prio, prio: 0}]},
+ "administrator": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 4}]},
+ "alias.ip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 3},{field: "related.ip", setter: fld_append}]},
+ "alias.ipv6": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 4},{field: "related.ip", setter: fld_append}]},
+ "alias.mac": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 1}]},
+ "application": {to:[{field: "network.application", setter: fld_set}]},
+ "bytes": {convert: to_long, to:[{field: "network.bytes", setter: fld_set}]},
+ "c_domain": {to:[{field: "source.domain", setter: fld_prio, prio: 1}]},
+ "c_logon_id": {to:[{field: "user.id", setter: fld_prio, prio: 2}]},
+ "c_user_name": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 8}]},
+ "c_username": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 2}]},
+ "cctld": {to:[{field: "url.top_level_domain", setter: fld_prio, prio: 1}]},
+ "child_pid": {convert: to_long, to:[{field: "process.pid", setter: fld_prio, prio: 1}]},
+ "child_pid_val": {to:[{field: "process.title", setter: fld_set}]},
+ "child_process": {to:[{field: "process.name", setter: fld_prio, prio: 1}]},
+ "city.dst": {to:[{field: "destination.geo.city_name", setter: fld_set}]},
+ "city.src": {to:[{field: "source.geo.city_name", setter: fld_set}]},
+ "daddr": {convert: to_ip, to:[{field: "destination.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "daddr_v6": {convert: to_ip, to:[{field: "destination.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "ddomain": {to:[{field: "destination.domain", setter: fld_prio, prio: 0}]},
+ "devicehostip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 2},{field: "related.ip", setter: fld_append}]},
+ "devicehostmac": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 0}]},
+ "dhost": {to:[{field: "destination.address", setter: fld_set},{field: "related.hosts", setter: fld_append}]},
+ "dinterface": {to:[{field: "observer.egress.interface.name", setter: fld_set}]},
+ "direction": {to:[{field: "network.direction", setter: fld_set}]},
+ "directory": {to:[{field: "file.directory", setter: fld_set}]},
+ "dmacaddr": {convert: to_mac, to:[{field: "destination.mac", setter: fld_set}]},
+ "dns.responsetype": {to:[{field: "dns.answers.type", setter: fld_set}]},
+ "dns.resptext": {to:[{field: "dns.answers.name", setter: fld_set}]},
+ "dns_querytype": {to:[{field: "dns.question.type", setter: fld_set}]},
+ "domain": {to:[{field: "server.domain", setter: fld_prio, prio: 0},{field: "related.hosts", setter: fld_append}]},
+ "domain.dst": {to:[{field: "destination.domain", setter: fld_prio, prio: 1}]},
+ "domain.src": {to:[{field: "source.domain", setter: fld_prio, prio: 2}]},
+ "domain_id": {to:[{field: "user.domain", setter: fld_set}]},
+ "domainname": {to:[{field: "server.domain", setter: fld_prio, prio: 1}]},
+ "dport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 0}]},
+ "dtransaddr": {convert: to_ip, to:[{field: "destination.nat.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "dtransport": {convert: to_long, to:[{field: "destination.nat.port", setter: fld_prio, prio: 0}]},
+ "ec_outcome": {to:[{field: "event.outcome", setter: fld_ecs_outcome}]},
+ "event_description": {to:[{field: "message", setter: fld_prio, prio: 0}]},
+ "event_source": {to:[{field: "related.hosts", setter: fld_append}]},
+ "event_time": {convert: to_date, to:[{field: "@timestamp", setter: fld_set}]},
+ "event_type": {to:[{field: "event.action", setter: fld_prio, prio: 1}]},
+ "extension": {to:[{field: "file.extension", setter: fld_prio, prio: 1}]},
+ "file.attributes": {to:[{field: "file.attributes", setter: fld_set}]},
+ "filename": {to:[{field: "file.name", setter: fld_prio, prio: 0}]},
+ "filename_size": {convert: to_long, to:[{field: "file.size", setter: fld_set}]},
+ "filepath": {to:[{field: "file.path", setter: fld_set}]},
+ "filetype": {to:[{field: "file.type", setter: fld_set}]},
+ "fqdn": {to:[{field: "related.hosts", setter: fld_append}]},
+ "group": {to:[{field: "group.name", setter: fld_set}]},
+ "groupid": {to:[{field: "group.id", setter: fld_set}]},
+ "host": {to:[{field: "host.name", setter: fld_prio, prio: 1},{field: "related.hosts", setter: fld_append}]},
+ "hostip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "hostip_v6": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "hostname": {to:[{field: "host.name", setter: fld_prio, prio: 0}]},
+ "id": {to:[{field: "event.code", setter: fld_prio, prio: 0}]},
+ "interface": {to:[{field: "network.interface.name", setter: fld_set}]},
+ "ip.orig": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "ip.trans.dst": {convert: to_ip, to:[{field: "destination.nat.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "ip.trans.src": {convert: to_ip, to:[{field: "source.nat.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "ipv6.orig": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 2},{field: "related.ip", setter: fld_append}]},
+ "latdec_dst": {convert: to_double, to:[{field: "destination.geo.location.lat", setter: fld_set}]},
+ "latdec_src": {convert: to_double, to:[{field: "source.geo.location.lat", setter: fld_set}]},
+ "location_city": {to:[{field: "geo.city_name", setter: fld_set}]},
+ "location_country": {to:[{field: "geo.country_name", setter: fld_set}]},
+ "location_desc": {to:[{field: "geo.name", setter: fld_set}]},
+ "location_dst": {to:[{field: "destination.geo.country_name", setter: fld_set}]},
+ "location_src": {to:[{field: "source.geo.country_name", setter: fld_set}]},
+ "location_state": {to:[{field: "geo.region_name", setter: fld_set}]},
+ "logon_id": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 5}]},
+ "longdec_dst": {convert: to_double, to:[{field: "destination.geo.location.lon", setter: fld_set}]},
+ "longdec_src": {convert: to_double, to:[{field: "source.geo.location.lon", setter: fld_set}]},
+ "macaddr": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 2}]},
+ "messageid": {to:[{field: "event.code", setter: fld_prio, prio: 1}]},
+ "method": {to:[{field: "http.request.method", setter: fld_set}]},
+ "msg": {to:[{field: "message", setter: fld_set}]},
+ "orig_ip": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "owner": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 6}]},
+ "packets": {convert: to_long, to:[{field: "network.packets", setter: fld_set}]},
+ "parent_pid": {convert: to_long, to:[{field: "process.parent.pid", setter: fld_prio, prio: 0}]},
+ "parent_pid_val": {to:[{field: "process.parent.title", setter: fld_set}]},
+ "parent_process": {to:[{field: "process.parent.name", setter: fld_prio, prio: 0}]},
+ "patient_fullname": {to:[{field: "user.full_name", setter: fld_prio, prio: 1}]},
+ "port.dst": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 1}]},
+ "port.src": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 1}]},
+ "port.trans.dst": {convert: to_long, to:[{field: "destination.nat.port", setter: fld_prio, prio: 1}]},
+ "port.trans.src": {convert: to_long, to:[{field: "source.nat.port", setter: fld_prio, prio: 1}]},
+ "process": {to:[{field: "process.name", setter: fld_prio, prio: 0}]},
+ "process_id": {convert: to_long, to:[{field: "process.pid", setter: fld_prio, prio: 0}]},
+ "process_id_src": {convert: to_long, to:[{field: "process.parent.pid", setter: fld_prio, prio: 1}]},
+ "process_src": {to:[{field: "process.parent.name", setter: fld_prio, prio: 1}]},
+ "product": {to:[{field: "observer.product", setter: fld_set}]},
+ "protocol": {to:[{field: "network.protocol", setter: fld_set}]},
+ "query": {to:[{field: "url.query", setter: fld_prio, prio: 2}]},
+ "rbytes": {convert: to_long, to:[{field: "destination.bytes", setter: fld_set}]},
+ "referer": {to:[{field: "http.request.referrer", setter: fld_prio, prio: 1}]},
+ "rulename": {to:[{field: "rule.name", setter: fld_set}]},
+ "saddr": {convert: to_ip, to:[{field: "source.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "saddr_v6": {convert: to_ip, to:[{field: "source.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "sbytes": {convert: to_long, to:[{field: "source.bytes", setter: fld_set}]},
+ "sdomain": {to:[{field: "source.domain", setter: fld_prio, prio: 0}]},
+ "service": {to:[{field: "service.name", setter: fld_prio, prio: 1}]},
+ "service.name": {to:[{field: "service.name", setter: fld_prio, prio: 0}]},
+ "service_account": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 7}]},
+ "severity": {to:[{field: "log.level", setter: fld_set}]},
+ "shost": {to:[{field: "host.hostname", setter: fld_set},{field: "source.address", setter: fld_set},{field: "related.hosts", setter: fld_append}]},
+ "sinterface": {to:[{field: "observer.ingress.interface.name", setter: fld_set}]},
+ "sld": {to:[{field: "url.registered_domain", setter: fld_set}]},
+ "smacaddr": {convert: to_mac, to:[{field: "source.mac", setter: fld_set}]},
+ "sport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 0}]},
+ "stransaddr": {convert: to_ip, to:[{field: "source.nat.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "stransport": {convert: to_long, to:[{field: "source.nat.port", setter: fld_prio, prio: 0}]},
+ "tcp.dstport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 2}]},
+ "tcp.srcport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 2}]},
+ "timezone": {to:[{field: "event.timezone", setter: fld_set}]},
+ "tld": {to:[{field: "url.top_level_domain", setter: fld_prio, prio: 0}]},
+ "udp.dstport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 3}]},
+ "udp.srcport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 3}]},
+ "uid": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 3}]},
+ "url": {to:[{field: "url.original", setter: fld_prio, prio: 1}]},
+ "url_raw": {to:[{field: "url.original", setter: fld_prio, prio: 0}]},
+ "urldomain": {to:[{field: "url.domain", setter: fld_prio, prio: 0}]},
+ "urlquery": {to:[{field: "url.query", setter: fld_prio, prio: 0}]},
+ "user": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 0}]},
+ "user.id": {to:[{field: "user.id", setter: fld_prio, prio: 1}]},
+ "user_agent": {to:[{field: "user_agent.original", setter: fld_set}]},
+ "user_fullname": {to:[{field: "user.full_name", setter: fld_prio, prio: 0}]},
+ "user_id": {to:[{field: "user.id", setter: fld_prio, prio: 0}]},
+ "username": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 1}]},
+ "version": {to:[{field: "observer.version", setter: fld_set}]},
+ "web_domain": {to:[{field: "url.domain", setter: fld_prio, prio: 1},{field: "related.hosts", setter: fld_append}]},
+ "web_extension": {to:[{field: "file.extension", setter: fld_prio, prio: 0}]},
+ "web_query": {to:[{field: "url.query", setter: fld_prio, prio: 1}]},
+ "web_ref_domain": {to:[{field: "related.hosts", setter: fld_append}]},
+ "web_referer": {to:[{field: "http.request.referrer", setter: fld_prio, prio: 0}]},
+ "web_root": {to:[{field: "url.path", setter: fld_set}]},
+ "webpage": {to:[{field: "file.name", setter: fld_prio, prio: 1}]},
+ };
+
+ var rsa_mappings = {
+ "access_point": {to:[{field: "rsa.wireless.access_point", setter: fld_set}]},
+ "accesses": {to:[{field: "rsa.identity.accesses", setter: fld_set}]},
+ "acl_id": {to:[{field: "rsa.misc.acl_id", setter: fld_set}]},
+ "acl_op": {to:[{field: "rsa.misc.acl_op", setter: fld_set}]},
+ "acl_pos": {to:[{field: "rsa.misc.acl_pos", setter: fld_set}]},
+ "acl_table": {to:[{field: "rsa.misc.acl_table", setter: fld_set}]},
+ "action": {to:[{field: "rsa.misc.action", setter: fld_append}]},
+ "ad_computer_dst": {to:[{field: "rsa.network.ad_computer_dst", setter: fld_set}]},
+ "addr": {to:[{field: "rsa.network.addr", setter: fld_set}]},
+ "admin": {to:[{field: "rsa.misc.admin", setter: fld_set}]},
+ "agent": {to:[{field: "rsa.misc.client", setter: fld_prio, prio: 0}]},
+ "agent.id": {to:[{field: "rsa.misc.agent_id", setter: fld_set}]},
+ "alarm_id": {to:[{field: "rsa.misc.alarm_id", setter: fld_set}]},
+ "alarmname": {to:[{field: "rsa.misc.alarmname", setter: fld_set}]},
+ "alert": {to:[{field: "rsa.threat.alert", setter: fld_set}]},
+ "alert_id": {to:[{field: "rsa.misc.alert_id", setter: fld_set}]},
+ "alias.host": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "analysis.file": {to:[{field: "rsa.investigations.analysis_file", setter: fld_set}]},
+ "analysis.service": {to:[{field: "rsa.investigations.analysis_service", setter: fld_set}]},
+ "analysis.session": {to:[{field: "rsa.investigations.analysis_session", setter: fld_set}]},
+ "app_id": {to:[{field: "rsa.misc.app_id", setter: fld_set}]},
+ "attachment": {to:[{field: "rsa.file.attachment", setter: fld_set}]},
+ "audit": {to:[{field: "rsa.misc.audit", setter: fld_set}]},
+ "audit_class": {to:[{field: "rsa.internal.audit_class", setter: fld_set}]},
+ "audit_object": {to:[{field: "rsa.misc.audit_object", setter: fld_set}]},
+ "auditdata": {to:[{field: "rsa.misc.auditdata", setter: fld_set}]},
+ "authmethod": {to:[{field: "rsa.identity.auth_method", setter: fld_set}]},
+ "autorun_type": {to:[{field: "rsa.misc.autorun_type", setter: fld_set}]},
+ "bcc": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "benchmark": {to:[{field: "rsa.misc.benchmark", setter: fld_set}]},
+ "binary": {to:[{field: "rsa.file.binary", setter: fld_set}]},
+ "boc": {to:[{field: "rsa.investigations.boc", setter: fld_set}]},
+ "bssid": {to:[{field: "rsa.wireless.wlan_ssid", setter: fld_prio, prio: 1}]},
+ "bypass": {to:[{field: "rsa.misc.bypass", setter: fld_set}]},
+ "c_sid": {to:[{field: "rsa.identity.user_sid_src", setter: fld_set}]},
+ "cache": {to:[{field: "rsa.misc.cache", setter: fld_set}]},
+ "cache_hit": {to:[{field: "rsa.misc.cache_hit", setter: fld_set}]},
+ "calling_from": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 1}]},
+ "calling_to": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 0}]},
+ "category": {to:[{field: "rsa.misc.category", setter: fld_set}]},
+ "cc": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "cc.number": {convert: to_long, to:[{field: "rsa.misc.cc_number", setter: fld_set}]},
+ "cefversion": {to:[{field: "rsa.misc.cefversion", setter: fld_set}]},
+ "cert.serial": {to:[{field: "rsa.crypto.cert_serial", setter: fld_set}]},
+ "cert_ca": {to:[{field: "rsa.crypto.cert_ca", setter: fld_set}]},
+ "cert_checksum": {to:[{field: "rsa.crypto.cert_checksum", setter: fld_set}]},
+ "cert_common": {to:[{field: "rsa.crypto.cert_common", setter: fld_set}]},
+ "cert_error": {to:[{field: "rsa.crypto.cert_error", setter: fld_set}]},
+ "cert_hostname": {to:[{field: "rsa.crypto.cert_host_name", setter: fld_set}]},
+ "cert_hostname_cat": {to:[{field: "rsa.crypto.cert_host_cat", setter: fld_set}]},
+ "cert_issuer": {to:[{field: "rsa.crypto.cert_issuer", setter: fld_set}]},
+ "cert_keysize": {to:[{field: "rsa.crypto.cert_keysize", setter: fld_set}]},
+ "cert_status": {to:[{field: "rsa.crypto.cert_status", setter: fld_set}]},
+ "cert_subject": {to:[{field: "rsa.crypto.cert_subject", setter: fld_set}]},
+ "cert_username": {to:[{field: "rsa.crypto.cert_username", setter: fld_set}]},
+ "cfg.attr": {to:[{field: "rsa.misc.cfg_attr", setter: fld_set}]},
+ "cfg.obj": {to:[{field: "rsa.misc.cfg_obj", setter: fld_set}]},
+ "cfg.path": {to:[{field: "rsa.misc.cfg_path", setter: fld_set}]},
+ "change_attribute": {to:[{field: "rsa.misc.change_attrib", setter: fld_set}]},
+ "change_new": {to:[{field: "rsa.misc.change_new", setter: fld_set}]},
+ "change_old": {to:[{field: "rsa.misc.change_old", setter: fld_set}]},
+ "changes": {to:[{field: "rsa.misc.changes", setter: fld_set}]},
+ "checksum": {to:[{field: "rsa.misc.checksum", setter: fld_set}]},
+ "checksum.dst": {to:[{field: "rsa.misc.checksum_dst", setter: fld_set}]},
+ "checksum.src": {to:[{field: "rsa.misc.checksum_src", setter: fld_set}]},
+ "cid": {to:[{field: "rsa.internal.cid", setter: fld_set}]},
+ "client": {to:[{field: "rsa.misc.client", setter: fld_prio, prio: 1}]},
+ "client_ip": {to:[{field: "rsa.misc.client_ip", setter: fld_set}]},
+ "clustermembers": {to:[{field: "rsa.misc.clustermembers", setter: fld_set}]},
+ "cmd": {to:[{field: "rsa.misc.cmd", setter: fld_set}]},
+ "cn_acttimeout": {to:[{field: "rsa.misc.cn_acttimeout", setter: fld_set}]},
+ "cn_asn_dst": {to:[{field: "rsa.web.cn_asn_dst", setter: fld_set}]},
+ "cn_asn_src": {to:[{field: "rsa.misc.cn_asn_src", setter: fld_set}]},
+ "cn_bgpv4nxthop": {to:[{field: "rsa.misc.cn_bgpv4nxthop", setter: fld_set}]},
+ "cn_ctr_dst_code": {to:[{field: "rsa.misc.cn_ctr_dst_code", setter: fld_set}]},
+ "cn_dst_tos": {to:[{field: "rsa.misc.cn_dst_tos", setter: fld_set}]},
+ "cn_dst_vlan": {to:[{field: "rsa.misc.cn_dst_vlan", setter: fld_set}]},
+ "cn_engine_id": {to:[{field: "rsa.misc.cn_engine_id", setter: fld_set}]},
+ "cn_engine_type": {to:[{field: "rsa.misc.cn_engine_type", setter: fld_set}]},
+ "cn_f_switch": {to:[{field: "rsa.misc.cn_f_switch", setter: fld_set}]},
+ "cn_flowsampid": {to:[{field: "rsa.misc.cn_flowsampid", setter: fld_set}]},
+ "cn_flowsampintv": {to:[{field: "rsa.misc.cn_flowsampintv", setter: fld_set}]},
+ "cn_flowsampmode": {to:[{field: "rsa.misc.cn_flowsampmode", setter: fld_set}]},
+ "cn_inacttimeout": {to:[{field: "rsa.misc.cn_inacttimeout", setter: fld_set}]},
+ "cn_inpermbyts": {to:[{field: "rsa.misc.cn_inpermbyts", setter: fld_set}]},
+ "cn_inpermpckts": {to:[{field: "rsa.misc.cn_inpermpckts", setter: fld_set}]},
+ "cn_invalid": {to:[{field: "rsa.misc.cn_invalid", setter: fld_set}]},
+ "cn_ip_proto_ver": {to:[{field: "rsa.misc.cn_ip_proto_ver", setter: fld_set}]},
+ "cn_ipv4_ident": {to:[{field: "rsa.misc.cn_ipv4_ident", setter: fld_set}]},
+ "cn_l_switch": {to:[{field: "rsa.misc.cn_l_switch", setter: fld_set}]},
+ "cn_log_did": {to:[{field: "rsa.misc.cn_log_did", setter: fld_set}]},
+ "cn_log_rid": {to:[{field: "rsa.misc.cn_log_rid", setter: fld_set}]},
+ "cn_max_ttl": {to:[{field: "rsa.misc.cn_max_ttl", setter: fld_set}]},
+ "cn_maxpcktlen": {to:[{field: "rsa.misc.cn_maxpcktlen", setter: fld_set}]},
+ "cn_min_ttl": {to:[{field: "rsa.misc.cn_min_ttl", setter: fld_set}]},
+ "cn_minpcktlen": {to:[{field: "rsa.misc.cn_minpcktlen", setter: fld_set}]},
+ "cn_mpls_lbl_1": {to:[{field: "rsa.misc.cn_mpls_lbl_1", setter: fld_set}]},
+ "cn_mpls_lbl_10": {to:[{field: "rsa.misc.cn_mpls_lbl_10", setter: fld_set}]},
+ "cn_mpls_lbl_2": {to:[{field: "rsa.misc.cn_mpls_lbl_2", setter: fld_set}]},
+ "cn_mpls_lbl_3": {to:[{field: "rsa.misc.cn_mpls_lbl_3", setter: fld_set}]},
+ "cn_mpls_lbl_4": {to:[{field: "rsa.misc.cn_mpls_lbl_4", setter: fld_set}]},
+ "cn_mpls_lbl_5": {to:[{field: "rsa.misc.cn_mpls_lbl_5", setter: fld_set}]},
+ "cn_mpls_lbl_6": {to:[{field: "rsa.misc.cn_mpls_lbl_6", setter: fld_set}]},
+ "cn_mpls_lbl_7": {to:[{field: "rsa.misc.cn_mpls_lbl_7", setter: fld_set}]},
+ "cn_mpls_lbl_8": {to:[{field: "rsa.misc.cn_mpls_lbl_8", setter: fld_set}]},
+ "cn_mpls_lbl_9": {to:[{field: "rsa.misc.cn_mpls_lbl_9", setter: fld_set}]},
+ "cn_mplstoplabel": {to:[{field: "rsa.misc.cn_mplstoplabel", setter: fld_set}]},
+ "cn_mplstoplabip": {to:[{field: "rsa.misc.cn_mplstoplabip", setter: fld_set}]},
+ "cn_mul_dst_byt": {to:[{field: "rsa.misc.cn_mul_dst_byt", setter: fld_set}]},
+ "cn_mul_dst_pks": {to:[{field: "rsa.misc.cn_mul_dst_pks", setter: fld_set}]},
+ "cn_muligmptype": {to:[{field: "rsa.misc.cn_muligmptype", setter: fld_set}]},
+ "cn_rpackets": {to:[{field: "rsa.web.cn_rpackets", setter: fld_set}]},
+ "cn_sampalgo": {to:[{field: "rsa.misc.cn_sampalgo", setter: fld_set}]},
+ "cn_sampint": {to:[{field: "rsa.misc.cn_sampint", setter: fld_set}]},
+ "cn_seqctr": {to:[{field: "rsa.misc.cn_seqctr", setter: fld_set}]},
+ "cn_spackets": {to:[{field: "rsa.misc.cn_spackets", setter: fld_set}]},
+ "cn_src_tos": {to:[{field: "rsa.misc.cn_src_tos", setter: fld_set}]},
+ "cn_src_vlan": {to:[{field: "rsa.misc.cn_src_vlan", setter: fld_set}]},
+ "cn_sysuptime": {to:[{field: "rsa.misc.cn_sysuptime", setter: fld_set}]},
+ "cn_template_id": {to:[{field: "rsa.misc.cn_template_id", setter: fld_set}]},
+ "cn_totbytsexp": {to:[{field: "rsa.misc.cn_totbytsexp", setter: fld_set}]},
+ "cn_totflowexp": {to:[{field: "rsa.misc.cn_totflowexp", setter: fld_set}]},
+ "cn_totpcktsexp": {to:[{field: "rsa.misc.cn_totpcktsexp", setter: fld_set}]},
+ "cn_unixnanosecs": {to:[{field: "rsa.misc.cn_unixnanosecs", setter: fld_set}]},
+ "cn_v6flowlabel": {to:[{field: "rsa.misc.cn_v6flowlabel", setter: fld_set}]},
+ "cn_v6optheaders": {to:[{field: "rsa.misc.cn_v6optheaders", setter: fld_set}]},
+ "code": {to:[{field: "rsa.misc.code", setter: fld_set}]},
+ "command": {to:[{field: "rsa.misc.command", setter: fld_set}]},
+ "comments": {to:[{field: "rsa.misc.comments", setter: fld_set}]},
+ "comp_class": {to:[{field: "rsa.misc.comp_class", setter: fld_set}]},
+ "comp_name": {to:[{field: "rsa.misc.comp_name", setter: fld_set}]},
+ "comp_rbytes": {to:[{field: "rsa.misc.comp_rbytes", setter: fld_set}]},
+ "comp_sbytes": {to:[{field: "rsa.misc.comp_sbytes", setter: fld_set}]},
+ "component_version": {to:[{field: "rsa.misc.comp_version", setter: fld_set}]},
+ "connection_id": {to:[{field: "rsa.misc.connection_id", setter: fld_prio, prio: 1}]},
+ "connectionid": {to:[{field: "rsa.misc.connection_id", setter: fld_prio, prio: 0}]},
+ "content": {to:[{field: "rsa.misc.content", setter: fld_set}]},
+ "content_type": {to:[{field: "rsa.misc.content_type", setter: fld_set}]},
+ "content_version": {to:[{field: "rsa.misc.content_version", setter: fld_set}]},
+ "context": {to:[{field: "rsa.misc.context", setter: fld_set}]},
+ "count": {to:[{field: "rsa.misc.count", setter: fld_set}]},
+ "cpu": {convert: to_long, to:[{field: "rsa.misc.cpu", setter: fld_set}]},
+ "cpu_data": {to:[{field: "rsa.misc.cpu_data", setter: fld_set}]},
+ "criticality": {to:[{field: "rsa.misc.criticality", setter: fld_set}]},
+ "cs_agency_dst": {to:[{field: "rsa.misc.cs_agency_dst", setter: fld_set}]},
+ "cs_analyzedby": {to:[{field: "rsa.misc.cs_analyzedby", setter: fld_set}]},
+ "cs_av_other": {to:[{field: "rsa.misc.cs_av_other", setter: fld_set}]},
+ "cs_av_primary": {to:[{field: "rsa.misc.cs_av_primary", setter: fld_set}]},
+ "cs_av_secondary": {to:[{field: "rsa.misc.cs_av_secondary", setter: fld_set}]},
+ "cs_bgpv6nxthop": {to:[{field: "rsa.misc.cs_bgpv6nxthop", setter: fld_set}]},
+ "cs_bit9status": {to:[{field: "rsa.misc.cs_bit9status", setter: fld_set}]},
+ "cs_context": {to:[{field: "rsa.misc.cs_context", setter: fld_set}]},
+ "cs_control": {to:[{field: "rsa.misc.cs_control", setter: fld_set}]},
+ "cs_data": {to:[{field: "rsa.misc.cs_data", setter: fld_set}]},
+ "cs_datecret": {to:[{field: "rsa.misc.cs_datecret", setter: fld_set}]},
+ "cs_dst_tld": {to:[{field: "rsa.misc.cs_dst_tld", setter: fld_set}]},
+ "cs_eth_dst_ven": {to:[{field: "rsa.misc.cs_eth_dst_ven", setter: fld_set}]},
+ "cs_eth_src_ven": {to:[{field: "rsa.misc.cs_eth_src_ven", setter: fld_set}]},
+ "cs_event_uuid": {to:[{field: "rsa.misc.cs_event_uuid", setter: fld_set}]},
+ "cs_filetype": {to:[{field: "rsa.misc.cs_filetype", setter: fld_set}]},
+ "cs_fld": {to:[{field: "rsa.misc.cs_fld", setter: fld_set}]},
+ "cs_if_desc": {to:[{field: "rsa.misc.cs_if_desc", setter: fld_set}]},
+ "cs_if_name": {to:[{field: "rsa.misc.cs_if_name", setter: fld_set}]},
+ "cs_ip_next_hop": {to:[{field: "rsa.misc.cs_ip_next_hop", setter: fld_set}]},
+ "cs_ipv4dstpre": {to:[{field: "rsa.misc.cs_ipv4dstpre", setter: fld_set}]},
+ "cs_ipv4srcpre": {to:[{field: "rsa.misc.cs_ipv4srcpre", setter: fld_set}]},
+ "cs_lifetime": {to:[{field: "rsa.misc.cs_lifetime", setter: fld_set}]},
+ "cs_log_medium": {to:[{field: "rsa.misc.cs_log_medium", setter: fld_set}]},
+ "cs_loginname": {to:[{field: "rsa.misc.cs_loginname", setter: fld_set}]},
+ "cs_modulescore": {to:[{field: "rsa.misc.cs_modulescore", setter: fld_set}]},
+ "cs_modulesign": {to:[{field: "rsa.misc.cs_modulesign", setter: fld_set}]},
+ "cs_opswatresult": {to:[{field: "rsa.misc.cs_opswatresult", setter: fld_set}]},
+ "cs_payload": {to:[{field: "rsa.misc.cs_payload", setter: fld_set}]},
+ "cs_registrant": {to:[{field: "rsa.misc.cs_registrant", setter: fld_set}]},
+ "cs_registrar": {to:[{field: "rsa.misc.cs_registrar", setter: fld_set}]},
+ "cs_represult": {to:[{field: "rsa.misc.cs_represult", setter: fld_set}]},
+ "cs_rpayload": {to:[{field: "rsa.misc.cs_rpayload", setter: fld_set}]},
+ "cs_sampler_name": {to:[{field: "rsa.misc.cs_sampler_name", setter: fld_set}]},
+ "cs_sourcemodule": {to:[{field: "rsa.misc.cs_sourcemodule", setter: fld_set}]},
+ "cs_streams": {to:[{field: "rsa.misc.cs_streams", setter: fld_set}]},
+ "cs_targetmodule": {to:[{field: "rsa.misc.cs_targetmodule", setter: fld_set}]},
+ "cs_v6nxthop": {to:[{field: "rsa.misc.cs_v6nxthop", setter: fld_set}]},
+ "cs_whois_server": {to:[{field: "rsa.misc.cs_whois_server", setter: fld_set}]},
+ "cs_yararesult": {to:[{field: "rsa.misc.cs_yararesult", setter: fld_set}]},
+ "cve": {to:[{field: "rsa.misc.cve", setter: fld_set}]},
+ "d_certauth": {to:[{field: "rsa.crypto.d_certauth", setter: fld_set}]},
+ "d_cipher": {to:[{field: "rsa.crypto.cipher_dst", setter: fld_set}]},
+ "d_ciphersize": {convert: to_long, to:[{field: "rsa.crypto.cipher_size_dst", setter: fld_set}]},
+ "d_sslver": {to:[{field: "rsa.crypto.ssl_ver_dst", setter: fld_set}]},
+ "data": {to:[{field: "rsa.internal.data", setter: fld_set}]},
+ "data_type": {to:[{field: "rsa.misc.data_type", setter: fld_set}]},
+ "date": {to:[{field: "rsa.time.date", setter: fld_set}]},
+ "datetime": {to:[{field: "rsa.time.datetime", setter: fld_set}]},
+ "day": {to:[{field: "rsa.time.day", setter: fld_set}]},
+ "db_id": {to:[{field: "rsa.db.db_id", setter: fld_set}]},
+ "db_name": {to:[{field: "rsa.db.database", setter: fld_set}]},
+ "db_pid": {convert: to_long, to:[{field: "rsa.db.db_pid", setter: fld_set}]},
+ "dclass_counter1": {convert: to_long, to:[{field: "rsa.counters.dclass_c1", setter: fld_set}]},
+ "dclass_counter1_string": {to:[{field: "rsa.counters.dclass_c1_str", setter: fld_set}]},
+ "dclass_counter2": {convert: to_long, to:[{field: "rsa.counters.dclass_c2", setter: fld_set}]},
+ "dclass_counter2_string": {to:[{field: "rsa.counters.dclass_c2_str", setter: fld_set}]},
+ "dclass_counter3": {convert: to_long, to:[{field: "rsa.counters.dclass_c3", setter: fld_set}]},
+ "dclass_counter3_string": {to:[{field: "rsa.counters.dclass_c3_str", setter: fld_set}]},
+ "dclass_ratio1": {to:[{field: "rsa.counters.dclass_r1", setter: fld_set}]},
+ "dclass_ratio1_string": {to:[{field: "rsa.counters.dclass_r1_str", setter: fld_set}]},
+ "dclass_ratio2": {to:[{field: "rsa.counters.dclass_r2", setter: fld_set}]},
+ "dclass_ratio2_string": {to:[{field: "rsa.counters.dclass_r2_str", setter: fld_set}]},
+ "dclass_ratio3": {to:[{field: "rsa.counters.dclass_r3", setter: fld_set}]},
+ "dclass_ratio3_string": {to:[{field: "rsa.counters.dclass_r3_str", setter: fld_set}]},
+ "dead": {convert: to_long, to:[{field: "rsa.internal.dead", setter: fld_set}]},
+ "description": {to:[{field: "rsa.misc.description", setter: fld_set}]},
+ "detail": {to:[{field: "rsa.misc.event_desc", setter: fld_set}]},
+ "device": {to:[{field: "rsa.misc.device_name", setter: fld_set}]},
+ "device.class": {to:[{field: "rsa.internal.device_class", setter: fld_set}]},
+ "device.group": {to:[{field: "rsa.internal.device_group", setter: fld_set}]},
+ "device.host": {to:[{field: "rsa.internal.device_host", setter: fld_set}]},
+ "device.ip": {convert: to_ip, to:[{field: "rsa.internal.device_ip", setter: fld_set}]},
+ "device.ipv6": {convert: to_ip, to:[{field: "rsa.internal.device_ipv6", setter: fld_set}]},
+ "device.type": {to:[{field: "rsa.internal.device_type", setter: fld_set}]},
+ "device.type.id": {convert: to_long, to:[{field: "rsa.internal.device_type_id", setter: fld_set}]},
+ "devicehostname": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "devvendor": {to:[{field: "rsa.misc.devvendor", setter: fld_set}]},
+ "dhost": {to:[{field: "rsa.network.host_dst", setter: fld_set}]},
+ "did": {to:[{field: "rsa.internal.did", setter: fld_set}]},
+ "dinterface": {to:[{field: "rsa.network.dinterface", setter: fld_set}]},
+ "directory.dst": {to:[{field: "rsa.file.directory_dst", setter: fld_set}]},
+ "directory.src": {to:[{field: "rsa.file.directory_src", setter: fld_set}]},
+ "disk_volume": {to:[{field: "rsa.storage.disk_volume", setter: fld_set}]},
+ "disposition": {to:[{field: "rsa.misc.disposition", setter: fld_set}]},
+ "distance": {to:[{field: "rsa.misc.distance", setter: fld_set}]},
+ "dmask": {to:[{field: "rsa.network.dmask", setter: fld_set}]},
+ "dn": {to:[{field: "rsa.identity.dn", setter: fld_set}]},
+ "dns_a_record": {to:[{field: "rsa.network.dns_a_record", setter: fld_set}]},
+ "dns_cname_record": {to:[{field: "rsa.network.dns_cname_record", setter: fld_set}]},
+ "dns_id": {to:[{field: "rsa.network.dns_id", setter: fld_set}]},
+ "dns_opcode": {to:[{field: "rsa.network.dns_opcode", setter: fld_set}]},
+ "dns_ptr_record": {to:[{field: "rsa.network.dns_ptr_record", setter: fld_set}]},
+ "dns_resp": {to:[{field: "rsa.network.dns_resp", setter: fld_set}]},
+ "dns_type": {to:[{field: "rsa.network.dns_type", setter: fld_set}]},
+ "doc_number": {convert: to_long, to:[{field: "rsa.misc.doc_number", setter: fld_set}]},
+ "domain": {to:[{field: "rsa.network.domain", setter: fld_set}]},
+ "domain1": {to:[{field: "rsa.network.domain1", setter: fld_set}]},
+ "dst_dn": {to:[{field: "rsa.identity.dn_dst", setter: fld_set}]},
+ "dst_payload": {to:[{field: "rsa.misc.payload_dst", setter: fld_set}]},
+ "dst_spi": {to:[{field: "rsa.misc.spi_dst", setter: fld_set}]},
+ "dst_zone": {to:[{field: "rsa.network.zone_dst", setter: fld_set}]},
+ "dstburb": {to:[{field: "rsa.misc.dstburb", setter: fld_set}]},
+ "duration": {convert: to_double, to:[{field: "rsa.time.duration_time", setter: fld_set}]},
+ "duration_string": {to:[{field: "rsa.time.duration_str", setter: fld_set}]},
+ "ec_activity": {to:[{field: "rsa.investigations.ec_activity", setter: fld_set}]},
+ "ec_outcome": {to:[{field: "rsa.investigations.ec_outcome", setter: fld_set}]},
+ "ec_subject": {to:[{field: "rsa.investigations.ec_subject", setter: fld_set}]},
+ "ec_theme": {to:[{field: "rsa.investigations.ec_theme", setter: fld_set}]},
+ "edomain": {to:[{field: "rsa.misc.edomain", setter: fld_set}]},
+ "edomaub": {to:[{field: "rsa.misc.edomaub", setter: fld_set}]},
+ "effective_time": {convert: to_date, to:[{field: "rsa.time.effective_time", setter: fld_set}]},
+ "ein.number": {convert: to_long, to:[{field: "rsa.misc.ein_number", setter: fld_set}]},
+ "email": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "encryption_type": {to:[{field: "rsa.crypto.crypto", setter: fld_set}]},
+ "endtime": {convert: to_date, to:[{field: "rsa.time.endtime", setter: fld_set}]},
+ "entropy.req": {convert: to_long, to:[{field: "rsa.internal.entropy_req", setter: fld_set}]},
+ "entropy.res": {convert: to_long, to:[{field: "rsa.internal.entropy_res", setter: fld_set}]},
+ "entry": {to:[{field: "rsa.internal.entry", setter: fld_set}]},
+ "eoc": {to:[{field: "rsa.investigations.eoc", setter: fld_set}]},
+ "error": {to:[{field: "rsa.misc.error", setter: fld_set}]},
+ "eth_type": {convert: to_long, to:[{field: "rsa.network.eth_type", setter: fld_set}]},
+ "euid": {to:[{field: "rsa.misc.euid", setter: fld_set}]},
+ "event.cat": {convert: to_long, to:[{field: "rsa.investigations.event_cat", setter: fld_prio, prio: 1}]},
+ "event.cat.name": {to:[{field: "rsa.investigations.event_cat_name", setter: fld_prio, prio: 1}]},
+ "event_cat": {convert: to_long, to:[{field: "rsa.investigations.event_cat", setter: fld_prio, prio: 0}]},
+ "event_cat_name": {to:[{field: "rsa.investigations.event_cat_name", setter: fld_prio, prio: 0}]},
+ "event_category": {to:[{field: "rsa.misc.event_category", setter: fld_set}]},
+ "event_computer": {to:[{field: "rsa.misc.event_computer", setter: fld_set}]},
+ "event_counter": {convert: to_long, to:[{field: "rsa.counters.event_counter", setter: fld_set}]},
+ "event_description": {to:[{field: "rsa.internal.event_desc", setter: fld_set}]},
+ "event_id": {to:[{field: "rsa.misc.event_id", setter: fld_set}]},
+ "event_log": {to:[{field: "rsa.misc.event_log", setter: fld_set}]},
+ "event_name": {to:[{field: "rsa.internal.event_name", setter: fld_set}]},
+ "event_queue_time": {convert: to_date, to:[{field: "rsa.time.event_queue_time", setter: fld_set}]},
+ "event_source": {to:[{field: "rsa.misc.event_source", setter: fld_set}]},
+ "event_state": {to:[{field: "rsa.misc.event_state", setter: fld_set}]},
+ "event_time": {convert: to_date, to:[{field: "rsa.time.event_time", setter: fld_set}]},
+ "event_time_str": {to:[{field: "rsa.time.event_time_str", setter: fld_prio, prio: 1}]},
+ "event_time_string": {to:[{field: "rsa.time.event_time_str", setter: fld_prio, prio: 0}]},
+ "event_type": {to:[{field: "rsa.misc.event_type", setter: fld_set}]},
+ "event_user": {to:[{field: "rsa.misc.event_user", setter: fld_set}]},
+ "eventtime": {to:[{field: "rsa.time.eventtime", setter: fld_set}]},
+ "expected_val": {to:[{field: "rsa.misc.expected_val", setter: fld_set}]},
+ "expiration_time": {convert: to_date, to:[{field: "rsa.time.expire_time", setter: fld_set}]},
+ "expiration_time_string": {to:[{field: "rsa.time.expire_time_str", setter: fld_set}]},
+ "facility": {to:[{field: "rsa.misc.facility", setter: fld_set}]},
+ "facilityname": {to:[{field: "rsa.misc.facilityname", setter: fld_set}]},
+ "faddr": {to:[{field: "rsa.network.faddr", setter: fld_set}]},
+ "fcatnum": {to:[{field: "rsa.misc.fcatnum", setter: fld_set}]},
+ "federated_idp": {to:[{field: "rsa.identity.federated_idp", setter: fld_set}]},
+ "federated_sp": {to:[{field: "rsa.identity.federated_sp", setter: fld_set}]},
+ "feed.category": {to:[{field: "rsa.internal.feed_category", setter: fld_set}]},
+ "feed_desc": {to:[{field: "rsa.internal.feed_desc", setter: fld_set}]},
+ "feed_name": {to:[{field: "rsa.internal.feed_name", setter: fld_set}]},
+ "fhost": {to:[{field: "rsa.network.fhost", setter: fld_set}]},
+ "file_entropy": {convert: to_double, to:[{field: "rsa.file.file_entropy", setter: fld_set}]},
+ "file_vendor": {to:[{field: "rsa.file.file_vendor", setter: fld_set}]},
+ "filename_dst": {to:[{field: "rsa.file.filename_dst", setter: fld_set}]},
+ "filename_src": {to:[{field: "rsa.file.filename_src", setter: fld_set}]},
+ "filename_tmp": {to:[{field: "rsa.file.filename_tmp", setter: fld_set}]},
+ "filesystem": {to:[{field: "rsa.file.filesystem", setter: fld_set}]},
+ "filter": {to:[{field: "rsa.misc.filter", setter: fld_set}]},
+ "finterface": {to:[{field: "rsa.misc.finterface", setter: fld_set}]},
+ "flags": {to:[{field: "rsa.misc.flags", setter: fld_set}]},
+ "forensic_info": {to:[{field: "rsa.misc.forensic_info", setter: fld_set}]},
+ "forward.ip": {convert: to_ip, to:[{field: "rsa.internal.forward_ip", setter: fld_set}]},
+ "forward.ipv6": {convert: to_ip, to:[{field: "rsa.internal.forward_ipv6", setter: fld_set}]},
+ "found": {to:[{field: "rsa.misc.found", setter: fld_set}]},
+ "fport": {to:[{field: "rsa.network.fport", setter: fld_set}]},
+ "fqdn": {to:[{field: "rsa.web.fqdn", setter: fld_set}]},
+ "fresult": {convert: to_long, to:[{field: "rsa.misc.fresult", setter: fld_set}]},
+ "from": {to:[{field: "rsa.email.email_src", setter: fld_set}]},
+ "gaddr": {to:[{field: "rsa.misc.gaddr", setter: fld_set}]},
+ "gateway": {to:[{field: "rsa.network.gateway", setter: fld_set}]},
+ "gmtdate": {to:[{field: "rsa.time.gmtdate", setter: fld_set}]},
+ "gmttime": {to:[{field: "rsa.time.gmttime", setter: fld_set}]},
+ "group": {to:[{field: "rsa.misc.group", setter: fld_set}]},
+ "group_object": {to:[{field: "rsa.misc.group_object", setter: fld_set}]},
+ "groupid": {to:[{field: "rsa.misc.group_id", setter: fld_set}]},
+ "h_code": {to:[{field: "rsa.internal.hcode", setter: fld_set}]},
+ "hardware_id": {to:[{field: "rsa.misc.hardware_id", setter: fld_set}]},
+ "header.id": {to:[{field: "rsa.internal.header_id", setter: fld_set}]},
+ "host.orig": {to:[{field: "rsa.network.host_orig", setter: fld_set}]},
+ "host.state": {to:[{field: "rsa.endpoint.host_state", setter: fld_set}]},
+ "host.type": {to:[{field: "rsa.network.host_type", setter: fld_set}]},
+ "host_role": {to:[{field: "rsa.identity.host_role", setter: fld_set}]},
+ "hostid": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "hostname": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "hour": {to:[{field: "rsa.time.hour", setter: fld_set}]},
+ "https.insact": {to:[{field: "rsa.crypto.https_insact", setter: fld_set}]},
+ "https.valid": {to:[{field: "rsa.crypto.https_valid", setter: fld_set}]},
+ "icmpcode": {convert: to_long, to:[{field: "rsa.network.icmp_code", setter: fld_set}]},
+ "icmptype": {convert: to_long, to:[{field: "rsa.network.icmp_type", setter: fld_set}]},
+ "id": {to:[{field: "rsa.misc.reference_id", setter: fld_set}]},
+ "id1": {to:[{field: "rsa.misc.reference_id1", setter: fld_set}]},
+ "id2": {to:[{field: "rsa.misc.reference_id2", setter: fld_set}]},
+ "id3": {to:[{field: "rsa.misc.id3", setter: fld_set}]},
+ "ike": {to:[{field: "rsa.crypto.ike", setter: fld_set}]},
+ "ike_cookie1": {to:[{field: "rsa.crypto.ike_cookie1", setter: fld_set}]},
+ "ike_cookie2": {to:[{field: "rsa.crypto.ike_cookie2", setter: fld_set}]},
+ "im_buddyid": {to:[{field: "rsa.misc.im_buddyid", setter: fld_set}]},
+ "im_buddyname": {to:[{field: "rsa.misc.im_buddyname", setter: fld_set}]},
+ "im_client": {to:[{field: "rsa.misc.im_client", setter: fld_set}]},
+ "im_croomid": {to:[{field: "rsa.misc.im_croomid", setter: fld_set}]},
+ "im_croomtype": {to:[{field: "rsa.misc.im_croomtype", setter: fld_set}]},
+ "im_members": {to:[{field: "rsa.misc.im_members", setter: fld_set}]},
+ "im_userid": {to:[{field: "rsa.misc.im_userid", setter: fld_set}]},
+ "im_username": {to:[{field: "rsa.misc.im_username", setter: fld_set}]},
+ "index": {to:[{field: "rsa.misc.index", setter: fld_set}]},
+ "info": {to:[{field: "rsa.db.index", setter: fld_set}]},
+ "inode": {convert: to_long, to:[{field: "rsa.internal.inode", setter: fld_set}]},
+ "inout": {to:[{field: "rsa.misc.inout", setter: fld_set}]},
+ "instance": {to:[{field: "rsa.db.instance", setter: fld_set}]},
+ "interface": {to:[{field: "rsa.network.interface", setter: fld_set}]},
+ "inv.category": {to:[{field: "rsa.investigations.inv_category", setter: fld_set}]},
+ "inv.context": {to:[{field: "rsa.investigations.inv_context", setter: fld_set}]},
+ "ioc": {to:[{field: "rsa.investigations.ioc", setter: fld_set}]},
+ "ip_proto": {convert: to_long, to:[{field: "rsa.network.ip_proto", setter: fld_set}]},
+ "ipkt": {to:[{field: "rsa.misc.ipkt", setter: fld_set}]},
+ "ipscat": {to:[{field: "rsa.misc.ipscat", setter: fld_set}]},
+ "ipspri": {to:[{field: "rsa.misc.ipspri", setter: fld_set}]},
+ "jobname": {to:[{field: "rsa.misc.jobname", setter: fld_set}]},
+ "jobnum": {to:[{field: "rsa.misc.job_num", setter: fld_set}]},
+ "laddr": {to:[{field: "rsa.network.laddr", setter: fld_set}]},
+ "language": {to:[{field: "rsa.misc.language", setter: fld_set}]},
+ "latitude": {to:[{field: "rsa.misc.latitude", setter: fld_set}]},
+ "lc.cid": {to:[{field: "rsa.internal.lc_cid", setter: fld_set}]},
+ "lc.ctime": {convert: to_date, to:[{field: "rsa.internal.lc_ctime", setter: fld_set}]},
+ "ldap": {to:[{field: "rsa.identity.ldap", setter: fld_set}]},
+ "ldap.query": {to:[{field: "rsa.identity.ldap_query", setter: fld_set}]},
+ "ldap.response": {to:[{field: "rsa.identity.ldap_response", setter: fld_set}]},
+ "level": {convert: to_long, to:[{field: "rsa.internal.level", setter: fld_set}]},
+ "lhost": {to:[{field: "rsa.network.lhost", setter: fld_set}]},
+ "library": {to:[{field: "rsa.misc.library", setter: fld_set}]},
+ "lifetime": {convert: to_long, to:[{field: "rsa.misc.lifetime", setter: fld_set}]},
+ "linenum": {to:[{field: "rsa.misc.linenum", setter: fld_set}]},
+ "link": {to:[{field: "rsa.misc.link", setter: fld_set}]},
+ "linterface": {to:[{field: "rsa.network.linterface", setter: fld_set}]},
+ "list_name": {to:[{field: "rsa.misc.list_name", setter: fld_set}]},
+ "listnum": {to:[{field: "rsa.misc.listnum", setter: fld_set}]},
+ "load_data": {to:[{field: "rsa.misc.load_data", setter: fld_set}]},
+ "location_floor": {to:[{field: "rsa.misc.location_floor", setter: fld_set}]},
+ "location_mark": {to:[{field: "rsa.misc.location_mark", setter: fld_set}]},
+ "log_id": {to:[{field: "rsa.misc.log_id", setter: fld_set}]},
+ "log_type": {to:[{field: "rsa.misc.log_type", setter: fld_set}]},
+ "logid": {to:[{field: "rsa.misc.logid", setter: fld_set}]},
+ "logip": {to:[{field: "rsa.misc.logip", setter: fld_set}]},
+ "logname": {to:[{field: "rsa.misc.logname", setter: fld_set}]},
+ "logon_type": {to:[{field: "rsa.identity.logon_type", setter: fld_set}]},
+ "logon_type_desc": {to:[{field: "rsa.identity.logon_type_desc", setter: fld_set}]},
+ "longitude": {to:[{field: "rsa.misc.longitude", setter: fld_set}]},
+ "lport": {to:[{field: "rsa.misc.lport", setter: fld_set}]},
+ "lread": {convert: to_long, to:[{field: "rsa.db.lread", setter: fld_set}]},
+ "lun": {to:[{field: "rsa.storage.lun", setter: fld_set}]},
+ "lwrite": {convert: to_long, to:[{field: "rsa.db.lwrite", setter: fld_set}]},
+ "macaddr": {convert: to_mac, to:[{field: "rsa.network.eth_host", setter: fld_set}]},
+ "mail_id": {to:[{field: "rsa.misc.mail_id", setter: fld_set}]},
+ "mask": {to:[{field: "rsa.network.mask", setter: fld_set}]},
+ "match": {to:[{field: "rsa.misc.match", setter: fld_set}]},
+ "mbug_data": {to:[{field: "rsa.misc.mbug_data", setter: fld_set}]},
+ "mcb.req": {convert: to_long, to:[{field: "rsa.internal.mcb_req", setter: fld_set}]},
+ "mcb.res": {convert: to_long, to:[{field: "rsa.internal.mcb_res", setter: fld_set}]},
+ "mcbc.req": {convert: to_long, to:[{field: "rsa.internal.mcbc_req", setter: fld_set}]},
+ "mcbc.res": {convert: to_long, to:[{field: "rsa.internal.mcbc_res", setter: fld_set}]},
+ "medium": {convert: to_long, to:[{field: "rsa.internal.medium", setter: fld_set}]},
+ "message": {to:[{field: "rsa.internal.message", setter: fld_set}]},
+ "message_body": {to:[{field: "rsa.misc.message_body", setter: fld_set}]},
+ "messageid": {to:[{field: "rsa.internal.messageid", setter: fld_set}]},
+ "min": {to:[{field: "rsa.time.min", setter: fld_set}]},
+ "misc": {to:[{field: "rsa.misc.misc", setter: fld_set}]},
+ "misc_name": {to:[{field: "rsa.misc.misc_name", setter: fld_set}]},
+ "mode": {to:[{field: "rsa.misc.mode", setter: fld_set}]},
+ "month": {to:[{field: "rsa.time.month", setter: fld_set}]},
+ "msg": {to:[{field: "rsa.internal.msg", setter: fld_set}]},
+ "msgIdPart1": {to:[{field: "rsa.misc.msgIdPart1", setter: fld_set}]},
+ "msgIdPart2": {to:[{field: "rsa.misc.msgIdPart2", setter: fld_set}]},
+ "msgIdPart3": {to:[{field: "rsa.misc.msgIdPart3", setter: fld_set}]},
+ "msgIdPart4": {to:[{field: "rsa.misc.msgIdPart4", setter: fld_set}]},
+ "msg_id": {to:[{field: "rsa.internal.msg_id", setter: fld_set}]},
+ "msg_type": {to:[{field: "rsa.misc.msg_type", setter: fld_set}]},
+ "msgid": {to:[{field: "rsa.misc.msgid", setter: fld_set}]},
+ "name": {to:[{field: "rsa.misc.name", setter: fld_set}]},
+ "netname": {to:[{field: "rsa.network.netname", setter: fld_set}]},
+ "netsessid": {to:[{field: "rsa.misc.netsessid", setter: fld_set}]},
+ "network_port": {convert: to_long, to:[{field: "rsa.network.network_port", setter: fld_set}]},
+ "network_service": {to:[{field: "rsa.network.network_service", setter: fld_set}]},
+ "node": {to:[{field: "rsa.misc.node", setter: fld_set}]},
+ "nodename": {to:[{field: "rsa.internal.node_name", setter: fld_set}]},
+ "ntype": {to:[{field: "rsa.misc.ntype", setter: fld_set}]},
+ "num": {to:[{field: "rsa.misc.num", setter: fld_set}]},
+ "number": {to:[{field: "rsa.misc.number", setter: fld_set}]},
+ "number1": {to:[{field: "rsa.misc.number1", setter: fld_set}]},
+ "number2": {to:[{field: "rsa.misc.number2", setter: fld_set}]},
+ "nwe.callback_id": {to:[{field: "rsa.internal.nwe_callback_id", setter: fld_set}]},
+ "nwwn": {to:[{field: "rsa.misc.nwwn", setter: fld_set}]},
+ "obj_id": {to:[{field: "rsa.internal.obj_id", setter: fld_set}]},
+ "obj_name": {to:[{field: "rsa.misc.obj_name", setter: fld_set}]},
+ "obj_server": {to:[{field: "rsa.internal.obj_server", setter: fld_set}]},
+ "obj_type": {to:[{field: "rsa.misc.obj_type", setter: fld_set}]},
+ "obj_value": {to:[{field: "rsa.internal.obj_val", setter: fld_set}]},
+ "object": {to:[{field: "rsa.misc.object", setter: fld_set}]},
+ "observed_val": {to:[{field: "rsa.misc.observed_val", setter: fld_set}]},
+ "operation": {to:[{field: "rsa.misc.operation", setter: fld_set}]},
+ "operation_id": {to:[{field: "rsa.misc.operation_id", setter: fld_set}]},
+ "opkt": {to:[{field: "rsa.misc.opkt", setter: fld_set}]},
+ "org.dst": {to:[{field: "rsa.physical.org_dst", setter: fld_prio, prio: 1}]},
+ "org.src": {to:[{field: "rsa.physical.org_src", setter: fld_set}]},
+ "org_dst": {to:[{field: "rsa.physical.org_dst", setter: fld_prio, prio: 0}]},
+ "orig_from": {to:[{field: "rsa.misc.orig_from", setter: fld_set}]},
+ "origin": {to:[{field: "rsa.network.origin", setter: fld_set}]},
+ "original_owner": {to:[{field: "rsa.identity.owner", setter: fld_set}]},
+ "os": {to:[{field: "rsa.misc.OS", setter: fld_set}]},
+ "owner_id": {to:[{field: "rsa.misc.owner_id", setter: fld_set}]},
+ "p_action": {to:[{field: "rsa.misc.p_action", setter: fld_set}]},
+ "p_date": {to:[{field: "rsa.time.p_date", setter: fld_set}]},
+ "p_filter": {to:[{field: "rsa.misc.p_filter", setter: fld_set}]},
+ "p_group_object": {to:[{field: "rsa.misc.p_group_object", setter: fld_set}]},
+ "p_id": {to:[{field: "rsa.misc.p_id", setter: fld_set}]},
+ "p_month": {to:[{field: "rsa.time.p_month", setter: fld_set}]},
+ "p_msgid": {to:[{field: "rsa.misc.p_msgid", setter: fld_set}]},
+ "p_msgid1": {to:[{field: "rsa.misc.p_msgid1", setter: fld_set}]},
+ "p_msgid2": {to:[{field: "rsa.misc.p_msgid2", setter: fld_set}]},
+ "p_result1": {to:[{field: "rsa.misc.p_result1", setter: fld_set}]},
+ "p_time": {to:[{field: "rsa.time.p_time", setter: fld_set}]},
+ "p_time1": {to:[{field: "rsa.time.p_time1", setter: fld_set}]},
+ "p_time2": {to:[{field: "rsa.time.p_time2", setter: fld_set}]},
+ "p_url": {to:[{field: "rsa.web.p_url", setter: fld_set}]},
+ "p_user_agent": {to:[{field: "rsa.web.p_user_agent", setter: fld_set}]},
+ "p_web_cookie": {to:[{field: "rsa.web.p_web_cookie", setter: fld_set}]},
+ "p_web_method": {to:[{field: "rsa.web.p_web_method", setter: fld_set}]},
+ "p_web_referer": {to:[{field: "rsa.web.p_web_referer", setter: fld_set}]},
+ "p_year": {to:[{field: "rsa.time.p_year", setter: fld_set}]},
+ "packet_length": {to:[{field: "rsa.network.packet_length", setter: fld_set}]},
+ "paddr": {convert: to_ip, to:[{field: "rsa.network.paddr", setter: fld_set}]},
+ "param": {to:[{field: "rsa.misc.param", setter: fld_set}]},
+ "param.dst": {to:[{field: "rsa.misc.param_dst", setter: fld_set}]},
+ "param.src": {to:[{field: "rsa.misc.param_src", setter: fld_set}]},
+ "parent_node": {to:[{field: "rsa.misc.parent_node", setter: fld_set}]},
+ "parse.error": {to:[{field: "rsa.internal.parse_error", setter: fld_set}]},
+ "password": {to:[{field: "rsa.identity.password", setter: fld_set}]},
+ "password_chg": {to:[{field: "rsa.misc.password_chg", setter: fld_set}]},
+ "password_expire": {to:[{field: "rsa.misc.password_expire", setter: fld_set}]},
+ "patient_fname": {to:[{field: "rsa.healthcare.patient_fname", setter: fld_set}]},
+ "patient_id": {to:[{field: "rsa.healthcare.patient_id", setter: fld_set}]},
+ "patient_lname": {to:[{field: "rsa.healthcare.patient_lname", setter: fld_set}]},
+ "patient_mname": {to:[{field: "rsa.healthcare.patient_mname", setter: fld_set}]},
+ "payload.req": {convert: to_long, to:[{field: "rsa.internal.payload_req", setter: fld_set}]},
+ "payload.res": {convert: to_long, to:[{field: "rsa.internal.payload_res", setter: fld_set}]},
+ "peer": {to:[{field: "rsa.crypto.peer", setter: fld_set}]},
+ "peer_id": {to:[{field: "rsa.crypto.peer_id", setter: fld_set}]},
+ "permgranted": {to:[{field: "rsa.misc.permgranted", setter: fld_set}]},
+ "permissions": {to:[{field: "rsa.db.permissions", setter: fld_set}]},
+ "permwanted": {to:[{field: "rsa.misc.permwanted", setter: fld_set}]},
+ "pgid": {to:[{field: "rsa.misc.pgid", setter: fld_set}]},
+ "phone_number": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 2}]},
+ "phost": {to:[{field: "rsa.network.phost", setter: fld_set}]},
+ "pid": {to:[{field: "rsa.misc.pid", setter: fld_set}]},
+ "policy": {to:[{field: "rsa.misc.policy", setter: fld_set}]},
+ "policyUUID": {to:[{field: "rsa.misc.policyUUID", setter: fld_set}]},
+ "policy_id": {to:[{field: "rsa.misc.policy_id", setter: fld_set}]},
+ "policy_value": {to:[{field: "rsa.misc.policy_value", setter: fld_set}]},
+ "policy_waiver": {to:[{field: "rsa.misc.policy_waiver", setter: fld_set}]},
+ "policyname": {to:[{field: "rsa.misc.policy_name", setter: fld_prio, prio: 0}]},
+ "pool_id": {to:[{field: "rsa.misc.pool_id", setter: fld_set}]},
+ "pool_name": {to:[{field: "rsa.misc.pool_name", setter: fld_set}]},
+ "port": {convert: to_long, to:[{field: "rsa.network.port", setter: fld_set}]},
+ "portname": {to:[{field: "rsa.misc.port_name", setter: fld_set}]},
+ "pread": {convert: to_long, to:[{field: "rsa.db.pread", setter: fld_set}]},
+ "priority": {to:[{field: "rsa.misc.priority", setter: fld_set}]},
+ "privilege": {to:[{field: "rsa.file.privilege", setter: fld_set}]},
+ "process.vid.dst": {to:[{field: "rsa.internal.process_vid_dst", setter: fld_set}]},
+ "process.vid.src": {to:[{field: "rsa.internal.process_vid_src", setter: fld_set}]},
+ "process_id_val": {to:[{field: "rsa.misc.process_id_val", setter: fld_set}]},
+ "processing_time": {to:[{field: "rsa.time.process_time", setter: fld_set}]},
+ "profile": {to:[{field: "rsa.identity.profile", setter: fld_set}]},
+ "prog_asp_num": {to:[{field: "rsa.misc.prog_asp_num", setter: fld_set}]},
+ "program": {to:[{field: "rsa.misc.program", setter: fld_set}]},
+ "protocol_detail": {to:[{field: "rsa.network.protocol_detail", setter: fld_set}]},
+ "pwwn": {to:[{field: "rsa.storage.pwwn", setter: fld_set}]},
+ "r_hostid": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "real_data": {to:[{field: "rsa.misc.real_data", setter: fld_set}]},
+ "realm": {to:[{field: "rsa.identity.realm", setter: fld_set}]},
+ "reason": {to:[{field: "rsa.misc.reason", setter: fld_set}]},
+ "rec_asp_device": {to:[{field: "rsa.misc.rec_asp_device", setter: fld_set}]},
+ "rec_asp_num": {to:[{field: "rsa.misc.rec_asp_num", setter: fld_set}]},
+ "rec_library": {to:[{field: "rsa.misc.rec_library", setter: fld_set}]},
+ "recorded_time": {convert: to_date, to:[{field: "rsa.time.recorded_time", setter: fld_set}]},
+ "recordnum": {to:[{field: "rsa.misc.recordnum", setter: fld_set}]},
+ "registry.key": {to:[{field: "rsa.endpoint.registry_key", setter: fld_set}]},
+ "registry.value": {to:[{field: "rsa.endpoint.registry_value", setter: fld_set}]},
+ "remote_domain": {to:[{field: "rsa.web.remote_domain", setter: fld_set}]},
+ "remote_domain_id": {to:[{field: "rsa.network.remote_domain_id", setter: fld_set}]},
+ "reputation_num": {convert: to_double, to:[{field: "rsa.web.reputation_num", setter: fld_set}]},
+ "resource": {to:[{field: "rsa.internal.resource", setter: fld_set}]},
+ "resource_class": {to:[{field: "rsa.internal.resource_class", setter: fld_set}]},
+ "result": {to:[{field: "rsa.misc.result", setter: fld_set}]},
+ "result_code": {to:[{field: "rsa.misc.result_code", setter: fld_prio, prio: 1}]},
+ "resultcode": {to:[{field: "rsa.misc.result_code", setter: fld_prio, prio: 0}]},
+ "rid": {convert: to_long, to:[{field: "rsa.internal.rid", setter: fld_set}]},
+ "risk": {to:[{field: "rsa.misc.risk", setter: fld_set}]},
+ "risk_info": {to:[{field: "rsa.misc.risk_info", setter: fld_set}]},
+ "risk_num": {convert: to_double, to:[{field: "rsa.misc.risk_num", setter: fld_set}]},
+ "risk_num_comm": {convert: to_double, to:[{field: "rsa.misc.risk_num_comm", setter: fld_set}]},
+ "risk_num_next": {convert: to_double, to:[{field: "rsa.misc.risk_num_next", setter: fld_set}]},
+ "risk_num_sand": {convert: to_double, to:[{field: "rsa.misc.risk_num_sand", setter: fld_set}]},
+ "risk_num_static": {convert: to_double, to:[{field: "rsa.misc.risk_num_static", setter: fld_set}]},
+ "risk_suspicious": {to:[{field: "rsa.misc.risk_suspicious", setter: fld_set}]},
+ "risk_warning": {to:[{field: "rsa.misc.risk_warning", setter: fld_set}]},
+ "rpayload": {to:[{field: "rsa.network.rpayload", setter: fld_set}]},
+ "ruid": {to:[{field: "rsa.misc.ruid", setter: fld_set}]},
+ "rule": {to:[{field: "rsa.misc.rule", setter: fld_set}]},
+ "rule_group": {to:[{field: "rsa.misc.rule_group", setter: fld_set}]},
+ "rule_template": {to:[{field: "rsa.misc.rule_template", setter: fld_set}]},
+ "rule_uid": {to:[{field: "rsa.misc.rule_uid", setter: fld_set}]},
+ "rulename": {to:[{field: "rsa.misc.rule_name", setter: fld_set}]},
+ "s_certauth": {to:[{field: "rsa.crypto.s_certauth", setter: fld_set}]},
+ "s_cipher": {to:[{field: "rsa.crypto.cipher_src", setter: fld_set}]},
+ "s_ciphersize": {convert: to_long, to:[{field: "rsa.crypto.cipher_size_src", setter: fld_set}]},
+ "s_context": {to:[{field: "rsa.misc.context_subject", setter: fld_set}]},
+ "s_sslver": {to:[{field: "rsa.crypto.ssl_ver_src", setter: fld_set}]},
+ "sburb": {to:[{field: "rsa.misc.sburb", setter: fld_set}]},
+ "scheme": {to:[{field: "rsa.crypto.scheme", setter: fld_set}]},
+ "sdomain_fld": {to:[{field: "rsa.misc.sdomain_fld", setter: fld_set}]},
+ "search.text": {to:[{field: "rsa.misc.search_text", setter: fld_set}]},
+ "sec": {to:[{field: "rsa.misc.sec", setter: fld_set}]},
+ "second": {to:[{field: "rsa.misc.second", setter: fld_set}]},
+ "sensor": {to:[{field: "rsa.misc.sensor", setter: fld_set}]},
+ "sensorname": {to:[{field: "rsa.misc.sensorname", setter: fld_set}]},
+ "seqnum": {to:[{field: "rsa.misc.seqnum", setter: fld_set}]},
+ "serial_number": {to:[{field: "rsa.misc.serial_number", setter: fld_set}]},
+ "service.account": {to:[{field: "rsa.identity.service_account", setter: fld_set}]},
+ "session": {to:[{field: "rsa.misc.session", setter: fld_set}]},
+ "session.split": {to:[{field: "rsa.internal.session_split", setter: fld_set}]},
+ "sessionid": {to:[{field: "rsa.misc.log_session_id", setter: fld_set}]},
+ "sessionid1": {to:[{field: "rsa.misc.log_session_id1", setter: fld_set}]},
+ "sessiontype": {to:[{field: "rsa.misc.sessiontype", setter: fld_set}]},
+ "severity": {to:[{field: "rsa.misc.severity", setter: fld_set}]},
+ "sid": {to:[{field: "rsa.identity.user_sid_dst", setter: fld_set}]},
+ "sig.name": {to:[{field: "rsa.misc.sig_name", setter: fld_set}]},
+ "sigUUID": {to:[{field: "rsa.misc.sigUUID", setter: fld_set}]},
+ "sigcat": {to:[{field: "rsa.misc.sigcat", setter: fld_set}]},
+ "sigid": {convert: to_long, to:[{field: "rsa.misc.sig_id", setter: fld_set}]},
+ "sigid1": {convert: to_long, to:[{field: "rsa.misc.sig_id1", setter: fld_set}]},
+ "sigid_string": {to:[{field: "rsa.misc.sig_id_str", setter: fld_set}]},
+ "signame": {to:[{field: "rsa.misc.policy_name", setter: fld_prio, prio: 1}]},
+ "sigtype": {to:[{field: "rsa.crypto.sig_type", setter: fld_set}]},
+ "sinterface": {to:[{field: "rsa.network.sinterface", setter: fld_set}]},
+ "site": {to:[{field: "rsa.internal.site", setter: fld_set}]},
+ "size": {convert: to_long, to:[{field: "rsa.internal.size", setter: fld_set}]},
+ "smask": {to:[{field: "rsa.network.smask", setter: fld_set}]},
+ "snmp.oid": {to:[{field: "rsa.misc.snmp_oid", setter: fld_set}]},
+ "snmp.value": {to:[{field: "rsa.misc.snmp_value", setter: fld_set}]},
+ "sourcefile": {to:[{field: "rsa.internal.sourcefile", setter: fld_set}]},
+ "space": {to:[{field: "rsa.misc.space", setter: fld_set}]},
+ "space1": {to:[{field: "rsa.misc.space1", setter: fld_set}]},
+ "spi": {to:[{field: "rsa.misc.spi", setter: fld_set}]},
+ "sql": {to:[{field: "rsa.misc.sql", setter: fld_set}]},
+ "src_dn": {to:[{field: "rsa.identity.dn_src", setter: fld_set}]},
+ "src_payload": {to:[{field: "rsa.misc.payload_src", setter: fld_set}]},
+ "src_spi": {to:[{field: "rsa.misc.spi_src", setter: fld_set}]},
+ "src_zone": {to:[{field: "rsa.network.zone_src", setter: fld_set}]},
+ "srcburb": {to:[{field: "rsa.misc.srcburb", setter: fld_set}]},
+ "srcdom": {to:[{field: "rsa.misc.srcdom", setter: fld_set}]},
+ "srcservice": {to:[{field: "rsa.misc.srcservice", setter: fld_set}]},
+ "ssid": {to:[{field: "rsa.wireless.wlan_ssid", setter: fld_prio, prio: 0}]},
+ "stamp": {convert: to_date, to:[{field: "rsa.time.stamp", setter: fld_set}]},
+ "starttime": {convert: to_date, to:[{field: "rsa.time.starttime", setter: fld_set}]},
+ "state": {to:[{field: "rsa.misc.state", setter: fld_set}]},
+ "statement": {to:[{field: "rsa.internal.statement", setter: fld_set}]},
+ "status": {to:[{field: "rsa.misc.status", setter: fld_set}]},
+ "status1": {to:[{field: "rsa.misc.status1", setter: fld_set}]},
+ "streams": {convert: to_long, to:[{field: "rsa.misc.streams", setter: fld_set}]},
+ "subcategory": {to:[{field: "rsa.misc.subcategory", setter: fld_set}]},
+ "subject": {to:[{field: "rsa.email.subject", setter: fld_set}]},
+ "svcno": {to:[{field: "rsa.misc.svcno", setter: fld_set}]},
+ "system": {to:[{field: "rsa.misc.system", setter: fld_set}]},
+ "t_context": {to:[{field: "rsa.misc.context_target", setter: fld_set}]},
+ "task_name": {to:[{field: "rsa.file.task_name", setter: fld_set}]},
+ "tbdstr1": {to:[{field: "rsa.misc.tbdstr1", setter: fld_set}]},
+ "tbdstr2": {to:[{field: "rsa.misc.tbdstr2", setter: fld_set}]},
+ "tbl_name": {to:[{field: "rsa.db.table_name", setter: fld_set}]},
+ "tcp_flags": {convert: to_long, to:[{field: "rsa.misc.tcp_flags", setter: fld_set}]},
+ "terminal": {to:[{field: "rsa.misc.terminal", setter: fld_set}]},
+ "tgtdom": {to:[{field: "rsa.misc.tgtdom", setter: fld_set}]},
+ "tgtdomain": {to:[{field: "rsa.misc.tgtdomain", setter: fld_set}]},
+ "threat_name": {to:[{field: "rsa.threat.threat_category", setter: fld_set}]},
+ "threat_source": {to:[{field: "rsa.threat.threat_source", setter: fld_set}]},
+ "threat_val": {to:[{field: "rsa.threat.threat_desc", setter: fld_set}]},
+ "threshold": {to:[{field: "rsa.misc.threshold", setter: fld_set}]},
+ "time": {convert: to_date, to:[{field: "rsa.internal.time", setter: fld_set}]},
+ "timestamp": {to:[{field: "rsa.time.timestamp", setter: fld_set}]},
+ "timezone": {to:[{field: "rsa.time.timezone", setter: fld_set}]},
+ "to": {to:[{field: "rsa.email.email_dst", setter: fld_set}]},
+ "tos": {convert: to_long, to:[{field: "rsa.misc.tos", setter: fld_set}]},
+ "trans_from": {to:[{field: "rsa.email.trans_from", setter: fld_set}]},
+ "trans_id": {to:[{field: "rsa.db.transact_id", setter: fld_set}]},
+ "trans_to": {to:[{field: "rsa.email.trans_to", setter: fld_set}]},
+ "trigger_desc": {to:[{field: "rsa.misc.trigger_desc", setter: fld_set}]},
+ "trigger_val": {to:[{field: "rsa.misc.trigger_val", setter: fld_set}]},
+ "type": {to:[{field: "rsa.misc.type", setter: fld_set}]},
+ "type1": {to:[{field: "rsa.misc.type1", setter: fld_set}]},
+ "tzone": {to:[{field: "rsa.time.tzone", setter: fld_set}]},
+ "ubc.req": {convert: to_long, to:[{field: "rsa.internal.ubc_req", setter: fld_set}]},
+ "ubc.res": {convert: to_long, to:[{field: "rsa.internal.ubc_res", setter: fld_set}]},
+ "udb_class": {to:[{field: "rsa.misc.udb_class", setter: fld_set}]},
+ "url_fld": {to:[{field: "rsa.misc.url_fld", setter: fld_set}]},
+ "urlpage": {to:[{field: "rsa.web.urlpage", setter: fld_set}]},
+ "urlroot": {to:[{field: "rsa.web.urlroot", setter: fld_set}]},
+ "user_address": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "user_dept": {to:[{field: "rsa.identity.user_dept", setter: fld_set}]},
+ "user_div": {to:[{field: "rsa.misc.user_div", setter: fld_set}]},
+ "user_fname": {to:[{field: "rsa.identity.firstname", setter: fld_set}]},
+ "user_lname": {to:[{field: "rsa.identity.lastname", setter: fld_set}]},
+ "user_mname": {to:[{field: "rsa.identity.middlename", setter: fld_set}]},
+ "user_org": {to:[{field: "rsa.identity.org", setter: fld_set}]},
+ "user_role": {to:[{field: "rsa.identity.user_role", setter: fld_set}]},
+ "userid": {to:[{field: "rsa.misc.userid", setter: fld_set}]},
+ "username_fld": {to:[{field: "rsa.misc.username_fld", setter: fld_set}]},
+ "utcstamp": {to:[{field: "rsa.misc.utcstamp", setter: fld_set}]},
+ "v_instafname": {to:[{field: "rsa.misc.v_instafname", setter: fld_set}]},
+ "vendor_event_cat": {to:[{field: "rsa.investigations.event_vcat", setter: fld_set}]},
+ "version": {to:[{field: "rsa.misc.version", setter: fld_set}]},
+ "vid": {to:[{field: "rsa.internal.msg_vid", setter: fld_set}]},
+ "virt_data": {to:[{field: "rsa.misc.virt_data", setter: fld_set}]},
+ "virusname": {to:[{field: "rsa.misc.virusname", setter: fld_set}]},
+ "vlan": {convert: to_long, to:[{field: "rsa.network.vlan", setter: fld_set}]},
+ "vlan.name": {to:[{field: "rsa.network.vlan_name", setter: fld_set}]},
+ "vm_target": {to:[{field: "rsa.misc.vm_target", setter: fld_set}]},
+ "vpnid": {to:[{field: "rsa.misc.vpnid", setter: fld_set}]},
+ "vsys": {to:[{field: "rsa.misc.vsys", setter: fld_set}]},
+ "vuln_ref": {to:[{field: "rsa.misc.vuln_ref", setter: fld_set}]},
+ "web_cookie": {to:[{field: "rsa.web.web_cookie", setter: fld_set}]},
+ "web_extension_tmp": {to:[{field: "rsa.web.web_extension_tmp", setter: fld_set}]},
+ "web_host": {to:[{field: "rsa.web.alias_host", setter: fld_set}]},
+ "web_method": {to:[{field: "rsa.misc.action", setter: fld_append}]},
+ "web_page": {to:[{field: "rsa.web.web_page", setter: fld_set}]},
+ "web_ref_domain": {to:[{field: "rsa.web.web_ref_domain", setter: fld_set}]},
+ "web_ref_host": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "web_ref_page": {to:[{field: "rsa.web.web_ref_page", setter: fld_set}]},
+ "web_ref_query": {to:[{field: "rsa.web.web_ref_query", setter: fld_set}]},
+ "web_ref_root": {to:[{field: "rsa.web.web_ref_root", setter: fld_set}]},
+ "wifi_channel": {convert: to_long, to:[{field: "rsa.wireless.wlan_channel", setter: fld_set}]},
+ "wlan": {to:[{field: "rsa.wireless.wlan_name", setter: fld_set}]},
+ "word": {to:[{field: "rsa.internal.word", setter: fld_set}]},
+ "workspace_desc": {to:[{field: "rsa.misc.workspace", setter: fld_set}]},
+ "workstation": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "year": {to:[{field: "rsa.time.year", setter: fld_set}]},
+ "zone": {to:[{field: "rsa.network.zone", setter: fld_set}]},
+ };
+
+ function to_date(value) {
+ switch (typeof (value)) {
+ case "object":
+ // This is a Date. But as it was obtained from evt.Get(), the VM
+ // doesn't see it as a JS Date anymore, thus value instanceof Date === false.
+ // Have to trust that any object here is a valid Date for Go.
+ return value;
+ case "string":
+ var asDate = new Date(value);
+ if (!isNaN(asDate)) return asDate;
+ }
+ }
+
+ // ECMAScript 5.1 doesn't have Object.MAX_SAFE_INTEGER / Object.MIN_SAFE_INTEGER.
+ var maxSafeInt = Math.pow(2, 53) - 1;
+ var minSafeInt = -maxSafeInt;
+
+ function to_long(value) {
+ var num = parseInt(value);
+ // Better not to index a number if it's not safe (above 53 bits).
+ return !isNaN(num) && minSafeInt <= num && num <= maxSafeInt ? num : undefined;
+ }
+
+ function to_ip(value) {
+ if (value.indexOf(":") === -1)
+ return to_ipv4(value);
+ return to_ipv6(value);
+ }
+
+ var ipv4_regex = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
+ var ipv6_hex_regex = /^[0-9A-Fa-f]{1,4}$/;
+
+ function to_ipv4(value) {
+ var result = ipv4_regex.exec(value);
+ if (result == null || result.length !== 5) return;
+ for (var i = 1; i < 5; i++) {
+ var num = strictToInt(result[i]);
+ if (isNaN(num) || num < 0 || num > 255) return;
+ }
+ return value;
+ }
+
+ function to_ipv6(value) {
+ var sqEnd = value.indexOf("]");
+ if (sqEnd > -1) {
+ if (value.charAt(0) !== "[") return;
+ value = value.substr(1, sqEnd - 1);
+ }
+ var zoneOffset = value.indexOf("%");
+ if (zoneOffset > -1) {
+ value = value.substr(0, zoneOffset);
+ }
+ var parts = value.split(":");
+ if (parts == null || parts.length < 3 || parts.length > 8) return;
+ var numEmpty = 0;
+ var innerEmpty = 0;
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i].length === 0) {
+ numEmpty++;
+ if (i > 0 && i + 1 < parts.length) innerEmpty++;
+ } else if (!parts[i].match(ipv6_hex_regex) &&
+ // Accept an IPv6 with a valid IPv4 at the end.
+ ((i + 1 < parts.length) || !to_ipv4(parts[i]))) {
+ return;
+ }
+ }
+ return innerEmpty === 0 && parts.length === 8 || innerEmpty === 1 ? value : undefined;
+ }
+
+ function to_double(value) {
+ return parseFloat(value);
+ }
+
+ function to_mac(value) {
+ // ES doesn't have a mac datatype so it's safe to ingest whatever was captured.
+ return value;
+ }
+
+ function to_lowercase(value) {
+ // to_lowercase is used against keyword fields, which can accept
+ // any other type (numbers, dates).
+ return typeof(value) === "string"? value.toLowerCase() : value;
+ }
+
+ function fld_set(dst, value) {
+ dst[this.field] = { v: value };
+ }
+
+ function fld_append(dst, value) {
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: [value] };
+ } else {
+ var base = dst[this.field];
+ if (base.v.indexOf(value)===-1) base.v.push(value);
+ }
+ }
+
+ function fld_prio(dst, value) {
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: value, prio: this.prio};
+ } else if(this.prio < dst[this.field].prio) {
+ dst[this.field].v = value;
+ dst[this.field].prio = this.prio;
+ }
+ }
+
+ var valid_ecs_outcome = {
+ 'failure': true,
+ 'success': true,
+ 'unknown': true
+ };
+
+ function fld_ecs_outcome(dst, value) {
+ value = value.toLowerCase();
+ if (valid_ecs_outcome[value] === undefined) {
+ value = 'unknown';
+ }
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: value };
+ } else if (dst[this.field].v === 'unknown') {
+ dst[this.field] = { v: value };
+ }
+ }
+
+ function map_all(evt, targets, value) {
+ for (var i = 0; i < targets.length; i++) {
+ evt.Put(targets[i], value);
+ }
+ }
+
+ function populate_fields(evt) {
+ var base = evt.Get(FIELDS_OBJECT);
+ if (base === null) return;
+ alternate_datetime(evt);
+ if (map_ecs) {
+ do_populate(evt, base, ecs_mappings);
+ }
+ if (map_rsa) {
+ do_populate(evt, base, rsa_mappings);
+ }
+ if (keep_raw) {
+ evt.Put("rsa.raw", base);
+ }
+ evt.Delete(FIELDS_OBJECT);
+ }
+
+ var datetime_alt_components = [
+ {field: "day", fmts: [[dF]]},
+ {field: "year", fmts: [[dW]]},
+ {field: "month", fmts: [[dB],[dG]]},
+ {field: "date", fmts: [[dW,dSkip,dG,dSkip,dF],[dW,dSkip,dB,dSkip,dF],[dW,dSkip,dR,dSkip,dF]]},
+ {field: "hour", fmts: [[dN]]},
+ {field: "min", fmts: [[dU]]},
+ {field: "secs", fmts: [[dO]]},
+ {field: "time", fmts: [[dN, dSkip, dU, dSkip, dO]]},
+ ];
+
+ function alternate_datetime(evt) {
+ if (evt.Get(FIELDS_PREFIX + "event_time") != null) {
+ return;
+ }
+ var tzOffset = tz_offset;
+ if (tzOffset === "event") {
+ tzOffset = evt.Get("event.timezone");
+ }
+ var container = new DateContainer(tzOffset);
+ for (var i=0; i} ZSCALERNSS: time=%{hfld2->} %{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hyear}^^timezone=%{timezone}^^%{payload}", processor_chain([
+ setc("header_id","0001"),
+ setc("messageid","ZSCALERNSS_1"),
+ ]));
+
+ var select1 = linear_select([
+ hdr1,
+ ]);
+
+ var part1 = match("MESSAGE#0:ZSCALERNSS_1", "nwparser.payload", "action=%{action}^^reason=%{result}^^hostname=%{hostname}^^protocol=%{protocol}^^serverip=%{daddr}^^url=%{url}^^urlcategory=%{filter}^^urlclass=%{info}^^dlpdictionaries=%{fld3}^^dlpengine=%{fld4}^^filetype=%{filetype}^^threatcategory=%{category}^^threatclass=%{vendor_event_cat}^^pagerisk=%{fld8}^^threatname=%{threat_name}^^clientpublicIP=%{fld9}^^ClientIP=%{saddr}^^location=%{fld11}^^refererURL=%{web_referer}^^useragent=%{user_agent}^^department=%{user_dept}^^user=%{username}^^event_id=%{id}^^clienttranstime=%{fld17}^^requestmethod=%{web_method}^^requestsize=%{sbytes}^^requestversion=%{fld20}^^status=%{resultcode}^^responsesize=%{rbytes}^^responseversion=%{fld23}^^transactionsize=%{bytes}", processor_chain([
+ setc("eventcategory","1605000000"),
+ setf("fqdn","hostname"),
+ setf("msg","$MSG"),
+ date_time({
+ dest: "event_time",
+ args: ["hmonth","hday","hyear","hhour","hmin","hsec"],
+ fmts: [
+ [dB,dF,dW,dN,dU,dO],
+ ],
+ }),
+ lookup({
+ dest: "nwparser.ec_activity",
+ map: map_getEventCategoryActivity,
+ key: field("action"),
+ }),
+ setc("ec_theme","Communication"),
+ setc("ec_subject","User"),
+ ]));
+
+ var msg1 = msg("ZSCALERNSS_1", part1);
+
+ var chain1 = processor_chain([
+ select1,
+ msgid_select({
+ "ZSCALERNSS_1": msg1,
+ }),
+ ]);
+
+- community_id:
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: dns.question.name
+ target_field: dns.question.registered_domain
+ target_subdomain_field: dns.question.subdomain
+ target_etld_field: dns.question.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: client.domain
+ target_field: client.registered_domain
+ target_subdomain_field: client.subdomain
+ target_etld_field: client.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: server.domain
+ target_field: server.registered_domain
+ target_subdomain_field: server.subdomain
+ target_etld_field: server.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: destination.domain
+ target_field: destination.registered_domain
+ target_subdomain_field: destination.subdomain
+ target_etld_field: destination.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: source.domain
+ target_field: source.registered_domain
+ target_subdomain_field: source.subdomain
+ target_etld_field: source.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: url.domain
+ target_field: url.registered_domain
+ target_subdomain_field: url.subdomain
+ target_etld_field: url.top_level_domain
+- add_locale: ~
diff --git a/packages/zscaler/0.5.1/data_stream/zia/agent/stream/tcp.yml.hbs b/packages/zscaler/0.5.1/data_stream/zia/agent/stream/tcp.yml.hbs
new file mode 100755
index 0000000000..678c7087b7
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/agent/stream/tcp.yml.hbs
@@ -0,0 +1,2652 @@
+tcp:
+host: "{{tcp_host}}:{{tcp_port}}"
+tags:
+{{#if preserve_original_event}}
+ - preserve_original_event
+{{/if}}
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+fields_under_root: true
+fields:
+ observer:
+ vendor: "Zscaler"
+ product: "Internet"
+ type: "Configuration"
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+processors:
+{{#if processors}}
+{{processors}}
+{{/if}}
+- script:
+ lang: javascript
+ params:
+ ecs: true
+ rsa: {{rsa_fields}}
+ tz_offset: {{tz_offset}}
+ keep_raw: {{keep_raw_fields}}
+ debug: {{debug}}
+ source: |
+ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ // or more contributor license agreements. Licensed under the Elastic License;
+ // you may not use this file except in compliance with the Elastic License.
+
+ /* jshint -W014,-W016,-W097,-W116 */
+
+ var processor = require("processor");
+ var console = require("console");
+
+ var FLAG_FIELD = "log.flags";
+ var FIELDS_OBJECT = "nwparser";
+ var FIELDS_PREFIX = FIELDS_OBJECT + ".";
+
+ var defaults = {
+ debug: false,
+ ecs: true,
+ rsa: false,
+ keep_raw: false,
+ tz_offset: "local",
+ strip_priority: true
+ };
+
+ var saved_flags = null;
+ var debug;
+ var map_ecs;
+ var map_rsa;
+ var keep_raw;
+ var device;
+ var tz_offset;
+ var strip_priority;
+
+ // Register params from configuration.
+ function register(params) {
+ debug = params.debug !== undefined ? params.debug : defaults.debug;
+ map_ecs = params.ecs !== undefined ? params.ecs : defaults.ecs;
+ map_rsa = params.rsa !== undefined ? params.rsa : defaults.rsa;
+ keep_raw = params.keep_raw !== undefined ? params.keep_raw : defaults.keep_raw;
+ tz_offset = parse_tz_offset(params.tz_offset !== undefined? params.tz_offset : defaults.tz_offset);
+ strip_priority = params.strip_priority !== undefined? params.strip_priority : defaults.strip_priority;
+ device = new DeviceProcessor();
+ }
+
+ function parse_tz_offset(offset) {
+ var date;
+ var m;
+ switch(offset) {
+ // local uses the tz offset from the JS VM.
+ case "local":
+ date = new Date();
+ // Reversing the sign as we the offset from UTC, not to UTC.
+ return parse_local_tz_offset(-date.getTimezoneOffset());
+ // event uses the tz offset from event.timezone (add_locale processor).
+ case "event":
+ return offset;
+ // Otherwise a tz offset in the form "[+-][0-9]{4}" is required.
+ default:
+ m = offset.match(/^([+\-])([0-9]{2}):?([0-9]{2})?$/);
+ if (m === null || m.length !== 4) {
+ throw("bad timezone offset: '" + offset + "'. Must have the form +HH:MM");
+ }
+ return m[1] + m[2] + ":" + (m[3]!==undefined? m[3] : "00");
+ }
+ }
+
+ function parse_local_tz_offset(minutes) {
+ var neg = minutes < 0;
+ minutes = Math.abs(minutes);
+ var min = minutes % 60;
+ var hours = Math.floor(minutes / 60);
+ var pad2digit = function(n) {
+ if (n < 10) { return "0" + n;}
+ return "" + n;
+ };
+ return (neg? "-" : "+") + pad2digit(hours) + ":" + pad2digit(min);
+ }
+
+ function process(evt) {
+ // Function register is only called by the processor when `params` are set
+ // in the processor config.
+ if (device === undefined) {
+ register(defaults);
+ }
+ return device.process(evt);
+ }
+
+ function processor_chain(subprocessors) {
+ var builder = new processor.Chain();
+ subprocessors.forEach(builder.Add);
+ return builder.Build().Run;
+ }
+
+ function linear_select(subprocessors) {
+ return function (evt) {
+ var flags = evt.Get(FLAG_FIELD);
+ var i;
+ for (i = 0; i < subprocessors.length; i++) {
+ evt.Delete(FLAG_FIELD);
+ if (debug) console.warn("linear_select trying entry " + i);
+ subprocessors[i](evt);
+ // Dissect processor succeeded?
+ if (evt.Get(FLAG_FIELD) == null) break;
+ if (debug) console.warn("linear_select failed entry " + i);
+ }
+ if (flags !== null) {
+ evt.Put(FLAG_FIELD, flags);
+ }
+ if (debug) {
+ if (i < subprocessors.length) {
+ console.warn("linear_select matched entry " + i);
+ } else {
+ console.warn("linear_select didn't match");
+ }
+ }
+ };
+ }
+
+ function conditional(opt) {
+ return function(evt) {
+ if (opt.if(evt)) {
+ opt.then(evt);
+ } else if (opt.else) {
+ opt.else(evt);
+ }
+ };
+ }
+
+ var strip_syslog_priority = (function() {
+ var isEnabled = function() { return strip_priority === true; };
+ var fetchPRI = field("_pri");
+ var fetchPayload = field("payload");
+ var removePayload = remove(["payload"]);
+ var cleanup = remove(["_pri", "payload"]);
+ var onMatch = function(evt) {
+ var pri, priStr = fetchPRI(evt);
+ if (priStr != null
+ && 0 < priStr.length && priStr.length < 4
+ && !isNaN((pri = Number(priStr)))
+ && 0 <= pri && pri < 192) {
+ var severity = pri & 7,
+ facility = pri >> 3;
+ setc("_severity", "" + severity)(evt);
+ setc("_facility", "" + facility)(evt);
+ // Replace message with priority stripped.
+ evt.Put("message", fetchPayload(evt));
+ removePayload(evt);
+ } else {
+ // not a valid syslog PRI, cleanup.
+ cleanup(evt);
+ }
+ };
+ return conditional({
+ if: isEnabled,
+ then: cleanup_flags(match(
+ "STRIP_PRI",
+ "message",
+ "<%{_pri}>%{payload}",
+ onMatch
+ ))
+ });
+ })();
+
+ function match(id, src, pattern, on_success) {
+ var dissect = new processor.Dissect({
+ field: src,
+ tokenizer: pattern,
+ target_prefix: FIELDS_OBJECT,
+ ignore_failure: true,
+ overwrite_keys: true,
+ trim_values: "right"
+ });
+ return function (evt) {
+ var msg = evt.Get(src);
+ dissect.Run(evt);
+ var failed = evt.Get(FLAG_FIELD) != null;
+ if (debug) {
+ if (failed) {
+ console.debug("dissect fail: " + id + " field:" + src);
+ } else {
+ console.debug("dissect OK: " + id + " field:" + src);
+ }
+ console.debug(" expr: <<" + pattern + ">>");
+ console.debug(" input: <<" + msg + ">>");
+ }
+ if (on_success != null && !failed) {
+ on_success(evt);
+ }
+ };
+ }
+
+ function match_copy(id, src, dst, on_success) {
+ dst = FIELDS_PREFIX + dst;
+ if (dst === FIELDS_PREFIX || dst === src) {
+ return function (evt) {
+ if (debug) {
+ console.debug("noop OK: " + id + " field:" + src);
+ console.debug(" input: <<" + evt.Get(src) + ">>");
+ }
+ if (on_success != null) on_success(evt);
+ }
+ }
+ return function (evt) {
+ var msg = evt.Get(src);
+ evt.Put(dst, msg);
+ if (debug) {
+ console.debug("copy OK: " + id + " field:" + src);
+ console.debug(" target: '" + dst + "'");
+ console.debug(" input: <<" + msg + ">>");
+ }
+ if (on_success != null) on_success(evt);
+ }
+ }
+
+ function cleanup_flags(processor) {
+ return function(evt) {
+ processor(evt);
+ evt.Delete(FLAG_FIELD);
+ };
+ }
+
+ function all_match(opts) {
+ return function (evt) {
+ var i;
+ for (i = 0; i < opts.processors.length; i++) {
+ evt.Delete(FLAG_FIELD);
+ opts.processors[i](evt);
+ // Dissect processor succeeded?
+ if (evt.Get(FLAG_FIELD) != null) {
+ if (debug) console.warn("all_match failure at " + i);
+ if (opts.on_failure != null) opts.on_failure(evt);
+ return;
+ }
+ if (debug) console.warn("all_match success at " + i);
+ }
+ if (opts.on_success != null) opts.on_success(evt);
+ };
+ }
+
+ function msgid_select(mapping) {
+ return function (evt) {
+ var msgid = evt.Get(FIELDS_PREFIX + "messageid");
+ if (msgid == null) {
+ if (debug) console.warn("msgid_select: no messageid captured!");
+ return;
+ }
+ var next = mapping[msgid];
+ if (next === undefined) {
+ if (debug) console.warn("msgid_select: no mapping for messageid:" + msgid);
+ return;
+ }
+ if (debug) console.info("msgid_select: matched key=" + msgid);
+ return next(evt);
+ };
+ }
+
+ function msg(msg_id, match) {
+ return function (evt) {
+ match(evt);
+ if (evt.Get(FLAG_FIELD) == null) {
+ evt.Put(FIELDS_PREFIX + "msg_id1", msg_id);
+ }
+ };
+ }
+
+ var start;
+
+ function save_flags(evt) {
+ saved_flags = evt.Get(FLAG_FIELD);
+ evt.Put("event.original", evt.Get("message"));
+ }
+
+ function restore_flags(evt) {
+ if (saved_flags !== null) {
+ evt.Put(FLAG_FIELD, saved_flags);
+ }
+ evt.Delete("message");
+ }
+
+ function constant(value) {
+ return function (evt) {
+ return value;
+ };
+ }
+
+ function field(name) {
+ var fullname = FIELDS_PREFIX + name;
+ return function (evt) {
+ return evt.Get(fullname);
+ };
+ }
+
+ function STRCAT(args) {
+ var s = "";
+ var i;
+ for (i = 0; i < args.length; i++) {
+ s += args[i];
+ }
+ return s;
+ }
+
+ // TODO: Implement
+ function DIRCHK(args) {
+ unimplemented("DIRCHK");
+ }
+
+ function strictToInt(str) {
+ return str * 1;
+ }
+
+ function CALC(args) {
+ if (args.length !== 3) {
+ console.warn("skipped call to CALC with " + args.length + " arguments.");
+ return;
+ }
+ var a = strictToInt(args[0]);
+ var b = strictToInt(args[2]);
+ if (isNaN(a) || isNaN(b)) {
+ console.warn("failed evaluating CALC arguments a='" + args[0] + "' b='" + args[2] + "'.");
+ return;
+ }
+ var result;
+ switch (args[1]) {
+ case "+":
+ result = a + b;
+ break;
+ case "-":
+ result = a - b;
+ break;
+ case "*":
+ result = a * b;
+ break;
+ default:
+ // Only * and + seen in the parsers.
+ console.warn("unknown CALC operation '" + args[1] + "'.");
+ return;
+ }
+ // Always return a string
+ return result !== undefined ? "" + result : result;
+ }
+
+ var quoteChars = "\"'`";
+ function RMQ(args) {
+ if(args.length !== 1) {
+ console.warn("RMQ: only one argument expected");
+ return;
+ }
+ var value = args[0].trim();
+ var n = value.length;
+ var char;
+ return n > 1
+ && (char=value.charAt(0)) === value.charAt(n-1)
+ && quoteChars.indexOf(char) !== -1?
+ value.substr(1, n-2)
+ : value;
+ }
+
+ function call(opts) {
+ var args = new Array(opts.args.length);
+ return function (evt) {
+ for (var i = 0; i < opts.args.length; i++)
+ if ((args[i] = opts.args[i](evt)) == null) return;
+ var result = opts.fn(args);
+ if (result != null) {
+ evt.Put(opts.dest, result);
+ }
+ };
+ }
+
+ function nop(evt) {
+ }
+
+ function appendErrorMsg(evt, msg) {
+ var value = evt.Get("error.message");
+ if (value == null) {
+ value = [msg];
+ } else if (msg instanceof Array) {
+ value.push(msg);
+ } else {
+ value = [value, msg];
+ }
+ evt.Put("error.message", value);
+ }
+
+ function unimplemented(name) {
+ appendErrorMsg("unimplemented feature: " + name);
+ }
+
+ function lookup(opts) {
+ return function (evt) {
+ var key = opts.key(evt);
+ if (key == null) return;
+ var value = opts.map.keyvaluepairs[key];
+ if (value === undefined) {
+ value = opts.map.default;
+ }
+ if (value !== undefined) {
+ evt.Put(opts.dest, value(evt));
+ }
+ };
+ }
+
+ function set(fields) {
+ return new processor.AddFields({
+ target: FIELDS_OBJECT,
+ fields: fields,
+ });
+ }
+
+ function setf(dst, src) {
+ return function (evt) {
+ var val = evt.Get(FIELDS_PREFIX + src);
+ if (val != null) evt.Put(FIELDS_PREFIX + dst, val);
+ };
+ }
+
+ function setc(dst, value) {
+ return function (evt) {
+ evt.Put(FIELDS_PREFIX + dst, value);
+ };
+ }
+
+ function set_field(opts) {
+ return function (evt) {
+ var val = opts.value(evt);
+ if (val != null) evt.Put(opts.dest, val);
+ };
+ }
+
+ function dump(label) {
+ return function (evt) {
+ console.log("Dump of event at " + label + ": " + JSON.stringify(evt, null, "\t"));
+ };
+ }
+
+ function date_time_join_args(evt, arglist) {
+ var str = "";
+ for (var i = 0; i < arglist.length; i++) {
+ var fname = FIELDS_PREFIX + arglist[i];
+ var val = evt.Get(fname);
+ if (val != null) {
+ if (str !== "") str += " ";
+ str += val;
+ } else {
+ if (debug) console.warn("in date_time: input arg " + fname + " is not set");
+ }
+ }
+ return str;
+ }
+
+ function to2Digit(num) {
+ return num? (num < 10? "0" + num : num) : "00";
+ }
+
+ // Make two-digit dates 00-69 interpreted as 2000-2069
+ // and dates 70-99 translated to 1970-1999.
+ var twoDigitYearEpoch = 70;
+ var twoDigitYearCentury = 2000;
+
+ // This is to accept dates up to 2 days in the future, only used when
+ // no year is specified in a date. 2 days should be enough to account for
+ // time differences between systems and different tz offsets.
+ var maxFutureDelta = 2*24*60*60*1000;
+
+ // DateContainer stores date fields and then converts those fields into
+ // a Date. Necessary because building a Date using its set() methods gives
+ // different results depending on the order of components.
+ function DateContainer(tzOffset) {
+ this.offset = tzOffset === undefined? "Z" : tzOffset;
+ }
+
+ DateContainer.prototype = {
+ setYear: function(v) {this.year = v;},
+ setMonth: function(v) {this.month = v;},
+ setDay: function(v) {this.day = v;},
+ setHours: function(v) {this.hours = v;},
+ setMinutes: function(v) {this.minutes = v;},
+ setSeconds: function(v) {this.seconds = v;},
+
+ setUNIX: function(v) {this.unix = v;},
+
+ set2DigitYear: function(v) {
+ this.year = v < twoDigitYearEpoch? twoDigitYearCentury + v : twoDigitYearCentury + v - 100;
+ },
+
+ toDate: function() {
+ if (this.unix !== undefined) {
+ return new Date(this.unix * 1000);
+ }
+ if (this.day === undefined || this.month === undefined) {
+ // Can't make a date from this.
+ return undefined;
+ }
+ if (this.year === undefined) {
+ // A date without a year. Set current year, or previous year
+ // if date would be in the future.
+ var now = new Date();
+ this.year = now.getFullYear();
+ var date = this.toDate();
+ if (date.getTime() - now.getTime() > maxFutureDelta) {
+ date.setFullYear(now.getFullYear() - 1);
+ }
+ return date;
+ }
+ var MM = to2Digit(this.month);
+ var DD = to2Digit(this.day);
+ var hh = to2Digit(this.hours);
+ var mm = to2Digit(this.minutes);
+ var ss = to2Digit(this.seconds);
+ return new Date(this.year + "-" + MM + "-" + DD + "T" + hh + ":" + mm + ":" + ss + this.offset);
+ }
+ }
+
+ function date_time_try_pattern(fmt, str, tzOffset) {
+ var date = new DateContainer(tzOffset);
+ var pos = date_time_try_pattern_at_pos(fmt, str, 0, date);
+ return pos !== undefined? date.toDate() : undefined;
+ }
+
+ function date_time_try_pattern_at_pos(fmt, str, pos, date) {
+ var len = str.length;
+ for (var proc = 0; pos !== undefined && pos < len && proc < fmt.length; proc++) {
+ pos = fmt[proc](str, pos, date);
+ }
+ return pos;
+ }
+
+ function date_time(opts) {
+ return function (evt) {
+ var tzOffset = opts.tz || tz_offset;
+ if (tzOffset === "event") {
+ tzOffset = evt.Get("event.timezone");
+ }
+ var str = date_time_join_args(evt, opts.args);
+ for (var i = 0; i < opts.fmts.length; i++) {
+ var date = date_time_try_pattern(opts.fmts[i], str, tzOffset);
+ if (date !== undefined) {
+ evt.Put(FIELDS_PREFIX + opts.dest, date);
+ return;
+ }
+ }
+ if (debug) console.warn("in date_time: id=" + opts.id + " FAILED: " + str);
+ };
+ }
+
+ var uA = 60 * 60 * 24;
+ var uD = 60 * 60 * 24;
+ var uF = 60 * 60;
+ var uG = 60 * 60 * 24 * 30;
+ var uH = 60 * 60;
+ var uI = 60 * 60;
+ var uJ = 60 * 60 * 24;
+ var uM = 60 * 60 * 24 * 30;
+ var uN = 60 * 60;
+ var uO = 1;
+ var uS = 1;
+ var uT = 60;
+ var uU = 60;
+ var uc = dc;
+
+ function duration(opts) {
+ return function(evt) {
+ var str = date_time_join_args(evt, opts.args);
+ for (var i = 0; i < opts.fmts.length; i++) {
+ var seconds = duration_try_pattern(opts.fmts[i], str);
+ if (seconds !== undefined) {
+ evt.Put(FIELDS_PREFIX + opts.dest, seconds);
+ return;
+ }
+ }
+ if (debug) console.warn("in duration: id=" + opts.id + " (s) FAILED: " + str);
+ };
+ }
+
+ function duration_try_pattern(fmt, str) {
+ var secs = 0;
+ var pos = 0;
+ for (var i=0; i [ month_id , how many chars to skip if month in long form ]
+ "Jan": [0, 4],
+ "Feb": [1, 5],
+ "Mar": [2, 2],
+ "Apr": [3, 2],
+ "May": [4, 0],
+ "Jun": [5, 1],
+ "Jul": [6, 1],
+ "Aug": [7, 3],
+ "Sep": [8, 6],
+ "Oct": [9, 4],
+ "Nov": [10, 5],
+ "Dec": [11, 4],
+ "jan": [0, 4],
+ "feb": [1, 5],
+ "mar": [2, 2],
+ "apr": [3, 2],
+ "may": [4, 0],
+ "jun": [5, 1],
+ "jul": [6, 1],
+ "aug": [7, 3],
+ "sep": [8, 6],
+ "oct": [9, 4],
+ "nov": [10, 5],
+ "dec": [11, 4],
+ };
+
+ // var dC = undefined;
+ var dR = dateMonthName(true);
+ var dB = dateMonthName(false);
+ var dM = dateFixedWidthNumber("M", 2, 1, 12, DateContainer.prototype.setMonth);
+ var dG = dateVariableWidthNumber("G", 1, 12, DateContainer.prototype.setMonth);
+ var dD = dateFixedWidthNumber("D", 2, 1, 31, DateContainer.prototype.setDay);
+ var dF = dateVariableWidthNumber("F", 1, 31, DateContainer.prototype.setDay);
+ var dH = dateFixedWidthNumber("H", 2, 0, 24, DateContainer.prototype.setHours);
+ var dI = dateVariableWidthNumber("I", 0, 24, DateContainer.prototype.setHours); // Accept hours >12
+ var dN = dateVariableWidthNumber("N", 0, 24, DateContainer.prototype.setHours);
+ var dT = dateFixedWidthNumber("T", 2, 0, 59, DateContainer.prototype.setMinutes);
+ var dU = dateVariableWidthNumber("U", 0, 59, DateContainer.prototype.setMinutes);
+ var dP = parseAMPM; // AM|PM
+ var dQ = parseAMPM; // A.M.|P.M
+ var dS = dateFixedWidthNumber("S", 2, 0, 60, DateContainer.prototype.setSeconds);
+ var dO = dateVariableWidthNumber("O", 0, 60, DateContainer.prototype.setSeconds);
+ var dY = dateFixedWidthNumber("Y", 2, 0, 99, DateContainer.prototype.set2DigitYear);
+ var dW = dateFixedWidthNumber("W", 4, 1000, 9999, DateContainer.prototype.setYear);
+ var dZ = parseHMS;
+ var dX = dateVariableWidthNumber("X", 0, 0x10000000000, DateContainer.prototype.setUNIX);
+
+ // parseAMPM parses "A.M", "AM", "P.M", "PM" from logs.
+ // Only works if this modifier appears after the hour has been read from logs
+ // which is always the case in the 300 devices.
+ function parseAMPM(str, pos, date) {
+ var n = str.length;
+ var start = skipws(str, pos);
+ if (start + 2 > n) return;
+ var head = str.substr(start, 2).toUpperCase();
+ var isPM = false;
+ var skip = false;
+ switch (head) {
+ case "A.":
+ skip = true;
+ /* falls through */
+ case "AM":
+ break;
+ case "P.":
+ skip = true;
+ /* falls through */
+ case "PM":
+ isPM = true;
+ break;
+ default:
+ if (debug) console.warn("can't parse pos " + start + " as AM/PM: " + str + "(head:" + head + ")");
+ return;
+ }
+ pos = start + 2;
+ if (skip) {
+ if (pos+2 > n || str.substr(pos, 2).toUpperCase() !== "M.") {
+ if (debug) console.warn("can't parse pos " + start + " as AM/PM: " + str + "(tail)");
+ return;
+ }
+ pos += 2;
+ }
+ var hh = date.hours;
+ if (isPM) {
+ // Accept existing hour in 24h format.
+ if (hh < 12) hh += 12;
+ } else {
+ if (hh === 12) hh = 0;
+ }
+ date.setHours(hh);
+ return pos;
+ }
+
+ function parseHMS(str, pos, date) {
+ return date_time_try_pattern_at_pos([dN, dc(":"), dU, dc(":"), dO], str, pos, date);
+ }
+
+ function skipws(str, pos) {
+ for ( var n = str.length;
+ pos < n && str.charAt(pos) === " ";
+ pos++)
+ ;
+ return pos;
+ }
+
+ function skipdigits(str, pos) {
+ var c;
+ for (var n = str.length;
+ pos < n && (c = str.charAt(pos)) >= "0" && c <= "9";
+ pos++)
+ ;
+ return pos;
+ }
+
+ function dSkip(str, pos, date) {
+ var chr;
+ for (;pos < str.length && (chr=str[pos])<'0' || chr>'9'; pos++) {}
+ return pos < str.length? pos : undefined;
+ }
+
+ function dateVariableWidthNumber(fmtChar, min, max, setter) {
+ return function (str, pos, date) {
+ var start = skipws(str, pos);
+ pos = skipdigits(str, start);
+ var s = str.substr(start, pos - start);
+ var value = parseInt(s, 10);
+ if (value >= min && value <= max) {
+ setter.call(date, value);
+ return pos;
+ }
+ return;
+ };
+ }
+
+ function dateFixedWidthNumber(fmtChar, width, min, max, setter) {
+ return function (str, pos, date) {
+ pos = skipws(str, pos);
+ var n = str.length;
+ if (pos + width > n) return;
+ var s = str.substr(pos, width);
+ var value = parseInt(s, 10);
+ if (value >= min && value <= max) {
+ setter.call(date, value);
+ return pos + width;
+ }
+ return;
+ };
+ }
+
+ // Short month name (Jan..Dec).
+ function dateMonthName(long) {
+ return function (str, pos, date) {
+ pos = skipws(str, pos);
+ var n = str.length;
+ if (pos + 3 > n) return;
+ var mon = str.substr(pos, 3);
+ var idx = shortMonths[mon];
+ if (idx === undefined) {
+ idx = shortMonths[mon.toLowerCase()];
+ }
+ if (idx === undefined) {
+ //console.warn("parsing date_time: '" + mon + "' is not a valid short month (%B)");
+ return;
+ }
+ date.setMonth(idx[0]+1);
+ return pos + 3 + (long ? idx[1] : 0);
+ };
+ }
+
+ function url_wrapper(dst, src, fn) {
+ return function(evt) {
+ var value = evt.Get(FIELDS_PREFIX + src), result;
+ if (value != null && (result = fn(value))!== undefined) {
+ evt.Put(FIELDS_PREFIX + dst, result);
+ } else {
+ console.debug(fn.name + " failed for '" + value + "'");
+ }
+ };
+ }
+
+ // The following regular expression for parsing URLs from:
+ // https://github.com/wizard04wsu/URI_Parsing
+ //
+ // The MIT License (MIT)
+ //
+ // Copyright (c) 2014 Andrew Harrison
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a copy of
+ // this software and associated documentation files (the "Software"), to deal in
+ // the Software without restriction, including without limitation the rights to
+ // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ // the Software, and to permit persons to whom the Software is furnished to do so,
+ // subject to the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included in all
+ // copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ var uriRegExp = /^([a-z][a-z0-9+.\-]*):(?:\/\/((?:(?=((?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9A-F]{2})*))(\3)@)?(?=(\[[0-9A-F:.]{2,}\]|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9A-F]{2})*))\5(?::(?=(\d*))\6)?)(\/(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\8)?|(\/?(?!\/)(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\10)?)(?:\?(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\11)?(?:#(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\12)?$/i;
+
+ var uriScheme = 1;
+ var uriDomain = 5;
+ var uriPort = 6;
+ var uriPath = 7;
+ var uriPathAlt = 9;
+ var uriQuery = 11;
+
+ function domain(dst, src) {
+ return url_wrapper(dst, src, extract_domain);
+ }
+
+ function split_url(value) {
+ var m = value.match(uriRegExp);
+ if (m && m[uriDomain]) return m;
+ // Support input in the form "www.example.net/path", but not "/path".
+ m = ("null://" + value).match(uriRegExp);
+ if (m) return m;
+ }
+
+ function extract_domain(value) {
+ var m = split_url(value);
+ if (m && m[uriDomain]) return m[uriDomain];
+ }
+
+ var extFromPage = /\.[^.]+$/;
+ function extract_ext(value) {
+ var page = extract_page(value);
+ if (page) {
+ var m = page.match(extFromPage);
+ if (m) return m[0];
+ }
+ }
+
+ function ext(dst, src) {
+ return url_wrapper(dst, src, extract_ext);
+ }
+
+ function fqdn(dst, src) {
+ // TODO: fqdn and domain(eTLD+1) are currently the same.
+ return domain(dst, src);
+ }
+
+ var pageFromPathRegExp = /\/([^\/]+)$/;
+ var pageName = 1;
+
+ function extract_page(value) {
+ value = extract_path(value);
+ if (!value) return undefined;
+ var m = value.match(pageFromPathRegExp);
+ if (m) return m[pageName];
+ }
+
+ function page(dst, src) {
+ return url_wrapper(dst, src, extract_page);
+ }
+
+ function extract_path(value) {
+ var m = split_url(value);
+ return m? m[uriPath] || m[uriPathAlt] : undefined;
+ }
+
+ function path(dst, src) {
+ return url_wrapper(dst, src, extract_path);
+ }
+
+ // Map common schemes to their default port.
+ // port has to be a string (will be converted at a later stage).
+ var schemePort = {
+ "ftp": "21",
+ "ssh": "22",
+ "http": "80",
+ "https": "443",
+ };
+
+ function extract_port(value) {
+ var m = split_url(value);
+ if (!m) return undefined;
+ if (m[uriPort]) return m[uriPort];
+ if (m[uriScheme]) {
+ return schemePort[m[uriScheme]];
+ }
+ }
+
+ function port(dst, src) {
+ return url_wrapper(dst, src, extract_port);
+ }
+
+ function extract_query(value) {
+ var m = split_url(value);
+ if (m && m[uriQuery]) return m[uriQuery];
+ }
+
+ function query(dst, src) {
+ return url_wrapper(dst, src, extract_query);
+ }
+
+ function extract_root(value) {
+ var m = split_url(value);
+ if (m && m[uriDomain] && m[uriDomain]) {
+ var scheme = m[uriScheme] && m[uriScheme] !== "null"?
+ m[uriScheme] + "://" : "";
+ var port = m[uriPort]? ":" + m[uriPort] : "";
+ return scheme + m[uriDomain] + port;
+ }
+ }
+
+ function root(dst, src) {
+ return url_wrapper(dst, src, extract_root);
+ }
+
+ function tagval(id, src, cfg, keys, on_success) {
+ var fail = function(evt) {
+ evt.Put(FLAG_FIELD, "tagval_parsing_error");
+ }
+ if (cfg.kv_separator.length !== 1) {
+ throw("Invalid TAGVALMAP ValueDelimiter (must have 1 character)");
+ }
+ var quotes_len = cfg.open_quote.length > 0 && cfg.close_quote.length > 0?
+ cfg.open_quote.length + cfg.close_quote.length : 0;
+ var kv_regex = new RegExp('^([^' + cfg.kv_separator + ']*)*' + cfg.kv_separator + ' *(.*)*$');
+ return function(evt) {
+ var msg = evt.Get(src);
+ if (msg === undefined) {
+ console.warn("tagval: input field is missing");
+ return fail(evt);
+ }
+ var pairs = msg.split(cfg.pair_separator);
+ var i;
+ var success = false;
+ var prev = "";
+ for (i=0; i 0 &&
+ value.length >= cfg.open_quote.length + cfg.close_quote.length &&
+ value.substr(0, cfg.open_quote.length) === cfg.open_quote &&
+ value.substr(value.length - cfg.close_quote.length) === cfg.close_quote) {
+ value = value.substr(cfg.open_quote.length, value.length - quotes_len);
+ }
+ evt.Put(FIELDS_PREFIX + field, value);
+ success = true;
+ }
+ if (!success) {
+ return fail(evt);
+ }
+ if (on_success != null) {
+ on_success(evt);
+ }
+ }
+ }
+
+ var ecs_mappings = {
+ "_facility": {convert: to_long, to:[{field: "log.syslog.facility.code", setter: fld_set}]},
+ "_pri": {convert: to_long, to:[{field: "log.syslog.priority", setter: fld_set}]},
+ "_severity": {convert: to_long, to:[{field: "log.syslog.severity.code", setter: fld_set}]},
+ "action": {to:[{field: "event.action", setter: fld_prio, prio: 0}]},
+ "administrator": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 4}]},
+ "alias.ip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 3},{field: "related.ip", setter: fld_append}]},
+ "alias.ipv6": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 4},{field: "related.ip", setter: fld_append}]},
+ "alias.mac": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 1}]},
+ "application": {to:[{field: "network.application", setter: fld_set}]},
+ "bytes": {convert: to_long, to:[{field: "network.bytes", setter: fld_set}]},
+ "c_domain": {to:[{field: "source.domain", setter: fld_prio, prio: 1}]},
+ "c_logon_id": {to:[{field: "user.id", setter: fld_prio, prio: 2}]},
+ "c_user_name": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 8}]},
+ "c_username": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 2}]},
+ "cctld": {to:[{field: "url.top_level_domain", setter: fld_prio, prio: 1}]},
+ "child_pid": {convert: to_long, to:[{field: "process.pid", setter: fld_prio, prio: 1}]},
+ "child_pid_val": {to:[{field: "process.title", setter: fld_set}]},
+ "child_process": {to:[{field: "process.name", setter: fld_prio, prio: 1}]},
+ "city.dst": {to:[{field: "destination.geo.city_name", setter: fld_set}]},
+ "city.src": {to:[{field: "source.geo.city_name", setter: fld_set}]},
+ "daddr": {convert: to_ip, to:[{field: "destination.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "daddr_v6": {convert: to_ip, to:[{field: "destination.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "ddomain": {to:[{field: "destination.domain", setter: fld_prio, prio: 0}]},
+ "devicehostip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 2},{field: "related.ip", setter: fld_append}]},
+ "devicehostmac": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 0}]},
+ "dhost": {to:[{field: "destination.address", setter: fld_set},{field: "related.hosts", setter: fld_append}]},
+ "dinterface": {to:[{field: "observer.egress.interface.name", setter: fld_set}]},
+ "direction": {to:[{field: "network.direction", setter: fld_set}]},
+ "directory": {to:[{field: "file.directory", setter: fld_set}]},
+ "dmacaddr": {convert: to_mac, to:[{field: "destination.mac", setter: fld_set}]},
+ "dns.responsetype": {to:[{field: "dns.answers.type", setter: fld_set}]},
+ "dns.resptext": {to:[{field: "dns.answers.name", setter: fld_set}]},
+ "dns_querytype": {to:[{field: "dns.question.type", setter: fld_set}]},
+ "domain": {to:[{field: "server.domain", setter: fld_prio, prio: 0},{field: "related.hosts", setter: fld_append}]},
+ "domain.dst": {to:[{field: "destination.domain", setter: fld_prio, prio: 1}]},
+ "domain.src": {to:[{field: "source.domain", setter: fld_prio, prio: 2}]},
+ "domain_id": {to:[{field: "user.domain", setter: fld_set}]},
+ "domainname": {to:[{field: "server.domain", setter: fld_prio, prio: 1}]},
+ "dport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 0}]},
+ "dtransaddr": {convert: to_ip, to:[{field: "destination.nat.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "dtransport": {convert: to_long, to:[{field: "destination.nat.port", setter: fld_prio, prio: 0}]},
+ "ec_outcome": {to:[{field: "event.outcome", setter: fld_ecs_outcome}]},
+ "event_description": {to:[{field: "message", setter: fld_prio, prio: 0}]},
+ "event_source": {to:[{field: "related.hosts", setter: fld_append}]},
+ "event_time": {convert: to_date, to:[{field: "@timestamp", setter: fld_set}]},
+ "event_type": {to:[{field: "event.action", setter: fld_prio, prio: 1}]},
+ "extension": {to:[{field: "file.extension", setter: fld_prio, prio: 1}]},
+ "file.attributes": {to:[{field: "file.attributes", setter: fld_set}]},
+ "filename": {to:[{field: "file.name", setter: fld_prio, prio: 0}]},
+ "filename_size": {convert: to_long, to:[{field: "file.size", setter: fld_set}]},
+ "filepath": {to:[{field: "file.path", setter: fld_set}]},
+ "filetype": {to:[{field: "file.type", setter: fld_set}]},
+ "fqdn": {to:[{field: "related.hosts", setter: fld_append}]},
+ "group": {to:[{field: "group.name", setter: fld_set}]},
+ "groupid": {to:[{field: "group.id", setter: fld_set}]},
+ "host": {to:[{field: "host.name", setter: fld_prio, prio: 1},{field: "related.hosts", setter: fld_append}]},
+ "hostip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "hostip_v6": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "hostname": {to:[{field: "host.name", setter: fld_prio, prio: 0}]},
+ "id": {to:[{field: "event.code", setter: fld_prio, prio: 0}]},
+ "interface": {to:[{field: "network.interface.name", setter: fld_set}]},
+ "ip.orig": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "ip.trans.dst": {convert: to_ip, to:[{field: "destination.nat.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "ip.trans.src": {convert: to_ip, to:[{field: "source.nat.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "ipv6.orig": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 2},{field: "related.ip", setter: fld_append}]},
+ "latdec_dst": {convert: to_double, to:[{field: "destination.geo.location.lat", setter: fld_set}]},
+ "latdec_src": {convert: to_double, to:[{field: "source.geo.location.lat", setter: fld_set}]},
+ "location_city": {to:[{field: "geo.city_name", setter: fld_set}]},
+ "location_country": {to:[{field: "geo.country_name", setter: fld_set}]},
+ "location_desc": {to:[{field: "geo.name", setter: fld_set}]},
+ "location_dst": {to:[{field: "destination.geo.country_name", setter: fld_set}]},
+ "location_src": {to:[{field: "source.geo.country_name", setter: fld_set}]},
+ "location_state": {to:[{field: "geo.region_name", setter: fld_set}]},
+ "logon_id": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 5}]},
+ "longdec_dst": {convert: to_double, to:[{field: "destination.geo.location.lon", setter: fld_set}]},
+ "longdec_src": {convert: to_double, to:[{field: "source.geo.location.lon", setter: fld_set}]},
+ "macaddr": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 2}]},
+ "messageid": {to:[{field: "event.code", setter: fld_prio, prio: 1}]},
+ "method": {to:[{field: "http.request.method", setter: fld_set}]},
+ "msg": {to:[{field: "message", setter: fld_set}]},
+ "orig_ip": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "owner": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 6}]},
+ "packets": {convert: to_long, to:[{field: "network.packets", setter: fld_set}]},
+ "parent_pid": {convert: to_long, to:[{field: "process.parent.pid", setter: fld_prio, prio: 0}]},
+ "parent_pid_val": {to:[{field: "process.parent.title", setter: fld_set}]},
+ "parent_process": {to:[{field: "process.parent.name", setter: fld_prio, prio: 0}]},
+ "patient_fullname": {to:[{field: "user.full_name", setter: fld_prio, prio: 1}]},
+ "port.dst": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 1}]},
+ "port.src": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 1}]},
+ "port.trans.dst": {convert: to_long, to:[{field: "destination.nat.port", setter: fld_prio, prio: 1}]},
+ "port.trans.src": {convert: to_long, to:[{field: "source.nat.port", setter: fld_prio, prio: 1}]},
+ "process": {to:[{field: "process.name", setter: fld_prio, prio: 0}]},
+ "process_id": {convert: to_long, to:[{field: "process.pid", setter: fld_prio, prio: 0}]},
+ "process_id_src": {convert: to_long, to:[{field: "process.parent.pid", setter: fld_prio, prio: 1}]},
+ "process_src": {to:[{field: "process.parent.name", setter: fld_prio, prio: 1}]},
+ "product": {to:[{field: "observer.product", setter: fld_set}]},
+ "protocol": {to:[{field: "network.protocol", setter: fld_set}]},
+ "query": {to:[{field: "url.query", setter: fld_prio, prio: 2}]},
+ "rbytes": {convert: to_long, to:[{field: "destination.bytes", setter: fld_set}]},
+ "referer": {to:[{field: "http.request.referrer", setter: fld_prio, prio: 1}]},
+ "rulename": {to:[{field: "rule.name", setter: fld_set}]},
+ "saddr": {convert: to_ip, to:[{field: "source.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "saddr_v6": {convert: to_ip, to:[{field: "source.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "sbytes": {convert: to_long, to:[{field: "source.bytes", setter: fld_set}]},
+ "sdomain": {to:[{field: "source.domain", setter: fld_prio, prio: 0}]},
+ "service": {to:[{field: "service.name", setter: fld_prio, prio: 1}]},
+ "service.name": {to:[{field: "service.name", setter: fld_prio, prio: 0}]},
+ "service_account": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 7}]},
+ "severity": {to:[{field: "log.level", setter: fld_set}]},
+ "shost": {to:[{field: "host.hostname", setter: fld_set},{field: "source.address", setter: fld_set},{field: "related.hosts", setter: fld_append}]},
+ "sinterface": {to:[{field: "observer.ingress.interface.name", setter: fld_set}]},
+ "sld": {to:[{field: "url.registered_domain", setter: fld_set}]},
+ "smacaddr": {convert: to_mac, to:[{field: "source.mac", setter: fld_set}]},
+ "sport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 0}]},
+ "stransaddr": {convert: to_ip, to:[{field: "source.nat.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "stransport": {convert: to_long, to:[{field: "source.nat.port", setter: fld_prio, prio: 0}]},
+ "tcp.dstport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 2}]},
+ "tcp.srcport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 2}]},
+ "timezone": {to:[{field: "event.timezone", setter: fld_set}]},
+ "tld": {to:[{field: "url.top_level_domain", setter: fld_prio, prio: 0}]},
+ "udp.dstport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 3}]},
+ "udp.srcport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 3}]},
+ "uid": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 3}]},
+ "url": {to:[{field: "url.original", setter: fld_prio, prio: 1}]},
+ "url_raw": {to:[{field: "url.original", setter: fld_prio, prio: 0}]},
+ "urldomain": {to:[{field: "url.domain", setter: fld_prio, prio: 0}]},
+ "urlquery": {to:[{field: "url.query", setter: fld_prio, prio: 0}]},
+ "user": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 0}]},
+ "user.id": {to:[{field: "user.id", setter: fld_prio, prio: 1}]},
+ "user_agent": {to:[{field: "user_agent.original", setter: fld_set}]},
+ "user_fullname": {to:[{field: "user.full_name", setter: fld_prio, prio: 0}]},
+ "user_id": {to:[{field: "user.id", setter: fld_prio, prio: 0}]},
+ "username": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 1}]},
+ "version": {to:[{field: "observer.version", setter: fld_set}]},
+ "web_domain": {to:[{field: "url.domain", setter: fld_prio, prio: 1},{field: "related.hosts", setter: fld_append}]},
+ "web_extension": {to:[{field: "file.extension", setter: fld_prio, prio: 0}]},
+ "web_query": {to:[{field: "url.query", setter: fld_prio, prio: 1}]},
+ "web_ref_domain": {to:[{field: "related.hosts", setter: fld_append}]},
+ "web_referer": {to:[{field: "http.request.referrer", setter: fld_prio, prio: 0}]},
+ "web_root": {to:[{field: "url.path", setter: fld_set}]},
+ "webpage": {to:[{field: "file.name", setter: fld_prio, prio: 1}]},
+ };
+
+ var rsa_mappings = {
+ "access_point": {to:[{field: "rsa.wireless.access_point", setter: fld_set}]},
+ "accesses": {to:[{field: "rsa.identity.accesses", setter: fld_set}]},
+ "acl_id": {to:[{field: "rsa.misc.acl_id", setter: fld_set}]},
+ "acl_op": {to:[{field: "rsa.misc.acl_op", setter: fld_set}]},
+ "acl_pos": {to:[{field: "rsa.misc.acl_pos", setter: fld_set}]},
+ "acl_table": {to:[{field: "rsa.misc.acl_table", setter: fld_set}]},
+ "action": {to:[{field: "rsa.misc.action", setter: fld_append}]},
+ "ad_computer_dst": {to:[{field: "rsa.network.ad_computer_dst", setter: fld_set}]},
+ "addr": {to:[{field: "rsa.network.addr", setter: fld_set}]},
+ "admin": {to:[{field: "rsa.misc.admin", setter: fld_set}]},
+ "agent": {to:[{field: "rsa.misc.client", setter: fld_prio, prio: 0}]},
+ "agent.id": {to:[{field: "rsa.misc.agent_id", setter: fld_set}]},
+ "alarm_id": {to:[{field: "rsa.misc.alarm_id", setter: fld_set}]},
+ "alarmname": {to:[{field: "rsa.misc.alarmname", setter: fld_set}]},
+ "alert": {to:[{field: "rsa.threat.alert", setter: fld_set}]},
+ "alert_id": {to:[{field: "rsa.misc.alert_id", setter: fld_set}]},
+ "alias.host": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "analysis.file": {to:[{field: "rsa.investigations.analysis_file", setter: fld_set}]},
+ "analysis.service": {to:[{field: "rsa.investigations.analysis_service", setter: fld_set}]},
+ "analysis.session": {to:[{field: "rsa.investigations.analysis_session", setter: fld_set}]},
+ "app_id": {to:[{field: "rsa.misc.app_id", setter: fld_set}]},
+ "attachment": {to:[{field: "rsa.file.attachment", setter: fld_set}]},
+ "audit": {to:[{field: "rsa.misc.audit", setter: fld_set}]},
+ "audit_class": {to:[{field: "rsa.internal.audit_class", setter: fld_set}]},
+ "audit_object": {to:[{field: "rsa.misc.audit_object", setter: fld_set}]},
+ "auditdata": {to:[{field: "rsa.misc.auditdata", setter: fld_set}]},
+ "authmethod": {to:[{field: "rsa.identity.auth_method", setter: fld_set}]},
+ "autorun_type": {to:[{field: "rsa.misc.autorun_type", setter: fld_set}]},
+ "bcc": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "benchmark": {to:[{field: "rsa.misc.benchmark", setter: fld_set}]},
+ "binary": {to:[{field: "rsa.file.binary", setter: fld_set}]},
+ "boc": {to:[{field: "rsa.investigations.boc", setter: fld_set}]},
+ "bssid": {to:[{field: "rsa.wireless.wlan_ssid", setter: fld_prio, prio: 1}]},
+ "bypass": {to:[{field: "rsa.misc.bypass", setter: fld_set}]},
+ "c_sid": {to:[{field: "rsa.identity.user_sid_src", setter: fld_set}]},
+ "cache": {to:[{field: "rsa.misc.cache", setter: fld_set}]},
+ "cache_hit": {to:[{field: "rsa.misc.cache_hit", setter: fld_set}]},
+ "calling_from": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 1}]},
+ "calling_to": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 0}]},
+ "category": {to:[{field: "rsa.misc.category", setter: fld_set}]},
+ "cc": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "cc.number": {convert: to_long, to:[{field: "rsa.misc.cc_number", setter: fld_set}]},
+ "cefversion": {to:[{field: "rsa.misc.cefversion", setter: fld_set}]},
+ "cert.serial": {to:[{field: "rsa.crypto.cert_serial", setter: fld_set}]},
+ "cert_ca": {to:[{field: "rsa.crypto.cert_ca", setter: fld_set}]},
+ "cert_checksum": {to:[{field: "rsa.crypto.cert_checksum", setter: fld_set}]},
+ "cert_common": {to:[{field: "rsa.crypto.cert_common", setter: fld_set}]},
+ "cert_error": {to:[{field: "rsa.crypto.cert_error", setter: fld_set}]},
+ "cert_hostname": {to:[{field: "rsa.crypto.cert_host_name", setter: fld_set}]},
+ "cert_hostname_cat": {to:[{field: "rsa.crypto.cert_host_cat", setter: fld_set}]},
+ "cert_issuer": {to:[{field: "rsa.crypto.cert_issuer", setter: fld_set}]},
+ "cert_keysize": {to:[{field: "rsa.crypto.cert_keysize", setter: fld_set}]},
+ "cert_status": {to:[{field: "rsa.crypto.cert_status", setter: fld_set}]},
+ "cert_subject": {to:[{field: "rsa.crypto.cert_subject", setter: fld_set}]},
+ "cert_username": {to:[{field: "rsa.crypto.cert_username", setter: fld_set}]},
+ "cfg.attr": {to:[{field: "rsa.misc.cfg_attr", setter: fld_set}]},
+ "cfg.obj": {to:[{field: "rsa.misc.cfg_obj", setter: fld_set}]},
+ "cfg.path": {to:[{field: "rsa.misc.cfg_path", setter: fld_set}]},
+ "change_attribute": {to:[{field: "rsa.misc.change_attrib", setter: fld_set}]},
+ "change_new": {to:[{field: "rsa.misc.change_new", setter: fld_set}]},
+ "change_old": {to:[{field: "rsa.misc.change_old", setter: fld_set}]},
+ "changes": {to:[{field: "rsa.misc.changes", setter: fld_set}]},
+ "checksum": {to:[{field: "rsa.misc.checksum", setter: fld_set}]},
+ "checksum.dst": {to:[{field: "rsa.misc.checksum_dst", setter: fld_set}]},
+ "checksum.src": {to:[{field: "rsa.misc.checksum_src", setter: fld_set}]},
+ "cid": {to:[{field: "rsa.internal.cid", setter: fld_set}]},
+ "client": {to:[{field: "rsa.misc.client", setter: fld_prio, prio: 1}]},
+ "client_ip": {to:[{field: "rsa.misc.client_ip", setter: fld_set}]},
+ "clustermembers": {to:[{field: "rsa.misc.clustermembers", setter: fld_set}]},
+ "cmd": {to:[{field: "rsa.misc.cmd", setter: fld_set}]},
+ "cn_acttimeout": {to:[{field: "rsa.misc.cn_acttimeout", setter: fld_set}]},
+ "cn_asn_dst": {to:[{field: "rsa.web.cn_asn_dst", setter: fld_set}]},
+ "cn_asn_src": {to:[{field: "rsa.misc.cn_asn_src", setter: fld_set}]},
+ "cn_bgpv4nxthop": {to:[{field: "rsa.misc.cn_bgpv4nxthop", setter: fld_set}]},
+ "cn_ctr_dst_code": {to:[{field: "rsa.misc.cn_ctr_dst_code", setter: fld_set}]},
+ "cn_dst_tos": {to:[{field: "rsa.misc.cn_dst_tos", setter: fld_set}]},
+ "cn_dst_vlan": {to:[{field: "rsa.misc.cn_dst_vlan", setter: fld_set}]},
+ "cn_engine_id": {to:[{field: "rsa.misc.cn_engine_id", setter: fld_set}]},
+ "cn_engine_type": {to:[{field: "rsa.misc.cn_engine_type", setter: fld_set}]},
+ "cn_f_switch": {to:[{field: "rsa.misc.cn_f_switch", setter: fld_set}]},
+ "cn_flowsampid": {to:[{field: "rsa.misc.cn_flowsampid", setter: fld_set}]},
+ "cn_flowsampintv": {to:[{field: "rsa.misc.cn_flowsampintv", setter: fld_set}]},
+ "cn_flowsampmode": {to:[{field: "rsa.misc.cn_flowsampmode", setter: fld_set}]},
+ "cn_inacttimeout": {to:[{field: "rsa.misc.cn_inacttimeout", setter: fld_set}]},
+ "cn_inpermbyts": {to:[{field: "rsa.misc.cn_inpermbyts", setter: fld_set}]},
+ "cn_inpermpckts": {to:[{field: "rsa.misc.cn_inpermpckts", setter: fld_set}]},
+ "cn_invalid": {to:[{field: "rsa.misc.cn_invalid", setter: fld_set}]},
+ "cn_ip_proto_ver": {to:[{field: "rsa.misc.cn_ip_proto_ver", setter: fld_set}]},
+ "cn_ipv4_ident": {to:[{field: "rsa.misc.cn_ipv4_ident", setter: fld_set}]},
+ "cn_l_switch": {to:[{field: "rsa.misc.cn_l_switch", setter: fld_set}]},
+ "cn_log_did": {to:[{field: "rsa.misc.cn_log_did", setter: fld_set}]},
+ "cn_log_rid": {to:[{field: "rsa.misc.cn_log_rid", setter: fld_set}]},
+ "cn_max_ttl": {to:[{field: "rsa.misc.cn_max_ttl", setter: fld_set}]},
+ "cn_maxpcktlen": {to:[{field: "rsa.misc.cn_maxpcktlen", setter: fld_set}]},
+ "cn_min_ttl": {to:[{field: "rsa.misc.cn_min_ttl", setter: fld_set}]},
+ "cn_minpcktlen": {to:[{field: "rsa.misc.cn_minpcktlen", setter: fld_set}]},
+ "cn_mpls_lbl_1": {to:[{field: "rsa.misc.cn_mpls_lbl_1", setter: fld_set}]},
+ "cn_mpls_lbl_10": {to:[{field: "rsa.misc.cn_mpls_lbl_10", setter: fld_set}]},
+ "cn_mpls_lbl_2": {to:[{field: "rsa.misc.cn_mpls_lbl_2", setter: fld_set}]},
+ "cn_mpls_lbl_3": {to:[{field: "rsa.misc.cn_mpls_lbl_3", setter: fld_set}]},
+ "cn_mpls_lbl_4": {to:[{field: "rsa.misc.cn_mpls_lbl_4", setter: fld_set}]},
+ "cn_mpls_lbl_5": {to:[{field: "rsa.misc.cn_mpls_lbl_5", setter: fld_set}]},
+ "cn_mpls_lbl_6": {to:[{field: "rsa.misc.cn_mpls_lbl_6", setter: fld_set}]},
+ "cn_mpls_lbl_7": {to:[{field: "rsa.misc.cn_mpls_lbl_7", setter: fld_set}]},
+ "cn_mpls_lbl_8": {to:[{field: "rsa.misc.cn_mpls_lbl_8", setter: fld_set}]},
+ "cn_mpls_lbl_9": {to:[{field: "rsa.misc.cn_mpls_lbl_9", setter: fld_set}]},
+ "cn_mplstoplabel": {to:[{field: "rsa.misc.cn_mplstoplabel", setter: fld_set}]},
+ "cn_mplstoplabip": {to:[{field: "rsa.misc.cn_mplstoplabip", setter: fld_set}]},
+ "cn_mul_dst_byt": {to:[{field: "rsa.misc.cn_mul_dst_byt", setter: fld_set}]},
+ "cn_mul_dst_pks": {to:[{field: "rsa.misc.cn_mul_dst_pks", setter: fld_set}]},
+ "cn_muligmptype": {to:[{field: "rsa.misc.cn_muligmptype", setter: fld_set}]},
+ "cn_rpackets": {to:[{field: "rsa.web.cn_rpackets", setter: fld_set}]},
+ "cn_sampalgo": {to:[{field: "rsa.misc.cn_sampalgo", setter: fld_set}]},
+ "cn_sampint": {to:[{field: "rsa.misc.cn_sampint", setter: fld_set}]},
+ "cn_seqctr": {to:[{field: "rsa.misc.cn_seqctr", setter: fld_set}]},
+ "cn_spackets": {to:[{field: "rsa.misc.cn_spackets", setter: fld_set}]},
+ "cn_src_tos": {to:[{field: "rsa.misc.cn_src_tos", setter: fld_set}]},
+ "cn_src_vlan": {to:[{field: "rsa.misc.cn_src_vlan", setter: fld_set}]},
+ "cn_sysuptime": {to:[{field: "rsa.misc.cn_sysuptime", setter: fld_set}]},
+ "cn_template_id": {to:[{field: "rsa.misc.cn_template_id", setter: fld_set}]},
+ "cn_totbytsexp": {to:[{field: "rsa.misc.cn_totbytsexp", setter: fld_set}]},
+ "cn_totflowexp": {to:[{field: "rsa.misc.cn_totflowexp", setter: fld_set}]},
+ "cn_totpcktsexp": {to:[{field: "rsa.misc.cn_totpcktsexp", setter: fld_set}]},
+ "cn_unixnanosecs": {to:[{field: "rsa.misc.cn_unixnanosecs", setter: fld_set}]},
+ "cn_v6flowlabel": {to:[{field: "rsa.misc.cn_v6flowlabel", setter: fld_set}]},
+ "cn_v6optheaders": {to:[{field: "rsa.misc.cn_v6optheaders", setter: fld_set}]},
+ "code": {to:[{field: "rsa.misc.code", setter: fld_set}]},
+ "command": {to:[{field: "rsa.misc.command", setter: fld_set}]},
+ "comments": {to:[{field: "rsa.misc.comments", setter: fld_set}]},
+ "comp_class": {to:[{field: "rsa.misc.comp_class", setter: fld_set}]},
+ "comp_name": {to:[{field: "rsa.misc.comp_name", setter: fld_set}]},
+ "comp_rbytes": {to:[{field: "rsa.misc.comp_rbytes", setter: fld_set}]},
+ "comp_sbytes": {to:[{field: "rsa.misc.comp_sbytes", setter: fld_set}]},
+ "component_version": {to:[{field: "rsa.misc.comp_version", setter: fld_set}]},
+ "connection_id": {to:[{field: "rsa.misc.connection_id", setter: fld_prio, prio: 1}]},
+ "connectionid": {to:[{field: "rsa.misc.connection_id", setter: fld_prio, prio: 0}]},
+ "content": {to:[{field: "rsa.misc.content", setter: fld_set}]},
+ "content_type": {to:[{field: "rsa.misc.content_type", setter: fld_set}]},
+ "content_version": {to:[{field: "rsa.misc.content_version", setter: fld_set}]},
+ "context": {to:[{field: "rsa.misc.context", setter: fld_set}]},
+ "count": {to:[{field: "rsa.misc.count", setter: fld_set}]},
+ "cpu": {convert: to_long, to:[{field: "rsa.misc.cpu", setter: fld_set}]},
+ "cpu_data": {to:[{field: "rsa.misc.cpu_data", setter: fld_set}]},
+ "criticality": {to:[{field: "rsa.misc.criticality", setter: fld_set}]},
+ "cs_agency_dst": {to:[{field: "rsa.misc.cs_agency_dst", setter: fld_set}]},
+ "cs_analyzedby": {to:[{field: "rsa.misc.cs_analyzedby", setter: fld_set}]},
+ "cs_av_other": {to:[{field: "rsa.misc.cs_av_other", setter: fld_set}]},
+ "cs_av_primary": {to:[{field: "rsa.misc.cs_av_primary", setter: fld_set}]},
+ "cs_av_secondary": {to:[{field: "rsa.misc.cs_av_secondary", setter: fld_set}]},
+ "cs_bgpv6nxthop": {to:[{field: "rsa.misc.cs_bgpv6nxthop", setter: fld_set}]},
+ "cs_bit9status": {to:[{field: "rsa.misc.cs_bit9status", setter: fld_set}]},
+ "cs_context": {to:[{field: "rsa.misc.cs_context", setter: fld_set}]},
+ "cs_control": {to:[{field: "rsa.misc.cs_control", setter: fld_set}]},
+ "cs_data": {to:[{field: "rsa.misc.cs_data", setter: fld_set}]},
+ "cs_datecret": {to:[{field: "rsa.misc.cs_datecret", setter: fld_set}]},
+ "cs_dst_tld": {to:[{field: "rsa.misc.cs_dst_tld", setter: fld_set}]},
+ "cs_eth_dst_ven": {to:[{field: "rsa.misc.cs_eth_dst_ven", setter: fld_set}]},
+ "cs_eth_src_ven": {to:[{field: "rsa.misc.cs_eth_src_ven", setter: fld_set}]},
+ "cs_event_uuid": {to:[{field: "rsa.misc.cs_event_uuid", setter: fld_set}]},
+ "cs_filetype": {to:[{field: "rsa.misc.cs_filetype", setter: fld_set}]},
+ "cs_fld": {to:[{field: "rsa.misc.cs_fld", setter: fld_set}]},
+ "cs_if_desc": {to:[{field: "rsa.misc.cs_if_desc", setter: fld_set}]},
+ "cs_if_name": {to:[{field: "rsa.misc.cs_if_name", setter: fld_set}]},
+ "cs_ip_next_hop": {to:[{field: "rsa.misc.cs_ip_next_hop", setter: fld_set}]},
+ "cs_ipv4dstpre": {to:[{field: "rsa.misc.cs_ipv4dstpre", setter: fld_set}]},
+ "cs_ipv4srcpre": {to:[{field: "rsa.misc.cs_ipv4srcpre", setter: fld_set}]},
+ "cs_lifetime": {to:[{field: "rsa.misc.cs_lifetime", setter: fld_set}]},
+ "cs_log_medium": {to:[{field: "rsa.misc.cs_log_medium", setter: fld_set}]},
+ "cs_loginname": {to:[{field: "rsa.misc.cs_loginname", setter: fld_set}]},
+ "cs_modulescore": {to:[{field: "rsa.misc.cs_modulescore", setter: fld_set}]},
+ "cs_modulesign": {to:[{field: "rsa.misc.cs_modulesign", setter: fld_set}]},
+ "cs_opswatresult": {to:[{field: "rsa.misc.cs_opswatresult", setter: fld_set}]},
+ "cs_payload": {to:[{field: "rsa.misc.cs_payload", setter: fld_set}]},
+ "cs_registrant": {to:[{field: "rsa.misc.cs_registrant", setter: fld_set}]},
+ "cs_registrar": {to:[{field: "rsa.misc.cs_registrar", setter: fld_set}]},
+ "cs_represult": {to:[{field: "rsa.misc.cs_represult", setter: fld_set}]},
+ "cs_rpayload": {to:[{field: "rsa.misc.cs_rpayload", setter: fld_set}]},
+ "cs_sampler_name": {to:[{field: "rsa.misc.cs_sampler_name", setter: fld_set}]},
+ "cs_sourcemodule": {to:[{field: "rsa.misc.cs_sourcemodule", setter: fld_set}]},
+ "cs_streams": {to:[{field: "rsa.misc.cs_streams", setter: fld_set}]},
+ "cs_targetmodule": {to:[{field: "rsa.misc.cs_targetmodule", setter: fld_set}]},
+ "cs_v6nxthop": {to:[{field: "rsa.misc.cs_v6nxthop", setter: fld_set}]},
+ "cs_whois_server": {to:[{field: "rsa.misc.cs_whois_server", setter: fld_set}]},
+ "cs_yararesult": {to:[{field: "rsa.misc.cs_yararesult", setter: fld_set}]},
+ "cve": {to:[{field: "rsa.misc.cve", setter: fld_set}]},
+ "d_certauth": {to:[{field: "rsa.crypto.d_certauth", setter: fld_set}]},
+ "d_cipher": {to:[{field: "rsa.crypto.cipher_dst", setter: fld_set}]},
+ "d_ciphersize": {convert: to_long, to:[{field: "rsa.crypto.cipher_size_dst", setter: fld_set}]},
+ "d_sslver": {to:[{field: "rsa.crypto.ssl_ver_dst", setter: fld_set}]},
+ "data": {to:[{field: "rsa.internal.data", setter: fld_set}]},
+ "data_type": {to:[{field: "rsa.misc.data_type", setter: fld_set}]},
+ "date": {to:[{field: "rsa.time.date", setter: fld_set}]},
+ "datetime": {to:[{field: "rsa.time.datetime", setter: fld_set}]},
+ "day": {to:[{field: "rsa.time.day", setter: fld_set}]},
+ "db_id": {to:[{field: "rsa.db.db_id", setter: fld_set}]},
+ "db_name": {to:[{field: "rsa.db.database", setter: fld_set}]},
+ "db_pid": {convert: to_long, to:[{field: "rsa.db.db_pid", setter: fld_set}]},
+ "dclass_counter1": {convert: to_long, to:[{field: "rsa.counters.dclass_c1", setter: fld_set}]},
+ "dclass_counter1_string": {to:[{field: "rsa.counters.dclass_c1_str", setter: fld_set}]},
+ "dclass_counter2": {convert: to_long, to:[{field: "rsa.counters.dclass_c2", setter: fld_set}]},
+ "dclass_counter2_string": {to:[{field: "rsa.counters.dclass_c2_str", setter: fld_set}]},
+ "dclass_counter3": {convert: to_long, to:[{field: "rsa.counters.dclass_c3", setter: fld_set}]},
+ "dclass_counter3_string": {to:[{field: "rsa.counters.dclass_c3_str", setter: fld_set}]},
+ "dclass_ratio1": {to:[{field: "rsa.counters.dclass_r1", setter: fld_set}]},
+ "dclass_ratio1_string": {to:[{field: "rsa.counters.dclass_r1_str", setter: fld_set}]},
+ "dclass_ratio2": {to:[{field: "rsa.counters.dclass_r2", setter: fld_set}]},
+ "dclass_ratio2_string": {to:[{field: "rsa.counters.dclass_r2_str", setter: fld_set}]},
+ "dclass_ratio3": {to:[{field: "rsa.counters.dclass_r3", setter: fld_set}]},
+ "dclass_ratio3_string": {to:[{field: "rsa.counters.dclass_r3_str", setter: fld_set}]},
+ "dead": {convert: to_long, to:[{field: "rsa.internal.dead", setter: fld_set}]},
+ "description": {to:[{field: "rsa.misc.description", setter: fld_set}]},
+ "detail": {to:[{field: "rsa.misc.event_desc", setter: fld_set}]},
+ "device": {to:[{field: "rsa.misc.device_name", setter: fld_set}]},
+ "device.class": {to:[{field: "rsa.internal.device_class", setter: fld_set}]},
+ "device.group": {to:[{field: "rsa.internal.device_group", setter: fld_set}]},
+ "device.host": {to:[{field: "rsa.internal.device_host", setter: fld_set}]},
+ "device.ip": {convert: to_ip, to:[{field: "rsa.internal.device_ip", setter: fld_set}]},
+ "device.ipv6": {convert: to_ip, to:[{field: "rsa.internal.device_ipv6", setter: fld_set}]},
+ "device.type": {to:[{field: "rsa.internal.device_type", setter: fld_set}]},
+ "device.type.id": {convert: to_long, to:[{field: "rsa.internal.device_type_id", setter: fld_set}]},
+ "devicehostname": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "devvendor": {to:[{field: "rsa.misc.devvendor", setter: fld_set}]},
+ "dhost": {to:[{field: "rsa.network.host_dst", setter: fld_set}]},
+ "did": {to:[{field: "rsa.internal.did", setter: fld_set}]},
+ "dinterface": {to:[{field: "rsa.network.dinterface", setter: fld_set}]},
+ "directory.dst": {to:[{field: "rsa.file.directory_dst", setter: fld_set}]},
+ "directory.src": {to:[{field: "rsa.file.directory_src", setter: fld_set}]},
+ "disk_volume": {to:[{field: "rsa.storage.disk_volume", setter: fld_set}]},
+ "disposition": {to:[{field: "rsa.misc.disposition", setter: fld_set}]},
+ "distance": {to:[{field: "rsa.misc.distance", setter: fld_set}]},
+ "dmask": {to:[{field: "rsa.network.dmask", setter: fld_set}]},
+ "dn": {to:[{field: "rsa.identity.dn", setter: fld_set}]},
+ "dns_a_record": {to:[{field: "rsa.network.dns_a_record", setter: fld_set}]},
+ "dns_cname_record": {to:[{field: "rsa.network.dns_cname_record", setter: fld_set}]},
+ "dns_id": {to:[{field: "rsa.network.dns_id", setter: fld_set}]},
+ "dns_opcode": {to:[{field: "rsa.network.dns_opcode", setter: fld_set}]},
+ "dns_ptr_record": {to:[{field: "rsa.network.dns_ptr_record", setter: fld_set}]},
+ "dns_resp": {to:[{field: "rsa.network.dns_resp", setter: fld_set}]},
+ "dns_type": {to:[{field: "rsa.network.dns_type", setter: fld_set}]},
+ "doc_number": {convert: to_long, to:[{field: "rsa.misc.doc_number", setter: fld_set}]},
+ "domain": {to:[{field: "rsa.network.domain", setter: fld_set}]},
+ "domain1": {to:[{field: "rsa.network.domain1", setter: fld_set}]},
+ "dst_dn": {to:[{field: "rsa.identity.dn_dst", setter: fld_set}]},
+ "dst_payload": {to:[{field: "rsa.misc.payload_dst", setter: fld_set}]},
+ "dst_spi": {to:[{field: "rsa.misc.spi_dst", setter: fld_set}]},
+ "dst_zone": {to:[{field: "rsa.network.zone_dst", setter: fld_set}]},
+ "dstburb": {to:[{field: "rsa.misc.dstburb", setter: fld_set}]},
+ "duration": {convert: to_double, to:[{field: "rsa.time.duration_time", setter: fld_set}]},
+ "duration_string": {to:[{field: "rsa.time.duration_str", setter: fld_set}]},
+ "ec_activity": {to:[{field: "rsa.investigations.ec_activity", setter: fld_set}]},
+ "ec_outcome": {to:[{field: "rsa.investigations.ec_outcome", setter: fld_set}]},
+ "ec_subject": {to:[{field: "rsa.investigations.ec_subject", setter: fld_set}]},
+ "ec_theme": {to:[{field: "rsa.investigations.ec_theme", setter: fld_set}]},
+ "edomain": {to:[{field: "rsa.misc.edomain", setter: fld_set}]},
+ "edomaub": {to:[{field: "rsa.misc.edomaub", setter: fld_set}]},
+ "effective_time": {convert: to_date, to:[{field: "rsa.time.effective_time", setter: fld_set}]},
+ "ein.number": {convert: to_long, to:[{field: "rsa.misc.ein_number", setter: fld_set}]},
+ "email": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "encryption_type": {to:[{field: "rsa.crypto.crypto", setter: fld_set}]},
+ "endtime": {convert: to_date, to:[{field: "rsa.time.endtime", setter: fld_set}]},
+ "entropy.req": {convert: to_long, to:[{field: "rsa.internal.entropy_req", setter: fld_set}]},
+ "entropy.res": {convert: to_long, to:[{field: "rsa.internal.entropy_res", setter: fld_set}]},
+ "entry": {to:[{field: "rsa.internal.entry", setter: fld_set}]},
+ "eoc": {to:[{field: "rsa.investigations.eoc", setter: fld_set}]},
+ "error": {to:[{field: "rsa.misc.error", setter: fld_set}]},
+ "eth_type": {convert: to_long, to:[{field: "rsa.network.eth_type", setter: fld_set}]},
+ "euid": {to:[{field: "rsa.misc.euid", setter: fld_set}]},
+ "event.cat": {convert: to_long, to:[{field: "rsa.investigations.event_cat", setter: fld_prio, prio: 1}]},
+ "event.cat.name": {to:[{field: "rsa.investigations.event_cat_name", setter: fld_prio, prio: 1}]},
+ "event_cat": {convert: to_long, to:[{field: "rsa.investigations.event_cat", setter: fld_prio, prio: 0}]},
+ "event_cat_name": {to:[{field: "rsa.investigations.event_cat_name", setter: fld_prio, prio: 0}]},
+ "event_category": {to:[{field: "rsa.misc.event_category", setter: fld_set}]},
+ "event_computer": {to:[{field: "rsa.misc.event_computer", setter: fld_set}]},
+ "event_counter": {convert: to_long, to:[{field: "rsa.counters.event_counter", setter: fld_set}]},
+ "event_description": {to:[{field: "rsa.internal.event_desc", setter: fld_set}]},
+ "event_id": {to:[{field: "rsa.misc.event_id", setter: fld_set}]},
+ "event_log": {to:[{field: "rsa.misc.event_log", setter: fld_set}]},
+ "event_name": {to:[{field: "rsa.internal.event_name", setter: fld_set}]},
+ "event_queue_time": {convert: to_date, to:[{field: "rsa.time.event_queue_time", setter: fld_set}]},
+ "event_source": {to:[{field: "rsa.misc.event_source", setter: fld_set}]},
+ "event_state": {to:[{field: "rsa.misc.event_state", setter: fld_set}]},
+ "event_time": {convert: to_date, to:[{field: "rsa.time.event_time", setter: fld_set}]},
+ "event_time_str": {to:[{field: "rsa.time.event_time_str", setter: fld_prio, prio: 1}]},
+ "event_time_string": {to:[{field: "rsa.time.event_time_str", setter: fld_prio, prio: 0}]},
+ "event_type": {to:[{field: "rsa.misc.event_type", setter: fld_set}]},
+ "event_user": {to:[{field: "rsa.misc.event_user", setter: fld_set}]},
+ "eventtime": {to:[{field: "rsa.time.eventtime", setter: fld_set}]},
+ "expected_val": {to:[{field: "rsa.misc.expected_val", setter: fld_set}]},
+ "expiration_time": {convert: to_date, to:[{field: "rsa.time.expire_time", setter: fld_set}]},
+ "expiration_time_string": {to:[{field: "rsa.time.expire_time_str", setter: fld_set}]},
+ "facility": {to:[{field: "rsa.misc.facility", setter: fld_set}]},
+ "facilityname": {to:[{field: "rsa.misc.facilityname", setter: fld_set}]},
+ "faddr": {to:[{field: "rsa.network.faddr", setter: fld_set}]},
+ "fcatnum": {to:[{field: "rsa.misc.fcatnum", setter: fld_set}]},
+ "federated_idp": {to:[{field: "rsa.identity.federated_idp", setter: fld_set}]},
+ "federated_sp": {to:[{field: "rsa.identity.federated_sp", setter: fld_set}]},
+ "feed.category": {to:[{field: "rsa.internal.feed_category", setter: fld_set}]},
+ "feed_desc": {to:[{field: "rsa.internal.feed_desc", setter: fld_set}]},
+ "feed_name": {to:[{field: "rsa.internal.feed_name", setter: fld_set}]},
+ "fhost": {to:[{field: "rsa.network.fhost", setter: fld_set}]},
+ "file_entropy": {convert: to_double, to:[{field: "rsa.file.file_entropy", setter: fld_set}]},
+ "file_vendor": {to:[{field: "rsa.file.file_vendor", setter: fld_set}]},
+ "filename_dst": {to:[{field: "rsa.file.filename_dst", setter: fld_set}]},
+ "filename_src": {to:[{field: "rsa.file.filename_src", setter: fld_set}]},
+ "filename_tmp": {to:[{field: "rsa.file.filename_tmp", setter: fld_set}]},
+ "filesystem": {to:[{field: "rsa.file.filesystem", setter: fld_set}]},
+ "filter": {to:[{field: "rsa.misc.filter", setter: fld_set}]},
+ "finterface": {to:[{field: "rsa.misc.finterface", setter: fld_set}]},
+ "flags": {to:[{field: "rsa.misc.flags", setter: fld_set}]},
+ "forensic_info": {to:[{field: "rsa.misc.forensic_info", setter: fld_set}]},
+ "forward.ip": {convert: to_ip, to:[{field: "rsa.internal.forward_ip", setter: fld_set}]},
+ "forward.ipv6": {convert: to_ip, to:[{field: "rsa.internal.forward_ipv6", setter: fld_set}]},
+ "found": {to:[{field: "rsa.misc.found", setter: fld_set}]},
+ "fport": {to:[{field: "rsa.network.fport", setter: fld_set}]},
+ "fqdn": {to:[{field: "rsa.web.fqdn", setter: fld_set}]},
+ "fresult": {convert: to_long, to:[{field: "rsa.misc.fresult", setter: fld_set}]},
+ "from": {to:[{field: "rsa.email.email_src", setter: fld_set}]},
+ "gaddr": {to:[{field: "rsa.misc.gaddr", setter: fld_set}]},
+ "gateway": {to:[{field: "rsa.network.gateway", setter: fld_set}]},
+ "gmtdate": {to:[{field: "rsa.time.gmtdate", setter: fld_set}]},
+ "gmttime": {to:[{field: "rsa.time.gmttime", setter: fld_set}]},
+ "group": {to:[{field: "rsa.misc.group", setter: fld_set}]},
+ "group_object": {to:[{field: "rsa.misc.group_object", setter: fld_set}]},
+ "groupid": {to:[{field: "rsa.misc.group_id", setter: fld_set}]},
+ "h_code": {to:[{field: "rsa.internal.hcode", setter: fld_set}]},
+ "hardware_id": {to:[{field: "rsa.misc.hardware_id", setter: fld_set}]},
+ "header.id": {to:[{field: "rsa.internal.header_id", setter: fld_set}]},
+ "host.orig": {to:[{field: "rsa.network.host_orig", setter: fld_set}]},
+ "host.state": {to:[{field: "rsa.endpoint.host_state", setter: fld_set}]},
+ "host.type": {to:[{field: "rsa.network.host_type", setter: fld_set}]},
+ "host_role": {to:[{field: "rsa.identity.host_role", setter: fld_set}]},
+ "hostid": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "hostname": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "hour": {to:[{field: "rsa.time.hour", setter: fld_set}]},
+ "https.insact": {to:[{field: "rsa.crypto.https_insact", setter: fld_set}]},
+ "https.valid": {to:[{field: "rsa.crypto.https_valid", setter: fld_set}]},
+ "icmpcode": {convert: to_long, to:[{field: "rsa.network.icmp_code", setter: fld_set}]},
+ "icmptype": {convert: to_long, to:[{field: "rsa.network.icmp_type", setter: fld_set}]},
+ "id": {to:[{field: "rsa.misc.reference_id", setter: fld_set}]},
+ "id1": {to:[{field: "rsa.misc.reference_id1", setter: fld_set}]},
+ "id2": {to:[{field: "rsa.misc.reference_id2", setter: fld_set}]},
+ "id3": {to:[{field: "rsa.misc.id3", setter: fld_set}]},
+ "ike": {to:[{field: "rsa.crypto.ike", setter: fld_set}]},
+ "ike_cookie1": {to:[{field: "rsa.crypto.ike_cookie1", setter: fld_set}]},
+ "ike_cookie2": {to:[{field: "rsa.crypto.ike_cookie2", setter: fld_set}]},
+ "im_buddyid": {to:[{field: "rsa.misc.im_buddyid", setter: fld_set}]},
+ "im_buddyname": {to:[{field: "rsa.misc.im_buddyname", setter: fld_set}]},
+ "im_client": {to:[{field: "rsa.misc.im_client", setter: fld_set}]},
+ "im_croomid": {to:[{field: "rsa.misc.im_croomid", setter: fld_set}]},
+ "im_croomtype": {to:[{field: "rsa.misc.im_croomtype", setter: fld_set}]},
+ "im_members": {to:[{field: "rsa.misc.im_members", setter: fld_set}]},
+ "im_userid": {to:[{field: "rsa.misc.im_userid", setter: fld_set}]},
+ "im_username": {to:[{field: "rsa.misc.im_username", setter: fld_set}]},
+ "index": {to:[{field: "rsa.misc.index", setter: fld_set}]},
+ "info": {to:[{field: "rsa.db.index", setter: fld_set}]},
+ "inode": {convert: to_long, to:[{field: "rsa.internal.inode", setter: fld_set}]},
+ "inout": {to:[{field: "rsa.misc.inout", setter: fld_set}]},
+ "instance": {to:[{field: "rsa.db.instance", setter: fld_set}]},
+ "interface": {to:[{field: "rsa.network.interface", setter: fld_set}]},
+ "inv.category": {to:[{field: "rsa.investigations.inv_category", setter: fld_set}]},
+ "inv.context": {to:[{field: "rsa.investigations.inv_context", setter: fld_set}]},
+ "ioc": {to:[{field: "rsa.investigations.ioc", setter: fld_set}]},
+ "ip_proto": {convert: to_long, to:[{field: "rsa.network.ip_proto", setter: fld_set}]},
+ "ipkt": {to:[{field: "rsa.misc.ipkt", setter: fld_set}]},
+ "ipscat": {to:[{field: "rsa.misc.ipscat", setter: fld_set}]},
+ "ipspri": {to:[{field: "rsa.misc.ipspri", setter: fld_set}]},
+ "jobname": {to:[{field: "rsa.misc.jobname", setter: fld_set}]},
+ "jobnum": {to:[{field: "rsa.misc.job_num", setter: fld_set}]},
+ "laddr": {to:[{field: "rsa.network.laddr", setter: fld_set}]},
+ "language": {to:[{field: "rsa.misc.language", setter: fld_set}]},
+ "latitude": {to:[{field: "rsa.misc.latitude", setter: fld_set}]},
+ "lc.cid": {to:[{field: "rsa.internal.lc_cid", setter: fld_set}]},
+ "lc.ctime": {convert: to_date, to:[{field: "rsa.internal.lc_ctime", setter: fld_set}]},
+ "ldap": {to:[{field: "rsa.identity.ldap", setter: fld_set}]},
+ "ldap.query": {to:[{field: "rsa.identity.ldap_query", setter: fld_set}]},
+ "ldap.response": {to:[{field: "rsa.identity.ldap_response", setter: fld_set}]},
+ "level": {convert: to_long, to:[{field: "rsa.internal.level", setter: fld_set}]},
+ "lhost": {to:[{field: "rsa.network.lhost", setter: fld_set}]},
+ "library": {to:[{field: "rsa.misc.library", setter: fld_set}]},
+ "lifetime": {convert: to_long, to:[{field: "rsa.misc.lifetime", setter: fld_set}]},
+ "linenum": {to:[{field: "rsa.misc.linenum", setter: fld_set}]},
+ "link": {to:[{field: "rsa.misc.link", setter: fld_set}]},
+ "linterface": {to:[{field: "rsa.network.linterface", setter: fld_set}]},
+ "list_name": {to:[{field: "rsa.misc.list_name", setter: fld_set}]},
+ "listnum": {to:[{field: "rsa.misc.listnum", setter: fld_set}]},
+ "load_data": {to:[{field: "rsa.misc.load_data", setter: fld_set}]},
+ "location_floor": {to:[{field: "rsa.misc.location_floor", setter: fld_set}]},
+ "location_mark": {to:[{field: "rsa.misc.location_mark", setter: fld_set}]},
+ "log_id": {to:[{field: "rsa.misc.log_id", setter: fld_set}]},
+ "log_type": {to:[{field: "rsa.misc.log_type", setter: fld_set}]},
+ "logid": {to:[{field: "rsa.misc.logid", setter: fld_set}]},
+ "logip": {to:[{field: "rsa.misc.logip", setter: fld_set}]},
+ "logname": {to:[{field: "rsa.misc.logname", setter: fld_set}]},
+ "logon_type": {to:[{field: "rsa.identity.logon_type", setter: fld_set}]},
+ "logon_type_desc": {to:[{field: "rsa.identity.logon_type_desc", setter: fld_set}]},
+ "longitude": {to:[{field: "rsa.misc.longitude", setter: fld_set}]},
+ "lport": {to:[{field: "rsa.misc.lport", setter: fld_set}]},
+ "lread": {convert: to_long, to:[{field: "rsa.db.lread", setter: fld_set}]},
+ "lun": {to:[{field: "rsa.storage.lun", setter: fld_set}]},
+ "lwrite": {convert: to_long, to:[{field: "rsa.db.lwrite", setter: fld_set}]},
+ "macaddr": {convert: to_mac, to:[{field: "rsa.network.eth_host", setter: fld_set}]},
+ "mail_id": {to:[{field: "rsa.misc.mail_id", setter: fld_set}]},
+ "mask": {to:[{field: "rsa.network.mask", setter: fld_set}]},
+ "match": {to:[{field: "rsa.misc.match", setter: fld_set}]},
+ "mbug_data": {to:[{field: "rsa.misc.mbug_data", setter: fld_set}]},
+ "mcb.req": {convert: to_long, to:[{field: "rsa.internal.mcb_req", setter: fld_set}]},
+ "mcb.res": {convert: to_long, to:[{field: "rsa.internal.mcb_res", setter: fld_set}]},
+ "mcbc.req": {convert: to_long, to:[{field: "rsa.internal.mcbc_req", setter: fld_set}]},
+ "mcbc.res": {convert: to_long, to:[{field: "rsa.internal.mcbc_res", setter: fld_set}]},
+ "medium": {convert: to_long, to:[{field: "rsa.internal.medium", setter: fld_set}]},
+ "message": {to:[{field: "rsa.internal.message", setter: fld_set}]},
+ "message_body": {to:[{field: "rsa.misc.message_body", setter: fld_set}]},
+ "messageid": {to:[{field: "rsa.internal.messageid", setter: fld_set}]},
+ "min": {to:[{field: "rsa.time.min", setter: fld_set}]},
+ "misc": {to:[{field: "rsa.misc.misc", setter: fld_set}]},
+ "misc_name": {to:[{field: "rsa.misc.misc_name", setter: fld_set}]},
+ "mode": {to:[{field: "rsa.misc.mode", setter: fld_set}]},
+ "month": {to:[{field: "rsa.time.month", setter: fld_set}]},
+ "msg": {to:[{field: "rsa.internal.msg", setter: fld_set}]},
+ "msgIdPart1": {to:[{field: "rsa.misc.msgIdPart1", setter: fld_set}]},
+ "msgIdPart2": {to:[{field: "rsa.misc.msgIdPart2", setter: fld_set}]},
+ "msgIdPart3": {to:[{field: "rsa.misc.msgIdPart3", setter: fld_set}]},
+ "msgIdPart4": {to:[{field: "rsa.misc.msgIdPart4", setter: fld_set}]},
+ "msg_id": {to:[{field: "rsa.internal.msg_id", setter: fld_set}]},
+ "msg_type": {to:[{field: "rsa.misc.msg_type", setter: fld_set}]},
+ "msgid": {to:[{field: "rsa.misc.msgid", setter: fld_set}]},
+ "name": {to:[{field: "rsa.misc.name", setter: fld_set}]},
+ "netname": {to:[{field: "rsa.network.netname", setter: fld_set}]},
+ "netsessid": {to:[{field: "rsa.misc.netsessid", setter: fld_set}]},
+ "network_port": {convert: to_long, to:[{field: "rsa.network.network_port", setter: fld_set}]},
+ "network_service": {to:[{field: "rsa.network.network_service", setter: fld_set}]},
+ "node": {to:[{field: "rsa.misc.node", setter: fld_set}]},
+ "nodename": {to:[{field: "rsa.internal.node_name", setter: fld_set}]},
+ "ntype": {to:[{field: "rsa.misc.ntype", setter: fld_set}]},
+ "num": {to:[{field: "rsa.misc.num", setter: fld_set}]},
+ "number": {to:[{field: "rsa.misc.number", setter: fld_set}]},
+ "number1": {to:[{field: "rsa.misc.number1", setter: fld_set}]},
+ "number2": {to:[{field: "rsa.misc.number2", setter: fld_set}]},
+ "nwe.callback_id": {to:[{field: "rsa.internal.nwe_callback_id", setter: fld_set}]},
+ "nwwn": {to:[{field: "rsa.misc.nwwn", setter: fld_set}]},
+ "obj_id": {to:[{field: "rsa.internal.obj_id", setter: fld_set}]},
+ "obj_name": {to:[{field: "rsa.misc.obj_name", setter: fld_set}]},
+ "obj_server": {to:[{field: "rsa.internal.obj_server", setter: fld_set}]},
+ "obj_type": {to:[{field: "rsa.misc.obj_type", setter: fld_set}]},
+ "obj_value": {to:[{field: "rsa.internal.obj_val", setter: fld_set}]},
+ "object": {to:[{field: "rsa.misc.object", setter: fld_set}]},
+ "observed_val": {to:[{field: "rsa.misc.observed_val", setter: fld_set}]},
+ "operation": {to:[{field: "rsa.misc.operation", setter: fld_set}]},
+ "operation_id": {to:[{field: "rsa.misc.operation_id", setter: fld_set}]},
+ "opkt": {to:[{field: "rsa.misc.opkt", setter: fld_set}]},
+ "org.dst": {to:[{field: "rsa.physical.org_dst", setter: fld_prio, prio: 1}]},
+ "org.src": {to:[{field: "rsa.physical.org_src", setter: fld_set}]},
+ "org_dst": {to:[{field: "rsa.physical.org_dst", setter: fld_prio, prio: 0}]},
+ "orig_from": {to:[{field: "rsa.misc.orig_from", setter: fld_set}]},
+ "origin": {to:[{field: "rsa.network.origin", setter: fld_set}]},
+ "original_owner": {to:[{field: "rsa.identity.owner", setter: fld_set}]},
+ "os": {to:[{field: "rsa.misc.OS", setter: fld_set}]},
+ "owner_id": {to:[{field: "rsa.misc.owner_id", setter: fld_set}]},
+ "p_action": {to:[{field: "rsa.misc.p_action", setter: fld_set}]},
+ "p_date": {to:[{field: "rsa.time.p_date", setter: fld_set}]},
+ "p_filter": {to:[{field: "rsa.misc.p_filter", setter: fld_set}]},
+ "p_group_object": {to:[{field: "rsa.misc.p_group_object", setter: fld_set}]},
+ "p_id": {to:[{field: "rsa.misc.p_id", setter: fld_set}]},
+ "p_month": {to:[{field: "rsa.time.p_month", setter: fld_set}]},
+ "p_msgid": {to:[{field: "rsa.misc.p_msgid", setter: fld_set}]},
+ "p_msgid1": {to:[{field: "rsa.misc.p_msgid1", setter: fld_set}]},
+ "p_msgid2": {to:[{field: "rsa.misc.p_msgid2", setter: fld_set}]},
+ "p_result1": {to:[{field: "rsa.misc.p_result1", setter: fld_set}]},
+ "p_time": {to:[{field: "rsa.time.p_time", setter: fld_set}]},
+ "p_time1": {to:[{field: "rsa.time.p_time1", setter: fld_set}]},
+ "p_time2": {to:[{field: "rsa.time.p_time2", setter: fld_set}]},
+ "p_url": {to:[{field: "rsa.web.p_url", setter: fld_set}]},
+ "p_user_agent": {to:[{field: "rsa.web.p_user_agent", setter: fld_set}]},
+ "p_web_cookie": {to:[{field: "rsa.web.p_web_cookie", setter: fld_set}]},
+ "p_web_method": {to:[{field: "rsa.web.p_web_method", setter: fld_set}]},
+ "p_web_referer": {to:[{field: "rsa.web.p_web_referer", setter: fld_set}]},
+ "p_year": {to:[{field: "rsa.time.p_year", setter: fld_set}]},
+ "packet_length": {to:[{field: "rsa.network.packet_length", setter: fld_set}]},
+ "paddr": {convert: to_ip, to:[{field: "rsa.network.paddr", setter: fld_set}]},
+ "param": {to:[{field: "rsa.misc.param", setter: fld_set}]},
+ "param.dst": {to:[{field: "rsa.misc.param_dst", setter: fld_set}]},
+ "param.src": {to:[{field: "rsa.misc.param_src", setter: fld_set}]},
+ "parent_node": {to:[{field: "rsa.misc.parent_node", setter: fld_set}]},
+ "parse.error": {to:[{field: "rsa.internal.parse_error", setter: fld_set}]},
+ "password": {to:[{field: "rsa.identity.password", setter: fld_set}]},
+ "password_chg": {to:[{field: "rsa.misc.password_chg", setter: fld_set}]},
+ "password_expire": {to:[{field: "rsa.misc.password_expire", setter: fld_set}]},
+ "patient_fname": {to:[{field: "rsa.healthcare.patient_fname", setter: fld_set}]},
+ "patient_id": {to:[{field: "rsa.healthcare.patient_id", setter: fld_set}]},
+ "patient_lname": {to:[{field: "rsa.healthcare.patient_lname", setter: fld_set}]},
+ "patient_mname": {to:[{field: "rsa.healthcare.patient_mname", setter: fld_set}]},
+ "payload.req": {convert: to_long, to:[{field: "rsa.internal.payload_req", setter: fld_set}]},
+ "payload.res": {convert: to_long, to:[{field: "rsa.internal.payload_res", setter: fld_set}]},
+ "peer": {to:[{field: "rsa.crypto.peer", setter: fld_set}]},
+ "peer_id": {to:[{field: "rsa.crypto.peer_id", setter: fld_set}]},
+ "permgranted": {to:[{field: "rsa.misc.permgranted", setter: fld_set}]},
+ "permissions": {to:[{field: "rsa.db.permissions", setter: fld_set}]},
+ "permwanted": {to:[{field: "rsa.misc.permwanted", setter: fld_set}]},
+ "pgid": {to:[{field: "rsa.misc.pgid", setter: fld_set}]},
+ "phone_number": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 2}]},
+ "phost": {to:[{field: "rsa.network.phost", setter: fld_set}]},
+ "pid": {to:[{field: "rsa.misc.pid", setter: fld_set}]},
+ "policy": {to:[{field: "rsa.misc.policy", setter: fld_set}]},
+ "policyUUID": {to:[{field: "rsa.misc.policyUUID", setter: fld_set}]},
+ "policy_id": {to:[{field: "rsa.misc.policy_id", setter: fld_set}]},
+ "policy_value": {to:[{field: "rsa.misc.policy_value", setter: fld_set}]},
+ "policy_waiver": {to:[{field: "rsa.misc.policy_waiver", setter: fld_set}]},
+ "policyname": {to:[{field: "rsa.misc.policy_name", setter: fld_prio, prio: 0}]},
+ "pool_id": {to:[{field: "rsa.misc.pool_id", setter: fld_set}]},
+ "pool_name": {to:[{field: "rsa.misc.pool_name", setter: fld_set}]},
+ "port": {convert: to_long, to:[{field: "rsa.network.port", setter: fld_set}]},
+ "portname": {to:[{field: "rsa.misc.port_name", setter: fld_set}]},
+ "pread": {convert: to_long, to:[{field: "rsa.db.pread", setter: fld_set}]},
+ "priority": {to:[{field: "rsa.misc.priority", setter: fld_set}]},
+ "privilege": {to:[{field: "rsa.file.privilege", setter: fld_set}]},
+ "process.vid.dst": {to:[{field: "rsa.internal.process_vid_dst", setter: fld_set}]},
+ "process.vid.src": {to:[{field: "rsa.internal.process_vid_src", setter: fld_set}]},
+ "process_id_val": {to:[{field: "rsa.misc.process_id_val", setter: fld_set}]},
+ "processing_time": {to:[{field: "rsa.time.process_time", setter: fld_set}]},
+ "profile": {to:[{field: "rsa.identity.profile", setter: fld_set}]},
+ "prog_asp_num": {to:[{field: "rsa.misc.prog_asp_num", setter: fld_set}]},
+ "program": {to:[{field: "rsa.misc.program", setter: fld_set}]},
+ "protocol_detail": {to:[{field: "rsa.network.protocol_detail", setter: fld_set}]},
+ "pwwn": {to:[{field: "rsa.storage.pwwn", setter: fld_set}]},
+ "r_hostid": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "real_data": {to:[{field: "rsa.misc.real_data", setter: fld_set}]},
+ "realm": {to:[{field: "rsa.identity.realm", setter: fld_set}]},
+ "reason": {to:[{field: "rsa.misc.reason", setter: fld_set}]},
+ "rec_asp_device": {to:[{field: "rsa.misc.rec_asp_device", setter: fld_set}]},
+ "rec_asp_num": {to:[{field: "rsa.misc.rec_asp_num", setter: fld_set}]},
+ "rec_library": {to:[{field: "rsa.misc.rec_library", setter: fld_set}]},
+ "recorded_time": {convert: to_date, to:[{field: "rsa.time.recorded_time", setter: fld_set}]},
+ "recordnum": {to:[{field: "rsa.misc.recordnum", setter: fld_set}]},
+ "registry.key": {to:[{field: "rsa.endpoint.registry_key", setter: fld_set}]},
+ "registry.value": {to:[{field: "rsa.endpoint.registry_value", setter: fld_set}]},
+ "remote_domain": {to:[{field: "rsa.web.remote_domain", setter: fld_set}]},
+ "remote_domain_id": {to:[{field: "rsa.network.remote_domain_id", setter: fld_set}]},
+ "reputation_num": {convert: to_double, to:[{field: "rsa.web.reputation_num", setter: fld_set}]},
+ "resource": {to:[{field: "rsa.internal.resource", setter: fld_set}]},
+ "resource_class": {to:[{field: "rsa.internal.resource_class", setter: fld_set}]},
+ "result": {to:[{field: "rsa.misc.result", setter: fld_set}]},
+ "result_code": {to:[{field: "rsa.misc.result_code", setter: fld_prio, prio: 1}]},
+ "resultcode": {to:[{field: "rsa.misc.result_code", setter: fld_prio, prio: 0}]},
+ "rid": {convert: to_long, to:[{field: "rsa.internal.rid", setter: fld_set}]},
+ "risk": {to:[{field: "rsa.misc.risk", setter: fld_set}]},
+ "risk_info": {to:[{field: "rsa.misc.risk_info", setter: fld_set}]},
+ "risk_num": {convert: to_double, to:[{field: "rsa.misc.risk_num", setter: fld_set}]},
+ "risk_num_comm": {convert: to_double, to:[{field: "rsa.misc.risk_num_comm", setter: fld_set}]},
+ "risk_num_next": {convert: to_double, to:[{field: "rsa.misc.risk_num_next", setter: fld_set}]},
+ "risk_num_sand": {convert: to_double, to:[{field: "rsa.misc.risk_num_sand", setter: fld_set}]},
+ "risk_num_static": {convert: to_double, to:[{field: "rsa.misc.risk_num_static", setter: fld_set}]},
+ "risk_suspicious": {to:[{field: "rsa.misc.risk_suspicious", setter: fld_set}]},
+ "risk_warning": {to:[{field: "rsa.misc.risk_warning", setter: fld_set}]},
+ "rpayload": {to:[{field: "rsa.network.rpayload", setter: fld_set}]},
+ "ruid": {to:[{field: "rsa.misc.ruid", setter: fld_set}]},
+ "rule": {to:[{field: "rsa.misc.rule", setter: fld_set}]},
+ "rule_group": {to:[{field: "rsa.misc.rule_group", setter: fld_set}]},
+ "rule_template": {to:[{field: "rsa.misc.rule_template", setter: fld_set}]},
+ "rule_uid": {to:[{field: "rsa.misc.rule_uid", setter: fld_set}]},
+ "rulename": {to:[{field: "rsa.misc.rule_name", setter: fld_set}]},
+ "s_certauth": {to:[{field: "rsa.crypto.s_certauth", setter: fld_set}]},
+ "s_cipher": {to:[{field: "rsa.crypto.cipher_src", setter: fld_set}]},
+ "s_ciphersize": {convert: to_long, to:[{field: "rsa.crypto.cipher_size_src", setter: fld_set}]},
+ "s_context": {to:[{field: "rsa.misc.context_subject", setter: fld_set}]},
+ "s_sslver": {to:[{field: "rsa.crypto.ssl_ver_src", setter: fld_set}]},
+ "sburb": {to:[{field: "rsa.misc.sburb", setter: fld_set}]},
+ "scheme": {to:[{field: "rsa.crypto.scheme", setter: fld_set}]},
+ "sdomain_fld": {to:[{field: "rsa.misc.sdomain_fld", setter: fld_set}]},
+ "search.text": {to:[{field: "rsa.misc.search_text", setter: fld_set}]},
+ "sec": {to:[{field: "rsa.misc.sec", setter: fld_set}]},
+ "second": {to:[{field: "rsa.misc.second", setter: fld_set}]},
+ "sensor": {to:[{field: "rsa.misc.sensor", setter: fld_set}]},
+ "sensorname": {to:[{field: "rsa.misc.sensorname", setter: fld_set}]},
+ "seqnum": {to:[{field: "rsa.misc.seqnum", setter: fld_set}]},
+ "serial_number": {to:[{field: "rsa.misc.serial_number", setter: fld_set}]},
+ "service.account": {to:[{field: "rsa.identity.service_account", setter: fld_set}]},
+ "session": {to:[{field: "rsa.misc.session", setter: fld_set}]},
+ "session.split": {to:[{field: "rsa.internal.session_split", setter: fld_set}]},
+ "sessionid": {to:[{field: "rsa.misc.log_session_id", setter: fld_set}]},
+ "sessionid1": {to:[{field: "rsa.misc.log_session_id1", setter: fld_set}]},
+ "sessiontype": {to:[{field: "rsa.misc.sessiontype", setter: fld_set}]},
+ "severity": {to:[{field: "rsa.misc.severity", setter: fld_set}]},
+ "sid": {to:[{field: "rsa.identity.user_sid_dst", setter: fld_set}]},
+ "sig.name": {to:[{field: "rsa.misc.sig_name", setter: fld_set}]},
+ "sigUUID": {to:[{field: "rsa.misc.sigUUID", setter: fld_set}]},
+ "sigcat": {to:[{field: "rsa.misc.sigcat", setter: fld_set}]},
+ "sigid": {convert: to_long, to:[{field: "rsa.misc.sig_id", setter: fld_set}]},
+ "sigid1": {convert: to_long, to:[{field: "rsa.misc.sig_id1", setter: fld_set}]},
+ "sigid_string": {to:[{field: "rsa.misc.sig_id_str", setter: fld_set}]},
+ "signame": {to:[{field: "rsa.misc.policy_name", setter: fld_prio, prio: 1}]},
+ "sigtype": {to:[{field: "rsa.crypto.sig_type", setter: fld_set}]},
+ "sinterface": {to:[{field: "rsa.network.sinterface", setter: fld_set}]},
+ "site": {to:[{field: "rsa.internal.site", setter: fld_set}]},
+ "size": {convert: to_long, to:[{field: "rsa.internal.size", setter: fld_set}]},
+ "smask": {to:[{field: "rsa.network.smask", setter: fld_set}]},
+ "snmp.oid": {to:[{field: "rsa.misc.snmp_oid", setter: fld_set}]},
+ "snmp.value": {to:[{field: "rsa.misc.snmp_value", setter: fld_set}]},
+ "sourcefile": {to:[{field: "rsa.internal.sourcefile", setter: fld_set}]},
+ "space": {to:[{field: "rsa.misc.space", setter: fld_set}]},
+ "space1": {to:[{field: "rsa.misc.space1", setter: fld_set}]},
+ "spi": {to:[{field: "rsa.misc.spi", setter: fld_set}]},
+ "sql": {to:[{field: "rsa.misc.sql", setter: fld_set}]},
+ "src_dn": {to:[{field: "rsa.identity.dn_src", setter: fld_set}]},
+ "src_payload": {to:[{field: "rsa.misc.payload_src", setter: fld_set}]},
+ "src_spi": {to:[{field: "rsa.misc.spi_src", setter: fld_set}]},
+ "src_zone": {to:[{field: "rsa.network.zone_src", setter: fld_set}]},
+ "srcburb": {to:[{field: "rsa.misc.srcburb", setter: fld_set}]},
+ "srcdom": {to:[{field: "rsa.misc.srcdom", setter: fld_set}]},
+ "srcservice": {to:[{field: "rsa.misc.srcservice", setter: fld_set}]},
+ "ssid": {to:[{field: "rsa.wireless.wlan_ssid", setter: fld_prio, prio: 0}]},
+ "stamp": {convert: to_date, to:[{field: "rsa.time.stamp", setter: fld_set}]},
+ "starttime": {convert: to_date, to:[{field: "rsa.time.starttime", setter: fld_set}]},
+ "state": {to:[{field: "rsa.misc.state", setter: fld_set}]},
+ "statement": {to:[{field: "rsa.internal.statement", setter: fld_set}]},
+ "status": {to:[{field: "rsa.misc.status", setter: fld_set}]},
+ "status1": {to:[{field: "rsa.misc.status1", setter: fld_set}]},
+ "streams": {convert: to_long, to:[{field: "rsa.misc.streams", setter: fld_set}]},
+ "subcategory": {to:[{field: "rsa.misc.subcategory", setter: fld_set}]},
+ "subject": {to:[{field: "rsa.email.subject", setter: fld_set}]},
+ "svcno": {to:[{field: "rsa.misc.svcno", setter: fld_set}]},
+ "system": {to:[{field: "rsa.misc.system", setter: fld_set}]},
+ "t_context": {to:[{field: "rsa.misc.context_target", setter: fld_set}]},
+ "task_name": {to:[{field: "rsa.file.task_name", setter: fld_set}]},
+ "tbdstr1": {to:[{field: "rsa.misc.tbdstr1", setter: fld_set}]},
+ "tbdstr2": {to:[{field: "rsa.misc.tbdstr2", setter: fld_set}]},
+ "tbl_name": {to:[{field: "rsa.db.table_name", setter: fld_set}]},
+ "tcp_flags": {convert: to_long, to:[{field: "rsa.misc.tcp_flags", setter: fld_set}]},
+ "terminal": {to:[{field: "rsa.misc.terminal", setter: fld_set}]},
+ "tgtdom": {to:[{field: "rsa.misc.tgtdom", setter: fld_set}]},
+ "tgtdomain": {to:[{field: "rsa.misc.tgtdomain", setter: fld_set}]},
+ "threat_name": {to:[{field: "rsa.threat.threat_category", setter: fld_set}]},
+ "threat_source": {to:[{field: "rsa.threat.threat_source", setter: fld_set}]},
+ "threat_val": {to:[{field: "rsa.threat.threat_desc", setter: fld_set}]},
+ "threshold": {to:[{field: "rsa.misc.threshold", setter: fld_set}]},
+ "time": {convert: to_date, to:[{field: "rsa.internal.time", setter: fld_set}]},
+ "timestamp": {to:[{field: "rsa.time.timestamp", setter: fld_set}]},
+ "timezone": {to:[{field: "rsa.time.timezone", setter: fld_set}]},
+ "to": {to:[{field: "rsa.email.email_dst", setter: fld_set}]},
+ "tos": {convert: to_long, to:[{field: "rsa.misc.tos", setter: fld_set}]},
+ "trans_from": {to:[{field: "rsa.email.trans_from", setter: fld_set}]},
+ "trans_id": {to:[{field: "rsa.db.transact_id", setter: fld_set}]},
+ "trans_to": {to:[{field: "rsa.email.trans_to", setter: fld_set}]},
+ "trigger_desc": {to:[{field: "rsa.misc.trigger_desc", setter: fld_set}]},
+ "trigger_val": {to:[{field: "rsa.misc.trigger_val", setter: fld_set}]},
+ "type": {to:[{field: "rsa.misc.type", setter: fld_set}]},
+ "type1": {to:[{field: "rsa.misc.type1", setter: fld_set}]},
+ "tzone": {to:[{field: "rsa.time.tzone", setter: fld_set}]},
+ "ubc.req": {convert: to_long, to:[{field: "rsa.internal.ubc_req", setter: fld_set}]},
+ "ubc.res": {convert: to_long, to:[{field: "rsa.internal.ubc_res", setter: fld_set}]},
+ "udb_class": {to:[{field: "rsa.misc.udb_class", setter: fld_set}]},
+ "url_fld": {to:[{field: "rsa.misc.url_fld", setter: fld_set}]},
+ "urlpage": {to:[{field: "rsa.web.urlpage", setter: fld_set}]},
+ "urlroot": {to:[{field: "rsa.web.urlroot", setter: fld_set}]},
+ "user_address": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "user_dept": {to:[{field: "rsa.identity.user_dept", setter: fld_set}]},
+ "user_div": {to:[{field: "rsa.misc.user_div", setter: fld_set}]},
+ "user_fname": {to:[{field: "rsa.identity.firstname", setter: fld_set}]},
+ "user_lname": {to:[{field: "rsa.identity.lastname", setter: fld_set}]},
+ "user_mname": {to:[{field: "rsa.identity.middlename", setter: fld_set}]},
+ "user_org": {to:[{field: "rsa.identity.org", setter: fld_set}]},
+ "user_role": {to:[{field: "rsa.identity.user_role", setter: fld_set}]},
+ "userid": {to:[{field: "rsa.misc.userid", setter: fld_set}]},
+ "username_fld": {to:[{field: "rsa.misc.username_fld", setter: fld_set}]},
+ "utcstamp": {to:[{field: "rsa.misc.utcstamp", setter: fld_set}]},
+ "v_instafname": {to:[{field: "rsa.misc.v_instafname", setter: fld_set}]},
+ "vendor_event_cat": {to:[{field: "rsa.investigations.event_vcat", setter: fld_set}]},
+ "version": {to:[{field: "rsa.misc.version", setter: fld_set}]},
+ "vid": {to:[{field: "rsa.internal.msg_vid", setter: fld_set}]},
+ "virt_data": {to:[{field: "rsa.misc.virt_data", setter: fld_set}]},
+ "virusname": {to:[{field: "rsa.misc.virusname", setter: fld_set}]},
+ "vlan": {convert: to_long, to:[{field: "rsa.network.vlan", setter: fld_set}]},
+ "vlan.name": {to:[{field: "rsa.network.vlan_name", setter: fld_set}]},
+ "vm_target": {to:[{field: "rsa.misc.vm_target", setter: fld_set}]},
+ "vpnid": {to:[{field: "rsa.misc.vpnid", setter: fld_set}]},
+ "vsys": {to:[{field: "rsa.misc.vsys", setter: fld_set}]},
+ "vuln_ref": {to:[{field: "rsa.misc.vuln_ref", setter: fld_set}]},
+ "web_cookie": {to:[{field: "rsa.web.web_cookie", setter: fld_set}]},
+ "web_extension_tmp": {to:[{field: "rsa.web.web_extension_tmp", setter: fld_set}]},
+ "web_host": {to:[{field: "rsa.web.alias_host", setter: fld_set}]},
+ "web_method": {to:[{field: "rsa.misc.action", setter: fld_append}]},
+ "web_page": {to:[{field: "rsa.web.web_page", setter: fld_set}]},
+ "web_ref_domain": {to:[{field: "rsa.web.web_ref_domain", setter: fld_set}]},
+ "web_ref_host": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "web_ref_page": {to:[{field: "rsa.web.web_ref_page", setter: fld_set}]},
+ "web_ref_query": {to:[{field: "rsa.web.web_ref_query", setter: fld_set}]},
+ "web_ref_root": {to:[{field: "rsa.web.web_ref_root", setter: fld_set}]},
+ "wifi_channel": {convert: to_long, to:[{field: "rsa.wireless.wlan_channel", setter: fld_set}]},
+ "wlan": {to:[{field: "rsa.wireless.wlan_name", setter: fld_set}]},
+ "word": {to:[{field: "rsa.internal.word", setter: fld_set}]},
+ "workspace_desc": {to:[{field: "rsa.misc.workspace", setter: fld_set}]},
+ "workstation": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "year": {to:[{field: "rsa.time.year", setter: fld_set}]},
+ "zone": {to:[{field: "rsa.network.zone", setter: fld_set}]},
+ };
+
+ function to_date(value) {
+ switch (typeof (value)) {
+ case "object":
+ // This is a Date. But as it was obtained from evt.Get(), the VM
+ // doesn't see it as a JS Date anymore, thus value instanceof Date === false.
+ // Have to trust that any object here is a valid Date for Go.
+ return value;
+ case "string":
+ var asDate = new Date(value);
+ if (!isNaN(asDate)) return asDate;
+ }
+ }
+
+ // ECMAScript 5.1 doesn't have Object.MAX_SAFE_INTEGER / Object.MIN_SAFE_INTEGER.
+ var maxSafeInt = Math.pow(2, 53) - 1;
+ var minSafeInt = -maxSafeInt;
+
+ function to_long(value) {
+ var num = parseInt(value);
+ // Better not to index a number if it's not safe (above 53 bits).
+ return !isNaN(num) && minSafeInt <= num && num <= maxSafeInt ? num : undefined;
+ }
+
+ function to_ip(value) {
+ if (value.indexOf(":") === -1)
+ return to_ipv4(value);
+ return to_ipv6(value);
+ }
+
+ var ipv4_regex = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
+ var ipv6_hex_regex = /^[0-9A-Fa-f]{1,4}$/;
+
+ function to_ipv4(value) {
+ var result = ipv4_regex.exec(value);
+ if (result == null || result.length !== 5) return;
+ for (var i = 1; i < 5; i++) {
+ var num = strictToInt(result[i]);
+ if (isNaN(num) || num < 0 || num > 255) return;
+ }
+ return value;
+ }
+
+ function to_ipv6(value) {
+ var sqEnd = value.indexOf("]");
+ if (sqEnd > -1) {
+ if (value.charAt(0) !== "[") return;
+ value = value.substr(1, sqEnd - 1);
+ }
+ var zoneOffset = value.indexOf("%");
+ if (zoneOffset > -1) {
+ value = value.substr(0, zoneOffset);
+ }
+ var parts = value.split(":");
+ if (parts == null || parts.length < 3 || parts.length > 8) return;
+ var numEmpty = 0;
+ var innerEmpty = 0;
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i].length === 0) {
+ numEmpty++;
+ if (i > 0 && i + 1 < parts.length) innerEmpty++;
+ } else if (!parts[i].match(ipv6_hex_regex) &&
+ // Accept an IPv6 with a valid IPv4 at the end.
+ ((i + 1 < parts.length) || !to_ipv4(parts[i]))) {
+ return;
+ }
+ }
+ return innerEmpty === 0 && parts.length === 8 || innerEmpty === 1 ? value : undefined;
+ }
+
+ function to_double(value) {
+ return parseFloat(value);
+ }
+
+ function to_mac(value) {
+ // ES doesn't have a mac datatype so it's safe to ingest whatever was captured.
+ return value;
+ }
+
+ function to_lowercase(value) {
+ // to_lowercase is used against keyword fields, which can accept
+ // any other type (numbers, dates).
+ return typeof(value) === "string"? value.toLowerCase() : value;
+ }
+
+ function fld_set(dst, value) {
+ dst[this.field] = { v: value };
+ }
+
+ function fld_append(dst, value) {
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: [value] };
+ } else {
+ var base = dst[this.field];
+ if (base.v.indexOf(value)===-1) base.v.push(value);
+ }
+ }
+
+ function fld_prio(dst, value) {
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: value, prio: this.prio};
+ } else if(this.prio < dst[this.field].prio) {
+ dst[this.field].v = value;
+ dst[this.field].prio = this.prio;
+ }
+ }
+
+ var valid_ecs_outcome = {
+ 'failure': true,
+ 'success': true,
+ 'unknown': true
+ };
+
+ function fld_ecs_outcome(dst, value) {
+ value = value.toLowerCase();
+ if (valid_ecs_outcome[value] === undefined) {
+ value = 'unknown';
+ }
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: value };
+ } else if (dst[this.field].v === 'unknown') {
+ dst[this.field] = { v: value };
+ }
+ }
+
+ function map_all(evt, targets, value) {
+ for (var i = 0; i < targets.length; i++) {
+ evt.Put(targets[i], value);
+ }
+ }
+
+ function populate_fields(evt) {
+ var base = evt.Get(FIELDS_OBJECT);
+ if (base === null) return;
+ alternate_datetime(evt);
+ if (map_ecs) {
+ do_populate(evt, base, ecs_mappings);
+ }
+ if (map_rsa) {
+ do_populate(evt, base, rsa_mappings);
+ }
+ if (keep_raw) {
+ evt.Put("rsa.raw", base);
+ }
+ evt.Delete(FIELDS_OBJECT);
+ }
+
+ var datetime_alt_components = [
+ {field: "day", fmts: [[dF]]},
+ {field: "year", fmts: [[dW]]},
+ {field: "month", fmts: [[dB],[dG]]},
+ {field: "date", fmts: [[dW,dSkip,dG,dSkip,dF],[dW,dSkip,dB,dSkip,dF],[dW,dSkip,dR,dSkip,dF]]},
+ {field: "hour", fmts: [[dN]]},
+ {field: "min", fmts: [[dU]]},
+ {field: "secs", fmts: [[dO]]},
+ {field: "time", fmts: [[dN, dSkip, dU, dSkip, dO]]},
+ ];
+
+ function alternate_datetime(evt) {
+ if (evt.Get(FIELDS_PREFIX + "event_time") != null) {
+ return;
+ }
+ var tzOffset = tz_offset;
+ if (tzOffset === "event") {
+ tzOffset = evt.Get("event.timezone");
+ }
+ var container = new DateContainer(tzOffset);
+ for (var i=0; i} ZSCALERNSS: time=%{hfld2->} %{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hyear}^^timezone=%{timezone}^^%{payload}", processor_chain([
+ setc("header_id","0001"),
+ setc("messageid","ZSCALERNSS_1"),
+ ]));
+
+ var select1 = linear_select([
+ hdr1,
+ ]);
+
+ var part1 = match("MESSAGE#0:ZSCALERNSS_1", "nwparser.payload", "action=%{action}^^reason=%{result}^^hostname=%{hostname}^^protocol=%{protocol}^^serverip=%{daddr}^^url=%{url}^^urlcategory=%{filter}^^urlclass=%{info}^^dlpdictionaries=%{fld3}^^dlpengine=%{fld4}^^filetype=%{filetype}^^threatcategory=%{category}^^threatclass=%{vendor_event_cat}^^pagerisk=%{fld8}^^threatname=%{threat_name}^^clientpublicIP=%{fld9}^^ClientIP=%{saddr}^^location=%{fld11}^^refererURL=%{web_referer}^^useragent=%{user_agent}^^department=%{user_dept}^^user=%{username}^^event_id=%{id}^^clienttranstime=%{fld17}^^requestmethod=%{web_method}^^requestsize=%{sbytes}^^requestversion=%{fld20}^^status=%{resultcode}^^responsesize=%{rbytes}^^responseversion=%{fld23}^^transactionsize=%{bytes}", processor_chain([
+ setc("eventcategory","1605000000"),
+ setf("fqdn","hostname"),
+ setf("msg","$MSG"),
+ date_time({
+ dest: "event_time",
+ args: ["hmonth","hday","hyear","hhour","hmin","hsec"],
+ fmts: [
+ [dB,dF,dW,dN,dU,dO],
+ ],
+ }),
+ lookup({
+ dest: "nwparser.ec_activity",
+ map: map_getEventCategoryActivity,
+ key: field("action"),
+ }),
+ setc("ec_theme","Communication"),
+ setc("ec_subject","User"),
+ ]));
+
+ var msg1 = msg("ZSCALERNSS_1", part1);
+
+ var chain1 = processor_chain([
+ select1,
+ msgid_select({
+ "ZSCALERNSS_1": msg1,
+ }),
+ ]);
+
+- community_id:
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: dns.question.name
+ target_field: dns.question.registered_domain
+ target_subdomain_field: dns.question.subdomain
+ target_etld_field: dns.question.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: client.domain
+ target_field: client.registered_domain
+ target_subdomain_field: client.subdomain
+ target_etld_field: client.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: server.domain
+ target_field: server.registered_domain
+ target_subdomain_field: server.subdomain
+ target_etld_field: server.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: destination.domain
+ target_field: destination.registered_domain
+ target_subdomain_field: destination.subdomain
+ target_etld_field: destination.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: source.domain
+ target_field: source.registered_domain
+ target_subdomain_field: source.subdomain
+ target_etld_field: source.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: url.domain
+ target_field: url.registered_domain
+ target_subdomain_field: url.subdomain
+ target_etld_field: url.top_level_domain
+- add_locale: ~
diff --git a/packages/zscaler/0.5.1/data_stream/zia/agent/stream/udp.yml.hbs b/packages/zscaler/0.5.1/data_stream/zia/agent/stream/udp.yml.hbs
new file mode 100755
index 0000000000..e79a8a0553
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/agent/stream/udp.yml.hbs
@@ -0,0 +1,2652 @@
+udp:
+host: "{{udp_host}}:{{udp_port}}"
+tags:
+{{#if preserve_original_event}}
+ - preserve_original_event
+{{/if}}
+{{#each tags as |tag i|}}
+ - {{tag}}
+{{/each}}
+fields_under_root: true
+fields:
+ observer:
+ vendor: "Zscaler"
+ product: "Internet"
+ type: "Configuration"
+{{#contains "forwarded" tags}}
+publisher_pipeline.disable_host: true
+{{/contains}}
+processors:
+{{#if processors}}
+{{processors}}
+{{/if}}
+- script:
+ lang: javascript
+ params:
+ ecs: true
+ rsa: {{rsa_fields}}
+ tz_offset: {{tz_offset}}
+ keep_raw: {{keep_raw_fields}}
+ debug: {{debug}}
+ source: |
+ // Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ // or more contributor license agreements. Licensed under the Elastic License;
+ // you may not use this file except in compliance with the Elastic License.
+
+ /* jshint -W014,-W016,-W097,-W116 */
+
+ var processor = require("processor");
+ var console = require("console");
+
+ var FLAG_FIELD = "log.flags";
+ var FIELDS_OBJECT = "nwparser";
+ var FIELDS_PREFIX = FIELDS_OBJECT + ".";
+
+ var defaults = {
+ debug: false,
+ ecs: true,
+ rsa: false,
+ keep_raw: false,
+ tz_offset: "local",
+ strip_priority: true
+ };
+
+ var saved_flags = null;
+ var debug;
+ var map_ecs;
+ var map_rsa;
+ var keep_raw;
+ var device;
+ var tz_offset;
+ var strip_priority;
+
+ // Register params from configuration.
+ function register(params) {
+ debug = params.debug !== undefined ? params.debug : defaults.debug;
+ map_ecs = params.ecs !== undefined ? params.ecs : defaults.ecs;
+ map_rsa = params.rsa !== undefined ? params.rsa : defaults.rsa;
+ keep_raw = params.keep_raw !== undefined ? params.keep_raw : defaults.keep_raw;
+ tz_offset = parse_tz_offset(params.tz_offset !== undefined? params.tz_offset : defaults.tz_offset);
+ strip_priority = params.strip_priority !== undefined? params.strip_priority : defaults.strip_priority;
+ device = new DeviceProcessor();
+ }
+
+ function parse_tz_offset(offset) {
+ var date;
+ var m;
+ switch(offset) {
+ // local uses the tz offset from the JS VM.
+ case "local":
+ date = new Date();
+ // Reversing the sign as we the offset from UTC, not to UTC.
+ return parse_local_tz_offset(-date.getTimezoneOffset());
+ // event uses the tz offset from event.timezone (add_locale processor).
+ case "event":
+ return offset;
+ // Otherwise a tz offset in the form "[+-][0-9]{4}" is required.
+ default:
+ m = offset.match(/^([+\-])([0-9]{2}):?([0-9]{2})?$/);
+ if (m === null || m.length !== 4) {
+ throw("bad timezone offset: '" + offset + "'. Must have the form +HH:MM");
+ }
+ return m[1] + m[2] + ":" + (m[3]!==undefined? m[3] : "00");
+ }
+ }
+
+ function parse_local_tz_offset(minutes) {
+ var neg = minutes < 0;
+ minutes = Math.abs(minutes);
+ var min = minutes % 60;
+ var hours = Math.floor(minutes / 60);
+ var pad2digit = function(n) {
+ if (n < 10) { return "0" + n;}
+ return "" + n;
+ };
+ return (neg? "-" : "+") + pad2digit(hours) + ":" + pad2digit(min);
+ }
+
+ function process(evt) {
+ // Function register is only called by the processor when `params` are set
+ // in the processor config.
+ if (device === undefined) {
+ register(defaults);
+ }
+ return device.process(evt);
+ }
+
+ function processor_chain(subprocessors) {
+ var builder = new processor.Chain();
+ subprocessors.forEach(builder.Add);
+ return builder.Build().Run;
+ }
+
+ function linear_select(subprocessors) {
+ return function (evt) {
+ var flags = evt.Get(FLAG_FIELD);
+ var i;
+ for (i = 0; i < subprocessors.length; i++) {
+ evt.Delete(FLAG_FIELD);
+ if (debug) console.warn("linear_select trying entry " + i);
+ subprocessors[i](evt);
+ // Dissect processor succeeded?
+ if (evt.Get(FLAG_FIELD) == null) break;
+ if (debug) console.warn("linear_select failed entry " + i);
+ }
+ if (flags !== null) {
+ evt.Put(FLAG_FIELD, flags);
+ }
+ if (debug) {
+ if (i < subprocessors.length) {
+ console.warn("linear_select matched entry " + i);
+ } else {
+ console.warn("linear_select didn't match");
+ }
+ }
+ };
+ }
+
+ function conditional(opt) {
+ return function(evt) {
+ if (opt.if(evt)) {
+ opt.then(evt);
+ } else if (opt.else) {
+ opt.else(evt);
+ }
+ };
+ }
+
+ var strip_syslog_priority = (function() {
+ var isEnabled = function() { return strip_priority === true; };
+ var fetchPRI = field("_pri");
+ var fetchPayload = field("payload");
+ var removePayload = remove(["payload"]);
+ var cleanup = remove(["_pri", "payload"]);
+ var onMatch = function(evt) {
+ var pri, priStr = fetchPRI(evt);
+ if (priStr != null
+ && 0 < priStr.length && priStr.length < 4
+ && !isNaN((pri = Number(priStr)))
+ && 0 <= pri && pri < 192) {
+ var severity = pri & 7,
+ facility = pri >> 3;
+ setc("_severity", "" + severity)(evt);
+ setc("_facility", "" + facility)(evt);
+ // Replace message with priority stripped.
+ evt.Put("message", fetchPayload(evt));
+ removePayload(evt);
+ } else {
+ // not a valid syslog PRI, cleanup.
+ cleanup(evt);
+ }
+ };
+ return conditional({
+ if: isEnabled,
+ then: cleanup_flags(match(
+ "STRIP_PRI",
+ "message",
+ "<%{_pri}>%{payload}",
+ onMatch
+ ))
+ });
+ })();
+
+ function match(id, src, pattern, on_success) {
+ var dissect = new processor.Dissect({
+ field: src,
+ tokenizer: pattern,
+ target_prefix: FIELDS_OBJECT,
+ ignore_failure: true,
+ overwrite_keys: true,
+ trim_values: "right"
+ });
+ return function (evt) {
+ var msg = evt.Get(src);
+ dissect.Run(evt);
+ var failed = evt.Get(FLAG_FIELD) != null;
+ if (debug) {
+ if (failed) {
+ console.debug("dissect fail: " + id + " field:" + src);
+ } else {
+ console.debug("dissect OK: " + id + " field:" + src);
+ }
+ console.debug(" expr: <<" + pattern + ">>");
+ console.debug(" input: <<" + msg + ">>");
+ }
+ if (on_success != null && !failed) {
+ on_success(evt);
+ }
+ };
+ }
+
+ function match_copy(id, src, dst, on_success) {
+ dst = FIELDS_PREFIX + dst;
+ if (dst === FIELDS_PREFIX || dst === src) {
+ return function (evt) {
+ if (debug) {
+ console.debug("noop OK: " + id + " field:" + src);
+ console.debug(" input: <<" + evt.Get(src) + ">>");
+ }
+ if (on_success != null) on_success(evt);
+ }
+ }
+ return function (evt) {
+ var msg = evt.Get(src);
+ evt.Put(dst, msg);
+ if (debug) {
+ console.debug("copy OK: " + id + " field:" + src);
+ console.debug(" target: '" + dst + "'");
+ console.debug(" input: <<" + msg + ">>");
+ }
+ if (on_success != null) on_success(evt);
+ }
+ }
+
+ function cleanup_flags(processor) {
+ return function(evt) {
+ processor(evt);
+ evt.Delete(FLAG_FIELD);
+ };
+ }
+
+ function all_match(opts) {
+ return function (evt) {
+ var i;
+ for (i = 0; i < opts.processors.length; i++) {
+ evt.Delete(FLAG_FIELD);
+ opts.processors[i](evt);
+ // Dissect processor succeeded?
+ if (evt.Get(FLAG_FIELD) != null) {
+ if (debug) console.warn("all_match failure at " + i);
+ if (opts.on_failure != null) opts.on_failure(evt);
+ return;
+ }
+ if (debug) console.warn("all_match success at " + i);
+ }
+ if (opts.on_success != null) opts.on_success(evt);
+ };
+ }
+
+ function msgid_select(mapping) {
+ return function (evt) {
+ var msgid = evt.Get(FIELDS_PREFIX + "messageid");
+ if (msgid == null) {
+ if (debug) console.warn("msgid_select: no messageid captured!");
+ return;
+ }
+ var next = mapping[msgid];
+ if (next === undefined) {
+ if (debug) console.warn("msgid_select: no mapping for messageid:" + msgid);
+ return;
+ }
+ if (debug) console.info("msgid_select: matched key=" + msgid);
+ return next(evt);
+ };
+ }
+
+ function msg(msg_id, match) {
+ return function (evt) {
+ match(evt);
+ if (evt.Get(FLAG_FIELD) == null) {
+ evt.Put(FIELDS_PREFIX + "msg_id1", msg_id);
+ }
+ };
+ }
+
+ var start;
+
+ function save_flags(evt) {
+ saved_flags = evt.Get(FLAG_FIELD);
+ evt.Put("event.original", evt.Get("message"));
+ }
+
+ function restore_flags(evt) {
+ if (saved_flags !== null) {
+ evt.Put(FLAG_FIELD, saved_flags);
+ }
+ evt.Delete("message");
+ }
+
+ function constant(value) {
+ return function (evt) {
+ return value;
+ };
+ }
+
+ function field(name) {
+ var fullname = FIELDS_PREFIX + name;
+ return function (evt) {
+ return evt.Get(fullname);
+ };
+ }
+
+ function STRCAT(args) {
+ var s = "";
+ var i;
+ for (i = 0; i < args.length; i++) {
+ s += args[i];
+ }
+ return s;
+ }
+
+ // TODO: Implement
+ function DIRCHK(args) {
+ unimplemented("DIRCHK");
+ }
+
+ function strictToInt(str) {
+ return str * 1;
+ }
+
+ function CALC(args) {
+ if (args.length !== 3) {
+ console.warn("skipped call to CALC with " + args.length + " arguments.");
+ return;
+ }
+ var a = strictToInt(args[0]);
+ var b = strictToInt(args[2]);
+ if (isNaN(a) || isNaN(b)) {
+ console.warn("failed evaluating CALC arguments a='" + args[0] + "' b='" + args[2] + "'.");
+ return;
+ }
+ var result;
+ switch (args[1]) {
+ case "+":
+ result = a + b;
+ break;
+ case "-":
+ result = a - b;
+ break;
+ case "*":
+ result = a * b;
+ break;
+ default:
+ // Only * and + seen in the parsers.
+ console.warn("unknown CALC operation '" + args[1] + "'.");
+ return;
+ }
+ // Always return a string
+ return result !== undefined ? "" + result : result;
+ }
+
+ var quoteChars = "\"'`";
+ function RMQ(args) {
+ if(args.length !== 1) {
+ console.warn("RMQ: only one argument expected");
+ return;
+ }
+ var value = args[0].trim();
+ var n = value.length;
+ var char;
+ return n > 1
+ && (char=value.charAt(0)) === value.charAt(n-1)
+ && quoteChars.indexOf(char) !== -1?
+ value.substr(1, n-2)
+ : value;
+ }
+
+ function call(opts) {
+ var args = new Array(opts.args.length);
+ return function (evt) {
+ for (var i = 0; i < opts.args.length; i++)
+ if ((args[i] = opts.args[i](evt)) == null) return;
+ var result = opts.fn(args);
+ if (result != null) {
+ evt.Put(opts.dest, result);
+ }
+ };
+ }
+
+ function nop(evt) {
+ }
+
+ function appendErrorMsg(evt, msg) {
+ var value = evt.Get("error.message");
+ if (value == null) {
+ value = [msg];
+ } else if (msg instanceof Array) {
+ value.push(msg);
+ } else {
+ value = [value, msg];
+ }
+ evt.Put("error.message", value);
+ }
+
+ function unimplemented(name) {
+ appendErrorMsg("unimplemented feature: " + name);
+ }
+
+ function lookup(opts) {
+ return function (evt) {
+ var key = opts.key(evt);
+ if (key == null) return;
+ var value = opts.map.keyvaluepairs[key];
+ if (value === undefined) {
+ value = opts.map.default;
+ }
+ if (value !== undefined) {
+ evt.Put(opts.dest, value(evt));
+ }
+ };
+ }
+
+ function set(fields) {
+ return new processor.AddFields({
+ target: FIELDS_OBJECT,
+ fields: fields,
+ });
+ }
+
+ function setf(dst, src) {
+ return function (evt) {
+ var val = evt.Get(FIELDS_PREFIX + src);
+ if (val != null) evt.Put(FIELDS_PREFIX + dst, val);
+ };
+ }
+
+ function setc(dst, value) {
+ return function (evt) {
+ evt.Put(FIELDS_PREFIX + dst, value);
+ };
+ }
+
+ function set_field(opts) {
+ return function (evt) {
+ var val = opts.value(evt);
+ if (val != null) evt.Put(opts.dest, val);
+ };
+ }
+
+ function dump(label) {
+ return function (evt) {
+ console.log("Dump of event at " + label + ": " + JSON.stringify(evt, null, "\t"));
+ };
+ }
+
+ function date_time_join_args(evt, arglist) {
+ var str = "";
+ for (var i = 0; i < arglist.length; i++) {
+ var fname = FIELDS_PREFIX + arglist[i];
+ var val = evt.Get(fname);
+ if (val != null) {
+ if (str !== "") str += " ";
+ str += val;
+ } else {
+ if (debug) console.warn("in date_time: input arg " + fname + " is not set");
+ }
+ }
+ return str;
+ }
+
+ function to2Digit(num) {
+ return num? (num < 10? "0" + num : num) : "00";
+ }
+
+ // Make two-digit dates 00-69 interpreted as 2000-2069
+ // and dates 70-99 translated to 1970-1999.
+ var twoDigitYearEpoch = 70;
+ var twoDigitYearCentury = 2000;
+
+ // This is to accept dates up to 2 days in the future, only used when
+ // no year is specified in a date. 2 days should be enough to account for
+ // time differences between systems and different tz offsets.
+ var maxFutureDelta = 2*24*60*60*1000;
+
+ // DateContainer stores date fields and then converts those fields into
+ // a Date. Necessary because building a Date using its set() methods gives
+ // different results depending on the order of components.
+ function DateContainer(tzOffset) {
+ this.offset = tzOffset === undefined? "Z" : tzOffset;
+ }
+
+ DateContainer.prototype = {
+ setYear: function(v) {this.year = v;},
+ setMonth: function(v) {this.month = v;},
+ setDay: function(v) {this.day = v;},
+ setHours: function(v) {this.hours = v;},
+ setMinutes: function(v) {this.minutes = v;},
+ setSeconds: function(v) {this.seconds = v;},
+
+ setUNIX: function(v) {this.unix = v;},
+
+ set2DigitYear: function(v) {
+ this.year = v < twoDigitYearEpoch? twoDigitYearCentury + v : twoDigitYearCentury + v - 100;
+ },
+
+ toDate: function() {
+ if (this.unix !== undefined) {
+ return new Date(this.unix * 1000);
+ }
+ if (this.day === undefined || this.month === undefined) {
+ // Can't make a date from this.
+ return undefined;
+ }
+ if (this.year === undefined) {
+ // A date without a year. Set current year, or previous year
+ // if date would be in the future.
+ var now = new Date();
+ this.year = now.getFullYear();
+ var date = this.toDate();
+ if (date.getTime() - now.getTime() > maxFutureDelta) {
+ date.setFullYear(now.getFullYear() - 1);
+ }
+ return date;
+ }
+ var MM = to2Digit(this.month);
+ var DD = to2Digit(this.day);
+ var hh = to2Digit(this.hours);
+ var mm = to2Digit(this.minutes);
+ var ss = to2Digit(this.seconds);
+ return new Date(this.year + "-" + MM + "-" + DD + "T" + hh + ":" + mm + ":" + ss + this.offset);
+ }
+ }
+
+ function date_time_try_pattern(fmt, str, tzOffset) {
+ var date = new DateContainer(tzOffset);
+ var pos = date_time_try_pattern_at_pos(fmt, str, 0, date);
+ return pos !== undefined? date.toDate() : undefined;
+ }
+
+ function date_time_try_pattern_at_pos(fmt, str, pos, date) {
+ var len = str.length;
+ for (var proc = 0; pos !== undefined && pos < len && proc < fmt.length; proc++) {
+ pos = fmt[proc](str, pos, date);
+ }
+ return pos;
+ }
+
+ function date_time(opts) {
+ return function (evt) {
+ var tzOffset = opts.tz || tz_offset;
+ if (tzOffset === "event") {
+ tzOffset = evt.Get("event.timezone");
+ }
+ var str = date_time_join_args(evt, opts.args);
+ for (var i = 0; i < opts.fmts.length; i++) {
+ var date = date_time_try_pattern(opts.fmts[i], str, tzOffset);
+ if (date !== undefined) {
+ evt.Put(FIELDS_PREFIX + opts.dest, date);
+ return;
+ }
+ }
+ if (debug) console.warn("in date_time: id=" + opts.id + " FAILED: " + str);
+ };
+ }
+
+ var uA = 60 * 60 * 24;
+ var uD = 60 * 60 * 24;
+ var uF = 60 * 60;
+ var uG = 60 * 60 * 24 * 30;
+ var uH = 60 * 60;
+ var uI = 60 * 60;
+ var uJ = 60 * 60 * 24;
+ var uM = 60 * 60 * 24 * 30;
+ var uN = 60 * 60;
+ var uO = 1;
+ var uS = 1;
+ var uT = 60;
+ var uU = 60;
+ var uc = dc;
+
+ function duration(opts) {
+ return function(evt) {
+ var str = date_time_join_args(evt, opts.args);
+ for (var i = 0; i < opts.fmts.length; i++) {
+ var seconds = duration_try_pattern(opts.fmts[i], str);
+ if (seconds !== undefined) {
+ evt.Put(FIELDS_PREFIX + opts.dest, seconds);
+ return;
+ }
+ }
+ if (debug) console.warn("in duration: id=" + opts.id + " (s) FAILED: " + str);
+ };
+ }
+
+ function duration_try_pattern(fmt, str) {
+ var secs = 0;
+ var pos = 0;
+ for (var i=0; i [ month_id , how many chars to skip if month in long form ]
+ "Jan": [0, 4],
+ "Feb": [1, 5],
+ "Mar": [2, 2],
+ "Apr": [3, 2],
+ "May": [4, 0],
+ "Jun": [5, 1],
+ "Jul": [6, 1],
+ "Aug": [7, 3],
+ "Sep": [8, 6],
+ "Oct": [9, 4],
+ "Nov": [10, 5],
+ "Dec": [11, 4],
+ "jan": [0, 4],
+ "feb": [1, 5],
+ "mar": [2, 2],
+ "apr": [3, 2],
+ "may": [4, 0],
+ "jun": [5, 1],
+ "jul": [6, 1],
+ "aug": [7, 3],
+ "sep": [8, 6],
+ "oct": [9, 4],
+ "nov": [10, 5],
+ "dec": [11, 4],
+ };
+
+ // var dC = undefined;
+ var dR = dateMonthName(true);
+ var dB = dateMonthName(false);
+ var dM = dateFixedWidthNumber("M", 2, 1, 12, DateContainer.prototype.setMonth);
+ var dG = dateVariableWidthNumber("G", 1, 12, DateContainer.prototype.setMonth);
+ var dD = dateFixedWidthNumber("D", 2, 1, 31, DateContainer.prototype.setDay);
+ var dF = dateVariableWidthNumber("F", 1, 31, DateContainer.prototype.setDay);
+ var dH = dateFixedWidthNumber("H", 2, 0, 24, DateContainer.prototype.setHours);
+ var dI = dateVariableWidthNumber("I", 0, 24, DateContainer.prototype.setHours); // Accept hours >12
+ var dN = dateVariableWidthNumber("N", 0, 24, DateContainer.prototype.setHours);
+ var dT = dateFixedWidthNumber("T", 2, 0, 59, DateContainer.prototype.setMinutes);
+ var dU = dateVariableWidthNumber("U", 0, 59, DateContainer.prototype.setMinutes);
+ var dP = parseAMPM; // AM|PM
+ var dQ = parseAMPM; // A.M.|P.M
+ var dS = dateFixedWidthNumber("S", 2, 0, 60, DateContainer.prototype.setSeconds);
+ var dO = dateVariableWidthNumber("O", 0, 60, DateContainer.prototype.setSeconds);
+ var dY = dateFixedWidthNumber("Y", 2, 0, 99, DateContainer.prototype.set2DigitYear);
+ var dW = dateFixedWidthNumber("W", 4, 1000, 9999, DateContainer.prototype.setYear);
+ var dZ = parseHMS;
+ var dX = dateVariableWidthNumber("X", 0, 0x10000000000, DateContainer.prototype.setUNIX);
+
+ // parseAMPM parses "A.M", "AM", "P.M", "PM" from logs.
+ // Only works if this modifier appears after the hour has been read from logs
+ // which is always the case in the 300 devices.
+ function parseAMPM(str, pos, date) {
+ var n = str.length;
+ var start = skipws(str, pos);
+ if (start + 2 > n) return;
+ var head = str.substr(start, 2).toUpperCase();
+ var isPM = false;
+ var skip = false;
+ switch (head) {
+ case "A.":
+ skip = true;
+ /* falls through */
+ case "AM":
+ break;
+ case "P.":
+ skip = true;
+ /* falls through */
+ case "PM":
+ isPM = true;
+ break;
+ default:
+ if (debug) console.warn("can't parse pos " + start + " as AM/PM: " + str + "(head:" + head + ")");
+ return;
+ }
+ pos = start + 2;
+ if (skip) {
+ if (pos+2 > n || str.substr(pos, 2).toUpperCase() !== "M.") {
+ if (debug) console.warn("can't parse pos " + start + " as AM/PM: " + str + "(tail)");
+ return;
+ }
+ pos += 2;
+ }
+ var hh = date.hours;
+ if (isPM) {
+ // Accept existing hour in 24h format.
+ if (hh < 12) hh += 12;
+ } else {
+ if (hh === 12) hh = 0;
+ }
+ date.setHours(hh);
+ return pos;
+ }
+
+ function parseHMS(str, pos, date) {
+ return date_time_try_pattern_at_pos([dN, dc(":"), dU, dc(":"), dO], str, pos, date);
+ }
+
+ function skipws(str, pos) {
+ for ( var n = str.length;
+ pos < n && str.charAt(pos) === " ";
+ pos++)
+ ;
+ return pos;
+ }
+
+ function skipdigits(str, pos) {
+ var c;
+ for (var n = str.length;
+ pos < n && (c = str.charAt(pos)) >= "0" && c <= "9";
+ pos++)
+ ;
+ return pos;
+ }
+
+ function dSkip(str, pos, date) {
+ var chr;
+ for (;pos < str.length && (chr=str[pos])<'0' || chr>'9'; pos++) {}
+ return pos < str.length? pos : undefined;
+ }
+
+ function dateVariableWidthNumber(fmtChar, min, max, setter) {
+ return function (str, pos, date) {
+ var start = skipws(str, pos);
+ pos = skipdigits(str, start);
+ var s = str.substr(start, pos - start);
+ var value = parseInt(s, 10);
+ if (value >= min && value <= max) {
+ setter.call(date, value);
+ return pos;
+ }
+ return;
+ };
+ }
+
+ function dateFixedWidthNumber(fmtChar, width, min, max, setter) {
+ return function (str, pos, date) {
+ pos = skipws(str, pos);
+ var n = str.length;
+ if (pos + width > n) return;
+ var s = str.substr(pos, width);
+ var value = parseInt(s, 10);
+ if (value >= min && value <= max) {
+ setter.call(date, value);
+ return pos + width;
+ }
+ return;
+ };
+ }
+
+ // Short month name (Jan..Dec).
+ function dateMonthName(long) {
+ return function (str, pos, date) {
+ pos = skipws(str, pos);
+ var n = str.length;
+ if (pos + 3 > n) return;
+ var mon = str.substr(pos, 3);
+ var idx = shortMonths[mon];
+ if (idx === undefined) {
+ idx = shortMonths[mon.toLowerCase()];
+ }
+ if (idx === undefined) {
+ //console.warn("parsing date_time: '" + mon + "' is not a valid short month (%B)");
+ return;
+ }
+ date.setMonth(idx[0]+1);
+ return pos + 3 + (long ? idx[1] : 0);
+ };
+ }
+
+ function url_wrapper(dst, src, fn) {
+ return function(evt) {
+ var value = evt.Get(FIELDS_PREFIX + src), result;
+ if (value != null && (result = fn(value))!== undefined) {
+ evt.Put(FIELDS_PREFIX + dst, result);
+ } else {
+ console.debug(fn.name + " failed for '" + value + "'");
+ }
+ };
+ }
+
+ // The following regular expression for parsing URLs from:
+ // https://github.com/wizard04wsu/URI_Parsing
+ //
+ // The MIT License (MIT)
+ //
+ // Copyright (c) 2014 Andrew Harrison
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a copy of
+ // this software and associated documentation files (the "Software"), to deal in
+ // the Software without restriction, including without limitation the rights to
+ // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ // the Software, and to permit persons to whom the Software is furnished to do so,
+ // subject to the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included in all
+ // copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ var uriRegExp = /^([a-z][a-z0-9+.\-]*):(?:\/\/((?:(?=((?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9A-F]{2})*))(\3)@)?(?=(\[[0-9A-F:.]{2,}\]|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9A-F]{2})*))\5(?::(?=(\d*))\6)?)(\/(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\8)?|(\/?(?!\/)(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\10)?)(?:\?(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\11)?(?:#(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\12)?$/i;
+
+ var uriScheme = 1;
+ var uriDomain = 5;
+ var uriPort = 6;
+ var uriPath = 7;
+ var uriPathAlt = 9;
+ var uriQuery = 11;
+
+ function domain(dst, src) {
+ return url_wrapper(dst, src, extract_domain);
+ }
+
+ function split_url(value) {
+ var m = value.match(uriRegExp);
+ if (m && m[uriDomain]) return m;
+ // Support input in the form "www.example.net/path", but not "/path".
+ m = ("null://" + value).match(uriRegExp);
+ if (m) return m;
+ }
+
+ function extract_domain(value) {
+ var m = split_url(value);
+ if (m && m[uriDomain]) return m[uriDomain];
+ }
+
+ var extFromPage = /\.[^.]+$/;
+ function extract_ext(value) {
+ var page = extract_page(value);
+ if (page) {
+ var m = page.match(extFromPage);
+ if (m) return m[0];
+ }
+ }
+
+ function ext(dst, src) {
+ return url_wrapper(dst, src, extract_ext);
+ }
+
+ function fqdn(dst, src) {
+ // TODO: fqdn and domain(eTLD+1) are currently the same.
+ return domain(dst, src);
+ }
+
+ var pageFromPathRegExp = /\/([^\/]+)$/;
+ var pageName = 1;
+
+ function extract_page(value) {
+ value = extract_path(value);
+ if (!value) return undefined;
+ var m = value.match(pageFromPathRegExp);
+ if (m) return m[pageName];
+ }
+
+ function page(dst, src) {
+ return url_wrapper(dst, src, extract_page);
+ }
+
+ function extract_path(value) {
+ var m = split_url(value);
+ return m? m[uriPath] || m[uriPathAlt] : undefined;
+ }
+
+ function path(dst, src) {
+ return url_wrapper(dst, src, extract_path);
+ }
+
+ // Map common schemes to their default port.
+ // port has to be a string (will be converted at a later stage).
+ var schemePort = {
+ "ftp": "21",
+ "ssh": "22",
+ "http": "80",
+ "https": "443",
+ };
+
+ function extract_port(value) {
+ var m = split_url(value);
+ if (!m) return undefined;
+ if (m[uriPort]) return m[uriPort];
+ if (m[uriScheme]) {
+ return schemePort[m[uriScheme]];
+ }
+ }
+
+ function port(dst, src) {
+ return url_wrapper(dst, src, extract_port);
+ }
+
+ function extract_query(value) {
+ var m = split_url(value);
+ if (m && m[uriQuery]) return m[uriQuery];
+ }
+
+ function query(dst, src) {
+ return url_wrapper(dst, src, extract_query);
+ }
+
+ function extract_root(value) {
+ var m = split_url(value);
+ if (m && m[uriDomain] && m[uriDomain]) {
+ var scheme = m[uriScheme] && m[uriScheme] !== "null"?
+ m[uriScheme] + "://" : "";
+ var port = m[uriPort]? ":" + m[uriPort] : "";
+ return scheme + m[uriDomain] + port;
+ }
+ }
+
+ function root(dst, src) {
+ return url_wrapper(dst, src, extract_root);
+ }
+
+ function tagval(id, src, cfg, keys, on_success) {
+ var fail = function(evt) {
+ evt.Put(FLAG_FIELD, "tagval_parsing_error");
+ }
+ if (cfg.kv_separator.length !== 1) {
+ throw("Invalid TAGVALMAP ValueDelimiter (must have 1 character)");
+ }
+ var quotes_len = cfg.open_quote.length > 0 && cfg.close_quote.length > 0?
+ cfg.open_quote.length + cfg.close_quote.length : 0;
+ var kv_regex = new RegExp('^([^' + cfg.kv_separator + ']*)*' + cfg.kv_separator + ' *(.*)*$');
+ return function(evt) {
+ var msg = evt.Get(src);
+ if (msg === undefined) {
+ console.warn("tagval: input field is missing");
+ return fail(evt);
+ }
+ var pairs = msg.split(cfg.pair_separator);
+ var i;
+ var success = false;
+ var prev = "";
+ for (i=0; i 0 &&
+ value.length >= cfg.open_quote.length + cfg.close_quote.length &&
+ value.substr(0, cfg.open_quote.length) === cfg.open_quote &&
+ value.substr(value.length - cfg.close_quote.length) === cfg.close_quote) {
+ value = value.substr(cfg.open_quote.length, value.length - quotes_len);
+ }
+ evt.Put(FIELDS_PREFIX + field, value);
+ success = true;
+ }
+ if (!success) {
+ return fail(evt);
+ }
+ if (on_success != null) {
+ on_success(evt);
+ }
+ }
+ }
+
+ var ecs_mappings = {
+ "_facility": {convert: to_long, to:[{field: "log.syslog.facility.code", setter: fld_set}]},
+ "_pri": {convert: to_long, to:[{field: "log.syslog.priority", setter: fld_set}]},
+ "_severity": {convert: to_long, to:[{field: "log.syslog.severity.code", setter: fld_set}]},
+ "action": {to:[{field: "event.action", setter: fld_prio, prio: 0}]},
+ "administrator": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 4}]},
+ "alias.ip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 3},{field: "related.ip", setter: fld_append}]},
+ "alias.ipv6": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 4},{field: "related.ip", setter: fld_append}]},
+ "alias.mac": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 1}]},
+ "application": {to:[{field: "network.application", setter: fld_set}]},
+ "bytes": {convert: to_long, to:[{field: "network.bytes", setter: fld_set}]},
+ "c_domain": {to:[{field: "source.domain", setter: fld_prio, prio: 1}]},
+ "c_logon_id": {to:[{field: "user.id", setter: fld_prio, prio: 2}]},
+ "c_user_name": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 8}]},
+ "c_username": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 2}]},
+ "cctld": {to:[{field: "url.top_level_domain", setter: fld_prio, prio: 1}]},
+ "child_pid": {convert: to_long, to:[{field: "process.pid", setter: fld_prio, prio: 1}]},
+ "child_pid_val": {to:[{field: "process.title", setter: fld_set}]},
+ "child_process": {to:[{field: "process.name", setter: fld_prio, prio: 1}]},
+ "city.dst": {to:[{field: "destination.geo.city_name", setter: fld_set}]},
+ "city.src": {to:[{field: "source.geo.city_name", setter: fld_set}]},
+ "daddr": {convert: to_ip, to:[{field: "destination.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "daddr_v6": {convert: to_ip, to:[{field: "destination.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "ddomain": {to:[{field: "destination.domain", setter: fld_prio, prio: 0}]},
+ "devicehostip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 2},{field: "related.ip", setter: fld_append}]},
+ "devicehostmac": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 0}]},
+ "dhost": {to:[{field: "destination.address", setter: fld_set},{field: "related.hosts", setter: fld_append}]},
+ "dinterface": {to:[{field: "observer.egress.interface.name", setter: fld_set}]},
+ "direction": {to:[{field: "network.direction", setter: fld_set}]},
+ "directory": {to:[{field: "file.directory", setter: fld_set}]},
+ "dmacaddr": {convert: to_mac, to:[{field: "destination.mac", setter: fld_set}]},
+ "dns.responsetype": {to:[{field: "dns.answers.type", setter: fld_set}]},
+ "dns.resptext": {to:[{field: "dns.answers.name", setter: fld_set}]},
+ "dns_querytype": {to:[{field: "dns.question.type", setter: fld_set}]},
+ "domain": {to:[{field: "server.domain", setter: fld_prio, prio: 0},{field: "related.hosts", setter: fld_append}]},
+ "domain.dst": {to:[{field: "destination.domain", setter: fld_prio, prio: 1}]},
+ "domain.src": {to:[{field: "source.domain", setter: fld_prio, prio: 2}]},
+ "domain_id": {to:[{field: "user.domain", setter: fld_set}]},
+ "domainname": {to:[{field: "server.domain", setter: fld_prio, prio: 1}]},
+ "dport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 0}]},
+ "dtransaddr": {convert: to_ip, to:[{field: "destination.nat.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "dtransport": {convert: to_long, to:[{field: "destination.nat.port", setter: fld_prio, prio: 0}]},
+ "ec_outcome": {to:[{field: "event.outcome", setter: fld_ecs_outcome}]},
+ "event_description": {to:[{field: "message", setter: fld_prio, prio: 0}]},
+ "event_source": {to:[{field: "related.hosts", setter: fld_append}]},
+ "event_time": {convert: to_date, to:[{field: "@timestamp", setter: fld_set}]},
+ "event_type": {to:[{field: "event.action", setter: fld_prio, prio: 1}]},
+ "extension": {to:[{field: "file.extension", setter: fld_prio, prio: 1}]},
+ "file.attributes": {to:[{field: "file.attributes", setter: fld_set}]},
+ "filename": {to:[{field: "file.name", setter: fld_prio, prio: 0}]},
+ "filename_size": {convert: to_long, to:[{field: "file.size", setter: fld_set}]},
+ "filepath": {to:[{field: "file.path", setter: fld_set}]},
+ "filetype": {to:[{field: "file.type", setter: fld_set}]},
+ "fqdn": {to:[{field: "related.hosts", setter: fld_append}]},
+ "group": {to:[{field: "group.name", setter: fld_set}]},
+ "groupid": {to:[{field: "group.id", setter: fld_set}]},
+ "host": {to:[{field: "host.name", setter: fld_prio, prio: 1},{field: "related.hosts", setter: fld_append}]},
+ "hostip": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "hostip_v6": {convert: to_ip, to:[{field: "host.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "hostname": {to:[{field: "host.name", setter: fld_prio, prio: 0}]},
+ "id": {to:[{field: "event.code", setter: fld_prio, prio: 0}]},
+ "interface": {to:[{field: "network.interface.name", setter: fld_set}]},
+ "ip.orig": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "ip.trans.dst": {convert: to_ip, to:[{field: "destination.nat.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "ip.trans.src": {convert: to_ip, to:[{field: "source.nat.ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "ipv6.orig": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 2},{field: "related.ip", setter: fld_append}]},
+ "latdec_dst": {convert: to_double, to:[{field: "destination.geo.location.lat", setter: fld_set}]},
+ "latdec_src": {convert: to_double, to:[{field: "source.geo.location.lat", setter: fld_set}]},
+ "location_city": {to:[{field: "geo.city_name", setter: fld_set}]},
+ "location_country": {to:[{field: "geo.country_name", setter: fld_set}]},
+ "location_desc": {to:[{field: "geo.name", setter: fld_set}]},
+ "location_dst": {to:[{field: "destination.geo.country_name", setter: fld_set}]},
+ "location_src": {to:[{field: "source.geo.country_name", setter: fld_set}]},
+ "location_state": {to:[{field: "geo.region_name", setter: fld_set}]},
+ "logon_id": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 5}]},
+ "longdec_dst": {convert: to_double, to:[{field: "destination.geo.location.lon", setter: fld_set}]},
+ "longdec_src": {convert: to_double, to:[{field: "source.geo.location.lon", setter: fld_set}]},
+ "macaddr": {convert: to_mac, to:[{field: "host.mac", setter: fld_prio, prio: 2}]},
+ "messageid": {to:[{field: "event.code", setter: fld_prio, prio: 1}]},
+ "method": {to:[{field: "http.request.method", setter: fld_set}]},
+ "msg": {to:[{field: "message", setter: fld_set}]},
+ "orig_ip": {convert: to_ip, to:[{field: "network.forwarded_ip", setter: fld_prio, prio: 1},{field: "related.ip", setter: fld_append}]},
+ "owner": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 6}]},
+ "packets": {convert: to_long, to:[{field: "network.packets", setter: fld_set}]},
+ "parent_pid": {convert: to_long, to:[{field: "process.parent.pid", setter: fld_prio, prio: 0}]},
+ "parent_pid_val": {to:[{field: "process.parent.title", setter: fld_set}]},
+ "parent_process": {to:[{field: "process.parent.name", setter: fld_prio, prio: 0}]},
+ "patient_fullname": {to:[{field: "user.full_name", setter: fld_prio, prio: 1}]},
+ "port.dst": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 1}]},
+ "port.src": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 1}]},
+ "port.trans.dst": {convert: to_long, to:[{field: "destination.nat.port", setter: fld_prio, prio: 1}]},
+ "port.trans.src": {convert: to_long, to:[{field: "source.nat.port", setter: fld_prio, prio: 1}]},
+ "process": {to:[{field: "process.name", setter: fld_prio, prio: 0}]},
+ "process_id": {convert: to_long, to:[{field: "process.pid", setter: fld_prio, prio: 0}]},
+ "process_id_src": {convert: to_long, to:[{field: "process.parent.pid", setter: fld_prio, prio: 1}]},
+ "process_src": {to:[{field: "process.parent.name", setter: fld_prio, prio: 1}]},
+ "product": {to:[{field: "observer.product", setter: fld_set}]},
+ "protocol": {to:[{field: "network.protocol", setter: fld_set}]},
+ "query": {to:[{field: "url.query", setter: fld_prio, prio: 2}]},
+ "rbytes": {convert: to_long, to:[{field: "destination.bytes", setter: fld_set}]},
+ "referer": {to:[{field: "http.request.referrer", setter: fld_prio, prio: 1}]},
+ "rulename": {to:[{field: "rule.name", setter: fld_set}]},
+ "saddr": {convert: to_ip, to:[{field: "source.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "saddr_v6": {convert: to_ip, to:[{field: "source.ip", setter: fld_set},{field: "related.ip", setter: fld_append}]},
+ "sbytes": {convert: to_long, to:[{field: "source.bytes", setter: fld_set}]},
+ "sdomain": {to:[{field: "source.domain", setter: fld_prio, prio: 0}]},
+ "service": {to:[{field: "service.name", setter: fld_prio, prio: 1}]},
+ "service.name": {to:[{field: "service.name", setter: fld_prio, prio: 0}]},
+ "service_account": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 7}]},
+ "severity": {to:[{field: "log.level", setter: fld_set}]},
+ "shost": {to:[{field: "host.hostname", setter: fld_set},{field: "source.address", setter: fld_set},{field: "related.hosts", setter: fld_append}]},
+ "sinterface": {to:[{field: "observer.ingress.interface.name", setter: fld_set}]},
+ "sld": {to:[{field: "url.registered_domain", setter: fld_set}]},
+ "smacaddr": {convert: to_mac, to:[{field: "source.mac", setter: fld_set}]},
+ "sport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 0}]},
+ "stransaddr": {convert: to_ip, to:[{field: "source.nat.ip", setter: fld_prio, prio: 0},{field: "related.ip", setter: fld_append}]},
+ "stransport": {convert: to_long, to:[{field: "source.nat.port", setter: fld_prio, prio: 0}]},
+ "tcp.dstport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 2}]},
+ "tcp.srcport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 2}]},
+ "timezone": {to:[{field: "event.timezone", setter: fld_set}]},
+ "tld": {to:[{field: "url.top_level_domain", setter: fld_prio, prio: 0}]},
+ "udp.dstport": {convert: to_long, to:[{field: "destination.port", setter: fld_prio, prio: 3}]},
+ "udp.srcport": {convert: to_long, to:[{field: "source.port", setter: fld_prio, prio: 3}]},
+ "uid": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 3}]},
+ "url": {to:[{field: "url.original", setter: fld_prio, prio: 1}]},
+ "url_raw": {to:[{field: "url.original", setter: fld_prio, prio: 0}]},
+ "urldomain": {to:[{field: "url.domain", setter: fld_prio, prio: 0}]},
+ "urlquery": {to:[{field: "url.query", setter: fld_prio, prio: 0}]},
+ "user": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 0}]},
+ "user.id": {to:[{field: "user.id", setter: fld_prio, prio: 1}]},
+ "user_agent": {to:[{field: "user_agent.original", setter: fld_set}]},
+ "user_fullname": {to:[{field: "user.full_name", setter: fld_prio, prio: 0}]},
+ "user_id": {to:[{field: "user.id", setter: fld_prio, prio: 0}]},
+ "username": {to:[{field: "related.user", setter: fld_append},{field: "user.name", setter: fld_prio, prio: 1}]},
+ "version": {to:[{field: "observer.version", setter: fld_set}]},
+ "web_domain": {to:[{field: "url.domain", setter: fld_prio, prio: 1},{field: "related.hosts", setter: fld_append}]},
+ "web_extension": {to:[{field: "file.extension", setter: fld_prio, prio: 0}]},
+ "web_query": {to:[{field: "url.query", setter: fld_prio, prio: 1}]},
+ "web_ref_domain": {to:[{field: "related.hosts", setter: fld_append}]},
+ "web_referer": {to:[{field: "http.request.referrer", setter: fld_prio, prio: 0}]},
+ "web_root": {to:[{field: "url.path", setter: fld_set}]},
+ "webpage": {to:[{field: "file.name", setter: fld_prio, prio: 1}]},
+ };
+
+ var rsa_mappings = {
+ "access_point": {to:[{field: "rsa.wireless.access_point", setter: fld_set}]},
+ "accesses": {to:[{field: "rsa.identity.accesses", setter: fld_set}]},
+ "acl_id": {to:[{field: "rsa.misc.acl_id", setter: fld_set}]},
+ "acl_op": {to:[{field: "rsa.misc.acl_op", setter: fld_set}]},
+ "acl_pos": {to:[{field: "rsa.misc.acl_pos", setter: fld_set}]},
+ "acl_table": {to:[{field: "rsa.misc.acl_table", setter: fld_set}]},
+ "action": {to:[{field: "rsa.misc.action", setter: fld_append}]},
+ "ad_computer_dst": {to:[{field: "rsa.network.ad_computer_dst", setter: fld_set}]},
+ "addr": {to:[{field: "rsa.network.addr", setter: fld_set}]},
+ "admin": {to:[{field: "rsa.misc.admin", setter: fld_set}]},
+ "agent": {to:[{field: "rsa.misc.client", setter: fld_prio, prio: 0}]},
+ "agent.id": {to:[{field: "rsa.misc.agent_id", setter: fld_set}]},
+ "alarm_id": {to:[{field: "rsa.misc.alarm_id", setter: fld_set}]},
+ "alarmname": {to:[{field: "rsa.misc.alarmname", setter: fld_set}]},
+ "alert": {to:[{field: "rsa.threat.alert", setter: fld_set}]},
+ "alert_id": {to:[{field: "rsa.misc.alert_id", setter: fld_set}]},
+ "alias.host": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "analysis.file": {to:[{field: "rsa.investigations.analysis_file", setter: fld_set}]},
+ "analysis.service": {to:[{field: "rsa.investigations.analysis_service", setter: fld_set}]},
+ "analysis.session": {to:[{field: "rsa.investigations.analysis_session", setter: fld_set}]},
+ "app_id": {to:[{field: "rsa.misc.app_id", setter: fld_set}]},
+ "attachment": {to:[{field: "rsa.file.attachment", setter: fld_set}]},
+ "audit": {to:[{field: "rsa.misc.audit", setter: fld_set}]},
+ "audit_class": {to:[{field: "rsa.internal.audit_class", setter: fld_set}]},
+ "audit_object": {to:[{field: "rsa.misc.audit_object", setter: fld_set}]},
+ "auditdata": {to:[{field: "rsa.misc.auditdata", setter: fld_set}]},
+ "authmethod": {to:[{field: "rsa.identity.auth_method", setter: fld_set}]},
+ "autorun_type": {to:[{field: "rsa.misc.autorun_type", setter: fld_set}]},
+ "bcc": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "benchmark": {to:[{field: "rsa.misc.benchmark", setter: fld_set}]},
+ "binary": {to:[{field: "rsa.file.binary", setter: fld_set}]},
+ "boc": {to:[{field: "rsa.investigations.boc", setter: fld_set}]},
+ "bssid": {to:[{field: "rsa.wireless.wlan_ssid", setter: fld_prio, prio: 1}]},
+ "bypass": {to:[{field: "rsa.misc.bypass", setter: fld_set}]},
+ "c_sid": {to:[{field: "rsa.identity.user_sid_src", setter: fld_set}]},
+ "cache": {to:[{field: "rsa.misc.cache", setter: fld_set}]},
+ "cache_hit": {to:[{field: "rsa.misc.cache_hit", setter: fld_set}]},
+ "calling_from": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 1}]},
+ "calling_to": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 0}]},
+ "category": {to:[{field: "rsa.misc.category", setter: fld_set}]},
+ "cc": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "cc.number": {convert: to_long, to:[{field: "rsa.misc.cc_number", setter: fld_set}]},
+ "cefversion": {to:[{field: "rsa.misc.cefversion", setter: fld_set}]},
+ "cert.serial": {to:[{field: "rsa.crypto.cert_serial", setter: fld_set}]},
+ "cert_ca": {to:[{field: "rsa.crypto.cert_ca", setter: fld_set}]},
+ "cert_checksum": {to:[{field: "rsa.crypto.cert_checksum", setter: fld_set}]},
+ "cert_common": {to:[{field: "rsa.crypto.cert_common", setter: fld_set}]},
+ "cert_error": {to:[{field: "rsa.crypto.cert_error", setter: fld_set}]},
+ "cert_hostname": {to:[{field: "rsa.crypto.cert_host_name", setter: fld_set}]},
+ "cert_hostname_cat": {to:[{field: "rsa.crypto.cert_host_cat", setter: fld_set}]},
+ "cert_issuer": {to:[{field: "rsa.crypto.cert_issuer", setter: fld_set}]},
+ "cert_keysize": {to:[{field: "rsa.crypto.cert_keysize", setter: fld_set}]},
+ "cert_status": {to:[{field: "rsa.crypto.cert_status", setter: fld_set}]},
+ "cert_subject": {to:[{field: "rsa.crypto.cert_subject", setter: fld_set}]},
+ "cert_username": {to:[{field: "rsa.crypto.cert_username", setter: fld_set}]},
+ "cfg.attr": {to:[{field: "rsa.misc.cfg_attr", setter: fld_set}]},
+ "cfg.obj": {to:[{field: "rsa.misc.cfg_obj", setter: fld_set}]},
+ "cfg.path": {to:[{field: "rsa.misc.cfg_path", setter: fld_set}]},
+ "change_attribute": {to:[{field: "rsa.misc.change_attrib", setter: fld_set}]},
+ "change_new": {to:[{field: "rsa.misc.change_new", setter: fld_set}]},
+ "change_old": {to:[{field: "rsa.misc.change_old", setter: fld_set}]},
+ "changes": {to:[{field: "rsa.misc.changes", setter: fld_set}]},
+ "checksum": {to:[{field: "rsa.misc.checksum", setter: fld_set}]},
+ "checksum.dst": {to:[{field: "rsa.misc.checksum_dst", setter: fld_set}]},
+ "checksum.src": {to:[{field: "rsa.misc.checksum_src", setter: fld_set}]},
+ "cid": {to:[{field: "rsa.internal.cid", setter: fld_set}]},
+ "client": {to:[{field: "rsa.misc.client", setter: fld_prio, prio: 1}]},
+ "client_ip": {to:[{field: "rsa.misc.client_ip", setter: fld_set}]},
+ "clustermembers": {to:[{field: "rsa.misc.clustermembers", setter: fld_set}]},
+ "cmd": {to:[{field: "rsa.misc.cmd", setter: fld_set}]},
+ "cn_acttimeout": {to:[{field: "rsa.misc.cn_acttimeout", setter: fld_set}]},
+ "cn_asn_dst": {to:[{field: "rsa.web.cn_asn_dst", setter: fld_set}]},
+ "cn_asn_src": {to:[{field: "rsa.misc.cn_asn_src", setter: fld_set}]},
+ "cn_bgpv4nxthop": {to:[{field: "rsa.misc.cn_bgpv4nxthop", setter: fld_set}]},
+ "cn_ctr_dst_code": {to:[{field: "rsa.misc.cn_ctr_dst_code", setter: fld_set}]},
+ "cn_dst_tos": {to:[{field: "rsa.misc.cn_dst_tos", setter: fld_set}]},
+ "cn_dst_vlan": {to:[{field: "rsa.misc.cn_dst_vlan", setter: fld_set}]},
+ "cn_engine_id": {to:[{field: "rsa.misc.cn_engine_id", setter: fld_set}]},
+ "cn_engine_type": {to:[{field: "rsa.misc.cn_engine_type", setter: fld_set}]},
+ "cn_f_switch": {to:[{field: "rsa.misc.cn_f_switch", setter: fld_set}]},
+ "cn_flowsampid": {to:[{field: "rsa.misc.cn_flowsampid", setter: fld_set}]},
+ "cn_flowsampintv": {to:[{field: "rsa.misc.cn_flowsampintv", setter: fld_set}]},
+ "cn_flowsampmode": {to:[{field: "rsa.misc.cn_flowsampmode", setter: fld_set}]},
+ "cn_inacttimeout": {to:[{field: "rsa.misc.cn_inacttimeout", setter: fld_set}]},
+ "cn_inpermbyts": {to:[{field: "rsa.misc.cn_inpermbyts", setter: fld_set}]},
+ "cn_inpermpckts": {to:[{field: "rsa.misc.cn_inpermpckts", setter: fld_set}]},
+ "cn_invalid": {to:[{field: "rsa.misc.cn_invalid", setter: fld_set}]},
+ "cn_ip_proto_ver": {to:[{field: "rsa.misc.cn_ip_proto_ver", setter: fld_set}]},
+ "cn_ipv4_ident": {to:[{field: "rsa.misc.cn_ipv4_ident", setter: fld_set}]},
+ "cn_l_switch": {to:[{field: "rsa.misc.cn_l_switch", setter: fld_set}]},
+ "cn_log_did": {to:[{field: "rsa.misc.cn_log_did", setter: fld_set}]},
+ "cn_log_rid": {to:[{field: "rsa.misc.cn_log_rid", setter: fld_set}]},
+ "cn_max_ttl": {to:[{field: "rsa.misc.cn_max_ttl", setter: fld_set}]},
+ "cn_maxpcktlen": {to:[{field: "rsa.misc.cn_maxpcktlen", setter: fld_set}]},
+ "cn_min_ttl": {to:[{field: "rsa.misc.cn_min_ttl", setter: fld_set}]},
+ "cn_minpcktlen": {to:[{field: "rsa.misc.cn_minpcktlen", setter: fld_set}]},
+ "cn_mpls_lbl_1": {to:[{field: "rsa.misc.cn_mpls_lbl_1", setter: fld_set}]},
+ "cn_mpls_lbl_10": {to:[{field: "rsa.misc.cn_mpls_lbl_10", setter: fld_set}]},
+ "cn_mpls_lbl_2": {to:[{field: "rsa.misc.cn_mpls_lbl_2", setter: fld_set}]},
+ "cn_mpls_lbl_3": {to:[{field: "rsa.misc.cn_mpls_lbl_3", setter: fld_set}]},
+ "cn_mpls_lbl_4": {to:[{field: "rsa.misc.cn_mpls_lbl_4", setter: fld_set}]},
+ "cn_mpls_lbl_5": {to:[{field: "rsa.misc.cn_mpls_lbl_5", setter: fld_set}]},
+ "cn_mpls_lbl_6": {to:[{field: "rsa.misc.cn_mpls_lbl_6", setter: fld_set}]},
+ "cn_mpls_lbl_7": {to:[{field: "rsa.misc.cn_mpls_lbl_7", setter: fld_set}]},
+ "cn_mpls_lbl_8": {to:[{field: "rsa.misc.cn_mpls_lbl_8", setter: fld_set}]},
+ "cn_mpls_lbl_9": {to:[{field: "rsa.misc.cn_mpls_lbl_9", setter: fld_set}]},
+ "cn_mplstoplabel": {to:[{field: "rsa.misc.cn_mplstoplabel", setter: fld_set}]},
+ "cn_mplstoplabip": {to:[{field: "rsa.misc.cn_mplstoplabip", setter: fld_set}]},
+ "cn_mul_dst_byt": {to:[{field: "rsa.misc.cn_mul_dst_byt", setter: fld_set}]},
+ "cn_mul_dst_pks": {to:[{field: "rsa.misc.cn_mul_dst_pks", setter: fld_set}]},
+ "cn_muligmptype": {to:[{field: "rsa.misc.cn_muligmptype", setter: fld_set}]},
+ "cn_rpackets": {to:[{field: "rsa.web.cn_rpackets", setter: fld_set}]},
+ "cn_sampalgo": {to:[{field: "rsa.misc.cn_sampalgo", setter: fld_set}]},
+ "cn_sampint": {to:[{field: "rsa.misc.cn_sampint", setter: fld_set}]},
+ "cn_seqctr": {to:[{field: "rsa.misc.cn_seqctr", setter: fld_set}]},
+ "cn_spackets": {to:[{field: "rsa.misc.cn_spackets", setter: fld_set}]},
+ "cn_src_tos": {to:[{field: "rsa.misc.cn_src_tos", setter: fld_set}]},
+ "cn_src_vlan": {to:[{field: "rsa.misc.cn_src_vlan", setter: fld_set}]},
+ "cn_sysuptime": {to:[{field: "rsa.misc.cn_sysuptime", setter: fld_set}]},
+ "cn_template_id": {to:[{field: "rsa.misc.cn_template_id", setter: fld_set}]},
+ "cn_totbytsexp": {to:[{field: "rsa.misc.cn_totbytsexp", setter: fld_set}]},
+ "cn_totflowexp": {to:[{field: "rsa.misc.cn_totflowexp", setter: fld_set}]},
+ "cn_totpcktsexp": {to:[{field: "rsa.misc.cn_totpcktsexp", setter: fld_set}]},
+ "cn_unixnanosecs": {to:[{field: "rsa.misc.cn_unixnanosecs", setter: fld_set}]},
+ "cn_v6flowlabel": {to:[{field: "rsa.misc.cn_v6flowlabel", setter: fld_set}]},
+ "cn_v6optheaders": {to:[{field: "rsa.misc.cn_v6optheaders", setter: fld_set}]},
+ "code": {to:[{field: "rsa.misc.code", setter: fld_set}]},
+ "command": {to:[{field: "rsa.misc.command", setter: fld_set}]},
+ "comments": {to:[{field: "rsa.misc.comments", setter: fld_set}]},
+ "comp_class": {to:[{field: "rsa.misc.comp_class", setter: fld_set}]},
+ "comp_name": {to:[{field: "rsa.misc.comp_name", setter: fld_set}]},
+ "comp_rbytes": {to:[{field: "rsa.misc.comp_rbytes", setter: fld_set}]},
+ "comp_sbytes": {to:[{field: "rsa.misc.comp_sbytes", setter: fld_set}]},
+ "component_version": {to:[{field: "rsa.misc.comp_version", setter: fld_set}]},
+ "connection_id": {to:[{field: "rsa.misc.connection_id", setter: fld_prio, prio: 1}]},
+ "connectionid": {to:[{field: "rsa.misc.connection_id", setter: fld_prio, prio: 0}]},
+ "content": {to:[{field: "rsa.misc.content", setter: fld_set}]},
+ "content_type": {to:[{field: "rsa.misc.content_type", setter: fld_set}]},
+ "content_version": {to:[{field: "rsa.misc.content_version", setter: fld_set}]},
+ "context": {to:[{field: "rsa.misc.context", setter: fld_set}]},
+ "count": {to:[{field: "rsa.misc.count", setter: fld_set}]},
+ "cpu": {convert: to_long, to:[{field: "rsa.misc.cpu", setter: fld_set}]},
+ "cpu_data": {to:[{field: "rsa.misc.cpu_data", setter: fld_set}]},
+ "criticality": {to:[{field: "rsa.misc.criticality", setter: fld_set}]},
+ "cs_agency_dst": {to:[{field: "rsa.misc.cs_agency_dst", setter: fld_set}]},
+ "cs_analyzedby": {to:[{field: "rsa.misc.cs_analyzedby", setter: fld_set}]},
+ "cs_av_other": {to:[{field: "rsa.misc.cs_av_other", setter: fld_set}]},
+ "cs_av_primary": {to:[{field: "rsa.misc.cs_av_primary", setter: fld_set}]},
+ "cs_av_secondary": {to:[{field: "rsa.misc.cs_av_secondary", setter: fld_set}]},
+ "cs_bgpv6nxthop": {to:[{field: "rsa.misc.cs_bgpv6nxthop", setter: fld_set}]},
+ "cs_bit9status": {to:[{field: "rsa.misc.cs_bit9status", setter: fld_set}]},
+ "cs_context": {to:[{field: "rsa.misc.cs_context", setter: fld_set}]},
+ "cs_control": {to:[{field: "rsa.misc.cs_control", setter: fld_set}]},
+ "cs_data": {to:[{field: "rsa.misc.cs_data", setter: fld_set}]},
+ "cs_datecret": {to:[{field: "rsa.misc.cs_datecret", setter: fld_set}]},
+ "cs_dst_tld": {to:[{field: "rsa.misc.cs_dst_tld", setter: fld_set}]},
+ "cs_eth_dst_ven": {to:[{field: "rsa.misc.cs_eth_dst_ven", setter: fld_set}]},
+ "cs_eth_src_ven": {to:[{field: "rsa.misc.cs_eth_src_ven", setter: fld_set}]},
+ "cs_event_uuid": {to:[{field: "rsa.misc.cs_event_uuid", setter: fld_set}]},
+ "cs_filetype": {to:[{field: "rsa.misc.cs_filetype", setter: fld_set}]},
+ "cs_fld": {to:[{field: "rsa.misc.cs_fld", setter: fld_set}]},
+ "cs_if_desc": {to:[{field: "rsa.misc.cs_if_desc", setter: fld_set}]},
+ "cs_if_name": {to:[{field: "rsa.misc.cs_if_name", setter: fld_set}]},
+ "cs_ip_next_hop": {to:[{field: "rsa.misc.cs_ip_next_hop", setter: fld_set}]},
+ "cs_ipv4dstpre": {to:[{field: "rsa.misc.cs_ipv4dstpre", setter: fld_set}]},
+ "cs_ipv4srcpre": {to:[{field: "rsa.misc.cs_ipv4srcpre", setter: fld_set}]},
+ "cs_lifetime": {to:[{field: "rsa.misc.cs_lifetime", setter: fld_set}]},
+ "cs_log_medium": {to:[{field: "rsa.misc.cs_log_medium", setter: fld_set}]},
+ "cs_loginname": {to:[{field: "rsa.misc.cs_loginname", setter: fld_set}]},
+ "cs_modulescore": {to:[{field: "rsa.misc.cs_modulescore", setter: fld_set}]},
+ "cs_modulesign": {to:[{field: "rsa.misc.cs_modulesign", setter: fld_set}]},
+ "cs_opswatresult": {to:[{field: "rsa.misc.cs_opswatresult", setter: fld_set}]},
+ "cs_payload": {to:[{field: "rsa.misc.cs_payload", setter: fld_set}]},
+ "cs_registrant": {to:[{field: "rsa.misc.cs_registrant", setter: fld_set}]},
+ "cs_registrar": {to:[{field: "rsa.misc.cs_registrar", setter: fld_set}]},
+ "cs_represult": {to:[{field: "rsa.misc.cs_represult", setter: fld_set}]},
+ "cs_rpayload": {to:[{field: "rsa.misc.cs_rpayload", setter: fld_set}]},
+ "cs_sampler_name": {to:[{field: "rsa.misc.cs_sampler_name", setter: fld_set}]},
+ "cs_sourcemodule": {to:[{field: "rsa.misc.cs_sourcemodule", setter: fld_set}]},
+ "cs_streams": {to:[{field: "rsa.misc.cs_streams", setter: fld_set}]},
+ "cs_targetmodule": {to:[{field: "rsa.misc.cs_targetmodule", setter: fld_set}]},
+ "cs_v6nxthop": {to:[{field: "rsa.misc.cs_v6nxthop", setter: fld_set}]},
+ "cs_whois_server": {to:[{field: "rsa.misc.cs_whois_server", setter: fld_set}]},
+ "cs_yararesult": {to:[{field: "rsa.misc.cs_yararesult", setter: fld_set}]},
+ "cve": {to:[{field: "rsa.misc.cve", setter: fld_set}]},
+ "d_certauth": {to:[{field: "rsa.crypto.d_certauth", setter: fld_set}]},
+ "d_cipher": {to:[{field: "rsa.crypto.cipher_dst", setter: fld_set}]},
+ "d_ciphersize": {convert: to_long, to:[{field: "rsa.crypto.cipher_size_dst", setter: fld_set}]},
+ "d_sslver": {to:[{field: "rsa.crypto.ssl_ver_dst", setter: fld_set}]},
+ "data": {to:[{field: "rsa.internal.data", setter: fld_set}]},
+ "data_type": {to:[{field: "rsa.misc.data_type", setter: fld_set}]},
+ "date": {to:[{field: "rsa.time.date", setter: fld_set}]},
+ "datetime": {to:[{field: "rsa.time.datetime", setter: fld_set}]},
+ "day": {to:[{field: "rsa.time.day", setter: fld_set}]},
+ "db_id": {to:[{field: "rsa.db.db_id", setter: fld_set}]},
+ "db_name": {to:[{field: "rsa.db.database", setter: fld_set}]},
+ "db_pid": {convert: to_long, to:[{field: "rsa.db.db_pid", setter: fld_set}]},
+ "dclass_counter1": {convert: to_long, to:[{field: "rsa.counters.dclass_c1", setter: fld_set}]},
+ "dclass_counter1_string": {to:[{field: "rsa.counters.dclass_c1_str", setter: fld_set}]},
+ "dclass_counter2": {convert: to_long, to:[{field: "rsa.counters.dclass_c2", setter: fld_set}]},
+ "dclass_counter2_string": {to:[{field: "rsa.counters.dclass_c2_str", setter: fld_set}]},
+ "dclass_counter3": {convert: to_long, to:[{field: "rsa.counters.dclass_c3", setter: fld_set}]},
+ "dclass_counter3_string": {to:[{field: "rsa.counters.dclass_c3_str", setter: fld_set}]},
+ "dclass_ratio1": {to:[{field: "rsa.counters.dclass_r1", setter: fld_set}]},
+ "dclass_ratio1_string": {to:[{field: "rsa.counters.dclass_r1_str", setter: fld_set}]},
+ "dclass_ratio2": {to:[{field: "rsa.counters.dclass_r2", setter: fld_set}]},
+ "dclass_ratio2_string": {to:[{field: "rsa.counters.dclass_r2_str", setter: fld_set}]},
+ "dclass_ratio3": {to:[{field: "rsa.counters.dclass_r3", setter: fld_set}]},
+ "dclass_ratio3_string": {to:[{field: "rsa.counters.dclass_r3_str", setter: fld_set}]},
+ "dead": {convert: to_long, to:[{field: "rsa.internal.dead", setter: fld_set}]},
+ "description": {to:[{field: "rsa.misc.description", setter: fld_set}]},
+ "detail": {to:[{field: "rsa.misc.event_desc", setter: fld_set}]},
+ "device": {to:[{field: "rsa.misc.device_name", setter: fld_set}]},
+ "device.class": {to:[{field: "rsa.internal.device_class", setter: fld_set}]},
+ "device.group": {to:[{field: "rsa.internal.device_group", setter: fld_set}]},
+ "device.host": {to:[{field: "rsa.internal.device_host", setter: fld_set}]},
+ "device.ip": {convert: to_ip, to:[{field: "rsa.internal.device_ip", setter: fld_set}]},
+ "device.ipv6": {convert: to_ip, to:[{field: "rsa.internal.device_ipv6", setter: fld_set}]},
+ "device.type": {to:[{field: "rsa.internal.device_type", setter: fld_set}]},
+ "device.type.id": {convert: to_long, to:[{field: "rsa.internal.device_type_id", setter: fld_set}]},
+ "devicehostname": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "devvendor": {to:[{field: "rsa.misc.devvendor", setter: fld_set}]},
+ "dhost": {to:[{field: "rsa.network.host_dst", setter: fld_set}]},
+ "did": {to:[{field: "rsa.internal.did", setter: fld_set}]},
+ "dinterface": {to:[{field: "rsa.network.dinterface", setter: fld_set}]},
+ "directory.dst": {to:[{field: "rsa.file.directory_dst", setter: fld_set}]},
+ "directory.src": {to:[{field: "rsa.file.directory_src", setter: fld_set}]},
+ "disk_volume": {to:[{field: "rsa.storage.disk_volume", setter: fld_set}]},
+ "disposition": {to:[{field: "rsa.misc.disposition", setter: fld_set}]},
+ "distance": {to:[{field: "rsa.misc.distance", setter: fld_set}]},
+ "dmask": {to:[{field: "rsa.network.dmask", setter: fld_set}]},
+ "dn": {to:[{field: "rsa.identity.dn", setter: fld_set}]},
+ "dns_a_record": {to:[{field: "rsa.network.dns_a_record", setter: fld_set}]},
+ "dns_cname_record": {to:[{field: "rsa.network.dns_cname_record", setter: fld_set}]},
+ "dns_id": {to:[{field: "rsa.network.dns_id", setter: fld_set}]},
+ "dns_opcode": {to:[{field: "rsa.network.dns_opcode", setter: fld_set}]},
+ "dns_ptr_record": {to:[{field: "rsa.network.dns_ptr_record", setter: fld_set}]},
+ "dns_resp": {to:[{field: "rsa.network.dns_resp", setter: fld_set}]},
+ "dns_type": {to:[{field: "rsa.network.dns_type", setter: fld_set}]},
+ "doc_number": {convert: to_long, to:[{field: "rsa.misc.doc_number", setter: fld_set}]},
+ "domain": {to:[{field: "rsa.network.domain", setter: fld_set}]},
+ "domain1": {to:[{field: "rsa.network.domain1", setter: fld_set}]},
+ "dst_dn": {to:[{field: "rsa.identity.dn_dst", setter: fld_set}]},
+ "dst_payload": {to:[{field: "rsa.misc.payload_dst", setter: fld_set}]},
+ "dst_spi": {to:[{field: "rsa.misc.spi_dst", setter: fld_set}]},
+ "dst_zone": {to:[{field: "rsa.network.zone_dst", setter: fld_set}]},
+ "dstburb": {to:[{field: "rsa.misc.dstburb", setter: fld_set}]},
+ "duration": {convert: to_double, to:[{field: "rsa.time.duration_time", setter: fld_set}]},
+ "duration_string": {to:[{field: "rsa.time.duration_str", setter: fld_set}]},
+ "ec_activity": {to:[{field: "rsa.investigations.ec_activity", setter: fld_set}]},
+ "ec_outcome": {to:[{field: "rsa.investigations.ec_outcome", setter: fld_set}]},
+ "ec_subject": {to:[{field: "rsa.investigations.ec_subject", setter: fld_set}]},
+ "ec_theme": {to:[{field: "rsa.investigations.ec_theme", setter: fld_set}]},
+ "edomain": {to:[{field: "rsa.misc.edomain", setter: fld_set}]},
+ "edomaub": {to:[{field: "rsa.misc.edomaub", setter: fld_set}]},
+ "effective_time": {convert: to_date, to:[{field: "rsa.time.effective_time", setter: fld_set}]},
+ "ein.number": {convert: to_long, to:[{field: "rsa.misc.ein_number", setter: fld_set}]},
+ "email": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "encryption_type": {to:[{field: "rsa.crypto.crypto", setter: fld_set}]},
+ "endtime": {convert: to_date, to:[{field: "rsa.time.endtime", setter: fld_set}]},
+ "entropy.req": {convert: to_long, to:[{field: "rsa.internal.entropy_req", setter: fld_set}]},
+ "entropy.res": {convert: to_long, to:[{field: "rsa.internal.entropy_res", setter: fld_set}]},
+ "entry": {to:[{field: "rsa.internal.entry", setter: fld_set}]},
+ "eoc": {to:[{field: "rsa.investigations.eoc", setter: fld_set}]},
+ "error": {to:[{field: "rsa.misc.error", setter: fld_set}]},
+ "eth_type": {convert: to_long, to:[{field: "rsa.network.eth_type", setter: fld_set}]},
+ "euid": {to:[{field: "rsa.misc.euid", setter: fld_set}]},
+ "event.cat": {convert: to_long, to:[{field: "rsa.investigations.event_cat", setter: fld_prio, prio: 1}]},
+ "event.cat.name": {to:[{field: "rsa.investigations.event_cat_name", setter: fld_prio, prio: 1}]},
+ "event_cat": {convert: to_long, to:[{field: "rsa.investigations.event_cat", setter: fld_prio, prio: 0}]},
+ "event_cat_name": {to:[{field: "rsa.investigations.event_cat_name", setter: fld_prio, prio: 0}]},
+ "event_category": {to:[{field: "rsa.misc.event_category", setter: fld_set}]},
+ "event_computer": {to:[{field: "rsa.misc.event_computer", setter: fld_set}]},
+ "event_counter": {convert: to_long, to:[{field: "rsa.counters.event_counter", setter: fld_set}]},
+ "event_description": {to:[{field: "rsa.internal.event_desc", setter: fld_set}]},
+ "event_id": {to:[{field: "rsa.misc.event_id", setter: fld_set}]},
+ "event_log": {to:[{field: "rsa.misc.event_log", setter: fld_set}]},
+ "event_name": {to:[{field: "rsa.internal.event_name", setter: fld_set}]},
+ "event_queue_time": {convert: to_date, to:[{field: "rsa.time.event_queue_time", setter: fld_set}]},
+ "event_source": {to:[{field: "rsa.misc.event_source", setter: fld_set}]},
+ "event_state": {to:[{field: "rsa.misc.event_state", setter: fld_set}]},
+ "event_time": {convert: to_date, to:[{field: "rsa.time.event_time", setter: fld_set}]},
+ "event_time_str": {to:[{field: "rsa.time.event_time_str", setter: fld_prio, prio: 1}]},
+ "event_time_string": {to:[{field: "rsa.time.event_time_str", setter: fld_prio, prio: 0}]},
+ "event_type": {to:[{field: "rsa.misc.event_type", setter: fld_set}]},
+ "event_user": {to:[{field: "rsa.misc.event_user", setter: fld_set}]},
+ "eventtime": {to:[{field: "rsa.time.eventtime", setter: fld_set}]},
+ "expected_val": {to:[{field: "rsa.misc.expected_val", setter: fld_set}]},
+ "expiration_time": {convert: to_date, to:[{field: "rsa.time.expire_time", setter: fld_set}]},
+ "expiration_time_string": {to:[{field: "rsa.time.expire_time_str", setter: fld_set}]},
+ "facility": {to:[{field: "rsa.misc.facility", setter: fld_set}]},
+ "facilityname": {to:[{field: "rsa.misc.facilityname", setter: fld_set}]},
+ "faddr": {to:[{field: "rsa.network.faddr", setter: fld_set}]},
+ "fcatnum": {to:[{field: "rsa.misc.fcatnum", setter: fld_set}]},
+ "federated_idp": {to:[{field: "rsa.identity.federated_idp", setter: fld_set}]},
+ "federated_sp": {to:[{field: "rsa.identity.federated_sp", setter: fld_set}]},
+ "feed.category": {to:[{field: "rsa.internal.feed_category", setter: fld_set}]},
+ "feed_desc": {to:[{field: "rsa.internal.feed_desc", setter: fld_set}]},
+ "feed_name": {to:[{field: "rsa.internal.feed_name", setter: fld_set}]},
+ "fhost": {to:[{field: "rsa.network.fhost", setter: fld_set}]},
+ "file_entropy": {convert: to_double, to:[{field: "rsa.file.file_entropy", setter: fld_set}]},
+ "file_vendor": {to:[{field: "rsa.file.file_vendor", setter: fld_set}]},
+ "filename_dst": {to:[{field: "rsa.file.filename_dst", setter: fld_set}]},
+ "filename_src": {to:[{field: "rsa.file.filename_src", setter: fld_set}]},
+ "filename_tmp": {to:[{field: "rsa.file.filename_tmp", setter: fld_set}]},
+ "filesystem": {to:[{field: "rsa.file.filesystem", setter: fld_set}]},
+ "filter": {to:[{field: "rsa.misc.filter", setter: fld_set}]},
+ "finterface": {to:[{field: "rsa.misc.finterface", setter: fld_set}]},
+ "flags": {to:[{field: "rsa.misc.flags", setter: fld_set}]},
+ "forensic_info": {to:[{field: "rsa.misc.forensic_info", setter: fld_set}]},
+ "forward.ip": {convert: to_ip, to:[{field: "rsa.internal.forward_ip", setter: fld_set}]},
+ "forward.ipv6": {convert: to_ip, to:[{field: "rsa.internal.forward_ipv6", setter: fld_set}]},
+ "found": {to:[{field: "rsa.misc.found", setter: fld_set}]},
+ "fport": {to:[{field: "rsa.network.fport", setter: fld_set}]},
+ "fqdn": {to:[{field: "rsa.web.fqdn", setter: fld_set}]},
+ "fresult": {convert: to_long, to:[{field: "rsa.misc.fresult", setter: fld_set}]},
+ "from": {to:[{field: "rsa.email.email_src", setter: fld_set}]},
+ "gaddr": {to:[{field: "rsa.misc.gaddr", setter: fld_set}]},
+ "gateway": {to:[{field: "rsa.network.gateway", setter: fld_set}]},
+ "gmtdate": {to:[{field: "rsa.time.gmtdate", setter: fld_set}]},
+ "gmttime": {to:[{field: "rsa.time.gmttime", setter: fld_set}]},
+ "group": {to:[{field: "rsa.misc.group", setter: fld_set}]},
+ "group_object": {to:[{field: "rsa.misc.group_object", setter: fld_set}]},
+ "groupid": {to:[{field: "rsa.misc.group_id", setter: fld_set}]},
+ "h_code": {to:[{field: "rsa.internal.hcode", setter: fld_set}]},
+ "hardware_id": {to:[{field: "rsa.misc.hardware_id", setter: fld_set}]},
+ "header.id": {to:[{field: "rsa.internal.header_id", setter: fld_set}]},
+ "host.orig": {to:[{field: "rsa.network.host_orig", setter: fld_set}]},
+ "host.state": {to:[{field: "rsa.endpoint.host_state", setter: fld_set}]},
+ "host.type": {to:[{field: "rsa.network.host_type", setter: fld_set}]},
+ "host_role": {to:[{field: "rsa.identity.host_role", setter: fld_set}]},
+ "hostid": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "hostname": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "hour": {to:[{field: "rsa.time.hour", setter: fld_set}]},
+ "https.insact": {to:[{field: "rsa.crypto.https_insact", setter: fld_set}]},
+ "https.valid": {to:[{field: "rsa.crypto.https_valid", setter: fld_set}]},
+ "icmpcode": {convert: to_long, to:[{field: "rsa.network.icmp_code", setter: fld_set}]},
+ "icmptype": {convert: to_long, to:[{field: "rsa.network.icmp_type", setter: fld_set}]},
+ "id": {to:[{field: "rsa.misc.reference_id", setter: fld_set}]},
+ "id1": {to:[{field: "rsa.misc.reference_id1", setter: fld_set}]},
+ "id2": {to:[{field: "rsa.misc.reference_id2", setter: fld_set}]},
+ "id3": {to:[{field: "rsa.misc.id3", setter: fld_set}]},
+ "ike": {to:[{field: "rsa.crypto.ike", setter: fld_set}]},
+ "ike_cookie1": {to:[{field: "rsa.crypto.ike_cookie1", setter: fld_set}]},
+ "ike_cookie2": {to:[{field: "rsa.crypto.ike_cookie2", setter: fld_set}]},
+ "im_buddyid": {to:[{field: "rsa.misc.im_buddyid", setter: fld_set}]},
+ "im_buddyname": {to:[{field: "rsa.misc.im_buddyname", setter: fld_set}]},
+ "im_client": {to:[{field: "rsa.misc.im_client", setter: fld_set}]},
+ "im_croomid": {to:[{field: "rsa.misc.im_croomid", setter: fld_set}]},
+ "im_croomtype": {to:[{field: "rsa.misc.im_croomtype", setter: fld_set}]},
+ "im_members": {to:[{field: "rsa.misc.im_members", setter: fld_set}]},
+ "im_userid": {to:[{field: "rsa.misc.im_userid", setter: fld_set}]},
+ "im_username": {to:[{field: "rsa.misc.im_username", setter: fld_set}]},
+ "index": {to:[{field: "rsa.misc.index", setter: fld_set}]},
+ "info": {to:[{field: "rsa.db.index", setter: fld_set}]},
+ "inode": {convert: to_long, to:[{field: "rsa.internal.inode", setter: fld_set}]},
+ "inout": {to:[{field: "rsa.misc.inout", setter: fld_set}]},
+ "instance": {to:[{field: "rsa.db.instance", setter: fld_set}]},
+ "interface": {to:[{field: "rsa.network.interface", setter: fld_set}]},
+ "inv.category": {to:[{field: "rsa.investigations.inv_category", setter: fld_set}]},
+ "inv.context": {to:[{field: "rsa.investigations.inv_context", setter: fld_set}]},
+ "ioc": {to:[{field: "rsa.investigations.ioc", setter: fld_set}]},
+ "ip_proto": {convert: to_long, to:[{field: "rsa.network.ip_proto", setter: fld_set}]},
+ "ipkt": {to:[{field: "rsa.misc.ipkt", setter: fld_set}]},
+ "ipscat": {to:[{field: "rsa.misc.ipscat", setter: fld_set}]},
+ "ipspri": {to:[{field: "rsa.misc.ipspri", setter: fld_set}]},
+ "jobname": {to:[{field: "rsa.misc.jobname", setter: fld_set}]},
+ "jobnum": {to:[{field: "rsa.misc.job_num", setter: fld_set}]},
+ "laddr": {to:[{field: "rsa.network.laddr", setter: fld_set}]},
+ "language": {to:[{field: "rsa.misc.language", setter: fld_set}]},
+ "latitude": {to:[{field: "rsa.misc.latitude", setter: fld_set}]},
+ "lc.cid": {to:[{field: "rsa.internal.lc_cid", setter: fld_set}]},
+ "lc.ctime": {convert: to_date, to:[{field: "rsa.internal.lc_ctime", setter: fld_set}]},
+ "ldap": {to:[{field: "rsa.identity.ldap", setter: fld_set}]},
+ "ldap.query": {to:[{field: "rsa.identity.ldap_query", setter: fld_set}]},
+ "ldap.response": {to:[{field: "rsa.identity.ldap_response", setter: fld_set}]},
+ "level": {convert: to_long, to:[{field: "rsa.internal.level", setter: fld_set}]},
+ "lhost": {to:[{field: "rsa.network.lhost", setter: fld_set}]},
+ "library": {to:[{field: "rsa.misc.library", setter: fld_set}]},
+ "lifetime": {convert: to_long, to:[{field: "rsa.misc.lifetime", setter: fld_set}]},
+ "linenum": {to:[{field: "rsa.misc.linenum", setter: fld_set}]},
+ "link": {to:[{field: "rsa.misc.link", setter: fld_set}]},
+ "linterface": {to:[{field: "rsa.network.linterface", setter: fld_set}]},
+ "list_name": {to:[{field: "rsa.misc.list_name", setter: fld_set}]},
+ "listnum": {to:[{field: "rsa.misc.listnum", setter: fld_set}]},
+ "load_data": {to:[{field: "rsa.misc.load_data", setter: fld_set}]},
+ "location_floor": {to:[{field: "rsa.misc.location_floor", setter: fld_set}]},
+ "location_mark": {to:[{field: "rsa.misc.location_mark", setter: fld_set}]},
+ "log_id": {to:[{field: "rsa.misc.log_id", setter: fld_set}]},
+ "log_type": {to:[{field: "rsa.misc.log_type", setter: fld_set}]},
+ "logid": {to:[{field: "rsa.misc.logid", setter: fld_set}]},
+ "logip": {to:[{field: "rsa.misc.logip", setter: fld_set}]},
+ "logname": {to:[{field: "rsa.misc.logname", setter: fld_set}]},
+ "logon_type": {to:[{field: "rsa.identity.logon_type", setter: fld_set}]},
+ "logon_type_desc": {to:[{field: "rsa.identity.logon_type_desc", setter: fld_set}]},
+ "longitude": {to:[{field: "rsa.misc.longitude", setter: fld_set}]},
+ "lport": {to:[{field: "rsa.misc.lport", setter: fld_set}]},
+ "lread": {convert: to_long, to:[{field: "rsa.db.lread", setter: fld_set}]},
+ "lun": {to:[{field: "rsa.storage.lun", setter: fld_set}]},
+ "lwrite": {convert: to_long, to:[{field: "rsa.db.lwrite", setter: fld_set}]},
+ "macaddr": {convert: to_mac, to:[{field: "rsa.network.eth_host", setter: fld_set}]},
+ "mail_id": {to:[{field: "rsa.misc.mail_id", setter: fld_set}]},
+ "mask": {to:[{field: "rsa.network.mask", setter: fld_set}]},
+ "match": {to:[{field: "rsa.misc.match", setter: fld_set}]},
+ "mbug_data": {to:[{field: "rsa.misc.mbug_data", setter: fld_set}]},
+ "mcb.req": {convert: to_long, to:[{field: "rsa.internal.mcb_req", setter: fld_set}]},
+ "mcb.res": {convert: to_long, to:[{field: "rsa.internal.mcb_res", setter: fld_set}]},
+ "mcbc.req": {convert: to_long, to:[{field: "rsa.internal.mcbc_req", setter: fld_set}]},
+ "mcbc.res": {convert: to_long, to:[{field: "rsa.internal.mcbc_res", setter: fld_set}]},
+ "medium": {convert: to_long, to:[{field: "rsa.internal.medium", setter: fld_set}]},
+ "message": {to:[{field: "rsa.internal.message", setter: fld_set}]},
+ "message_body": {to:[{field: "rsa.misc.message_body", setter: fld_set}]},
+ "messageid": {to:[{field: "rsa.internal.messageid", setter: fld_set}]},
+ "min": {to:[{field: "rsa.time.min", setter: fld_set}]},
+ "misc": {to:[{field: "rsa.misc.misc", setter: fld_set}]},
+ "misc_name": {to:[{field: "rsa.misc.misc_name", setter: fld_set}]},
+ "mode": {to:[{field: "rsa.misc.mode", setter: fld_set}]},
+ "month": {to:[{field: "rsa.time.month", setter: fld_set}]},
+ "msg": {to:[{field: "rsa.internal.msg", setter: fld_set}]},
+ "msgIdPart1": {to:[{field: "rsa.misc.msgIdPart1", setter: fld_set}]},
+ "msgIdPart2": {to:[{field: "rsa.misc.msgIdPart2", setter: fld_set}]},
+ "msgIdPart3": {to:[{field: "rsa.misc.msgIdPart3", setter: fld_set}]},
+ "msgIdPart4": {to:[{field: "rsa.misc.msgIdPart4", setter: fld_set}]},
+ "msg_id": {to:[{field: "rsa.internal.msg_id", setter: fld_set}]},
+ "msg_type": {to:[{field: "rsa.misc.msg_type", setter: fld_set}]},
+ "msgid": {to:[{field: "rsa.misc.msgid", setter: fld_set}]},
+ "name": {to:[{field: "rsa.misc.name", setter: fld_set}]},
+ "netname": {to:[{field: "rsa.network.netname", setter: fld_set}]},
+ "netsessid": {to:[{field: "rsa.misc.netsessid", setter: fld_set}]},
+ "network_port": {convert: to_long, to:[{field: "rsa.network.network_port", setter: fld_set}]},
+ "network_service": {to:[{field: "rsa.network.network_service", setter: fld_set}]},
+ "node": {to:[{field: "rsa.misc.node", setter: fld_set}]},
+ "nodename": {to:[{field: "rsa.internal.node_name", setter: fld_set}]},
+ "ntype": {to:[{field: "rsa.misc.ntype", setter: fld_set}]},
+ "num": {to:[{field: "rsa.misc.num", setter: fld_set}]},
+ "number": {to:[{field: "rsa.misc.number", setter: fld_set}]},
+ "number1": {to:[{field: "rsa.misc.number1", setter: fld_set}]},
+ "number2": {to:[{field: "rsa.misc.number2", setter: fld_set}]},
+ "nwe.callback_id": {to:[{field: "rsa.internal.nwe_callback_id", setter: fld_set}]},
+ "nwwn": {to:[{field: "rsa.misc.nwwn", setter: fld_set}]},
+ "obj_id": {to:[{field: "rsa.internal.obj_id", setter: fld_set}]},
+ "obj_name": {to:[{field: "rsa.misc.obj_name", setter: fld_set}]},
+ "obj_server": {to:[{field: "rsa.internal.obj_server", setter: fld_set}]},
+ "obj_type": {to:[{field: "rsa.misc.obj_type", setter: fld_set}]},
+ "obj_value": {to:[{field: "rsa.internal.obj_val", setter: fld_set}]},
+ "object": {to:[{field: "rsa.misc.object", setter: fld_set}]},
+ "observed_val": {to:[{field: "rsa.misc.observed_val", setter: fld_set}]},
+ "operation": {to:[{field: "rsa.misc.operation", setter: fld_set}]},
+ "operation_id": {to:[{field: "rsa.misc.operation_id", setter: fld_set}]},
+ "opkt": {to:[{field: "rsa.misc.opkt", setter: fld_set}]},
+ "org.dst": {to:[{field: "rsa.physical.org_dst", setter: fld_prio, prio: 1}]},
+ "org.src": {to:[{field: "rsa.physical.org_src", setter: fld_set}]},
+ "org_dst": {to:[{field: "rsa.physical.org_dst", setter: fld_prio, prio: 0}]},
+ "orig_from": {to:[{field: "rsa.misc.orig_from", setter: fld_set}]},
+ "origin": {to:[{field: "rsa.network.origin", setter: fld_set}]},
+ "original_owner": {to:[{field: "rsa.identity.owner", setter: fld_set}]},
+ "os": {to:[{field: "rsa.misc.OS", setter: fld_set}]},
+ "owner_id": {to:[{field: "rsa.misc.owner_id", setter: fld_set}]},
+ "p_action": {to:[{field: "rsa.misc.p_action", setter: fld_set}]},
+ "p_date": {to:[{field: "rsa.time.p_date", setter: fld_set}]},
+ "p_filter": {to:[{field: "rsa.misc.p_filter", setter: fld_set}]},
+ "p_group_object": {to:[{field: "rsa.misc.p_group_object", setter: fld_set}]},
+ "p_id": {to:[{field: "rsa.misc.p_id", setter: fld_set}]},
+ "p_month": {to:[{field: "rsa.time.p_month", setter: fld_set}]},
+ "p_msgid": {to:[{field: "rsa.misc.p_msgid", setter: fld_set}]},
+ "p_msgid1": {to:[{field: "rsa.misc.p_msgid1", setter: fld_set}]},
+ "p_msgid2": {to:[{field: "rsa.misc.p_msgid2", setter: fld_set}]},
+ "p_result1": {to:[{field: "rsa.misc.p_result1", setter: fld_set}]},
+ "p_time": {to:[{field: "rsa.time.p_time", setter: fld_set}]},
+ "p_time1": {to:[{field: "rsa.time.p_time1", setter: fld_set}]},
+ "p_time2": {to:[{field: "rsa.time.p_time2", setter: fld_set}]},
+ "p_url": {to:[{field: "rsa.web.p_url", setter: fld_set}]},
+ "p_user_agent": {to:[{field: "rsa.web.p_user_agent", setter: fld_set}]},
+ "p_web_cookie": {to:[{field: "rsa.web.p_web_cookie", setter: fld_set}]},
+ "p_web_method": {to:[{field: "rsa.web.p_web_method", setter: fld_set}]},
+ "p_web_referer": {to:[{field: "rsa.web.p_web_referer", setter: fld_set}]},
+ "p_year": {to:[{field: "rsa.time.p_year", setter: fld_set}]},
+ "packet_length": {to:[{field: "rsa.network.packet_length", setter: fld_set}]},
+ "paddr": {convert: to_ip, to:[{field: "rsa.network.paddr", setter: fld_set}]},
+ "param": {to:[{field: "rsa.misc.param", setter: fld_set}]},
+ "param.dst": {to:[{field: "rsa.misc.param_dst", setter: fld_set}]},
+ "param.src": {to:[{field: "rsa.misc.param_src", setter: fld_set}]},
+ "parent_node": {to:[{field: "rsa.misc.parent_node", setter: fld_set}]},
+ "parse.error": {to:[{field: "rsa.internal.parse_error", setter: fld_set}]},
+ "password": {to:[{field: "rsa.identity.password", setter: fld_set}]},
+ "password_chg": {to:[{field: "rsa.misc.password_chg", setter: fld_set}]},
+ "password_expire": {to:[{field: "rsa.misc.password_expire", setter: fld_set}]},
+ "patient_fname": {to:[{field: "rsa.healthcare.patient_fname", setter: fld_set}]},
+ "patient_id": {to:[{field: "rsa.healthcare.patient_id", setter: fld_set}]},
+ "patient_lname": {to:[{field: "rsa.healthcare.patient_lname", setter: fld_set}]},
+ "patient_mname": {to:[{field: "rsa.healthcare.patient_mname", setter: fld_set}]},
+ "payload.req": {convert: to_long, to:[{field: "rsa.internal.payload_req", setter: fld_set}]},
+ "payload.res": {convert: to_long, to:[{field: "rsa.internal.payload_res", setter: fld_set}]},
+ "peer": {to:[{field: "rsa.crypto.peer", setter: fld_set}]},
+ "peer_id": {to:[{field: "rsa.crypto.peer_id", setter: fld_set}]},
+ "permgranted": {to:[{field: "rsa.misc.permgranted", setter: fld_set}]},
+ "permissions": {to:[{field: "rsa.db.permissions", setter: fld_set}]},
+ "permwanted": {to:[{field: "rsa.misc.permwanted", setter: fld_set}]},
+ "pgid": {to:[{field: "rsa.misc.pgid", setter: fld_set}]},
+ "phone_number": {to:[{field: "rsa.misc.phone", setter: fld_prio, prio: 2}]},
+ "phost": {to:[{field: "rsa.network.phost", setter: fld_set}]},
+ "pid": {to:[{field: "rsa.misc.pid", setter: fld_set}]},
+ "policy": {to:[{field: "rsa.misc.policy", setter: fld_set}]},
+ "policyUUID": {to:[{field: "rsa.misc.policyUUID", setter: fld_set}]},
+ "policy_id": {to:[{field: "rsa.misc.policy_id", setter: fld_set}]},
+ "policy_value": {to:[{field: "rsa.misc.policy_value", setter: fld_set}]},
+ "policy_waiver": {to:[{field: "rsa.misc.policy_waiver", setter: fld_set}]},
+ "policyname": {to:[{field: "rsa.misc.policy_name", setter: fld_prio, prio: 0}]},
+ "pool_id": {to:[{field: "rsa.misc.pool_id", setter: fld_set}]},
+ "pool_name": {to:[{field: "rsa.misc.pool_name", setter: fld_set}]},
+ "port": {convert: to_long, to:[{field: "rsa.network.port", setter: fld_set}]},
+ "portname": {to:[{field: "rsa.misc.port_name", setter: fld_set}]},
+ "pread": {convert: to_long, to:[{field: "rsa.db.pread", setter: fld_set}]},
+ "priority": {to:[{field: "rsa.misc.priority", setter: fld_set}]},
+ "privilege": {to:[{field: "rsa.file.privilege", setter: fld_set}]},
+ "process.vid.dst": {to:[{field: "rsa.internal.process_vid_dst", setter: fld_set}]},
+ "process.vid.src": {to:[{field: "rsa.internal.process_vid_src", setter: fld_set}]},
+ "process_id_val": {to:[{field: "rsa.misc.process_id_val", setter: fld_set}]},
+ "processing_time": {to:[{field: "rsa.time.process_time", setter: fld_set}]},
+ "profile": {to:[{field: "rsa.identity.profile", setter: fld_set}]},
+ "prog_asp_num": {to:[{field: "rsa.misc.prog_asp_num", setter: fld_set}]},
+ "program": {to:[{field: "rsa.misc.program", setter: fld_set}]},
+ "protocol_detail": {to:[{field: "rsa.network.protocol_detail", setter: fld_set}]},
+ "pwwn": {to:[{field: "rsa.storage.pwwn", setter: fld_set}]},
+ "r_hostid": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "real_data": {to:[{field: "rsa.misc.real_data", setter: fld_set}]},
+ "realm": {to:[{field: "rsa.identity.realm", setter: fld_set}]},
+ "reason": {to:[{field: "rsa.misc.reason", setter: fld_set}]},
+ "rec_asp_device": {to:[{field: "rsa.misc.rec_asp_device", setter: fld_set}]},
+ "rec_asp_num": {to:[{field: "rsa.misc.rec_asp_num", setter: fld_set}]},
+ "rec_library": {to:[{field: "rsa.misc.rec_library", setter: fld_set}]},
+ "recorded_time": {convert: to_date, to:[{field: "rsa.time.recorded_time", setter: fld_set}]},
+ "recordnum": {to:[{field: "rsa.misc.recordnum", setter: fld_set}]},
+ "registry.key": {to:[{field: "rsa.endpoint.registry_key", setter: fld_set}]},
+ "registry.value": {to:[{field: "rsa.endpoint.registry_value", setter: fld_set}]},
+ "remote_domain": {to:[{field: "rsa.web.remote_domain", setter: fld_set}]},
+ "remote_domain_id": {to:[{field: "rsa.network.remote_domain_id", setter: fld_set}]},
+ "reputation_num": {convert: to_double, to:[{field: "rsa.web.reputation_num", setter: fld_set}]},
+ "resource": {to:[{field: "rsa.internal.resource", setter: fld_set}]},
+ "resource_class": {to:[{field: "rsa.internal.resource_class", setter: fld_set}]},
+ "result": {to:[{field: "rsa.misc.result", setter: fld_set}]},
+ "result_code": {to:[{field: "rsa.misc.result_code", setter: fld_prio, prio: 1}]},
+ "resultcode": {to:[{field: "rsa.misc.result_code", setter: fld_prio, prio: 0}]},
+ "rid": {convert: to_long, to:[{field: "rsa.internal.rid", setter: fld_set}]},
+ "risk": {to:[{field: "rsa.misc.risk", setter: fld_set}]},
+ "risk_info": {to:[{field: "rsa.misc.risk_info", setter: fld_set}]},
+ "risk_num": {convert: to_double, to:[{field: "rsa.misc.risk_num", setter: fld_set}]},
+ "risk_num_comm": {convert: to_double, to:[{field: "rsa.misc.risk_num_comm", setter: fld_set}]},
+ "risk_num_next": {convert: to_double, to:[{field: "rsa.misc.risk_num_next", setter: fld_set}]},
+ "risk_num_sand": {convert: to_double, to:[{field: "rsa.misc.risk_num_sand", setter: fld_set}]},
+ "risk_num_static": {convert: to_double, to:[{field: "rsa.misc.risk_num_static", setter: fld_set}]},
+ "risk_suspicious": {to:[{field: "rsa.misc.risk_suspicious", setter: fld_set}]},
+ "risk_warning": {to:[{field: "rsa.misc.risk_warning", setter: fld_set}]},
+ "rpayload": {to:[{field: "rsa.network.rpayload", setter: fld_set}]},
+ "ruid": {to:[{field: "rsa.misc.ruid", setter: fld_set}]},
+ "rule": {to:[{field: "rsa.misc.rule", setter: fld_set}]},
+ "rule_group": {to:[{field: "rsa.misc.rule_group", setter: fld_set}]},
+ "rule_template": {to:[{field: "rsa.misc.rule_template", setter: fld_set}]},
+ "rule_uid": {to:[{field: "rsa.misc.rule_uid", setter: fld_set}]},
+ "rulename": {to:[{field: "rsa.misc.rule_name", setter: fld_set}]},
+ "s_certauth": {to:[{field: "rsa.crypto.s_certauth", setter: fld_set}]},
+ "s_cipher": {to:[{field: "rsa.crypto.cipher_src", setter: fld_set}]},
+ "s_ciphersize": {convert: to_long, to:[{field: "rsa.crypto.cipher_size_src", setter: fld_set}]},
+ "s_context": {to:[{field: "rsa.misc.context_subject", setter: fld_set}]},
+ "s_sslver": {to:[{field: "rsa.crypto.ssl_ver_src", setter: fld_set}]},
+ "sburb": {to:[{field: "rsa.misc.sburb", setter: fld_set}]},
+ "scheme": {to:[{field: "rsa.crypto.scheme", setter: fld_set}]},
+ "sdomain_fld": {to:[{field: "rsa.misc.sdomain_fld", setter: fld_set}]},
+ "search.text": {to:[{field: "rsa.misc.search_text", setter: fld_set}]},
+ "sec": {to:[{field: "rsa.misc.sec", setter: fld_set}]},
+ "second": {to:[{field: "rsa.misc.second", setter: fld_set}]},
+ "sensor": {to:[{field: "rsa.misc.sensor", setter: fld_set}]},
+ "sensorname": {to:[{field: "rsa.misc.sensorname", setter: fld_set}]},
+ "seqnum": {to:[{field: "rsa.misc.seqnum", setter: fld_set}]},
+ "serial_number": {to:[{field: "rsa.misc.serial_number", setter: fld_set}]},
+ "service.account": {to:[{field: "rsa.identity.service_account", setter: fld_set}]},
+ "session": {to:[{field: "rsa.misc.session", setter: fld_set}]},
+ "session.split": {to:[{field: "rsa.internal.session_split", setter: fld_set}]},
+ "sessionid": {to:[{field: "rsa.misc.log_session_id", setter: fld_set}]},
+ "sessionid1": {to:[{field: "rsa.misc.log_session_id1", setter: fld_set}]},
+ "sessiontype": {to:[{field: "rsa.misc.sessiontype", setter: fld_set}]},
+ "severity": {to:[{field: "rsa.misc.severity", setter: fld_set}]},
+ "sid": {to:[{field: "rsa.identity.user_sid_dst", setter: fld_set}]},
+ "sig.name": {to:[{field: "rsa.misc.sig_name", setter: fld_set}]},
+ "sigUUID": {to:[{field: "rsa.misc.sigUUID", setter: fld_set}]},
+ "sigcat": {to:[{field: "rsa.misc.sigcat", setter: fld_set}]},
+ "sigid": {convert: to_long, to:[{field: "rsa.misc.sig_id", setter: fld_set}]},
+ "sigid1": {convert: to_long, to:[{field: "rsa.misc.sig_id1", setter: fld_set}]},
+ "sigid_string": {to:[{field: "rsa.misc.sig_id_str", setter: fld_set}]},
+ "signame": {to:[{field: "rsa.misc.policy_name", setter: fld_prio, prio: 1}]},
+ "sigtype": {to:[{field: "rsa.crypto.sig_type", setter: fld_set}]},
+ "sinterface": {to:[{field: "rsa.network.sinterface", setter: fld_set}]},
+ "site": {to:[{field: "rsa.internal.site", setter: fld_set}]},
+ "size": {convert: to_long, to:[{field: "rsa.internal.size", setter: fld_set}]},
+ "smask": {to:[{field: "rsa.network.smask", setter: fld_set}]},
+ "snmp.oid": {to:[{field: "rsa.misc.snmp_oid", setter: fld_set}]},
+ "snmp.value": {to:[{field: "rsa.misc.snmp_value", setter: fld_set}]},
+ "sourcefile": {to:[{field: "rsa.internal.sourcefile", setter: fld_set}]},
+ "space": {to:[{field: "rsa.misc.space", setter: fld_set}]},
+ "space1": {to:[{field: "rsa.misc.space1", setter: fld_set}]},
+ "spi": {to:[{field: "rsa.misc.spi", setter: fld_set}]},
+ "sql": {to:[{field: "rsa.misc.sql", setter: fld_set}]},
+ "src_dn": {to:[{field: "rsa.identity.dn_src", setter: fld_set}]},
+ "src_payload": {to:[{field: "rsa.misc.payload_src", setter: fld_set}]},
+ "src_spi": {to:[{field: "rsa.misc.spi_src", setter: fld_set}]},
+ "src_zone": {to:[{field: "rsa.network.zone_src", setter: fld_set}]},
+ "srcburb": {to:[{field: "rsa.misc.srcburb", setter: fld_set}]},
+ "srcdom": {to:[{field: "rsa.misc.srcdom", setter: fld_set}]},
+ "srcservice": {to:[{field: "rsa.misc.srcservice", setter: fld_set}]},
+ "ssid": {to:[{field: "rsa.wireless.wlan_ssid", setter: fld_prio, prio: 0}]},
+ "stamp": {convert: to_date, to:[{field: "rsa.time.stamp", setter: fld_set}]},
+ "starttime": {convert: to_date, to:[{field: "rsa.time.starttime", setter: fld_set}]},
+ "state": {to:[{field: "rsa.misc.state", setter: fld_set}]},
+ "statement": {to:[{field: "rsa.internal.statement", setter: fld_set}]},
+ "status": {to:[{field: "rsa.misc.status", setter: fld_set}]},
+ "status1": {to:[{field: "rsa.misc.status1", setter: fld_set}]},
+ "streams": {convert: to_long, to:[{field: "rsa.misc.streams", setter: fld_set}]},
+ "subcategory": {to:[{field: "rsa.misc.subcategory", setter: fld_set}]},
+ "subject": {to:[{field: "rsa.email.subject", setter: fld_set}]},
+ "svcno": {to:[{field: "rsa.misc.svcno", setter: fld_set}]},
+ "system": {to:[{field: "rsa.misc.system", setter: fld_set}]},
+ "t_context": {to:[{field: "rsa.misc.context_target", setter: fld_set}]},
+ "task_name": {to:[{field: "rsa.file.task_name", setter: fld_set}]},
+ "tbdstr1": {to:[{field: "rsa.misc.tbdstr1", setter: fld_set}]},
+ "tbdstr2": {to:[{field: "rsa.misc.tbdstr2", setter: fld_set}]},
+ "tbl_name": {to:[{field: "rsa.db.table_name", setter: fld_set}]},
+ "tcp_flags": {convert: to_long, to:[{field: "rsa.misc.tcp_flags", setter: fld_set}]},
+ "terminal": {to:[{field: "rsa.misc.terminal", setter: fld_set}]},
+ "tgtdom": {to:[{field: "rsa.misc.tgtdom", setter: fld_set}]},
+ "tgtdomain": {to:[{field: "rsa.misc.tgtdomain", setter: fld_set}]},
+ "threat_name": {to:[{field: "rsa.threat.threat_category", setter: fld_set}]},
+ "threat_source": {to:[{field: "rsa.threat.threat_source", setter: fld_set}]},
+ "threat_val": {to:[{field: "rsa.threat.threat_desc", setter: fld_set}]},
+ "threshold": {to:[{field: "rsa.misc.threshold", setter: fld_set}]},
+ "time": {convert: to_date, to:[{field: "rsa.internal.time", setter: fld_set}]},
+ "timestamp": {to:[{field: "rsa.time.timestamp", setter: fld_set}]},
+ "timezone": {to:[{field: "rsa.time.timezone", setter: fld_set}]},
+ "to": {to:[{field: "rsa.email.email_dst", setter: fld_set}]},
+ "tos": {convert: to_long, to:[{field: "rsa.misc.tos", setter: fld_set}]},
+ "trans_from": {to:[{field: "rsa.email.trans_from", setter: fld_set}]},
+ "trans_id": {to:[{field: "rsa.db.transact_id", setter: fld_set}]},
+ "trans_to": {to:[{field: "rsa.email.trans_to", setter: fld_set}]},
+ "trigger_desc": {to:[{field: "rsa.misc.trigger_desc", setter: fld_set}]},
+ "trigger_val": {to:[{field: "rsa.misc.trigger_val", setter: fld_set}]},
+ "type": {to:[{field: "rsa.misc.type", setter: fld_set}]},
+ "type1": {to:[{field: "rsa.misc.type1", setter: fld_set}]},
+ "tzone": {to:[{field: "rsa.time.tzone", setter: fld_set}]},
+ "ubc.req": {convert: to_long, to:[{field: "rsa.internal.ubc_req", setter: fld_set}]},
+ "ubc.res": {convert: to_long, to:[{field: "rsa.internal.ubc_res", setter: fld_set}]},
+ "udb_class": {to:[{field: "rsa.misc.udb_class", setter: fld_set}]},
+ "url_fld": {to:[{field: "rsa.misc.url_fld", setter: fld_set}]},
+ "urlpage": {to:[{field: "rsa.web.urlpage", setter: fld_set}]},
+ "urlroot": {to:[{field: "rsa.web.urlroot", setter: fld_set}]},
+ "user_address": {to:[{field: "rsa.email.email", setter: fld_append}]},
+ "user_dept": {to:[{field: "rsa.identity.user_dept", setter: fld_set}]},
+ "user_div": {to:[{field: "rsa.misc.user_div", setter: fld_set}]},
+ "user_fname": {to:[{field: "rsa.identity.firstname", setter: fld_set}]},
+ "user_lname": {to:[{field: "rsa.identity.lastname", setter: fld_set}]},
+ "user_mname": {to:[{field: "rsa.identity.middlename", setter: fld_set}]},
+ "user_org": {to:[{field: "rsa.identity.org", setter: fld_set}]},
+ "user_role": {to:[{field: "rsa.identity.user_role", setter: fld_set}]},
+ "userid": {to:[{field: "rsa.misc.userid", setter: fld_set}]},
+ "username_fld": {to:[{field: "rsa.misc.username_fld", setter: fld_set}]},
+ "utcstamp": {to:[{field: "rsa.misc.utcstamp", setter: fld_set}]},
+ "v_instafname": {to:[{field: "rsa.misc.v_instafname", setter: fld_set}]},
+ "vendor_event_cat": {to:[{field: "rsa.investigations.event_vcat", setter: fld_set}]},
+ "version": {to:[{field: "rsa.misc.version", setter: fld_set}]},
+ "vid": {to:[{field: "rsa.internal.msg_vid", setter: fld_set}]},
+ "virt_data": {to:[{field: "rsa.misc.virt_data", setter: fld_set}]},
+ "virusname": {to:[{field: "rsa.misc.virusname", setter: fld_set}]},
+ "vlan": {convert: to_long, to:[{field: "rsa.network.vlan", setter: fld_set}]},
+ "vlan.name": {to:[{field: "rsa.network.vlan_name", setter: fld_set}]},
+ "vm_target": {to:[{field: "rsa.misc.vm_target", setter: fld_set}]},
+ "vpnid": {to:[{field: "rsa.misc.vpnid", setter: fld_set}]},
+ "vsys": {to:[{field: "rsa.misc.vsys", setter: fld_set}]},
+ "vuln_ref": {to:[{field: "rsa.misc.vuln_ref", setter: fld_set}]},
+ "web_cookie": {to:[{field: "rsa.web.web_cookie", setter: fld_set}]},
+ "web_extension_tmp": {to:[{field: "rsa.web.web_extension_tmp", setter: fld_set}]},
+ "web_host": {to:[{field: "rsa.web.alias_host", setter: fld_set}]},
+ "web_method": {to:[{field: "rsa.misc.action", setter: fld_append}]},
+ "web_page": {to:[{field: "rsa.web.web_page", setter: fld_set}]},
+ "web_ref_domain": {to:[{field: "rsa.web.web_ref_domain", setter: fld_set}]},
+ "web_ref_host": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "web_ref_page": {to:[{field: "rsa.web.web_ref_page", setter: fld_set}]},
+ "web_ref_query": {to:[{field: "rsa.web.web_ref_query", setter: fld_set}]},
+ "web_ref_root": {to:[{field: "rsa.web.web_ref_root", setter: fld_set}]},
+ "wifi_channel": {convert: to_long, to:[{field: "rsa.wireless.wlan_channel", setter: fld_set}]},
+ "wlan": {to:[{field: "rsa.wireless.wlan_name", setter: fld_set}]},
+ "word": {to:[{field: "rsa.internal.word", setter: fld_set}]},
+ "workspace_desc": {to:[{field: "rsa.misc.workspace", setter: fld_set}]},
+ "workstation": {to:[{field: "rsa.network.alias_host", setter: fld_append}]},
+ "year": {to:[{field: "rsa.time.year", setter: fld_set}]},
+ "zone": {to:[{field: "rsa.network.zone", setter: fld_set}]},
+ };
+
+ function to_date(value) {
+ switch (typeof (value)) {
+ case "object":
+ // This is a Date. But as it was obtained from evt.Get(), the VM
+ // doesn't see it as a JS Date anymore, thus value instanceof Date === false.
+ // Have to trust that any object here is a valid Date for Go.
+ return value;
+ case "string":
+ var asDate = new Date(value);
+ if (!isNaN(asDate)) return asDate;
+ }
+ }
+
+ // ECMAScript 5.1 doesn't have Object.MAX_SAFE_INTEGER / Object.MIN_SAFE_INTEGER.
+ var maxSafeInt = Math.pow(2, 53) - 1;
+ var minSafeInt = -maxSafeInt;
+
+ function to_long(value) {
+ var num = parseInt(value);
+ // Better not to index a number if it's not safe (above 53 bits).
+ return !isNaN(num) && minSafeInt <= num && num <= maxSafeInt ? num : undefined;
+ }
+
+ function to_ip(value) {
+ if (value.indexOf(":") === -1)
+ return to_ipv4(value);
+ return to_ipv6(value);
+ }
+
+ var ipv4_regex = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
+ var ipv6_hex_regex = /^[0-9A-Fa-f]{1,4}$/;
+
+ function to_ipv4(value) {
+ var result = ipv4_regex.exec(value);
+ if (result == null || result.length !== 5) return;
+ for (var i = 1; i < 5; i++) {
+ var num = strictToInt(result[i]);
+ if (isNaN(num) || num < 0 || num > 255) return;
+ }
+ return value;
+ }
+
+ function to_ipv6(value) {
+ var sqEnd = value.indexOf("]");
+ if (sqEnd > -1) {
+ if (value.charAt(0) !== "[") return;
+ value = value.substr(1, sqEnd - 1);
+ }
+ var zoneOffset = value.indexOf("%");
+ if (zoneOffset > -1) {
+ value = value.substr(0, zoneOffset);
+ }
+ var parts = value.split(":");
+ if (parts == null || parts.length < 3 || parts.length > 8) return;
+ var numEmpty = 0;
+ var innerEmpty = 0;
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i].length === 0) {
+ numEmpty++;
+ if (i > 0 && i + 1 < parts.length) innerEmpty++;
+ } else if (!parts[i].match(ipv6_hex_regex) &&
+ // Accept an IPv6 with a valid IPv4 at the end.
+ ((i + 1 < parts.length) || !to_ipv4(parts[i]))) {
+ return;
+ }
+ }
+ return innerEmpty === 0 && parts.length === 8 || innerEmpty === 1 ? value : undefined;
+ }
+
+ function to_double(value) {
+ return parseFloat(value);
+ }
+
+ function to_mac(value) {
+ // ES doesn't have a mac datatype so it's safe to ingest whatever was captured.
+ return value;
+ }
+
+ function to_lowercase(value) {
+ // to_lowercase is used against keyword fields, which can accept
+ // any other type (numbers, dates).
+ return typeof(value) === "string"? value.toLowerCase() : value;
+ }
+
+ function fld_set(dst, value) {
+ dst[this.field] = { v: value };
+ }
+
+ function fld_append(dst, value) {
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: [value] };
+ } else {
+ var base = dst[this.field];
+ if (base.v.indexOf(value)===-1) base.v.push(value);
+ }
+ }
+
+ function fld_prio(dst, value) {
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: value, prio: this.prio};
+ } else if(this.prio < dst[this.field].prio) {
+ dst[this.field].v = value;
+ dst[this.field].prio = this.prio;
+ }
+ }
+
+ var valid_ecs_outcome = {
+ 'failure': true,
+ 'success': true,
+ 'unknown': true
+ };
+
+ function fld_ecs_outcome(dst, value) {
+ value = value.toLowerCase();
+ if (valid_ecs_outcome[value] === undefined) {
+ value = 'unknown';
+ }
+ if (dst[this.field] === undefined) {
+ dst[this.field] = { v: value };
+ } else if (dst[this.field].v === 'unknown') {
+ dst[this.field] = { v: value };
+ }
+ }
+
+ function map_all(evt, targets, value) {
+ for (var i = 0; i < targets.length; i++) {
+ evt.Put(targets[i], value);
+ }
+ }
+
+ function populate_fields(evt) {
+ var base = evt.Get(FIELDS_OBJECT);
+ if (base === null) return;
+ alternate_datetime(evt);
+ if (map_ecs) {
+ do_populate(evt, base, ecs_mappings);
+ }
+ if (map_rsa) {
+ do_populate(evt, base, rsa_mappings);
+ }
+ if (keep_raw) {
+ evt.Put("rsa.raw", base);
+ }
+ evt.Delete(FIELDS_OBJECT);
+ }
+
+ var datetime_alt_components = [
+ {field: "day", fmts: [[dF]]},
+ {field: "year", fmts: [[dW]]},
+ {field: "month", fmts: [[dB],[dG]]},
+ {field: "date", fmts: [[dW,dSkip,dG,dSkip,dF],[dW,dSkip,dB,dSkip,dF],[dW,dSkip,dR,dSkip,dF]]},
+ {field: "hour", fmts: [[dN]]},
+ {field: "min", fmts: [[dU]]},
+ {field: "secs", fmts: [[dO]]},
+ {field: "time", fmts: [[dN, dSkip, dU, dSkip, dO]]},
+ ];
+
+ function alternate_datetime(evt) {
+ if (evt.Get(FIELDS_PREFIX + "event_time") != null) {
+ return;
+ }
+ var tzOffset = tz_offset;
+ if (tzOffset === "event") {
+ tzOffset = evt.Get("event.timezone");
+ }
+ var container = new DateContainer(tzOffset);
+ for (var i=0; i} ZSCALERNSS: time=%{hfld2->} %{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hyear}^^timezone=%{timezone}^^%{payload}", processor_chain([
+ setc("header_id","0001"),
+ setc("messageid","ZSCALERNSS_1"),
+ ]));
+
+ var select1 = linear_select([
+ hdr1,
+ ]);
+
+ var part1 = match("MESSAGE#0:ZSCALERNSS_1", "nwparser.payload", "action=%{action}^^reason=%{result}^^hostname=%{hostname}^^protocol=%{protocol}^^serverip=%{daddr}^^url=%{url}^^urlcategory=%{filter}^^urlclass=%{info}^^dlpdictionaries=%{fld3}^^dlpengine=%{fld4}^^filetype=%{filetype}^^threatcategory=%{category}^^threatclass=%{vendor_event_cat}^^pagerisk=%{fld8}^^threatname=%{threat_name}^^clientpublicIP=%{fld9}^^ClientIP=%{saddr}^^location=%{fld11}^^refererURL=%{web_referer}^^useragent=%{user_agent}^^department=%{user_dept}^^user=%{username}^^event_id=%{id}^^clienttranstime=%{fld17}^^requestmethod=%{web_method}^^requestsize=%{sbytes}^^requestversion=%{fld20}^^status=%{resultcode}^^responsesize=%{rbytes}^^responseversion=%{fld23}^^transactionsize=%{bytes}", processor_chain([
+ setc("eventcategory","1605000000"),
+ setf("fqdn","hostname"),
+ setf("msg","$MSG"),
+ date_time({
+ dest: "event_time",
+ args: ["hmonth","hday","hyear","hhour","hmin","hsec"],
+ fmts: [
+ [dB,dF,dW,dN,dU,dO],
+ ],
+ }),
+ lookup({
+ dest: "nwparser.ec_activity",
+ map: map_getEventCategoryActivity,
+ key: field("action"),
+ }),
+ setc("ec_theme","Communication"),
+ setc("ec_subject","User"),
+ ]));
+
+ var msg1 = msg("ZSCALERNSS_1", part1);
+
+ var chain1 = processor_chain([
+ select1,
+ msgid_select({
+ "ZSCALERNSS_1": msg1,
+ }),
+ ]);
+
+- community_id:
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: dns.question.name
+ target_field: dns.question.registered_domain
+ target_subdomain_field: dns.question.subdomain
+ target_etld_field: dns.question.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: client.domain
+ target_field: client.registered_domain
+ target_subdomain_field: client.subdomain
+ target_etld_field: client.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: server.domain
+ target_field: server.registered_domain
+ target_subdomain_field: server.subdomain
+ target_etld_field: server.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: destination.domain
+ target_field: destination.registered_domain
+ target_subdomain_field: destination.subdomain
+ target_etld_field: destination.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: source.domain
+ target_field: source.registered_domain
+ target_subdomain_field: source.subdomain
+ target_etld_field: source.top_level_domain
+- registered_domain:
+ ignore_missing: true
+ ignore_failure: true
+ field: url.domain
+ target_field: url.registered_domain
+ target_subdomain_field: url.subdomain
+ target_etld_field: url.top_level_domain
+- add_locale: ~
diff --git a/packages/zscaler/0.5.1/data_stream/zia/elasticsearch/ingest_pipeline/default.yml b/packages/zscaler/0.5.1/data_stream/zia/elasticsearch/ingest_pipeline/default.yml
new file mode 100755
index 0000000000..520eb80c75
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/elasticsearch/ingest_pipeline/default.yml
@@ -0,0 +1,72 @@
+---
+description: Pipeline for Zscaler NSS
+
+processors:
+ # ECS event.ingested
+ - set:
+ field: event.ingested
+ value: '{{_ingest.timestamp}}'
+ - set:
+ field: ecs.version
+ value: '8.0.0'
+ # User agent
+ - user_agent:
+ field: user_agent.original
+ ignore_missing: true
+ # IP Geolocation Lookup
+ - geoip:
+ field: source.ip
+ target_field: source.geo
+ ignore_missing: true
+ - geoip:
+ field: destination.ip
+ target_field: destination.geo
+ ignore_missing: true
+
+ # IP Autonomous System (AS) Lookup
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: source.ip
+ target_field: source.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - geoip:
+ database_file: GeoLite2-ASN.mmdb
+ field: destination.ip
+ target_field: destination.as
+ properties:
+ - asn
+ - organization_name
+ ignore_missing: true
+ - rename:
+ field: source.as.asn
+ target_field: source.as.number
+ ignore_missing: true
+ - rename:
+ field: source.as.organization_name
+ target_field: source.as.organization.name
+ ignore_missing: true
+ - rename:
+ field: destination.as.asn
+ target_field: destination.as.number
+ ignore_missing: true
+ - rename:
+ field: destination.as.organization_name
+ target_field: destination.as.organization.name
+ ignore_missing: true
+ - append:
+ field: related.hosts
+ value: '{{host.name}}'
+ allow_duplicates: false
+ if: ctx.host?.name != null && ctx.host?.name != ''
+ - remove:
+ field: event.original
+ if: "ctx?.tags == null || !(ctx.tags.contains('preserve_original_event'))"
+ ignore_failure: true
+ ignore_missing: true
+on_failure:
+ - append:
+ field: error.message
+ value: "{{ _ingest.on_failure_message }}"
diff --git a/packages/zscaler/0.5.1/data_stream/zia/fields/base-fields.yml b/packages/zscaler/0.5.1/data_stream/zia/fields/base-fields.yml
new file mode 100755
index 0000000000..9a64f92d5b
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/fields/base-fields.yml
@@ -0,0 +1,46 @@
+- name: data_stream.type
+ type: constant_keyword
+ description: Data stream type.
+- name: data_stream.dataset
+ type: constant_keyword
+ description: Data stream dataset.
+- name: data_stream.namespace
+ type: constant_keyword
+ description: Data stream namespace.
+- name: event.module
+ type: constant_keyword
+ description: Event module
+ value: zscaler
+- name: event.dataset
+ type: constant_keyword
+ description: Event dataset
+ value: zscaler.zia
+- name: '@timestamp'
+ type: date
+ description: Event timestamp.
+- name: container.id
+ description: Unique container id.
+ ignore_above: 1024
+ type: keyword
+- name: input.type
+ description: Type of Filebeat input.
+ type: keyword
+- name: log.file.path
+ description: Full path to the log file this event came from.
+ example: /var/log/fun-times.log
+ ignore_above: 1024
+ type: keyword
+- name: log.source.address
+ description: Source address from which the log event was read / sent from.
+ type: keyword
+- name: log.flags
+ description: Flags for the log file.
+ type: keyword
+- name: log.offset
+ description: Offset of the entry in the log file.
+ type: long
+- name: tags
+ description: List of keywords used to tag each event.
+ example: '["production", "env2"]'
+ ignore_above: 1024
+ type: keyword
diff --git a/packages/zscaler/0.5.1/data_stream/zia/fields/ecs.yml b/packages/zscaler/0.5.1/data_stream/zia/fields/ecs.yml
new file mode 100755
index 0000000000..41eb38d57d
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/fields/ecs.yml
@@ -0,0 +1,539 @@
+- description: |-
+ Date/time when the event originated.
+ This is the date/time extracted from the event, typically representing when the event was generated by the source.
+ If the event source has no original timestamp, this value is typically populated by the first time the event was received by the pipeline.
+ Required field for all events.
+ name: '@timestamp'
+ type: date
+- description: |-
+ The domain name of the client system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: client.domain
+ type: keyword
+- description: |-
+ The highest registered client domain, stripped of the subdomain.
+ For example, the registered domain for "foo.example.com" is "example.com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk".
+ name: client.registered_domain
+ type: keyword
+- description: |-
+ The subdomain portion of a fully qualified domain name includes all of the names except the host name under the registered_domain. In a partially qualified domain, or if the the qualification level of the full name cannot be determined, subdomain contains all of the names below the registered domain.
+ For example the subdomain portion of "www.east.mydomain.co.uk" is "east". If the domain has multiple levels of subdomain, such as "sub2.sub1.example.com", the subdomain field should contain "sub2.sub1", with no trailing period.
+ name: client.subdomain
+ type: keyword
+- description: |-
+ The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk".
+ name: client.top_level_domain
+ type: keyword
+- description: |-
+ Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: destination.address
+ type: keyword
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: destination.as.number
+ type: long
+- description: Organization name.
+ name: destination.as.organization.name
+ type: keyword
+- description: Bytes sent from the destination to the source.
+ name: destination.bytes
+ type: long
+- description: |-
+ The domain name of the destination system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: destination.domain
+ type: keyword
+- description: City name.
+ name: destination.geo.city_name
+ type: keyword
+- description: Country name.
+ name: destination.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: destination.geo.location
+ type: geo_point
+- description: IP address of the destination (IPv4 or IPv6).
+ name: destination.ip
+ type: ip
+- description: |-
+ MAC address of the destination.
+ The notation format from RFC 7042 is suggested: Each octet (that is, 8-bit byte) is represented by two [uppercase] hexadecimal digits giving the value of the octet as an unsigned integer. Successive octets are separated by a hyphen.
+ name: destination.mac
+ type: keyword
+- description: |-
+ Translated ip of destination based NAT sessions (e.g. internet to private DMZ)
+ Typically used with load balancers, firewalls, or routers.
+ name: destination.nat.ip
+ type: ip
+- description: |-
+ Port the source session is translated to by NAT Device.
+ Typically used with load balancers, firewalls, or routers.
+ name: destination.nat.port
+ type: long
+- description: Port of the destination.
+ name: destination.port
+ type: long
+- description: |-
+ The highest registered destination domain, stripped of the subdomain.
+ For example, the registered domain for "foo.example.com" is "example.com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk".
+ name: destination.registered_domain
+ type: keyword
+- description: |-
+ The subdomain portion of a fully qualified domain name includes all of the names except the host name under the registered_domain. In a partially qualified domain, or if the the qualification level of the full name cannot be determined, subdomain contains all of the names below the registered domain.
+ For example the subdomain portion of "www.east.mydomain.co.uk" is "east". If the domain has multiple levels of subdomain, such as "sub2.sub1.example.com", the subdomain field should contain "sub2.sub1", with no trailing period.
+ name: destination.subdomain
+ type: keyword
+- description: |-
+ The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk".
+ name: destination.top_level_domain
+ type: keyword
+- description: |-
+ The domain name to which this resource record pertains.
+ If a chain of CNAME is being resolved, each answer's `name` should be the one that corresponds with the answer's `data`. It should not simply be the original `question.name` repeated.
+ name: dns.answers.name
+ type: keyword
+- description: The type of data contained in this resource record.
+ name: dns.answers.type
+ type: keyword
+- description: |-
+ The highest registered domain, stripped of the subdomain.
+ For example, the registered domain for "foo.example.com" is "example.com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk".
+ name: dns.question.registered_domain
+ type: keyword
+- description: |-
+ The subdomain is all of the labels under the registered_domain.
+ If the domain has multiple levels of subdomain, such as "sub2.sub1.example.com", the subdomain field should contain "sub2.sub1", with no trailing period.
+ name: dns.question.subdomain
+ type: keyword
+- description: |-
+ The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk".
+ name: dns.question.top_level_domain
+ type: keyword
+- description: The type of record being queried.
+ name: dns.question.type
+ type: keyword
+- description: |-
+ ECS version this event conforms to. `ecs.version` is a required field and must exist in all events.
+ When querying across multiple indices -- which may conform to slightly different ECS versions -- this field lets integrations adjust to the schema version of the events.
+ name: ecs.version
+ type: keyword
+- description: Error message.
+ name: error.message
+ type: match_only_text
+- description: |-
+ The action captured by the event.
+ This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer.
+ name: event.action
+ type: keyword
+- description: |-
+ Identification code for this event, if one exists.
+ Some event sources use event codes to identify messages unambiguously, regardless of message language or wording adjustments over time. An example of this is the Windows Event ID.
+ name: event.code
+ type: keyword
+- description: |-
+ Timestamp when an event arrived in the central data store.
+ This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event.
+ In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` < `event.created` < `event.ingested`.
+ name: event.ingested
+ type: date
+- description: |-
+ Raw text message of entire event. Used to demonstrate log integrity or where the full log message (before splitting it up in multiple parts) may be required, e.g. for reindex.
+ This field is not indexed and doc_values are disabled. It cannot be searched, but it can be retrieved from `_source`. If users wish to override this and index this field, please see `Field data types` in the `Elasticsearch Reference`.
+ name: event.original
+ type: keyword
+- description: |-
+ This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy.
+ `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event.
+ Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective.
+ Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer.
+ Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense.
+ name: event.outcome
+ type: keyword
+- description: |-
+ This field should be populated when the event's timestamp does not include timezone information already (e.g. default Syslog timestamps). It's optional otherwise.
+ Acceptable timezone formats are: a canonical ID (e.g. "Europe/Amsterdam"), abbreviated (e.g. "EST") or an HH:mm differential (e.g. "-05:00").
+ name: event.timezone
+ type: keyword
+- description: |-
+ Array of file attributes.
+ Attributes names will vary by platform. Here's a non-exhaustive list of values that are expected in this field: archive, compressed, directory, encrypted, execute, hidden, read, readonly, system, write.
+ name: file.attributes
+ type: keyword
+- description: Directory where the file is located. It should include the drive letter, when appropriate.
+ name: file.directory
+ type: keyword
+- description: |-
+ File extension, excluding the leading dot.
+ Note that when the file name has multiple extensions (example.tar.gz), only the last one should be captured ("gz", not "tar.gz").
+ name: file.extension
+ type: keyword
+- description: Name of the file including the extension, without the directory.
+ name: file.name
+ type: keyword
+- description: Full path to the file, including the file name. It should include the drive letter, when appropriate.
+ name: file.path
+ type: keyword
+- description: |-
+ File size in bytes.
+ Only relevant when `file.type` is "file".
+ name: file.size
+ type: long
+- description: File type (file, dir, or symlink).
+ name: file.type
+ type: keyword
+- description: City name.
+ name: geo.city_name
+ type: keyword
+- description: Country name.
+ name: geo.country_name
+ type: keyword
+- description: |-
+ User-defined description of a location, at the level of granularity they care about.
+ Could be the name of their data centers, the floor number, if this describes a local physical entity, city names.
+ Not typically used in automated geolocation.
+ name: geo.name
+ type: keyword
+- description: Region name.
+ name: geo.region_name
+ type: keyword
+- description: Unique identifier for the group on the system/platform.
+ name: group.id
+ type: keyword
+- description: Name of the group.
+ name: group.name
+ type: keyword
+- description: |-
+ Hostname of the host.
+ It normally contains what the `hostname` command returns on the host machine.
+ name: host.hostname
+ type: keyword
+- description: Host ip addresses.
+ name: host.ip
+ type: ip
+- description: |-
+ Host MAC addresses.
+ The notation format from RFC 7042 is suggested: Each octet (that is, 8-bit byte) is represented by two [uppercase] hexadecimal digits giving the value of the octet as an unsigned integer. Successive octets are separated by a hyphen.
+ name: host.mac
+ type: keyword
+- description: |-
+ Name of the host.
+ It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use.
+ name: host.name
+ type: keyword
+- description: |-
+ HTTP request method.
+ The value should retain its casing from the original event. For example, `GET`, `get`, and `GeT` are all considered valid values for this field.
+ name: http.request.method
+ type: keyword
+- description: Referrer for this HTTP request.
+ name: http.request.referrer
+ type: keyword
+- description: |-
+ Original log level of the log event.
+ If the source of the event provides a log level or textual severity, this is the one that goes in `log.level`. If your source doesn't specify one, you may put your event transport's severity here (e.g. Syslog severity).
+ Some examples are `warn`, `err`, `i`, `informational`.
+ name: log.level
+ type: keyword
+- description: |-
+ The Syslog numeric facility of the log event, if available.
+ According to RFCs 5424 and 3164, this value should be an integer between 0 and 23.
+ name: log.syslog.facility.code
+ type: long
+- description: |-
+ Syslog numeric priority of the event, if available.
+ According to RFCs 5424 and 3164, the priority is 8 * facility + severity. This number is therefore expected to contain a value between 0 and 191.
+ name: log.syslog.priority
+ type: long
+- description: |-
+ The Syslog numeric severity of the log event, if available.
+ If the event source publishing via Syslog provides a different numeric severity value (e.g. firewall, IDS), your source's numeric severity should go to `event.severity`. If the event source does not specify a distinct severity, you can optionally copy the Syslog severity to `event.severity`.
+ name: log.syslog.severity.code
+ type: long
+- description: |-
+ For log events the message field contains the log message, optimized for viewing in a log viewer.
+ For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event.
+ If multiple messages exist, they can be combined into one message.
+ name: message
+ type: match_only_text
+- description: |-
+ When a specific application or service is identified from network connection details (source/dest IPs, ports, certificates, or wire format), this field captures the application's or service's name.
+ For example, the original event identifies the network connection being from a specific web service in a `https` network connection, like `facebook` or `twitter`.
+ The field value must be normalized to lowercase for querying.
+ name: network.application
+ type: keyword
+- description: |-
+ Total bytes transferred in both directions.
+ If `source.bytes` and `destination.bytes` are known, `network.bytes` is their sum.
+ name: network.bytes
+ type: long
+- description: |-
+ Direction of the network traffic.
+ Recommended values are:
+ * ingress
+ * egress
+ * inbound
+ * outbound
+ * internal
+ * external
+ * unknown
+
+ When mapping events from a host-based monitoring context, populate this field from the host's point of view, using the values "ingress" or "egress".
+ When mapping events from a network or perimeter-based monitoring context, populate this field from the point of view of the network perimeter, using the values "inbound", "outbound", "internal" or "external".
+ Note that "internal" is not crossing perimeter boundaries, and is meant to describe communication between two hosts within the perimeter. Note also that "external" is meant to describe traffic between two hosts that are external to the perimeter. This could for example be useful for ISPs or VPN service providers.
+ name: network.direction
+ type: keyword
+- description: Host IP address when the source IP address is the proxy.
+ name: network.forwarded_ip
+ type: ip
+- description: |-
+ Total packets transferred in both directions.
+ If `source.packets` and `destination.packets` are known, `network.packets` is their sum.
+ name: network.packets
+ type: long
+- description: |-
+ In the OSI Model this would be the Application Layer protocol. For example, `http`, `dns`, or `ssh`.
+ The field value must be normalized to lowercase for querying.
+ name: network.protocol
+ type: keyword
+- description: Interface name as reported by the system.
+ name: observer.egress.interface.name
+ type: keyword
+- description: Interface name as reported by the system.
+ name: observer.ingress.interface.name
+ type: keyword
+- description: The product name of the observer.
+ name: observer.product
+ type: keyword
+- description: |-
+ The type of the observer the data is coming from.
+ There is no predefined list of observer types. Some examples are `forwarder`, `firewall`, `ids`, `ips`, `proxy`, `poller`, `sensor`, `APM server`.
+ name: observer.type
+ type: keyword
+- description: Vendor name of the observer.
+ name: observer.vendor
+ type: keyword
+- description: Observer version.
+ name: observer.version
+ type: keyword
+- description: |-
+ Process name.
+ Sometimes called program name or similar.
+ name: process.name
+ type: keyword
+- description: |-
+ Process name.
+ Sometimes called program name or similar.
+ name: process.parent.name
+ type: keyword
+- description: |-
+ Process title.
+ The proctitle, some times the same as process name. Can also be different: for example a browser setting its title to the web page currently opened.
+ name: process.parent.title
+ type: keyword
+- description: Process id.
+ name: process.pid
+ type: long
+- description: Process id.
+ name: process.parent.pid
+ type: long
+- description: |-
+ Process title.
+ The proctitle, some times the same as process name. Can also be different: for example a browser setting its title to the web page currently opened.
+ name: process.title
+ type: keyword
+- description: All hostnames or other host identifiers seen on your event. Example identifiers include FQDNs, domain names, workstation names, or aliases.
+ name: related.hosts
+ type: keyword
+- description: All of the IPs seen on your event.
+ name: related.ip
+ type: ip
+- description: All the user names or other user identifiers seen on the event.
+ name: related.user
+ type: keyword
+- description: The name of the rule or signature generating the event.
+ name: rule.name
+ type: keyword
+- description: |-
+ The domain name of the server system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: server.domain
+ type: keyword
+- description: |-
+ The highest registered server domain, stripped of the subdomain.
+ For example, the registered domain for "foo.example.com" is "example.com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk".
+ name: server.registered_domain
+ type: keyword
+- description: |-
+ The subdomain portion of a fully qualified domain name includes all of the names except the host name under the registered_domain. In a partially qualified domain, or if the the qualification level of the full name cannot be determined, subdomain contains all of the names below the registered domain.
+ For example the subdomain portion of "www.east.mydomain.co.uk" is "east". If the domain has multiple levels of subdomain, such as "sub2.sub1.example.com", the subdomain field should contain "sub2.sub1", with no trailing period.
+ name: server.subdomain
+ type: keyword
+- description: |-
+ The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk".
+ name: server.top_level_domain
+ type: keyword
+- description: |-
+ Name of the service data is collected from.
+ The name of the service is normally user given. This allows for distributed services that run on multiple hosts to correlate the related instances based on the name.
+ In the case of Elasticsearch the `service.name` could contain the cluster name. For Beats the `service.name` is by default a copy of the `service.type` field if no name is specified.
+ name: service.name
+ type: keyword
+- description: |-
+ Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field.
+ Then it should be duplicated to `.ip` or `.domain`, depending on which one it is.
+ name: source.address
+ type: keyword
+- description: Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet.
+ name: source.as.number
+ type: long
+- description: Organization name.
+ name: source.as.organization.name
+ type: keyword
+- description: Bytes sent from the source to the destination.
+ name: source.bytes
+ type: long
+- description: |-
+ The domain name of the source system.
+ This value may be a host name, a fully qualified domain name, or another host naming format. The value may derive from the original event or be added from enrichment.
+ name: source.domain
+ type: keyword
+- description: City name.
+ name: source.geo.city_name
+ type: keyword
+- description: Country name.
+ name: source.geo.country_name
+ type: keyword
+- description: Longitude and latitude.
+ level: core
+ name: source.geo.location
+ type: geo_point
+- description: IP address of the source (IPv4 or IPv6).
+ name: source.ip
+ type: ip
+- description: |-
+ MAC address of the source.
+ The notation format from RFC 7042 is suggested: Each octet (that is, 8-bit byte) is represented by two [uppercase] hexadecimal digits giving the value of the octet as an unsigned integer. Successive octets are separated by a hyphen.
+ name: source.mac
+ type: keyword
+- description: |-
+ Translated ip of source based NAT sessions (e.g. internal client to internet)
+ Typically connections traversing load balancers, firewalls, or routers.
+ name: source.nat.ip
+ type: ip
+- description: |-
+ Translated port of source based NAT sessions. (e.g. internal client to internet)
+ Typically used with load balancers, firewalls, or routers.
+ name: source.nat.port
+ type: long
+- description: Port of the source.
+ name: source.port
+ type: long
+- description: |-
+ The highest registered source domain, stripped of the subdomain.
+ For example, the registered domain for "foo.example.com" is "example.com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk".
+ name: source.registered_domain
+ type: keyword
+- description: |-
+ The subdomain portion of a fully qualified domain name includes all of the names except the host name under the registered_domain. In a partially qualified domain, or if the the qualification level of the full name cannot be determined, subdomain contains all of the names below the registered domain.
+ For example the subdomain portion of "www.east.mydomain.co.uk" is "east". If the domain has multiple levels of subdomain, such as "sub2.sub1.example.com", the subdomain field should contain "sub2.sub1", with no trailing period.
+ name: source.subdomain
+ type: keyword
+- description: |-
+ The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk".
+ name: source.top_level_domain
+ type: keyword
+- description: List of keywords used to tag each event.
+ name: tags
+ type: keyword
+- description: |-
+ Domain of the url, such as "www.elastic.co".
+ In some cases a URL may refer to an IP and/or port directly, without a domain name. In this case, the IP address would go to the `domain` field.
+ If the URL contains a literal IPv6 address enclosed by `[` and `]` (IETF RFC 2732), the `[` and `]` characters should also be captured in the `domain` field.
+ name: url.domain
+ type: keyword
+- description: |-
+ Unmodified original url as seen in the event source.
+ Note that in network monitoring, the observed URL may be a full URL, whereas in access logs, the URL is often just represented as a path.
+ This field is meant to represent the URL as it was observed, complete or not.
+ name: url.original
+ type: wildcard
+- description: Path of the request, such as "/search".
+ name: url.path
+ type: wildcard
+- description: |-
+ The query field describes the query string of the request, such as "q=elasticsearch".
+ The `?` is excluded from the query string. If a URL contains no `?`, there is no query field. If there is a `?` but no query, the query field exists with an empty string. The `exists` query can be used to differentiate between the two cases.
+ name: url.query
+ type: keyword
+- description: |-
+ The highest registered url domain, stripped of the subdomain.
+ For example, the registered domain for "foo.example.com" is "example.com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk".
+ name: url.registered_domain
+ type: keyword
+- description: |-
+ The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com".
+ This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk".
+ name: url.top_level_domain
+ type: keyword
+- description: |-
+ Name of the directory the user is a member of.
+ For example, an LDAP or Active Directory domain name.
+ name: user.domain
+ type: keyword
+- description: User's full name, if available.
+ name: user.full_name
+ type: keyword
+- description: Unique identifier of the user.
+ name: user.id
+ type: keyword
+- description: Short name or login of the user.
+ name: user.name
+ type: keyword
+- description: Name of the device.
+ name: user_agent.device.name
+ type: keyword
+- description: Name of the user agent.
+ name: user_agent.name
+ type: keyword
+- description: Unparsed user_agent string.
+ name: user_agent.original
+ type: keyword
+- description: OS family (such as redhat, debian, freebsd, windows).
+ name: user_agent.os.family
+ type: keyword
+- description: Operating system name, including the version or code name.
+ name: user_agent.os.full
+ type: keyword
+- description: Operating system kernel version as a raw string.
+ name: user_agent.os.kernel
+ type: keyword
+- description: Operating system name, without the version.
+ name: user_agent.os.name
+ type: keyword
+- description: Operating system platform (such centos, ubuntu, windows).
+ name: user_agent.os.platform
+ type: keyword
+- description: |-
+ Use the `os.type` field to categorize the operating system into one of the broad commercial families.
+ One of these following values should be used (lowercase): linux, macos, unix, windows.
+ If the OS you're dealing with is not in the list, the field should not be populated. Please let us know by opening an issue with ECS, to propose its addition.
+ name: user_agent.os.type
+ type: keyword
+- description: Operating system version as a raw string.
+ name: user_agent.os.version
+ type: keyword
+- description: Version of the user agent.
+ name: user_agent.version
+ type: keyword
diff --git a/packages/zscaler/0.5.1/data_stream/zia/fields/fields.yml b/packages/zscaler/0.5.1/data_stream/zia/fields/fields.yml
new file mode 100755
index 0000000000..ea69cd79e3
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/fields/fields.yml
@@ -0,0 +1,1754 @@
+- name: rsa
+ type: group
+ fields:
+ - name: internal
+ type: group
+ fields:
+ - name: msg
+ type: keyword
+ description: This key is used to capture the raw message that comes into the Log Decoder
+ - name: messageid
+ type: keyword
+ - name: event_desc
+ type: keyword
+ - name: message
+ type: keyword
+ description: This key captures the contents of instant messages
+ - name: time
+ type: date
+ description: This is the time at which a session hits a NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness.
+ - name: level
+ type: long
+ description: Deprecated key defined only in table map.
+ - name: msg_id
+ type: keyword
+ description: This is the Message ID1 value that identifies the exact log parser definition which parses a particular log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: msg_vid
+ type: keyword
+ description: This is the Message ID2 value that identifies the exact log parser definition which parses a particular log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: data
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: obj_server
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: obj_val
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: resource
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: obj_id
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: statement
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: audit_class
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: entry
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: hcode
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: inode
+ type: long
+ description: Deprecated key defined only in table map.
+ - name: resource_class
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: dead
+ type: long
+ description: Deprecated key defined only in table map.
+ - name: feed_desc
+ type: keyword
+ description: This is used to capture the description of the feed. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: feed_name
+ type: keyword
+ description: This is used to capture the name of the feed. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: cid
+ type: keyword
+ description: This is the unique identifier used to identify a NetWitness Concentrator. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: device_class
+ type: keyword
+ description: This is the Classification of the Log Event Source under a predefined fixed set of Event Source Classifications. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: device_group
+ type: keyword
+ description: This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: device_host
+ type: keyword
+ description: This is the Hostname of the log Event Source sending the logs to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: device_ip
+ type: ip
+ description: This is the IPv4 address of the Log Event Source sending the logs to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: device_ipv6
+ type: ip
+ description: This is the IPv6 address of the Log Event Source sending the logs to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: device_type
+ type: keyword
+ description: This is the name of the log parser which parsed a given session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: device_type_id
+ type: long
+ description: Deprecated key defined only in table map.
+ - name: did
+ type: keyword
+ description: This is the unique identifier used to identify a NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: entropy_req
+ type: long
+ description: This key is only used by the Entropy Parser, the Meta Type can be either UInt16 or Float32 based on the configuration
+ - name: entropy_res
+ type: long
+ description: This key is only used by the Entropy Parser, the Meta Type can be either UInt16 or Float32 based on the configuration
+ - name: event_name
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: feed_category
+ type: keyword
+ description: This is used to capture the category of the feed. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: forward_ip
+ type: ip
+ description: This key should be used to capture the IPV4 address of a relay system which forwarded the events from the original system to NetWitness.
+ - name: forward_ipv6
+ type: ip
+ description: This key is used to capture the IPV6 address of a relay system which forwarded the events from the original system to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: header_id
+ type: keyword
+ description: This is the Header ID value that identifies the exact log parser header definition that parses a particular log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: lc_cid
+ type: keyword
+ description: This is a unique Identifier of a Log Collector. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: lc_ctime
+ type: date
+ description: This is the time at which a log is collected in a NetWitness Log Collector. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: mcb_req
+ type: long
+ description: This key is only used by the Entropy Parser, the most common byte request is simply which byte for each side (0 thru 255) was seen the most
+ - name: mcb_res
+ type: long
+ description: This key is only used by the Entropy Parser, the most common byte response is simply which byte for each side (0 thru 255) was seen the most
+ - name: mcbc_req
+ type: long
+ description: This key is only used by the Entropy Parser, the most common byte count is the number of times the most common byte (above) was seen in the session streams
+ - name: mcbc_res
+ type: long
+ description: This key is only used by the Entropy Parser, the most common byte count is the number of times the most common byte (above) was seen in the session streams
+ - name: medium
+ type: long
+ description: "This key is used to identify if it’s a log/packet session or Layer 2 Encapsulation Type. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness. 32 = log, 33 = correlation session, < 32 is packet session"
+ - name: node_name
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: nwe_callback_id
+ type: keyword
+ description: This key denotes that event is endpoint related
+ - name: parse_error
+ type: keyword
+ description: This is a special key that stores any Meta key validation error found while parsing a log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: payload_req
+ type: long
+ description: This key is only used by the Entropy Parser, the payload size metrics are the payload sizes of each session side at the time of parsing. However, in order to keep
+ - name: payload_res
+ type: long
+ description: This key is only used by the Entropy Parser, the payload size metrics are the payload sizes of each session side at the time of parsing. However, in order to keep
+ - name: process_vid_dst
+ type: keyword
+ description: Endpoint generates and uses a unique virtual ID to identify any similar group of process. This ID represents the target process.
+ - name: process_vid_src
+ type: keyword
+ description: Endpoint generates and uses a unique virtual ID to identify any similar group of process. This ID represents the source process.
+ - name: rid
+ type: long
+ description: This is a special ID of the Remote Session created by NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: session_split
+ type: keyword
+ description: This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: site
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: size
+ type: long
+ description: This is the size of the session as seen by the NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: sourcefile
+ type: keyword
+ description: This is the name of the log file or PCAPs that can be imported into NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: ubc_req
+ type: long
+ description: This key is only used by the Entropy Parser, Unique byte count is the number of unique bytes seen in each stream. 256 would mean all byte values of 0 thru 255 were seen at least once
+ - name: ubc_res
+ type: long
+ description: This key is only used by the Entropy Parser, Unique byte count is the number of unique bytes seen in each stream. 256 would mean all byte values of 0 thru 255 were seen at least once
+ - name: word
+ type: keyword
+ description: This is used by the Word Parsing technology to capture the first 5 character of every word in an unparsed log
+ - name: time
+ type: group
+ fields:
+ - name: event_time
+ type: date
+ description: This key is used to capture the time mentioned in a raw session that represents the actual time an event occured in a standard normalized form
+ - name: duration_time
+ type: double
+ description: This key is used to capture the normalized duration/lifetime in seconds.
+ - name: event_time_str
+ type: keyword
+ description: This key is used to capture the incomplete time mentioned in a session as a string
+ - name: starttime
+ type: date
+ description: This key is used to capture the Start time mentioned in a session in a standard form
+ - name: month
+ type: keyword
+ - name: day
+ type: keyword
+ - name: endtime
+ type: date
+ description: This key is used to capture the End time mentioned in a session in a standard form
+ - name: timezone
+ type: keyword
+ description: This key is used to capture the timezone of the Event Time
+ - name: duration_str
+ type: keyword
+ description: A text string version of the duration
+ - name: date
+ type: keyword
+ - name: year
+ type: keyword
+ - name: recorded_time
+ type: date
+ description: The event time as recorded by the system the event is collected from. The usage scenario is a multi-tier application where the management layer of the system records it's own timestamp at the time of collection from its child nodes. Must be in timestamp format.
+ - name: datetime
+ type: keyword
+ - name: effective_time
+ type: date
+ description: This key is the effective time referenced by an individual event in a Standard Timestamp format
+ - name: expire_time
+ type: date
+ description: This key is the timestamp that explicitly refers to an expiration.
+ - name: process_time
+ type: keyword
+ description: Deprecated, use duration.time
+ - name: hour
+ type: keyword
+ - name: min
+ type: keyword
+ - name: timestamp
+ type: keyword
+ - name: event_queue_time
+ type: date
+ description: This key is the Time that the event was queued.
+ - name: p_time1
+ type: keyword
+ - name: tzone
+ type: keyword
+ - name: eventtime
+ type: keyword
+ - name: gmtdate
+ type: keyword
+ - name: gmttime
+ type: keyword
+ - name: p_date
+ type: keyword
+ - name: p_month
+ type: keyword
+ - name: p_time
+ type: keyword
+ - name: p_time2
+ type: keyword
+ - name: p_year
+ type: keyword
+ - name: expire_time_str
+ type: keyword
+ description: This key is used to capture incomplete timestamp that explicitly refers to an expiration.
+ - name: stamp
+ type: date
+ description: Deprecated key defined only in table map.
+ - name: misc
+ type: group
+ fields:
+ - name: action
+ type: keyword
+ - name: result
+ type: keyword
+ description: This key is used to capture the outcome/result string value of an action in a session.
+ - name: severity
+ type: keyword
+ description: This key is used to capture the severity given the session
+ - name: event_type
+ type: keyword
+ description: This key captures the event category type as specified by the event source.
+ - name: reference_id
+ type: keyword
+ description: This key is used to capture an event id from the session directly
+ - name: version
+ type: keyword
+ description: This key captures Version of the application or OS which is generating the event.
+ - name: disposition
+ type: keyword
+ description: This key captures the The end state of an action.
+ - name: result_code
+ type: keyword
+ description: This key is used to capture the outcome/result numeric value of an action in a session
+ - name: category
+ type: keyword
+ description: This key is used to capture the category of an event given by the vendor in the session
+ - name: obj_name
+ type: keyword
+ description: This is used to capture name of object
+ - name: obj_type
+ type: keyword
+ description: This is used to capture type of object
+ - name: event_source
+ type: keyword
+ description: "This key captures Source of the event that’s not a hostname"
+ - name: log_session_id
+ type: keyword
+ description: This key is used to capture a sessionid from the session directly
+ - name: group
+ type: keyword
+ description: This key captures the Group Name value
+ - name: policy_name
+ type: keyword
+ description: This key is used to capture the Policy Name only.
+ - name: rule_name
+ type: keyword
+ description: This key captures the Rule Name
+ - name: context
+ type: keyword
+ description: This key captures Information which adds additional context to the event.
+ - name: change_new
+ type: keyword
+ description: "This key is used to capture the new values of the attribute that’s changing in a session"
+ - name: space
+ type: keyword
+ - name: client
+ type: keyword
+ description: This key is used to capture only the name of the client application requesting resources of the server. See the user.agent meta key for capture of the specific user agent identifier or browser identification string.
+ - name: msgIdPart1
+ type: keyword
+ - name: msgIdPart2
+ type: keyword
+ - name: change_old
+ type: keyword
+ description: "This key is used to capture the old value of the attribute that’s changing in a session"
+ - name: operation_id
+ type: keyword
+ description: An alert number or operation number. The values should be unique and non-repeating.
+ - name: event_state
+ type: keyword
+ description: This key captures the current state of the object/item referenced within the event. Describing an on-going event.
+ - name: group_object
+ type: keyword
+ description: This key captures a collection/grouping of entities. Specific usage
+ - name: node
+ type: keyword
+ description: Common use case is the node name within a cluster. The cluster name is reflected by the host name.
+ - name: rule
+ type: keyword
+ description: This key captures the Rule number
+ - name: device_name
+ type: keyword
+ description: 'This is used to capture name of the Device associated with the node Like: a physical disk, printer, etc'
+ - name: param
+ type: keyword
+ description: This key is the parameters passed as part of a command or application, etc.
+ - name: change_attrib
+ type: keyword
+ description: "This key is used to capture the name of the attribute that’s changing in a session"
+ - name: event_computer
+ type: keyword
+ description: This key is a windows only concept, where this key is used to capture fully qualified domain name in a windows log.
+ - name: reference_id1
+ type: keyword
+ description: This key is for Linked ID to be used as an addition to "reference.id"
+ - name: event_log
+ type: keyword
+ description: This key captures the Name of the event log
+ - name: OS
+ type: keyword
+ description: This key captures the Name of the Operating System
+ - name: terminal
+ type: keyword
+ description: This key captures the Terminal Names only
+ - name: msgIdPart3
+ type: keyword
+ - name: filter
+ type: keyword
+ description: This key captures Filter used to reduce result set
+ - name: serial_number
+ type: keyword
+ description: This key is the Serial number associated with a physical asset.
+ - name: checksum
+ type: keyword
+ description: This key is used to capture the checksum or hash of the entity such as a file or process. Checksum should be used over checksum.src or checksum.dst when it is unclear whether the entity is a source or target of an action.
+ - name: event_user
+ type: keyword
+ description: This key is a windows only concept, where this key is used to capture combination of domain name and username in a windows log.
+ - name: virusname
+ type: keyword
+ description: This key captures the name of the virus
+ - name: content_type
+ type: keyword
+ description: This key is used to capture Content Type only.
+ - name: group_id
+ type: keyword
+ description: This key captures Group ID Number (related to the group name)
+ - name: policy_id
+ type: keyword
+ description: This key is used to capture the Policy ID only, this should be a numeric value, use policy.name otherwise
+ - name: vsys
+ type: keyword
+ description: This key captures Virtual System Name
+ - name: connection_id
+ type: keyword
+ description: This key captures the Connection ID
+ - name: reference_id2
+ type: keyword
+ description: This key is for the 2nd Linked ID. Can be either linked to "reference.id" or "reference.id1" value but should not be used unless the other two variables are in play.
+ - name: sensor
+ type: keyword
+ description: This key captures Name of the sensor. Typically used in IDS/IPS based devices
+ - name: sig_id
+ type: long
+ description: This key captures IDS/IPS Int Signature ID
+ - name: port_name
+ type: keyword
+ description: 'This key is used for Physical or logical port connection but does NOT include a network port. (Example: Printer port name).'
+ - name: rule_group
+ type: keyword
+ description: This key captures the Rule group name
+ - name: risk_num
+ type: double
+ description: This key captures a Numeric Risk value
+ - name: trigger_val
+ type: keyword
+ description: This key captures the Value of the trigger or threshold condition.
+ - name: log_session_id1
+ type: keyword
+ description: This key is used to capture a Linked (Related) Session ID from the session directly
+ - name: comp_version
+ type: keyword
+ description: This key captures the Version level of a sub-component of a product.
+ - name: content_version
+ type: keyword
+ description: This key captures Version level of a signature or database content.
+ - name: hardware_id
+ type: keyword
+ description: This key is used to capture unique identifier for a device or system (NOT a Mac address)
+ - name: risk
+ type: keyword
+ description: This key captures the non-numeric risk value
+ - name: event_id
+ type: keyword
+ - name: reason
+ type: keyword
+ - name: status
+ type: keyword
+ - name: mail_id
+ type: keyword
+ description: This key is used to capture the mailbox id/name
+ - name: rule_uid
+ type: keyword
+ description: This key is the Unique Identifier for a rule.
+ - name: trigger_desc
+ type: keyword
+ description: This key captures the Description of the trigger or threshold condition.
+ - name: inout
+ type: keyword
+ - name: p_msgid
+ type: keyword
+ - name: data_type
+ type: keyword
+ - name: msgIdPart4
+ type: keyword
+ - name: error
+ type: keyword
+ description: This key captures All non successful Error codes or responses
+ - name: index
+ type: keyword
+ - name: listnum
+ type: keyword
+ description: This key is used to capture listname or listnumber, primarily for collecting access-list
+ - name: ntype
+ type: keyword
+ - name: observed_val
+ type: keyword
+ description: This key captures the Value observed (from the perspective of the device generating the log).
+ - name: policy_value
+ type: keyword
+ description: This key captures the contents of the policy. This contains details about the policy
+ - name: pool_name
+ type: keyword
+ description: This key captures the name of a resource pool
+ - name: rule_template
+ type: keyword
+ description: A default set of parameters which are overlayed onto a rule (or rulename) which efffectively constitutes a template
+ - name: count
+ type: keyword
+ - name: number
+ type: keyword
+ - name: sigcat
+ type: keyword
+ - name: type
+ type: keyword
+ - name: comments
+ type: keyword
+ description: Comment information provided in the log message
+ - name: doc_number
+ type: long
+ description: This key captures File Identification number
+ - name: expected_val
+ type: keyword
+ description: This key captures the Value expected (from the perspective of the device generating the log).
+ - name: job_num
+ type: keyword
+ description: This key captures the Job Number
+ - name: spi_dst
+ type: keyword
+ description: Destination SPI Index
+ - name: spi_src
+ type: keyword
+ description: Source SPI Index
+ - name: code
+ type: keyword
+ - name: agent_id
+ type: keyword
+ description: This key is used to capture agent id
+ - name: message_body
+ type: keyword
+ description: This key captures the The contents of the message body.
+ - name: phone
+ type: keyword
+ - name: sig_id_str
+ type: keyword
+ description: This key captures a string object of the sigid variable.
+ - name: cmd
+ type: keyword
+ - name: misc
+ type: keyword
+ - name: name
+ type: keyword
+ - name: cpu
+ type: long
+ description: This key is the CPU time used in the execution of the event being recorded.
+ - name: event_desc
+ type: keyword
+ description: This key is used to capture a description of an event available directly or inferred
+ - name: sig_id1
+ type: long
+ description: This key captures IDS/IPS Int Signature ID. This must be linked to the sig.id
+ - name: im_buddyid
+ type: keyword
+ - name: im_client
+ type: keyword
+ - name: im_userid
+ type: keyword
+ - name: pid
+ type: keyword
+ - name: priority
+ type: keyword
+ - name: context_subject
+ type: keyword
+ description: This key is to be used in an audit context where the subject is the object being identified
+ - name: context_target
+ type: keyword
+ - name: cve
+ type: keyword
+ description: This key captures CVE (Common Vulnerabilities and Exposures) - an identifier for known information security vulnerabilities.
+ - name: fcatnum
+ type: keyword
+ description: This key captures Filter Category Number. Legacy Usage
+ - name: library
+ type: keyword
+ description: This key is used to capture library information in mainframe devices
+ - name: parent_node
+ type: keyword
+ description: This key captures the Parent Node Name. Must be related to node variable.
+ - name: risk_info
+ type: keyword
+ description: Deprecated, use New Hunting Model (inv.*, ioc, boc, eoc, analysis.*)
+ - name: tcp_flags
+ type: long
+ description: This key is captures the TCP flags set in any packet of session
+ - name: tos
+ type: long
+ description: This key describes the type of service
+ - name: vm_target
+ type: keyword
+ description: VMWare Target **VMWARE** only varaible.
+ - name: workspace
+ type: keyword
+ description: This key captures Workspace Description
+ - name: command
+ type: keyword
+ - name: event_category
+ type: keyword
+ - name: facilityname
+ type: keyword
+ - name: forensic_info
+ type: keyword
+ - name: jobname
+ type: keyword
+ - name: mode
+ type: keyword
+ - name: policy
+ type: keyword
+ - name: policy_waiver
+ type: keyword
+ - name: second
+ type: keyword
+ - name: space1
+ type: keyword
+ - name: subcategory
+ type: keyword
+ - name: tbdstr2
+ type: keyword
+ - name: alert_id
+ type: keyword
+ description: Deprecated, New Hunting Model (inv.*, ioc, boc, eoc, analysis.*)
+ - name: checksum_dst
+ type: keyword
+ description: This key is used to capture the checksum or hash of the the target entity such as a process or file.
+ - name: checksum_src
+ type: keyword
+ description: This key is used to capture the checksum or hash of the source entity such as a file or process.
+ - name: fresult
+ type: long
+ description: This key captures the Filter Result
+ - name: payload_dst
+ type: keyword
+ description: This key is used to capture destination payload
+ - name: payload_src
+ type: keyword
+ description: This key is used to capture source payload
+ - name: pool_id
+ type: keyword
+ description: This key captures the identifier (typically numeric field) of a resource pool
+ - name: process_id_val
+ type: keyword
+ description: This key is a failure key for Process ID when it is not an integer value
+ - name: risk_num_comm
+ type: double
+ description: This key captures Risk Number Community
+ - name: risk_num_next
+ type: double
+ description: This key captures Risk Number NextGen
+ - name: risk_num_sand
+ type: double
+ description: This key captures Risk Number SandBox
+ - name: risk_num_static
+ type: double
+ description: This key captures Risk Number Static
+ - name: risk_suspicious
+ type: keyword
+ description: Deprecated, use New Hunting Model (inv.*, ioc, boc, eoc, analysis.*)
+ - name: risk_warning
+ type: keyword
+ description: Deprecated, use New Hunting Model (inv.*, ioc, boc, eoc, analysis.*)
+ - name: snmp_oid
+ type: keyword
+ description: SNMP Object Identifier
+ - name: sql
+ type: keyword
+ description: This key captures the SQL query
+ - name: vuln_ref
+ type: keyword
+ description: This key captures the Vulnerability Reference details
+ - name: acl_id
+ type: keyword
+ - name: acl_op
+ type: keyword
+ - name: acl_pos
+ type: keyword
+ - name: acl_table
+ type: keyword
+ - name: admin
+ type: keyword
+ - name: alarm_id
+ type: keyword
+ - name: alarmname
+ type: keyword
+ - name: app_id
+ type: keyword
+ - name: audit
+ type: keyword
+ - name: audit_object
+ type: keyword
+ - name: auditdata
+ type: keyword
+ - name: benchmark
+ type: keyword
+ - name: bypass
+ type: keyword
+ - name: cache
+ type: keyword
+ - name: cache_hit
+ type: keyword
+ - name: cefversion
+ type: keyword
+ - name: cfg_attr
+ type: keyword
+ - name: cfg_obj
+ type: keyword
+ - name: cfg_path
+ type: keyword
+ - name: changes
+ type: keyword
+ - name: client_ip
+ type: keyword
+ - name: clustermembers
+ type: keyword
+ - name: cn_acttimeout
+ type: keyword
+ - name: cn_asn_src
+ type: keyword
+ - name: cn_bgpv4nxthop
+ type: keyword
+ - name: cn_ctr_dst_code
+ type: keyword
+ - name: cn_dst_tos
+ type: keyword
+ - name: cn_dst_vlan
+ type: keyword
+ - name: cn_engine_id
+ type: keyword
+ - name: cn_engine_type
+ type: keyword
+ - name: cn_f_switch
+ type: keyword
+ - name: cn_flowsampid
+ type: keyword
+ - name: cn_flowsampintv
+ type: keyword
+ - name: cn_flowsampmode
+ type: keyword
+ - name: cn_inacttimeout
+ type: keyword
+ - name: cn_inpermbyts
+ type: keyword
+ - name: cn_inpermpckts
+ type: keyword
+ - name: cn_invalid
+ type: keyword
+ - name: cn_ip_proto_ver
+ type: keyword
+ - name: cn_ipv4_ident
+ type: keyword
+ - name: cn_l_switch
+ type: keyword
+ - name: cn_log_did
+ type: keyword
+ - name: cn_log_rid
+ type: keyword
+ - name: cn_max_ttl
+ type: keyword
+ - name: cn_maxpcktlen
+ type: keyword
+ - name: cn_min_ttl
+ type: keyword
+ - name: cn_minpcktlen
+ type: keyword
+ - name: cn_mpls_lbl_1
+ type: keyword
+ - name: cn_mpls_lbl_10
+ type: keyword
+ - name: cn_mpls_lbl_2
+ type: keyword
+ - name: cn_mpls_lbl_3
+ type: keyword
+ - name: cn_mpls_lbl_4
+ type: keyword
+ - name: cn_mpls_lbl_5
+ type: keyword
+ - name: cn_mpls_lbl_6
+ type: keyword
+ - name: cn_mpls_lbl_7
+ type: keyword
+ - name: cn_mpls_lbl_8
+ type: keyword
+ - name: cn_mpls_lbl_9
+ type: keyword
+ - name: cn_mplstoplabel
+ type: keyword
+ - name: cn_mplstoplabip
+ type: keyword
+ - name: cn_mul_dst_byt
+ type: keyword
+ - name: cn_mul_dst_pks
+ type: keyword
+ - name: cn_muligmptype
+ type: keyword
+ - name: cn_sampalgo
+ type: keyword
+ - name: cn_sampint
+ type: keyword
+ - name: cn_seqctr
+ type: keyword
+ - name: cn_spackets
+ type: keyword
+ - name: cn_src_tos
+ type: keyword
+ - name: cn_src_vlan
+ type: keyword
+ - name: cn_sysuptime
+ type: keyword
+ - name: cn_template_id
+ type: keyword
+ - name: cn_totbytsexp
+ type: keyword
+ - name: cn_totflowexp
+ type: keyword
+ - name: cn_totpcktsexp
+ type: keyword
+ - name: cn_unixnanosecs
+ type: keyword
+ - name: cn_v6flowlabel
+ type: keyword
+ - name: cn_v6optheaders
+ type: keyword
+ - name: comp_class
+ type: keyword
+ - name: comp_name
+ type: keyword
+ - name: comp_rbytes
+ type: keyword
+ - name: comp_sbytes
+ type: keyword
+ - name: cpu_data
+ type: keyword
+ - name: criticality
+ type: keyword
+ - name: cs_agency_dst
+ type: keyword
+ - name: cs_analyzedby
+ type: keyword
+ - name: cs_av_other
+ type: keyword
+ - name: cs_av_primary
+ type: keyword
+ - name: cs_av_secondary
+ type: keyword
+ - name: cs_bgpv6nxthop
+ type: keyword
+ - name: cs_bit9status
+ type: keyword
+ - name: cs_context
+ type: keyword
+ - name: cs_control
+ type: keyword
+ - name: cs_data
+ type: keyword
+ - name: cs_datecret
+ type: keyword
+ - name: cs_dst_tld
+ type: keyword
+ - name: cs_eth_dst_ven
+ type: keyword
+ - name: cs_eth_src_ven
+ type: keyword
+ - name: cs_event_uuid
+ type: keyword
+ - name: cs_filetype
+ type: keyword
+ - name: cs_fld
+ type: keyword
+ - name: cs_if_desc
+ type: keyword
+ - name: cs_if_name
+ type: keyword
+ - name: cs_ip_next_hop
+ type: keyword
+ - name: cs_ipv4dstpre
+ type: keyword
+ - name: cs_ipv4srcpre
+ type: keyword
+ - name: cs_lifetime
+ type: keyword
+ - name: cs_log_medium
+ type: keyword
+ - name: cs_loginname
+ type: keyword
+ - name: cs_modulescore
+ type: keyword
+ - name: cs_modulesign
+ type: keyword
+ - name: cs_opswatresult
+ type: keyword
+ - name: cs_payload
+ type: keyword
+ - name: cs_registrant
+ type: keyword
+ - name: cs_registrar
+ type: keyword
+ - name: cs_represult
+ type: keyword
+ - name: cs_rpayload
+ type: keyword
+ - name: cs_sampler_name
+ type: keyword
+ - name: cs_sourcemodule
+ type: keyword
+ - name: cs_streams
+ type: keyword
+ - name: cs_targetmodule
+ type: keyword
+ - name: cs_v6nxthop
+ type: keyword
+ - name: cs_whois_server
+ type: keyword
+ - name: cs_yararesult
+ type: keyword
+ - name: description
+ type: keyword
+ - name: devvendor
+ type: keyword
+ - name: distance
+ type: keyword
+ - name: dstburb
+ type: keyword
+ - name: edomain
+ type: keyword
+ - name: edomaub
+ type: keyword
+ - name: euid
+ type: keyword
+ - name: facility
+ type: keyword
+ - name: finterface
+ type: keyword
+ - name: flags
+ type: keyword
+ - name: gaddr
+ type: keyword
+ - name: id3
+ type: keyword
+ - name: im_buddyname
+ type: keyword
+ - name: im_croomid
+ type: keyword
+ - name: im_croomtype
+ type: keyword
+ - name: im_members
+ type: keyword
+ - name: im_username
+ type: keyword
+ - name: ipkt
+ type: keyword
+ - name: ipscat
+ type: keyword
+ - name: ipspri
+ type: keyword
+ - name: latitude
+ type: keyword
+ - name: linenum
+ type: keyword
+ - name: list_name
+ type: keyword
+ - name: load_data
+ type: keyword
+ - name: location_floor
+ type: keyword
+ - name: location_mark
+ type: keyword
+ - name: log_id
+ type: keyword
+ - name: log_type
+ type: keyword
+ - name: logid
+ type: keyword
+ - name: logip
+ type: keyword
+ - name: logname
+ type: keyword
+ - name: longitude
+ type: keyword
+ - name: lport
+ type: keyword
+ - name: mbug_data
+ type: keyword
+ - name: misc_name
+ type: keyword
+ - name: msg_type
+ type: keyword
+ - name: msgid
+ type: keyword
+ - name: netsessid
+ type: keyword
+ - name: num
+ type: keyword
+ - name: number1
+ type: keyword
+ - name: number2
+ type: keyword
+ - name: nwwn
+ type: keyword
+ - name: object
+ type: keyword
+ - name: operation
+ type: keyword
+ - name: opkt
+ type: keyword
+ - name: orig_from
+ type: keyword
+ - name: owner_id
+ type: keyword
+ - name: p_action
+ type: keyword
+ - name: p_filter
+ type: keyword
+ - name: p_group_object
+ type: keyword
+ - name: p_id
+ type: keyword
+ - name: p_msgid1
+ type: keyword
+ - name: p_msgid2
+ type: keyword
+ - name: p_result1
+ type: keyword
+ - name: password_chg
+ type: keyword
+ - name: password_expire
+ type: keyword
+ - name: permgranted
+ type: keyword
+ - name: permwanted
+ type: keyword
+ - name: pgid
+ type: keyword
+ - name: policyUUID
+ type: keyword
+ - name: prog_asp_num
+ type: keyword
+ - name: program
+ type: keyword
+ - name: real_data
+ type: keyword
+ - name: rec_asp_device
+ type: keyword
+ - name: rec_asp_num
+ type: keyword
+ - name: rec_library
+ type: keyword
+ - name: recordnum
+ type: keyword
+ - name: ruid
+ type: keyword
+ - name: sburb
+ type: keyword
+ - name: sdomain_fld
+ type: keyword
+ - name: sec
+ type: keyword
+ - name: sensorname
+ type: keyword
+ - name: seqnum
+ type: keyword
+ - name: session
+ type: keyword
+ - name: sessiontype
+ type: keyword
+ - name: sigUUID
+ type: keyword
+ - name: spi
+ type: keyword
+ - name: srcburb
+ type: keyword
+ - name: srcdom
+ type: keyword
+ - name: srcservice
+ type: keyword
+ - name: state
+ type: keyword
+ - name: status1
+ type: keyword
+ - name: svcno
+ type: keyword
+ - name: system
+ type: keyword
+ - name: tbdstr1
+ type: keyword
+ - name: tgtdom
+ type: keyword
+ - name: tgtdomain
+ type: keyword
+ - name: threshold
+ type: keyword
+ - name: type1
+ type: keyword
+ - name: udb_class
+ type: keyword
+ - name: url_fld
+ type: keyword
+ - name: user_div
+ type: keyword
+ - name: userid
+ type: keyword
+ - name: username_fld
+ type: keyword
+ - name: utcstamp
+ type: keyword
+ - name: v_instafname
+ type: keyword
+ - name: virt_data
+ type: keyword
+ - name: vpnid
+ type: keyword
+ - name: autorun_type
+ type: keyword
+ description: This is used to capture Auto Run type
+ - name: cc_number
+ type: long
+ description: Valid Credit Card Numbers only
+ - name: content
+ type: keyword
+ description: This key captures the content type from protocol headers
+ - name: ein_number
+ type: long
+ description: Employee Identification Numbers only
+ - name: found
+ type: keyword
+ description: This is used to capture the results of regex match
+ - name: language
+ type: keyword
+ description: This is used to capture list of languages the client support and what it prefers
+ - name: lifetime
+ type: long
+ description: This key is used to capture the session lifetime in seconds.
+ - name: link
+ type: keyword
+ description: This key is used to link the sessions together. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness
+ - name: match
+ type: keyword
+ description: This key is for regex match name from search.ini
+ - name: param_dst
+ type: keyword
+ description: This key captures the command line/launch argument of the target process or file
+ - name: param_src
+ type: keyword
+ description: This key captures source parameter
+ - name: search_text
+ type: keyword
+ description: This key captures the Search Text used
+ - name: sig_name
+ type: keyword
+ description: This key is used to capture the Signature Name only.
+ - name: snmp_value
+ type: keyword
+ description: SNMP set request value
+ - name: streams
+ type: long
+ description: This key captures number of streams in session
+ - name: db
+ type: group
+ fields:
+ - name: index
+ type: keyword
+ description: This key captures IndexID of the index.
+ - name: instance
+ type: keyword
+ description: This key is used to capture the database server instance name
+ - name: database
+ type: keyword
+ description: This key is used to capture the name of a database or an instance as seen in a session
+ - name: transact_id
+ type: keyword
+ description: This key captures the SQL transantion ID of the current session
+ - name: permissions
+ type: keyword
+ description: This key captures permission or privilege level assigned to a resource.
+ - name: table_name
+ type: keyword
+ description: This key is used to capture the table name
+ - name: db_id
+ type: keyword
+ description: This key is used to capture the unique identifier for a database
+ - name: db_pid
+ type: long
+ description: This key captures the process id of a connection with database server
+ - name: lread
+ type: long
+ description: This key is used for the number of logical reads
+ - name: lwrite
+ type: long
+ description: This key is used for the number of logical writes
+ - name: pread
+ type: long
+ description: This key is used for the number of physical writes
+ - name: network
+ type: group
+ fields:
+ - name: alias_host
+ type: keyword
+ description: This key should be used when the source or destination context of a hostname is not clear.Also it captures the Device Hostname. Any Hostname that isnt ad.computer.
+ - name: domain
+ type: keyword
+ - name: host_dst
+ type: keyword
+ description: "This key should only be used when it’s a Destination Hostname"
+ - name: network_service
+ type: keyword
+ description: This is used to capture layer 7 protocols/service names
+ - name: interface
+ type: keyword
+ description: This key should be used when the source or destination context of an interface is not clear
+ - name: network_port
+ type: long
+ description: 'Deprecated, use port. NOTE: There is a type discrepancy as currently used, TM: Int32, INDEX: UInt64 (why neither chose the correct UInt16?!)'
+ - name: eth_host
+ type: keyword
+ description: Deprecated, use alias.mac
+ - name: sinterface
+ type: keyword
+ description: "This key should only be used when it’s a Source Interface"
+ - name: dinterface
+ type: keyword
+ description: "This key should only be used when it’s a Destination Interface"
+ - name: vlan
+ type: long
+ description: This key should only be used to capture the ID of the Virtual LAN
+ - name: zone_src
+ type: keyword
+ description: "This key should only be used when it’s a Source Zone."
+ - name: zone
+ type: keyword
+ description: This key should be used when the source or destination context of a Zone is not clear
+ - name: zone_dst
+ type: keyword
+ description: "This key should only be used when it’s a Destination Zone."
+ - name: gateway
+ type: keyword
+ description: This key is used to capture the IP Address of the gateway
+ - name: icmp_type
+ type: long
+ description: This key is used to capture the ICMP type only
+ - name: mask
+ type: keyword
+ description: This key is used to capture the device network IPmask.
+ - name: icmp_code
+ type: long
+ description: This key is used to capture the ICMP code only
+ - name: protocol_detail
+ type: keyword
+ description: This key should be used to capture additional protocol information
+ - name: dmask
+ type: keyword
+ description: This key is used for Destionation Device network mask
+ - name: port
+ type: long
+ description: This key should only be used to capture a Network Port when the directionality is not clear
+ - name: smask
+ type: keyword
+ description: This key is used for capturing source Network Mask
+ - name: netname
+ type: keyword
+ description: This key is used to capture the network name associated with an IP range. This is configured by the end user.
+ - name: paddr
+ type: ip
+ description: Deprecated
+ - name: faddr
+ type: keyword
+ - name: lhost
+ type: keyword
+ - name: origin
+ type: keyword
+ - name: remote_domain_id
+ type: keyword
+ - name: addr
+ type: keyword
+ - name: dns_a_record
+ type: keyword
+ - name: dns_ptr_record
+ type: keyword
+ - name: fhost
+ type: keyword
+ - name: fport
+ type: keyword
+ - name: laddr
+ type: keyword
+ - name: linterface
+ type: keyword
+ - name: phost
+ type: keyword
+ - name: ad_computer_dst
+ type: keyword
+ description: Deprecated, use host.dst
+ - name: eth_type
+ type: long
+ description: This key is used to capture Ethernet Type, Used for Layer 3 Protocols Only
+ - name: ip_proto
+ type: long
+ description: This key should be used to capture the Protocol number, all the protocol nubers are converted into string in UI
+ - name: dns_cname_record
+ type: keyword
+ - name: dns_id
+ type: keyword
+ - name: dns_opcode
+ type: keyword
+ - name: dns_resp
+ type: keyword
+ - name: dns_type
+ type: keyword
+ - name: domain1
+ type: keyword
+ - name: host_type
+ type: keyword
+ - name: packet_length
+ type: keyword
+ - name: host_orig
+ type: keyword
+ description: This is used to capture the original hostname in case of a Forwarding Agent or a Proxy in between.
+ - name: rpayload
+ type: keyword
+ description: This key is used to capture the total number of payload bytes seen in the retransmitted packets.
+ - name: vlan_name
+ type: keyword
+ description: This key should only be used to capture the name of the Virtual LAN
+ - name: investigations
+ type: group
+ fields:
+ - name: ec_activity
+ type: keyword
+ description: This key captures the particular event activity(Ex:Logoff)
+ - name: ec_theme
+ type: keyword
+ description: This key captures the Theme of a particular Event(Ex:Authentication)
+ - name: ec_subject
+ type: keyword
+ description: This key captures the Subject of a particular Event(Ex:User)
+ - name: ec_outcome
+ type: keyword
+ description: This key captures the outcome of a particular Event(Ex:Success)
+ - name: event_cat
+ type: long
+ description: This key captures the Event category number
+ - name: event_cat_name
+ type: keyword
+ description: This key captures the event category name corresponding to the event cat code
+ - name: event_vcat
+ type: keyword
+ description: This is a vendor supplied category. This should be used in situations where the vendor has adopted their own event_category taxonomy.
+ - name: analysis_file
+ type: keyword
+ description: This is used to capture all indicators used in a File Analysis. This key should be used to capture an analysis of a file
+ - name: analysis_service
+ type: keyword
+ description: This is used to capture all indicators used in a Service Analysis. This key should be used to capture an analysis of a service
+ - name: analysis_session
+ type: keyword
+ description: This is used to capture all indicators used for a Session Analysis. This key should be used to capture an analysis of a session
+ - name: boc
+ type: keyword
+ description: This is used to capture behaviour of compromise
+ - name: eoc
+ type: keyword
+ description: This is used to capture Enablers of Compromise
+ - name: inv_category
+ type: keyword
+ description: This used to capture investigation category
+ - name: inv_context
+ type: keyword
+ description: This used to capture investigation context
+ - name: ioc
+ type: keyword
+ description: This is key capture indicator of compromise
+ - name: counters
+ type: group
+ fields:
+ - name: dclass_c1
+ type: long
+ description: This is a generic counter key that should be used with the label dclass.c1.str only
+ - name: dclass_c2
+ type: long
+ description: This is a generic counter key that should be used with the label dclass.c2.str only
+ - name: event_counter
+ type: long
+ description: This is used to capture the number of times an event repeated
+ - name: dclass_r1
+ type: keyword
+ description: This is a generic ratio key that should be used with the label dclass.r1.str only
+ - name: dclass_c3
+ type: long
+ description: This is a generic counter key that should be used with the label dclass.c3.str only
+ - name: dclass_c1_str
+ type: keyword
+ description: This is a generic counter string key that should be used with the label dclass.c1 only
+ - name: dclass_c2_str
+ type: keyword
+ description: This is a generic counter string key that should be used with the label dclass.c2 only
+ - name: dclass_r1_str
+ type: keyword
+ description: This is a generic ratio string key that should be used with the label dclass.r1 only
+ - name: dclass_r2
+ type: keyword
+ description: This is a generic ratio key that should be used with the label dclass.r2.str only
+ - name: dclass_c3_str
+ type: keyword
+ description: This is a generic counter string key that should be used with the label dclass.c3 only
+ - name: dclass_r3
+ type: keyword
+ description: This is a generic ratio key that should be used with the label dclass.r3.str only
+ - name: dclass_r2_str
+ type: keyword
+ description: This is a generic ratio string key that should be used with the label dclass.r2 only
+ - name: dclass_r3_str
+ type: keyword
+ description: This is a generic ratio string key that should be used with the label dclass.r3 only
+ - name: identity
+ type: group
+ fields:
+ - name: auth_method
+ type: keyword
+ description: This key is used to capture authentication methods used only
+ - name: user_role
+ type: keyword
+ description: This key is used to capture the Role of a user only
+ - name: dn
+ type: keyword
+ description: X.500 (LDAP) Distinguished Name
+ - name: logon_type
+ type: keyword
+ description: This key is used to capture the type of logon method used.
+ - name: profile
+ type: keyword
+ description: This key is used to capture the user profile
+ - name: accesses
+ type: keyword
+ description: This key is used to capture actual privileges used in accessing an object
+ - name: realm
+ type: keyword
+ description: Radius realm or similar grouping of accounts
+ - name: user_sid_dst
+ type: keyword
+ description: This key captures Destination User Session ID
+ - name: dn_src
+ type: keyword
+ description: An X.500 (LDAP) Distinguished name that is used in a context that indicates a Source dn
+ - name: org
+ type: keyword
+ description: This key captures the User organization
+ - name: dn_dst
+ type: keyword
+ description: An X.500 (LDAP) Distinguished name that used in a context that indicates a Destination dn
+ - name: firstname
+ type: keyword
+ description: This key is for First Names only, this is used for Healthcare predominantly to capture Patients information
+ - name: lastname
+ type: keyword
+ description: This key is for Last Names only, this is used for Healthcare predominantly to capture Patients information
+ - name: user_dept
+ type: keyword
+ description: User's Department Names only
+ - name: user_sid_src
+ type: keyword
+ description: This key captures Source User Session ID
+ - name: federated_sp
+ type: keyword
+ description: This key is the Federated Service Provider. This is the application requesting authentication.
+ - name: federated_idp
+ type: keyword
+ description: This key is the federated Identity Provider. This is the server providing the authentication.
+ - name: logon_type_desc
+ type: keyword
+ description: This key is used to capture the textual description of an integer logon type as stored in the meta key 'logon.type'.
+ - name: middlename
+ type: keyword
+ description: This key is for Middle Names only, this is used for Healthcare predominantly to capture Patients information
+ - name: password
+ type: keyword
+ description: This key is for Passwords seen in any session, plain text or encrypted
+ - name: host_role
+ type: keyword
+ description: This key should only be used to capture the role of a Host Machine
+ - name: ldap
+ type: keyword
+ description: "This key is for Uninterpreted LDAP values. Ldap Values that don’t have a clear query or response context"
+ - name: ldap_query
+ type: keyword
+ description: This key is the Search criteria from an LDAP search
+ - name: ldap_response
+ type: keyword
+ description: This key is to capture Results from an LDAP search
+ - name: owner
+ type: keyword
+ description: This is used to capture username the process or service is running as, the author of the task
+ - name: service_account
+ type: keyword
+ description: This key is a windows specific key, used for capturing name of the account a service (referenced in the event) is running under. Legacy Usage
+ - name: email
+ type: group
+ fields:
+ - name: email_dst
+ type: keyword
+ description: This key is used to capture the Destination email address only, when the destination context is not clear use email
+ - name: email_src
+ type: keyword
+ description: This key is used to capture the source email address only, when the source context is not clear use email
+ - name: subject
+ type: keyword
+ description: This key is used to capture the subject string from an Email only.
+ - name: email
+ type: keyword
+ description: This key is used to capture a generic email address where the source or destination context is not clear
+ - name: trans_from
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: trans_to
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: file
+ type: group
+ fields:
+ - name: privilege
+ type: keyword
+ description: Deprecated, use permissions
+ - name: attachment
+ type: keyword
+ description: This key captures the attachment file name
+ - name: filesystem
+ type: keyword
+ - name: binary
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: filename_dst
+ type: keyword
+ description: This is used to capture name of the file targeted by the action
+ - name: filename_src
+ type: keyword
+ description: This is used to capture name of the parent filename, the file which performed the action
+ - name: filename_tmp
+ type: keyword
+ - name: directory_dst
+ type: keyword
+ description: This key is used to capture the directory of the target process or file
+ - name: directory_src
+ type: keyword
+ description: This key is used to capture the directory of the source process or file
+ - name: file_entropy
+ type: double
+ description: This is used to capture entropy vale of a file
+ - name: file_vendor
+ type: keyword
+ description: This is used to capture Company name of file located in version_info
+ - name: task_name
+ type: keyword
+ description: This is used to capture name of the task
+ - name: web
+ type: group
+ fields:
+ - name: fqdn
+ type: keyword
+ description: Fully Qualified Domain Names
+ - name: web_cookie
+ type: keyword
+ description: This key is used to capture the Web cookies specifically.
+ - name: alias_host
+ type: keyword
+ - name: reputation_num
+ type: double
+ description: Reputation Number of an entity. Typically used for Web Domains
+ - name: web_ref_domain
+ type: keyword
+ description: Web referer's domain
+ - name: web_ref_query
+ type: keyword
+ description: This key captures Web referer's query portion of the URL
+ - name: remote_domain
+ type: keyword
+ - name: web_ref_page
+ type: keyword
+ description: This key captures Web referer's page information
+ - name: web_ref_root
+ type: keyword
+ description: Web referer's root URL path
+ - name: cn_asn_dst
+ type: keyword
+ - name: cn_rpackets
+ type: keyword
+ - name: urlpage
+ type: keyword
+ - name: urlroot
+ type: keyword
+ - name: p_url
+ type: keyword
+ - name: p_user_agent
+ type: keyword
+ - name: p_web_cookie
+ type: keyword
+ - name: p_web_method
+ type: keyword
+ - name: p_web_referer
+ type: keyword
+ - name: web_extension_tmp
+ type: keyword
+ - name: web_page
+ type: keyword
+ - name: threat
+ type: group
+ fields:
+ - name: threat_category
+ type: keyword
+ description: This key captures Threat Name/Threat Category/Categorization of alert
+ - name: threat_desc
+ type: keyword
+ description: This key is used to capture the threat description from the session directly or inferred
+ - name: alert
+ type: keyword
+ description: This key is used to capture name of the alert
+ - name: threat_source
+ type: keyword
+ description: This key is used to capture source of the threat
+ - name: crypto
+ type: group
+ fields:
+ - name: crypto
+ type: keyword
+ description: This key is used to capture the Encryption Type or Encryption Key only
+ - name: cipher_src
+ type: keyword
+ description: This key is for Source (Client) Cipher
+ - name: cert_subject
+ type: keyword
+ description: This key is used to capture the Certificate organization only
+ - name: peer
+ type: keyword
+ description: This key is for Encryption peer's IP Address
+ - name: cipher_size_src
+ type: long
+ description: This key captures Source (Client) Cipher Size
+ - name: ike
+ type: keyword
+ description: IKE negotiation phase.
+ - name: scheme
+ type: keyword
+ description: This key captures the Encryption scheme used
+ - name: peer_id
+ type: keyword
+ description: "This key is for Encryption peer’s identity"
+ - name: sig_type
+ type: keyword
+ description: This key captures the Signature Type
+ - name: cert_issuer
+ type: keyword
+ - name: cert_host_name
+ type: keyword
+ description: Deprecated key defined only in table map.
+ - name: cert_error
+ type: keyword
+ description: This key captures the Certificate Error String
+ - name: cipher_dst
+ type: keyword
+ description: This key is for Destination (Server) Cipher
+ - name: cipher_size_dst
+ type: long
+ description: This key captures Destination (Server) Cipher Size
+ - name: ssl_ver_src
+ type: keyword
+ description: Deprecated, use version
+ - name: d_certauth
+ type: keyword
+ - name: s_certauth
+ type: keyword
+ - name: ike_cookie1
+ type: keyword
+ description: "ID of the negotiation — sent for ISAKMP Phase One"
+ - name: ike_cookie2
+ type: keyword
+ description: "ID of the negotiation — sent for ISAKMP Phase Two"
+ - name: cert_checksum
+ type: keyword
+ - name: cert_host_cat
+ type: keyword
+ description: This key is used for the hostname category value of a certificate
+ - name: cert_serial
+ type: keyword
+ description: This key is used to capture the Certificate serial number only
+ - name: cert_status
+ type: keyword
+ description: This key captures Certificate validation status
+ - name: ssl_ver_dst
+ type: keyword
+ description: Deprecated, use version
+ - name: cert_keysize
+ type: keyword
+ - name: cert_username
+ type: keyword
+ - name: https_insact
+ type: keyword
+ - name: https_valid
+ type: keyword
+ - name: cert_ca
+ type: keyword
+ description: This key is used to capture the Certificate signing authority only
+ - name: cert_common
+ type: keyword
+ description: This key is used to capture the Certificate common name only
+ - name: wireless
+ type: group
+ fields:
+ - name: wlan_ssid
+ type: keyword
+ description: This key is used to capture the ssid of a Wireless Session
+ - name: access_point
+ type: keyword
+ description: This key is used to capture the access point name.
+ - name: wlan_channel
+ type: long
+ description: This is used to capture the channel names
+ - name: wlan_name
+ type: keyword
+ description: This key captures either WLAN number/name
+ - name: storage
+ type: group
+ fields:
+ - name: disk_volume
+ type: keyword
+ description: A unique name assigned to logical units (volumes) within a physical disk
+ - name: lun
+ type: keyword
+ description: Logical Unit Number.This key is a very useful concept in Storage.
+ - name: pwwn
+ type: keyword
+ description: This uniquely identifies a port on a HBA.
+ - name: physical
+ type: group
+ fields:
+ - name: org_dst
+ type: keyword
+ description: This is used to capture the destination organization based on the GEOPIP Maxmind database.
+ - name: org_src
+ type: keyword
+ description: This is used to capture the source organization based on the GEOPIP Maxmind database.
+ - name: healthcare
+ type: group
+ fields:
+ - name: patient_fname
+ type: keyword
+ description: This key is for First Names only, this is used for Healthcare predominantly to capture Patients information
+ - name: patient_id
+ type: keyword
+ description: This key captures the unique ID for a patient
+ - name: patient_lname
+ type: keyword
+ description: This key is for Last Names only, this is used for Healthcare predominantly to capture Patients information
+ - name: patient_mname
+ type: keyword
+ description: This key is for Middle Names only, this is used for Healthcare predominantly to capture Patients information
+ - name: endpoint
+ type: group
+ fields:
+ - name: host_state
+ type: keyword
+ description: This key is used to capture the current state of the machine, such as blacklisted, infected, firewall disabled and so on
+ - name: registry_key
+ type: keyword
+ description: This key captures the path to the registry key
+ - name: registry_value
+ type: keyword
+ description: This key captures values or decorators used within a registry entry
+- name: dns.question.domain
+ type: keyword
+ ignore_above: 1024
+ description: Server domain.
+- name: network.interface.name
+ type: keyword
diff --git a/packages/zscaler/0.5.1/data_stream/zia/manifest.yml b/packages/zscaler/0.5.1/data_stream/zia/manifest.yml
new file mode 100755
index 0000000000..99ea159b95
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/manifest.yml
@@ -0,0 +1,204 @@
+title: Zscaler NSS logs
+release: experimental
+type: logs
+streams:
+ - input: udp
+ title: Zscaler NSS logs
+ description: Collect Zscaler NSS logs
+ template_path: udp.yml.hbs
+ vars:
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - zscaler-zia
+ - forwarded
+ - name: udp_host
+ type: text
+ title: UDP host to listen on
+ multi: false
+ required: true
+ show_user: true
+ default: localhost
+ - name: udp_port
+ type: integer
+ title: UDP port to listen on
+ multi: false
+ required: true
+ show_user: true
+ default: 9538
+ - name: tz_offset
+ type: text
+ title: Timezone offset (+HH:mm format)
+ required: false
+ show_user: true
+ default: "local"
+ - name: rsa_fields
+ type: bool
+ title: Add non-ECS fields
+ required: false
+ show_user: true
+ default: true
+ - name: keep_raw_fields
+ type: bool
+ title: Keep raw parser fields
+ required: false
+ show_user: false
+ default: false
+ - name: debug
+ type: bool
+ title: Enable debug logging
+ required: false
+ show_user: false
+ default: false
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ description: >
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
+
+ - input: tcp
+ title: Zscaler NSS logs
+ description: Collect Zscaler NSS logs
+ template_path: tcp.yml.hbs
+ vars:
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - zscaler-zia
+ - forwarded
+ - name: tcp_host
+ type: text
+ title: TCP host to listen on
+ multi: false
+ required: true
+ show_user: true
+ default: localhost
+ - name: tcp_port
+ type: integer
+ title: TCP port to listen on
+ multi: false
+ required: true
+ show_user: true
+ default: 9538
+ - name: tz_offset
+ type: text
+ title: Timezone offset (+HH:mm format)
+ required: false
+ show_user: true
+ default: "local"
+ - name: rsa_fields
+ type: bool
+ title: Add non-ECS fields
+ required: false
+ show_user: true
+ default: true
+ - name: keep_raw_fields
+ type: bool
+ title: Keep raw parser fields
+ required: false
+ show_user: false
+ default: false
+ - name: debug
+ type: bool
+ title: Enable debug logging
+ required: false
+ show_user: false
+ default: false
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ description: >
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
+
+ - input: logfile
+ enabled: false
+ title: Zscaler NSS logs
+ description: Collect Zscaler NSS logs from file
+ vars:
+ - name: paths
+ type: text
+ title: Paths
+ multi: true
+ required: true
+ show_user: true
+ default:
+ - /var/log/zscaler-zia.log
+ - name: tags
+ type: text
+ title: Tags
+ multi: true
+ required: true
+ show_user: false
+ default:
+ - zscaler-zia
+ - forwarded
+ - name: tz_offset
+ type: text
+ title: Timezone offset (+HH:mm format)
+ required: false
+ show_user: true
+ default: "local"
+ - name: rsa_fields
+ type: bool
+ title: Add non-ECS fields
+ required: false
+ show_user: true
+ default: true
+ - name: keep_raw_fields
+ type: bool
+ title: Keep raw parser fields
+ required: false
+ show_user: false
+ default: false
+ - name: debug
+ type: bool
+ title: Enable debug logging
+ required: false
+ show_user: false
+ default: false
+ - name: preserve_original_event
+ required: true
+ show_user: true
+ title: Preserve original event
+ description: Preserves a raw copy of the original event, added to the field `event.original`
+ type: bool
+ multi: false
+ default: false
+ - name: processors
+ type: yaml
+ title: Processors
+ multi: false
+ required: false
+ show_user: false
+ description: >-
+ Processors are used to reduce the number of fields in the exported event or to enhance the event with metadata. This executes in the agent before the logs are parsed. See [Processors](https://www.elastic.co/guide/en/beats/filebeat/current/filtering-and-enhancing-data.html) for details.
diff --git a/packages/zscaler/0.5.1/data_stream/zia/sample_event.json b/packages/zscaler/0.5.1/data_stream/zia/sample_event.json
new file mode 100755
index 0000000000..4e149aea5b
--- /dev/null
+++ b/packages/zscaler/0.5.1/data_stream/zia/sample_event.json
@@ -0,0 +1,148 @@
+{
+ "@timestamp": "2016-01-29T06:09:59.000Z",
+ "agent": {
+ "ephemeral_id": "6ff67be5-c9ec-45fc-98f2-8394229007a7",
+ "id": "4e3f135a-d5f9-40b6-ae01-2c834ecbead0",
+ "name": "docker-fleet-agent",
+ "type": "filebeat",
+ "version": "8.0.0"
+ },
+ "data_stream": {
+ "dataset": "zscaler.zia",
+ "namespace": "ep",
+ "type": "logs"
+ },
+ "destination": {
+ "bytes": 1803,
+ "ip": [
+ "10.206.191.17"
+ ]
+ },
+ "ecs": {
+ "version": "1.12.0"
+ },
+ "elastic_agent": {
+ "id": "4e3f135a-d5f9-40b6-ae01-2c834ecbead0",
+ "snapshot": true,
+ "version": "8.0.0"
+ },
+ "event": {
+ "action": "Blocked",
+ "agent_id_status": "verified",
+ "code": "litesse",
+ "dataset": "zscaler.zia",
+ "ingested": "2022-01-25T13:13:54Z",
+ "timezone": "+00:00"
+ },
+ "file": {
+ "type": "psa"
+ },
+ "host": {
+ "name": "rci737.www5.example"
+ },
+ "http": {
+ "request": {
+ "referrer": "https://internal.example.org/sequa/abo.gif?umqui=reeufugi#mdolo"
+ }
+ },
+ "input": {
+ "type": "udp"
+ },
+ "log": {
+ "source": {
+ "address": "172.30.0.4:56583"
+ }
+ },
+ "network": {
+ "bytes": 3942,
+ "protocol": "tcp"
+ },
+ "observer": {
+ "product": "Internet",
+ "type": "Configuration",
+ "vendor": "Zscaler"
+ },
+ "related": {
+ "hosts": [
+ "rci737.www5.example"
+ ],
+ "ip": [
+ "10.206.191.17",
+ "10.176.10.114"
+ ],
+ "user": [
+ "sumdo"
+ ]
+ },
+ "rsa": {
+ "db": {
+ "index": "ntsunti"
+ },
+ "identity": {
+ "user_dept": "sperna"
+ },
+ "internal": {
+ "data": "iusm",
+ "messageid": "ZSCALERNSS_1"
+ },
+ "investigations": {
+ "ec_activity": "Deny",
+ "ec_subject": "User",
+ "ec_theme": "Communication",
+ "event_vcat": "ntium"
+ },
+ "misc": {
+ "action": [
+ "pisciv",
+ "Blocked"
+ ],
+ "category": "umq",
+ "filter": "oremi",
+ "reference_id": "litesse",
+ "result": "failure",
+ "result_code": "sist"
+ },
+ "network": {
+ "alias_host": [
+ "rci737.www5.example"
+ ]
+ },
+ "threat": {
+ "threat_category": "cer"
+ },
+ "time": {
+ "event_time": "2016-01-29T06:09:59.000Z",
+ "timezone": "GMT+02:00"
+ },
+ "web": {
+ "fqdn": "rci737.www5.example"
+ }
+ },
+ "source": {
+ "bytes": 1884,
+ "ip": [
+ "10.176.10.114"
+ ]
+ },
+ "tags": [
+ "zscaler-zia",
+ "forwarded"
+ ],
+ "url": {
+ "original": "https://api.example.com/ivelitse/ritin.htm?utl=vol#amremap"
+ },
+ "user": {
+ "name": "sumdo"
+ },
+ "user_agent": {
+ "device": {
+ "name": "Generic Smartphone"
+ },
+ "name": "Opera Mini",
+ "original": "Opera/9.80 (Series 60; Opera Mini/7.1.32444/174.101; U; ru) Presto/2.12.423 Version/12.16",
+ "os": {
+ "name": "Symbian OS"
+ },
+ "version": "7.1.32444"
+ }
+}
\ No newline at end of file
diff --git a/packages/zscaler/0.5.1/docs/README.md b/packages/zscaler/0.5.1/docs/README.md
new file mode 100755
index 0000000000..6317040b06
--- /dev/null
+++ b/packages/zscaler/0.5.1/docs/README.md
@@ -0,0 +1,798 @@
+# Zscaler integration (Deprecated)
+
+_This integration is deprecated. Please migrate to the Zscaler ZIA integration._
+
+This integration is for Zscaler device's logs. It includes the following
+datasets for receiving logs over syslog or read from a file:
+- `zia` dataset: supports Zscaler NSS logs.
+
+### Zia
+
+The `zia` dataset collects Zscaler NSS logs.
+
+**Exported fields**
+
+| Field | Description | Type |
+|---|---|---|
+| @timestamp | Date/time when the event originated. This is the date/time extracted from the event, typically representing when the event was generated by the source. If the event source has no original timestamp, this value is typically populated by the first time the event was received by the pipeline. Required field for all events. | date |
+| container.id | Unique container id. | keyword |
+| data_stream.dataset | Data stream dataset. | constant_keyword |
+| data_stream.namespace | Data stream namespace. | constant_keyword |
+| data_stream.type | Data stream type. | constant_keyword |
+| destination.address | Some event destination addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| destination.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| destination.as.organization.name | Organization name. | keyword |
+| destination.bytes | Bytes sent from the destination to the source. | long |
+| destination.domain | Destination domain. | keyword |
+| destination.geo.city_name | City name. | keyword |
+| destination.geo.country_name | Country name. | keyword |
+| destination.geo.location.lat | | double |
+| destination.geo.location.lon | | double |
+| destination.ip | IP address of the destination (IPv4 or IPv6). | ip |
+| destination.mac | MAC address of the destination. | keyword |
+| destination.nat.ip | Translated ip of destination based NAT sessions (e.g. internet to private DMZ) Typically used with load balancers, firewalls, or routers. | ip |
+| destination.nat.port | Port the source session is translated to by NAT Device. Typically used with load balancers, firewalls, or routers. | long |
+| destination.port | Port of the destination. | long |
+| dns.answers.name | The domain name to which this resource record pertains. If a chain of CNAME is being resolved, each answer's `name` should be the one that corresponds with the answer's `data`. It should not simply be the original `question.name` repeated. | keyword |
+| dns.answers.type | The type of data contained in this resource record. | keyword |
+| dns.question.type | The type of record being queried. | keyword |
+| error.message | Error message. | text |
+| event.action | The action captured by the event. This describes the information in the event. It is more specific than `event.category`. Examples are `group-add`, `process-started`, `file-created`. The value is normally defined by the implementer. | keyword |
+| event.code | Identification code for this event, if one exists. Some event sources use event codes to identify messages unambiguously, regardless of message language or wording adjustments over time. An example of this is the Windows Event ID. | keyword |
+| event.ingested | Timestamp when an event arrived in the central data store. This is different from `@timestamp`, which is when the event originally occurred. It's also different from `event.created`, which is meant to capture the first time an agent saw the event. In normal conditions, assuming no tampering, the timestamps should chronologically look like this: `@timestamp` < `event.created` < `event.ingested`. | date |
+| event.original | Raw text message of entire event. Used to demonstrate log integrity. This field is not indexed and doc_values are disabled. It cannot be searched, but it can be retrieved from `_source`. | keyword |
+| event.outcome | This is one of four ECS Categorization Fields, and indicates the lowest level in the ECS category hierarchy. `event.outcome` simply denotes whether the event represents a success or a failure from the perspective of the entity that produced the event. Note that when a single transaction is described in multiple events, each event may populate different values of `event.outcome`, according to their perspective. Also note that in the case of a compound event (a single event that contains multiple logical events), this field should be populated with the value that best captures the overall success or failure from the perspective of the event producer. Further note that not all events will have an associated outcome. For example, this field is generally not populated for metric events, events with `event.type:info`, or any events for which an outcome does not make logical sense. | keyword |
+| event.timezone | This field should be populated when the event's timestamp does not include timezone information already (e.g. default Syslog timestamps). It's optional otherwise. Acceptable timezone formats are: a canonical ID (e.g. "Europe/Amsterdam"), abbreviated (e.g. "EST") or an HH:mm differential (e.g. "-05:00"). | keyword |
+| file.attributes | Array of file attributes. Attributes names will vary by platform. Here's a non-exhaustive list of values that are expected in this field: archive, compressed, directory, encrypted, execute, hidden, read, readonly, system, write. | keyword |
+| file.directory | Directory where the file is located. It should include the drive letter, when appropriate. | keyword |
+| file.extension | File extension. | keyword |
+| file.name | Name of the file including the extension, without the directory. | keyword |
+| file.path | Full path to the file, including the file name. It should include the drive letter, when appropriate. | keyword |
+| file.size | File size in bytes. Only relevant when `file.type` is "file". | long |
+| file.type | File type (file, dir, or symlink). | keyword |
+| geo.city_name | City name. | keyword |
+| geo.country_name | Country name. | keyword |
+| geo.name | User-defined description of a location, at the level of granularity they care about. Could be the name of their data centers, the floor number, if this describes a local physical entity, city names. Not typically used in automated geolocation. | keyword |
+| geo.region_name | Region name. | keyword |
+| group.id | Unique identifier for the group on the system/platform. | keyword |
+| group.name | Name of the group. | keyword |
+| host.hostname | Hostname of the host. It normally contains what the `hostname` command returns on the host machine. | keyword |
+| host.ip | Host ip addresses. | ip |
+| host.mac | Host mac addresses. | keyword |
+| host.name | Name of the host. It can contain what `hostname` returns on Unix systems, the fully qualified domain name, or a name specified by the user. The sender decides which value to use. | keyword |
+| http.request.method | HTTP request method. Prior to ECS 1.6.0 the following guidance was provided: "The field value must be normalized to lowercase for querying." As of ECS 1.6.0, the guidance is deprecated because the original case of the method may be useful in anomaly detection. Original case will be mandated in ECS 2.0.0 | keyword |
+| http.request.referrer | Referrer for this HTTP request. | keyword |
+| input.type | Type of Filebeat input. | keyword |
+| log.file.path | Full path to the log file this event came from. | keyword |
+| log.flags | Flags for the log file. | keyword |
+| log.level | Original log level of the log event. If the source of the event provides a log level or textual severity, this is the one that goes in `log.level`. If your source doesn't specify one, you may put your event transport's severity here (e.g. Syslog severity). Some examples are `warn`, `err`, `i`, `informational`. | keyword |
+| log.offset | Offset of the entry in the log file. | long |
+| log.original | This is the original log message and contains the full log message before splitting it up in multiple parts. In contrast to the `message` field which can contain an extracted part of the log message, this field contains the original, full log message. It can have already some modifications applied like encoding or new lines removed to clean up the log message. This field is not indexed and doc_values are disabled so it can't be queried but the value can be retrieved from `_source`. | keyword |
+| log.source.address | Source address from which the log event was read / sent from. | keyword |
+| log.syslog.facility.code | The Syslog numeric facility of the log event, if available. According to RFCs 5424 and 3164, this value should be an integer between 0 and 23. | long |
+| log.syslog.priority | Syslog numeric priority of the event, if available. According to RFCs 5424 and 3164, the priority is 8 * facility + severity. This number is therefore expected to contain a value between 0 and 191. | long |
+| log.syslog.severity.code | The Syslog numeric severity of the log event, if available. If the event source publishing via Syslog provides a different numeric severity value (e.g. firewall, IDS), your source's numeric severity should go to `event.severity`. If the event source does not specify a distinct severity, you can optionally copy the Syslog severity to `event.severity`. | long |
+| message | For log events the message field contains the log message, optimized for viewing in a log viewer. For structured logs without an original message field, other fields can be concatenated to form a human-readable summary of the event. If multiple messages exist, they can be combined into one message. | text |
+| network.application | A name given to an application level protocol. This can be arbitrarily assigned for things like microservices, but also apply to things like skype, icq, facebook, twitter. This would be used in situations where the vendor or service can be decoded such as from the source/dest IP owners, ports, or wire format. The field value must be normalized to lowercase for querying. See the documentation section "Implementing ECS". | keyword |
+| network.bytes | Total bytes transferred in both directions. If `source.bytes` and `destination.bytes` are known, `network.bytes` is their sum. | long |
+| network.direction | Direction of the network traffic. Recommended values are: * inbound * outbound * internal * external * unknown When mapping events from a host-based monitoring context, populate this field from the host's point of view. When mapping events from a network or perimeter-based monitoring context, populate this field from the point of view of your network perimeter. | keyword |
+| network.forwarded_ip | Host IP address when the source IP address is the proxy. | ip |
+| network.interface.name | | keyword |
+| network.packets | Total packets transferred in both directions. If `source.packets` and `destination.packets` are known, `network.packets` is their sum. | long |
+| network.protocol | L7 Network protocol name. ex. http, lumberjack, transport protocol. The field value must be normalized to lowercase for querying. See the documentation section "Implementing ECS". | keyword |
+| observer.egress.interface.name | Interface name as reported by the system. | keyword |
+| observer.ingress.interface.name | Interface name as reported by the system. | keyword |
+| observer.product | The product name of the observer. | keyword |
+| observer.type | The type of the observer the data is coming from. There is no predefined list of observer types. Some examples are `forwarder`, `firewall`, `ids`, `ips`, `proxy`, `poller`, `sensor`, `APM server`. | keyword |
+| observer.vendor | Vendor name of the observer. | keyword |
+| observer.version | Observer version. | keyword |
+| process.name | Process name. Sometimes called program name or similar. | keyword |
+| process.parent.name | Process name. Sometimes called program name or similar. | keyword |
+| process.parent.title | Process title. The proctitle, some times the same as process name. Can also be different: for example a browser setting its title to the web page currently opened. | keyword |
+| process.pid | Process id. | long |
+| process.ppid | Parent process' pid. | long |
+| process.title | Process title. The proctitle, some times the same as process name. Can also be different: for example a browser setting its title to the web page currently opened. | keyword |
+| related.ip | All of the IPs seen on your event. | ip |
+| related.user | All the user names seen on your event. | keyword |
+| rsa.counters.dclass_c1 | This is a generic counter key that should be used with the label dclass.c1.str only | long |
+| rsa.counters.dclass_c1_str | This is a generic counter string key that should be used with the label dclass.c1 only | keyword |
+| rsa.counters.dclass_c2 | This is a generic counter key that should be used with the label dclass.c2.str only | long |
+| rsa.counters.dclass_c2_str | This is a generic counter string key that should be used with the label dclass.c2 only | keyword |
+| rsa.counters.dclass_c3 | This is a generic counter key that should be used with the label dclass.c3.str only | long |
+| rsa.counters.dclass_c3_str | This is a generic counter string key that should be used with the label dclass.c3 only | keyword |
+| rsa.counters.dclass_r1 | This is a generic ratio key that should be used with the label dclass.r1.str only | keyword |
+| rsa.counters.dclass_r1_str | This is a generic ratio string key that should be used with the label dclass.r1 only | keyword |
+| rsa.counters.dclass_r2 | This is a generic ratio key that should be used with the label dclass.r2.str only | keyword |
+| rsa.counters.dclass_r2_str | This is a generic ratio string key that should be used with the label dclass.r2 only | keyword |
+| rsa.counters.dclass_r3 | This is a generic ratio key that should be used with the label dclass.r3.str only | keyword |
+| rsa.counters.dclass_r3_str | This is a generic ratio string key that should be used with the label dclass.r3 only | keyword |
+| rsa.counters.event_counter | This is used to capture the number of times an event repeated | long |
+| rsa.crypto.cert_ca | This key is used to capture the Certificate signing authority only | keyword |
+| rsa.crypto.cert_checksum | | keyword |
+| rsa.crypto.cert_common | This key is used to capture the Certificate common name only | keyword |
+| rsa.crypto.cert_error | This key captures the Certificate Error String | keyword |
+| rsa.crypto.cert_host_cat | This key is used for the hostname category value of a certificate | keyword |
+| rsa.crypto.cert_host_name | Deprecated key defined only in table map. | keyword |
+| rsa.crypto.cert_issuer | | keyword |
+| rsa.crypto.cert_keysize | | keyword |
+| rsa.crypto.cert_serial | This key is used to capture the Certificate serial number only | keyword |
+| rsa.crypto.cert_status | This key captures Certificate validation status | keyword |
+| rsa.crypto.cert_subject | This key is used to capture the Certificate organization only | keyword |
+| rsa.crypto.cert_username | | keyword |
+| rsa.crypto.cipher_dst | This key is for Destination (Server) Cipher | keyword |
+| rsa.crypto.cipher_size_dst | This key captures Destination (Server) Cipher Size | long |
+| rsa.crypto.cipher_size_src | This key captures Source (Client) Cipher Size | long |
+| rsa.crypto.cipher_src | This key is for Source (Client) Cipher | keyword |
+| rsa.crypto.crypto | This key is used to capture the Encryption Type or Encryption Key only | keyword |
+| rsa.crypto.d_certauth | | keyword |
+| rsa.crypto.https_insact | | keyword |
+| rsa.crypto.https_valid | | keyword |
+| rsa.crypto.ike | IKE negotiation phase. | keyword |
+| rsa.crypto.ike_cookie1 | ID of the negotiation — sent for ISAKMP Phase One | keyword |
+| rsa.crypto.ike_cookie2 | ID of the negotiation — sent for ISAKMP Phase Two | keyword |
+| rsa.crypto.peer | This key is for Encryption peer's IP Address | keyword |
+| rsa.crypto.peer_id | This key is for Encryption peer’s identity | keyword |
+| rsa.crypto.s_certauth | | keyword |
+| rsa.crypto.scheme | This key captures the Encryption scheme used | keyword |
+| rsa.crypto.sig_type | This key captures the Signature Type | keyword |
+| rsa.crypto.ssl_ver_dst | Deprecated, use version | keyword |
+| rsa.crypto.ssl_ver_src | Deprecated, use version | keyword |
+| rsa.db.database | This key is used to capture the name of a database or an instance as seen in a session | keyword |
+| rsa.db.db_id | This key is used to capture the unique identifier for a database | keyword |
+| rsa.db.db_pid | This key captures the process id of a connection with database server | long |
+| rsa.db.index | This key captures IndexID of the index. | keyword |
+| rsa.db.instance | This key is used to capture the database server instance name | keyword |
+| rsa.db.lread | This key is used for the number of logical reads | long |
+| rsa.db.lwrite | This key is used for the number of logical writes | long |
+| rsa.db.permissions | This key captures permission or privilege level assigned to a resource. | keyword |
+| rsa.db.pread | This key is used for the number of physical writes | long |
+| rsa.db.table_name | This key is used to capture the table name | keyword |
+| rsa.db.transact_id | This key captures the SQL transantion ID of the current session | keyword |
+| rsa.email.email | This key is used to capture a generic email address where the source or destination context is not clear | keyword |
+| rsa.email.email_dst | This key is used to capture the Destination email address only, when the destination context is not clear use email | keyword |
+| rsa.email.email_src | This key is used to capture the source email address only, when the source context is not clear use email | keyword |
+| rsa.email.subject | This key is used to capture the subject string from an Email only. | keyword |
+| rsa.email.trans_from | Deprecated key defined only in table map. | keyword |
+| rsa.email.trans_to | Deprecated key defined only in table map. | keyword |
+| rsa.endpoint.host_state | This key is used to capture the current state of the machine, such as blacklisted, infected, firewall disabled and so on | keyword |
+| rsa.endpoint.registry_key | This key captures the path to the registry key | keyword |
+| rsa.endpoint.registry_value | This key captures values or decorators used within a registry entry | keyword |
+| rsa.file.attachment | This key captures the attachment file name | keyword |
+| rsa.file.binary | Deprecated key defined only in table map. | keyword |
+| rsa.file.directory_dst | This key is used to capture the directory of the target process or file | keyword |
+| rsa.file.directory_src | This key is used to capture the directory of the source process or file | keyword |
+| rsa.file.file_entropy | This is used to capture entropy vale of a file | double |
+| rsa.file.file_vendor | This is used to capture Company name of file located in version_info | keyword |
+| rsa.file.filename_dst | This is used to capture name of the file targeted by the action | keyword |
+| rsa.file.filename_src | This is used to capture name of the parent filename, the file which performed the action | keyword |
+| rsa.file.filename_tmp | | keyword |
+| rsa.file.filesystem | | keyword |
+| rsa.file.privilege | Deprecated, use permissions | keyword |
+| rsa.file.task_name | This is used to capture name of the task | keyword |
+| rsa.healthcare.patient_fname | This key is for First Names only, this is used for Healthcare predominantly to capture Patients information | keyword |
+| rsa.healthcare.patient_id | This key captures the unique ID for a patient | keyword |
+| rsa.healthcare.patient_lname | This key is for Last Names only, this is used for Healthcare predominantly to capture Patients information | keyword |
+| rsa.healthcare.patient_mname | This key is for Middle Names only, this is used for Healthcare predominantly to capture Patients information | keyword |
+| rsa.identity.accesses | This key is used to capture actual privileges used in accessing an object | keyword |
+| rsa.identity.auth_method | This key is used to capture authentication methods used only | keyword |
+| rsa.identity.dn | X.500 (LDAP) Distinguished Name | keyword |
+| rsa.identity.dn_dst | An X.500 (LDAP) Distinguished name that used in a context that indicates a Destination dn | keyword |
+| rsa.identity.dn_src | An X.500 (LDAP) Distinguished name that is used in a context that indicates a Source dn | keyword |
+| rsa.identity.federated_idp | This key is the federated Identity Provider. This is the server providing the authentication. | keyword |
+| rsa.identity.federated_sp | This key is the Federated Service Provider. This is the application requesting authentication. | keyword |
+| rsa.identity.firstname | This key is for First Names only, this is used for Healthcare predominantly to capture Patients information | keyword |
+| rsa.identity.host_role | This key should only be used to capture the role of a Host Machine | keyword |
+| rsa.identity.lastname | This key is for Last Names only, this is used for Healthcare predominantly to capture Patients information | keyword |
+| rsa.identity.ldap | This key is for Uninterpreted LDAP values. Ldap Values that don’t have a clear query or response context | keyword |
+| rsa.identity.ldap_query | This key is the Search criteria from an LDAP search | keyword |
+| rsa.identity.ldap_response | This key is to capture Results from an LDAP search | keyword |
+| rsa.identity.logon_type | This key is used to capture the type of logon method used. | keyword |
+| rsa.identity.logon_type_desc | This key is used to capture the textual description of an integer logon type as stored in the meta key 'logon.type'. | keyword |
+| rsa.identity.middlename | This key is for Middle Names only, this is used for Healthcare predominantly to capture Patients information | keyword |
+| rsa.identity.org | This key captures the User organization | keyword |
+| rsa.identity.owner | This is used to capture username the process or service is running as, the author of the task | keyword |
+| rsa.identity.password | This key is for Passwords seen in any session, plain text or encrypted | keyword |
+| rsa.identity.profile | This key is used to capture the user profile | keyword |
+| rsa.identity.realm | Radius realm or similar grouping of accounts | keyword |
+| rsa.identity.service_account | This key is a windows specific key, used for capturing name of the account a service (referenced in the event) is running under. Legacy Usage | keyword |
+| rsa.identity.user_dept | User's Department Names only | keyword |
+| rsa.identity.user_role | This key is used to capture the Role of a user only | keyword |
+| rsa.identity.user_sid_dst | This key captures Destination User Session ID | keyword |
+| rsa.identity.user_sid_src | This key captures Source User Session ID | keyword |
+| rsa.internal.audit_class | Deprecated key defined only in table map. | keyword |
+| rsa.internal.cid | This is the unique identifier used to identify a NetWitness Concentrator. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.data | Deprecated key defined only in table map. | keyword |
+| rsa.internal.dead | Deprecated key defined only in table map. | long |
+| rsa.internal.device_class | This is the Classification of the Log Event Source under a predefined fixed set of Event Source Classifications. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.device_group | This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.device_host | This is the Hostname of the log Event Source sending the logs to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.device_ip | This is the IPv4 address of the Log Event Source sending the logs to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | ip |
+| rsa.internal.device_ipv6 | This is the IPv6 address of the Log Event Source sending the logs to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | ip |
+| rsa.internal.device_type | This is the name of the log parser which parsed a given session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.device_type_id | Deprecated key defined only in table map. | long |
+| rsa.internal.did | This is the unique identifier used to identify a NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.entropy_req | This key is only used by the Entropy Parser, the Meta Type can be either UInt16 or Float32 based on the configuration | long |
+| rsa.internal.entropy_res | This key is only used by the Entropy Parser, the Meta Type can be either UInt16 or Float32 based on the configuration | long |
+| rsa.internal.entry | Deprecated key defined only in table map. | keyword |
+| rsa.internal.event_desc | | keyword |
+| rsa.internal.event_name | Deprecated key defined only in table map. | keyword |
+| rsa.internal.feed_category | This is used to capture the category of the feed. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.feed_desc | This is used to capture the description of the feed. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.feed_name | This is used to capture the name of the feed. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.forward_ip | This key should be used to capture the IPV4 address of a relay system which forwarded the events from the original system to NetWitness. | ip |
+| rsa.internal.forward_ipv6 | This key is used to capture the IPV6 address of a relay system which forwarded the events from the original system to NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | ip |
+| rsa.internal.hcode | Deprecated key defined only in table map. | keyword |
+| rsa.internal.header_id | This is the Header ID value that identifies the exact log parser header definition that parses a particular log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.inode | Deprecated key defined only in table map. | long |
+| rsa.internal.lc_cid | This is a unique Identifier of a Log Collector. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.lc_ctime | This is the time at which a log is collected in a NetWitness Log Collector. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | date |
+| rsa.internal.level | Deprecated key defined only in table map. | long |
+| rsa.internal.mcb_req | This key is only used by the Entropy Parser, the most common byte request is simply which byte for each side (0 thru 255) was seen the most | long |
+| rsa.internal.mcb_res | This key is only used by the Entropy Parser, the most common byte response is simply which byte for each side (0 thru 255) was seen the most | long |
+| rsa.internal.mcbc_req | This key is only used by the Entropy Parser, the most common byte count is the number of times the most common byte (above) was seen in the session streams | long |
+| rsa.internal.mcbc_res | This key is only used by the Entropy Parser, the most common byte count is the number of times the most common byte (above) was seen in the session streams | long |
+| rsa.internal.medium | This key is used to identify if it’s a log/packet session or Layer 2 Encapsulation Type. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness. 32 = log, 33 = correlation session, < 32 is packet session | long |
+| rsa.internal.message | This key captures the contents of instant messages | keyword |
+| rsa.internal.messageid | | keyword |
+| rsa.internal.msg | This key is used to capture the raw message that comes into the Log Decoder | keyword |
+| rsa.internal.msg_id | This is the Message ID1 value that identifies the exact log parser definition which parses a particular log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.msg_vid | This is the Message ID2 value that identifies the exact log parser definition which parses a particular log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.node_name | Deprecated key defined only in table map. | keyword |
+| rsa.internal.nwe_callback_id | This key denotes that event is endpoint related | keyword |
+| rsa.internal.obj_id | Deprecated key defined only in table map. | keyword |
+| rsa.internal.obj_server | Deprecated key defined only in table map. | keyword |
+| rsa.internal.obj_val | Deprecated key defined only in table map. | keyword |
+| rsa.internal.parse_error | This is a special key that stores any Meta key validation error found while parsing a log session. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.payload_req | This key is only used by the Entropy Parser, the payload size metrics are the payload sizes of each session side at the time of parsing. However, in order to keep | long |
+| rsa.internal.payload_res | This key is only used by the Entropy Parser, the payload size metrics are the payload sizes of each session side at the time of parsing. However, in order to keep | long |
+| rsa.internal.process_vid_dst | Endpoint generates and uses a unique virtual ID to identify any similar group of process. This ID represents the target process. | keyword |
+| rsa.internal.process_vid_src | Endpoint generates and uses a unique virtual ID to identify any similar group of process. This ID represents the source process. | keyword |
+| rsa.internal.resource | Deprecated key defined only in table map. | keyword |
+| rsa.internal.resource_class | Deprecated key defined only in table map. | keyword |
+| rsa.internal.rid | This is a special ID of the Remote Session created by NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | long |
+| rsa.internal.session_split | This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.site | Deprecated key defined only in table map. | keyword |
+| rsa.internal.size | This is the size of the session as seen by the NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | long |
+| rsa.internal.sourcefile | This is the name of the log file or PCAPs that can be imported into NetWitness. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.internal.statement | Deprecated key defined only in table map. | keyword |
+| rsa.internal.time | This is the time at which a session hits a NetWitness Decoder. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness. | date |
+| rsa.internal.ubc_req | This key is only used by the Entropy Parser, Unique byte count is the number of unique bytes seen in each stream. 256 would mean all byte values of 0 thru 255 were seen at least once | long |
+| rsa.internal.ubc_res | This key is only used by the Entropy Parser, Unique byte count is the number of unique bytes seen in each stream. 256 would mean all byte values of 0 thru 255 were seen at least once | long |
+| rsa.internal.word | This is used by the Word Parsing technology to capture the first 5 character of every word in an unparsed log | keyword |
+| rsa.investigations.analysis_file | This is used to capture all indicators used in a File Analysis. This key should be used to capture an analysis of a file | keyword |
+| rsa.investigations.analysis_service | This is used to capture all indicators used in a Service Analysis. This key should be used to capture an analysis of a service | keyword |
+| rsa.investigations.analysis_session | This is used to capture all indicators used for a Session Analysis. This key should be used to capture an analysis of a session | keyword |
+| rsa.investigations.boc | This is used to capture behaviour of compromise | keyword |
+| rsa.investigations.ec_activity | This key captures the particular event activity(Ex:Logoff) | keyword |
+| rsa.investigations.ec_outcome | This key captures the outcome of a particular Event(Ex:Success) | keyword |
+| rsa.investigations.ec_subject | This key captures the Subject of a particular Event(Ex:User) | keyword |
+| rsa.investigations.ec_theme | This key captures the Theme of a particular Event(Ex:Authentication) | keyword |
+| rsa.investigations.eoc | This is used to capture Enablers of Compromise | keyword |
+| rsa.investigations.event_cat | This key captures the Event category number | long |
+| rsa.investigations.event_cat_name | This key captures the event category name corresponding to the event cat code | keyword |
+| rsa.investigations.event_vcat | This is a vendor supplied category. This should be used in situations where the vendor has adopted their own event_category taxonomy. | keyword |
+| rsa.investigations.inv_category | This used to capture investigation category | keyword |
+| rsa.investigations.inv_context | This used to capture investigation context | keyword |
+| rsa.investigations.ioc | This is key capture indicator of compromise | keyword |
+| rsa.misc.OS | This key captures the Name of the Operating System | keyword |
+| rsa.misc.acl_id | | keyword |
+| rsa.misc.acl_op | | keyword |
+| rsa.misc.acl_pos | | keyword |
+| rsa.misc.acl_table | | keyword |
+| rsa.misc.action | | keyword |
+| rsa.misc.admin | | keyword |
+| rsa.misc.agent_id | This key is used to capture agent id | keyword |
+| rsa.misc.alarm_id | | keyword |
+| rsa.misc.alarmname | | keyword |
+| rsa.misc.alert_id | Deprecated, New Hunting Model (inv.*, ioc, boc, eoc, analysis.*) | keyword |
+| rsa.misc.app_id | | keyword |
+| rsa.misc.audit | | keyword |
+| rsa.misc.audit_object | | keyword |
+| rsa.misc.auditdata | | keyword |
+| rsa.misc.autorun_type | This is used to capture Auto Run type | keyword |
+| rsa.misc.benchmark | | keyword |
+| rsa.misc.bypass | | keyword |
+| rsa.misc.cache | | keyword |
+| rsa.misc.cache_hit | | keyword |
+| rsa.misc.category | This key is used to capture the category of an event given by the vendor in the session | keyword |
+| rsa.misc.cc_number | Valid Credit Card Numbers only | long |
+| rsa.misc.cefversion | | keyword |
+| rsa.misc.cfg_attr | | keyword |
+| rsa.misc.cfg_obj | | keyword |
+| rsa.misc.cfg_path | | keyword |
+| rsa.misc.change_attrib | This key is used to capture the name of the attribute that’s changing in a session | keyword |
+| rsa.misc.change_new | This key is used to capture the new values of the attribute that’s changing in a session | keyword |
+| rsa.misc.change_old | This key is used to capture the old value of the attribute that’s changing in a session | keyword |
+| rsa.misc.changes | | keyword |
+| rsa.misc.checksum | This key is used to capture the checksum or hash of the entity such as a file or process. Checksum should be used over checksum.src or checksum.dst when it is unclear whether the entity is a source or target of an action. | keyword |
+| rsa.misc.checksum_dst | This key is used to capture the checksum or hash of the the target entity such as a process or file. | keyword |
+| rsa.misc.checksum_src | This key is used to capture the checksum or hash of the source entity such as a file or process. | keyword |
+| rsa.misc.client | This key is used to capture only the name of the client application requesting resources of the server. See the user.agent meta key for capture of the specific user agent identifier or browser identification string. | keyword |
+| rsa.misc.client_ip | | keyword |
+| rsa.misc.clustermembers | | keyword |
+| rsa.misc.cmd | | keyword |
+| rsa.misc.cn_acttimeout | | keyword |
+| rsa.misc.cn_asn_src | | keyword |
+| rsa.misc.cn_bgpv4nxthop | | keyword |
+| rsa.misc.cn_ctr_dst_code | | keyword |
+| rsa.misc.cn_dst_tos | | keyword |
+| rsa.misc.cn_dst_vlan | | keyword |
+| rsa.misc.cn_engine_id | | keyword |
+| rsa.misc.cn_engine_type | | keyword |
+| rsa.misc.cn_f_switch | | keyword |
+| rsa.misc.cn_flowsampid | | keyword |
+| rsa.misc.cn_flowsampintv | | keyword |
+| rsa.misc.cn_flowsampmode | | keyword |
+| rsa.misc.cn_inacttimeout | | keyword |
+| rsa.misc.cn_inpermbyts | | keyword |
+| rsa.misc.cn_inpermpckts | | keyword |
+| rsa.misc.cn_invalid | | keyword |
+| rsa.misc.cn_ip_proto_ver | | keyword |
+| rsa.misc.cn_ipv4_ident | | keyword |
+| rsa.misc.cn_l_switch | | keyword |
+| rsa.misc.cn_log_did | | keyword |
+| rsa.misc.cn_log_rid | | keyword |
+| rsa.misc.cn_max_ttl | | keyword |
+| rsa.misc.cn_maxpcktlen | | keyword |
+| rsa.misc.cn_min_ttl | | keyword |
+| rsa.misc.cn_minpcktlen | | keyword |
+| rsa.misc.cn_mpls_lbl_1 | | keyword |
+| rsa.misc.cn_mpls_lbl_10 | | keyword |
+| rsa.misc.cn_mpls_lbl_2 | | keyword |
+| rsa.misc.cn_mpls_lbl_3 | | keyword |
+| rsa.misc.cn_mpls_lbl_4 | | keyword |
+| rsa.misc.cn_mpls_lbl_5 | | keyword |
+| rsa.misc.cn_mpls_lbl_6 | | keyword |
+| rsa.misc.cn_mpls_lbl_7 | | keyword |
+| rsa.misc.cn_mpls_lbl_8 | | keyword |
+| rsa.misc.cn_mpls_lbl_9 | | keyword |
+| rsa.misc.cn_mplstoplabel | | keyword |
+| rsa.misc.cn_mplstoplabip | | keyword |
+| rsa.misc.cn_mul_dst_byt | | keyword |
+| rsa.misc.cn_mul_dst_pks | | keyword |
+| rsa.misc.cn_muligmptype | | keyword |
+| rsa.misc.cn_sampalgo | | keyword |
+| rsa.misc.cn_sampint | | keyword |
+| rsa.misc.cn_seqctr | | keyword |
+| rsa.misc.cn_spackets | | keyword |
+| rsa.misc.cn_src_tos | | keyword |
+| rsa.misc.cn_src_vlan | | keyword |
+| rsa.misc.cn_sysuptime | | keyword |
+| rsa.misc.cn_template_id | | keyword |
+| rsa.misc.cn_totbytsexp | | keyword |
+| rsa.misc.cn_totflowexp | | keyword |
+| rsa.misc.cn_totpcktsexp | | keyword |
+| rsa.misc.cn_unixnanosecs | | keyword |
+| rsa.misc.cn_v6flowlabel | | keyword |
+| rsa.misc.cn_v6optheaders | | keyword |
+| rsa.misc.code | | keyword |
+| rsa.misc.command | | keyword |
+| rsa.misc.comments | Comment information provided in the log message | keyword |
+| rsa.misc.comp_class | | keyword |
+| rsa.misc.comp_name | | keyword |
+| rsa.misc.comp_rbytes | | keyword |
+| rsa.misc.comp_sbytes | | keyword |
+| rsa.misc.comp_version | This key captures the Version level of a sub-component of a product. | keyword |
+| rsa.misc.connection_id | This key captures the Connection ID | keyword |
+| rsa.misc.content | This key captures the content type from protocol headers | keyword |
+| rsa.misc.content_type | This key is used to capture Content Type only. | keyword |
+| rsa.misc.content_version | This key captures Version level of a signature or database content. | keyword |
+| rsa.misc.context | This key captures Information which adds additional context to the event. | keyword |
+| rsa.misc.context_subject | This key is to be used in an audit context where the subject is the object being identified | keyword |
+| rsa.misc.context_target | | keyword |
+| rsa.misc.count | | keyword |
+| rsa.misc.cpu | This key is the CPU time used in the execution of the event being recorded. | long |
+| rsa.misc.cpu_data | | keyword |
+| rsa.misc.criticality | | keyword |
+| rsa.misc.cs_agency_dst | | keyword |
+| rsa.misc.cs_analyzedby | | keyword |
+| rsa.misc.cs_av_other | | keyword |
+| rsa.misc.cs_av_primary | | keyword |
+| rsa.misc.cs_av_secondary | | keyword |
+| rsa.misc.cs_bgpv6nxthop | | keyword |
+| rsa.misc.cs_bit9status | | keyword |
+| rsa.misc.cs_context | | keyword |
+| rsa.misc.cs_control | | keyword |
+| rsa.misc.cs_data | | keyword |
+| rsa.misc.cs_datecret | | keyword |
+| rsa.misc.cs_dst_tld | | keyword |
+| rsa.misc.cs_eth_dst_ven | | keyword |
+| rsa.misc.cs_eth_src_ven | | keyword |
+| rsa.misc.cs_event_uuid | | keyword |
+| rsa.misc.cs_filetype | | keyword |
+| rsa.misc.cs_fld | | keyword |
+| rsa.misc.cs_if_desc | | keyword |
+| rsa.misc.cs_if_name | | keyword |
+| rsa.misc.cs_ip_next_hop | | keyword |
+| rsa.misc.cs_ipv4dstpre | | keyword |
+| rsa.misc.cs_ipv4srcpre | | keyword |
+| rsa.misc.cs_lifetime | | keyword |
+| rsa.misc.cs_log_medium | | keyword |
+| rsa.misc.cs_loginname | | keyword |
+| rsa.misc.cs_modulescore | | keyword |
+| rsa.misc.cs_modulesign | | keyword |
+| rsa.misc.cs_opswatresult | | keyword |
+| rsa.misc.cs_payload | | keyword |
+| rsa.misc.cs_registrant | | keyword |
+| rsa.misc.cs_registrar | | keyword |
+| rsa.misc.cs_represult | | keyword |
+| rsa.misc.cs_rpayload | | keyword |
+| rsa.misc.cs_sampler_name | | keyword |
+| rsa.misc.cs_sourcemodule | | keyword |
+| rsa.misc.cs_streams | | keyword |
+| rsa.misc.cs_targetmodule | | keyword |
+| rsa.misc.cs_v6nxthop | | keyword |
+| rsa.misc.cs_whois_server | | keyword |
+| rsa.misc.cs_yararesult | | keyword |
+| rsa.misc.cve | This key captures CVE (Common Vulnerabilities and Exposures) - an identifier for known information security vulnerabilities. | keyword |
+| rsa.misc.data_type | | keyword |
+| rsa.misc.description | | keyword |
+| rsa.misc.device_name | This is used to capture name of the Device associated with the node Like: a physical disk, printer, etc | keyword |
+| rsa.misc.devvendor | | keyword |
+| rsa.misc.disposition | This key captures the The end state of an action. | keyword |
+| rsa.misc.distance | | keyword |
+| rsa.misc.doc_number | This key captures File Identification number | long |
+| rsa.misc.dstburb | | keyword |
+| rsa.misc.edomain | | keyword |
+| rsa.misc.edomaub | | keyword |
+| rsa.misc.ein_number | Employee Identification Numbers only | long |
+| rsa.misc.error | This key captures All non successful Error codes or responses | keyword |
+| rsa.misc.euid | | keyword |
+| rsa.misc.event_category | | keyword |
+| rsa.misc.event_computer | This key is a windows only concept, where this key is used to capture fully qualified domain name in a windows log. | keyword |
+| rsa.misc.event_desc | This key is used to capture a description of an event available directly or inferred | keyword |
+| rsa.misc.event_id | | keyword |
+| rsa.misc.event_log | This key captures the Name of the event log | keyword |
+| rsa.misc.event_source | This key captures Source of the event that’s not a hostname | keyword |
+| rsa.misc.event_state | This key captures the current state of the object/item referenced within the event. Describing an on-going event. | keyword |
+| rsa.misc.event_type | This key captures the event category type as specified by the event source. | keyword |
+| rsa.misc.event_user | This key is a windows only concept, where this key is used to capture combination of domain name and username in a windows log. | keyword |
+| rsa.misc.expected_val | This key captures the Value expected (from the perspective of the device generating the log). | keyword |
+| rsa.misc.facility | | keyword |
+| rsa.misc.facilityname | | keyword |
+| rsa.misc.fcatnum | This key captures Filter Category Number. Legacy Usage | keyword |
+| rsa.misc.filter | This key captures Filter used to reduce result set | keyword |
+| rsa.misc.finterface | | keyword |
+| rsa.misc.flags | | keyword |
+| rsa.misc.forensic_info | | keyword |
+| rsa.misc.found | This is used to capture the results of regex match | keyword |
+| rsa.misc.fresult | This key captures the Filter Result | long |
+| rsa.misc.gaddr | | keyword |
+| rsa.misc.group | This key captures the Group Name value | keyword |
+| rsa.misc.group_id | This key captures Group ID Number (related to the group name) | keyword |
+| rsa.misc.group_object | This key captures a collection/grouping of entities. Specific usage | keyword |
+| rsa.misc.hardware_id | This key is used to capture unique identifier for a device or system (NOT a Mac address) | keyword |
+| rsa.misc.id3 | | keyword |
+| rsa.misc.im_buddyid | | keyword |
+| rsa.misc.im_buddyname | | keyword |
+| rsa.misc.im_client | | keyword |
+| rsa.misc.im_croomid | | keyword |
+| rsa.misc.im_croomtype | | keyword |
+| rsa.misc.im_members | | keyword |
+| rsa.misc.im_userid | | keyword |
+| rsa.misc.im_username | | keyword |
+| rsa.misc.index | | keyword |
+| rsa.misc.inout | | keyword |
+| rsa.misc.ipkt | | keyword |
+| rsa.misc.ipscat | | keyword |
+| rsa.misc.ipspri | | keyword |
+| rsa.misc.job_num | This key captures the Job Number | keyword |
+| rsa.misc.jobname | | keyword |
+| rsa.misc.language | This is used to capture list of languages the client support and what it prefers | keyword |
+| rsa.misc.latitude | | keyword |
+| rsa.misc.library | This key is used to capture library information in mainframe devices | keyword |
+| rsa.misc.lifetime | This key is used to capture the session lifetime in seconds. | long |
+| rsa.misc.linenum | | keyword |
+| rsa.misc.link | This key is used to link the sessions together. This key should never be used to parse Meta data from a session (Logs/Packets) Directly, this is a Reserved key in NetWitness | keyword |
+| rsa.misc.list_name | | keyword |
+| rsa.misc.listnum | This key is used to capture listname or listnumber, primarily for collecting access-list | keyword |
+| rsa.misc.load_data | | keyword |
+| rsa.misc.location_floor | | keyword |
+| rsa.misc.location_mark | | keyword |
+| rsa.misc.log_id | | keyword |
+| rsa.misc.log_session_id | This key is used to capture a sessionid from the session directly | keyword |
+| rsa.misc.log_session_id1 | This key is used to capture a Linked (Related) Session ID from the session directly | keyword |
+| rsa.misc.log_type | | keyword |
+| rsa.misc.logid | | keyword |
+| rsa.misc.logip | | keyword |
+| rsa.misc.logname | | keyword |
+| rsa.misc.longitude | | keyword |
+| rsa.misc.lport | | keyword |
+| rsa.misc.mail_id | This key is used to capture the mailbox id/name | keyword |
+| rsa.misc.match | This key is for regex match name from search.ini | keyword |
+| rsa.misc.mbug_data | | keyword |
+| rsa.misc.message_body | This key captures the The contents of the message body. | keyword |
+| rsa.misc.misc | | keyword |
+| rsa.misc.misc_name | | keyword |
+| rsa.misc.mode | | keyword |
+| rsa.misc.msgIdPart1 | | keyword |
+| rsa.misc.msgIdPart2 | | keyword |
+| rsa.misc.msgIdPart3 | | keyword |
+| rsa.misc.msgIdPart4 | | keyword |
+| rsa.misc.msg_type | | keyword |
+| rsa.misc.msgid | | keyword |
+| rsa.misc.name | | keyword |
+| rsa.misc.netsessid | | keyword |
+| rsa.misc.node | Common use case is the node name within a cluster. The cluster name is reflected by the host name. | keyword |
+| rsa.misc.ntype | | keyword |
+| rsa.misc.num | | keyword |
+| rsa.misc.number | | keyword |
+| rsa.misc.number1 | | keyword |
+| rsa.misc.number2 | | keyword |
+| rsa.misc.nwwn | | keyword |
+| rsa.misc.obj_name | This is used to capture name of object | keyword |
+| rsa.misc.obj_type | This is used to capture type of object | keyword |
+| rsa.misc.object | | keyword |
+| rsa.misc.observed_val | This key captures the Value observed (from the perspective of the device generating the log). | keyword |
+| rsa.misc.operation | | keyword |
+| rsa.misc.operation_id | An alert number or operation number. The values should be unique and non-repeating. | keyword |
+| rsa.misc.opkt | | keyword |
+| rsa.misc.orig_from | | keyword |
+| rsa.misc.owner_id | | keyword |
+| rsa.misc.p_action | | keyword |
+| rsa.misc.p_filter | | keyword |
+| rsa.misc.p_group_object | | keyword |
+| rsa.misc.p_id | | keyword |
+| rsa.misc.p_msgid | | keyword |
+| rsa.misc.p_msgid1 | | keyword |
+| rsa.misc.p_msgid2 | | keyword |
+| rsa.misc.p_result1 | | keyword |
+| rsa.misc.param | This key is the parameters passed as part of a command or application, etc. | keyword |
+| rsa.misc.param_dst | This key captures the command line/launch argument of the target process or file | keyword |
+| rsa.misc.param_src | This key captures source parameter | keyword |
+| rsa.misc.parent_node | This key captures the Parent Node Name. Must be related to node variable. | keyword |
+| rsa.misc.password_chg | | keyword |
+| rsa.misc.password_expire | | keyword |
+| rsa.misc.payload_dst | This key is used to capture destination payload | keyword |
+| rsa.misc.payload_src | This key is used to capture source payload | keyword |
+| rsa.misc.permgranted | | keyword |
+| rsa.misc.permwanted | | keyword |
+| rsa.misc.pgid | | keyword |
+| rsa.misc.phone | | keyword |
+| rsa.misc.pid | | keyword |
+| rsa.misc.policy | | keyword |
+| rsa.misc.policyUUID | | keyword |
+| rsa.misc.policy_id | This key is used to capture the Policy ID only, this should be a numeric value, use policy.name otherwise | keyword |
+| rsa.misc.policy_name | This key is used to capture the Policy Name only. | keyword |
+| rsa.misc.policy_value | This key captures the contents of the policy. This contains details about the policy | keyword |
+| rsa.misc.policy_waiver | | keyword |
+| rsa.misc.pool_id | This key captures the identifier (typically numeric field) of a resource pool | keyword |
+| rsa.misc.pool_name | This key captures the name of a resource pool | keyword |
+| rsa.misc.port_name | This key is used for Physical or logical port connection but does NOT include a network port. (Example: Printer port name). | keyword |
+| rsa.misc.priority | | keyword |
+| rsa.misc.process_id_val | This key is a failure key for Process ID when it is not an integer value | keyword |
+| rsa.misc.prog_asp_num | | keyword |
+| rsa.misc.program | | keyword |
+| rsa.misc.real_data | | keyword |
+| rsa.misc.reason | | keyword |
+| rsa.misc.rec_asp_device | | keyword |
+| rsa.misc.rec_asp_num | | keyword |
+| rsa.misc.rec_library | | keyword |
+| rsa.misc.recordnum | | keyword |
+| rsa.misc.reference_id | This key is used to capture an event id from the session directly | keyword |
+| rsa.misc.reference_id1 | This key is for Linked ID to be used as an addition to "reference.id" | keyword |
+| rsa.misc.reference_id2 | This key is for the 2nd Linked ID. Can be either linked to "reference.id" or "reference.id1" value but should not be used unless the other two variables are in play. | keyword |
+| rsa.misc.result | This key is used to capture the outcome/result string value of an action in a session. | keyword |
+| rsa.misc.result_code | This key is used to capture the outcome/result numeric value of an action in a session | keyword |
+| rsa.misc.risk | This key captures the non-numeric risk value | keyword |
+| rsa.misc.risk_info | Deprecated, use New Hunting Model (inv.*, ioc, boc, eoc, analysis.*) | keyword |
+| rsa.misc.risk_num | This key captures a Numeric Risk value | double |
+| rsa.misc.risk_num_comm | This key captures Risk Number Community | double |
+| rsa.misc.risk_num_next | This key captures Risk Number NextGen | double |
+| rsa.misc.risk_num_sand | This key captures Risk Number SandBox | double |
+| rsa.misc.risk_num_static | This key captures Risk Number Static | double |
+| rsa.misc.risk_suspicious | Deprecated, use New Hunting Model (inv.*, ioc, boc, eoc, analysis.*) | keyword |
+| rsa.misc.risk_warning | Deprecated, use New Hunting Model (inv.*, ioc, boc, eoc, analysis.*) | keyword |
+| rsa.misc.ruid | | keyword |
+| rsa.misc.rule | This key captures the Rule number | keyword |
+| rsa.misc.rule_group | This key captures the Rule group name | keyword |
+| rsa.misc.rule_name | This key captures the Rule Name | keyword |
+| rsa.misc.rule_template | A default set of parameters which are overlayed onto a rule (or rulename) which efffectively constitutes a template | keyword |
+| rsa.misc.rule_uid | This key is the Unique Identifier for a rule. | keyword |
+| rsa.misc.sburb | | keyword |
+| rsa.misc.sdomain_fld | | keyword |
+| rsa.misc.search_text | This key captures the Search Text used | keyword |
+| rsa.misc.sec | | keyword |
+| rsa.misc.second | | keyword |
+| rsa.misc.sensor | This key captures Name of the sensor. Typically used in IDS/IPS based devices | keyword |
+| rsa.misc.sensorname | | keyword |
+| rsa.misc.seqnum | | keyword |
+| rsa.misc.serial_number | This key is the Serial number associated with a physical asset. | keyword |
+| rsa.misc.session | | keyword |
+| rsa.misc.sessiontype | | keyword |
+| rsa.misc.severity | This key is used to capture the severity given the session | keyword |
+| rsa.misc.sigUUID | | keyword |
+| rsa.misc.sig_id | This key captures IDS/IPS Int Signature ID | long |
+| rsa.misc.sig_id1 | This key captures IDS/IPS Int Signature ID. This must be linked to the sig.id | long |
+| rsa.misc.sig_id_str | This key captures a string object of the sigid variable. | keyword |
+| rsa.misc.sig_name | This key is used to capture the Signature Name only. | keyword |
+| rsa.misc.sigcat | | keyword |
+| rsa.misc.snmp_oid | SNMP Object Identifier | keyword |
+| rsa.misc.snmp_value | SNMP set request value | keyword |
+| rsa.misc.space | | keyword |
+| rsa.misc.space1 | | keyword |
+| rsa.misc.spi | | keyword |
+| rsa.misc.spi_dst | Destination SPI Index | keyword |
+| rsa.misc.spi_src | Source SPI Index | keyword |
+| rsa.misc.sql | This key captures the SQL query | keyword |
+| rsa.misc.srcburb | | keyword |
+| rsa.misc.srcdom | | keyword |
+| rsa.misc.srcservice | | keyword |
+| rsa.misc.state | | keyword |
+| rsa.misc.status | | keyword |
+| rsa.misc.status1 | | keyword |
+| rsa.misc.streams | This key captures number of streams in session | long |
+| rsa.misc.subcategory | | keyword |
+| rsa.misc.svcno | | keyword |
+| rsa.misc.system | | keyword |
+| rsa.misc.tbdstr1 | | keyword |
+| rsa.misc.tbdstr2 | | keyword |
+| rsa.misc.tcp_flags | This key is captures the TCP flags set in any packet of session | long |
+| rsa.misc.terminal | This key captures the Terminal Names only | keyword |
+| rsa.misc.tgtdom | | keyword |
+| rsa.misc.tgtdomain | | keyword |
+| rsa.misc.threshold | | keyword |
+| rsa.misc.tos | This key describes the type of service | long |
+| rsa.misc.trigger_desc | This key captures the Description of the trigger or threshold condition. | keyword |
+| rsa.misc.trigger_val | This key captures the Value of the trigger or threshold condition. | keyword |
+| rsa.misc.type | | keyword |
+| rsa.misc.type1 | | keyword |
+| rsa.misc.udb_class | | keyword |
+| rsa.misc.url_fld | | keyword |
+| rsa.misc.user_div | | keyword |
+| rsa.misc.userid | | keyword |
+| rsa.misc.username_fld | | keyword |
+| rsa.misc.utcstamp | | keyword |
+| rsa.misc.v_instafname | | keyword |
+| rsa.misc.version | This key captures Version of the application or OS which is generating the event. | keyword |
+| rsa.misc.virt_data | | keyword |
+| rsa.misc.virusname | This key captures the name of the virus | keyword |
+| rsa.misc.vm_target | VMWare Target **VMWARE** only varaible. | keyword |
+| rsa.misc.vpnid | | keyword |
+| rsa.misc.vsys | This key captures Virtual System Name | keyword |
+| rsa.misc.vuln_ref | This key captures the Vulnerability Reference details | keyword |
+| rsa.misc.workspace | This key captures Workspace Description | keyword |
+| rsa.network.ad_computer_dst | Deprecated, use host.dst | keyword |
+| rsa.network.addr | | keyword |
+| rsa.network.alias_host | This key should be used when the source or destination context of a hostname is not clear.Also it captures the Device Hostname. Any Hostname that isnt ad.computer. | keyword |
+| rsa.network.dinterface | This key should only be used when it’s a Destination Interface | keyword |
+| rsa.network.dmask | This key is used for Destionation Device network mask | keyword |
+| rsa.network.dns_a_record | | keyword |
+| rsa.network.dns_cname_record | | keyword |
+| rsa.network.dns_id | | keyword |
+| rsa.network.dns_opcode | | keyword |
+| rsa.network.dns_ptr_record | | keyword |
+| rsa.network.dns_resp | | keyword |
+| rsa.network.dns_type | | keyword |
+| rsa.network.domain | | keyword |
+| rsa.network.domain1 | | keyword |
+| rsa.network.eth_host | Deprecated, use alias.mac | keyword |
+| rsa.network.eth_type | This key is used to capture Ethernet Type, Used for Layer 3 Protocols Only | long |
+| rsa.network.faddr | | keyword |
+| rsa.network.fhost | | keyword |
+| rsa.network.fport | | keyword |
+| rsa.network.gateway | This key is used to capture the IP Address of the gateway | keyword |
+| rsa.network.host_dst | This key should only be used when it’s a Destination Hostname | keyword |
+| rsa.network.host_orig | This is used to capture the original hostname in case of a Forwarding Agent or a Proxy in between. | keyword |
+| rsa.network.host_type | | keyword |
+| rsa.network.icmp_code | This key is used to capture the ICMP code only | long |
+| rsa.network.icmp_type | This key is used to capture the ICMP type only | long |
+| rsa.network.interface | This key should be used when the source or destination context of an interface is not clear | keyword |
+| rsa.network.ip_proto | This key should be used to capture the Protocol number, all the protocol nubers are converted into string in UI | long |
+| rsa.network.laddr | | keyword |
+| rsa.network.lhost | | keyword |
+| rsa.network.linterface | | keyword |
+| rsa.network.mask | This key is used to capture the device network IPmask. | keyword |
+| rsa.network.netname | This key is used to capture the network name associated with an IP range. This is configured by the end user. | keyword |
+| rsa.network.network_port | Deprecated, use port. NOTE: There is a type discrepancy as currently used, TM: Int32, INDEX: UInt64 (why neither chose the correct UInt16?!) | long |
+| rsa.network.network_service | This is used to capture layer 7 protocols/service names | keyword |
+| rsa.network.origin | | keyword |
+| rsa.network.packet_length | | keyword |
+| rsa.network.paddr | Deprecated | ip |
+| rsa.network.phost | | keyword |
+| rsa.network.port | This key should only be used to capture a Network Port when the directionality is not clear | long |
+| rsa.network.protocol_detail | This key should be used to capture additional protocol information | keyword |
+| rsa.network.remote_domain_id | | keyword |
+| rsa.network.rpayload | This key is used to capture the total number of payload bytes seen in the retransmitted packets. | keyword |
+| rsa.network.sinterface | This key should only be used when it’s a Source Interface | keyword |
+| rsa.network.smask | This key is used for capturing source Network Mask | keyword |
+| rsa.network.vlan | This key should only be used to capture the ID of the Virtual LAN | long |
+| rsa.network.vlan_name | This key should only be used to capture the name of the Virtual LAN | keyword |
+| rsa.network.zone | This key should be used when the source or destination context of a Zone is not clear | keyword |
+| rsa.network.zone_dst | This key should only be used when it’s a Destination Zone. | keyword |
+| rsa.network.zone_src | This key should only be used when it’s a Source Zone. | keyword |
+| rsa.physical.org_dst | This is used to capture the destination organization based on the GEOPIP Maxmind database. | keyword |
+| rsa.physical.org_src | This is used to capture the source organization based on the GEOPIP Maxmind database. | keyword |
+| rsa.storage.disk_volume | A unique name assigned to logical units (volumes) within a physical disk | keyword |
+| rsa.storage.lun | Logical Unit Number.This key is a very useful concept in Storage. | keyword |
+| rsa.storage.pwwn | This uniquely identifies a port on a HBA. | keyword |
+| rsa.threat.alert | This key is used to capture name of the alert | keyword |
+| rsa.threat.threat_category | This key captures Threat Name/Threat Category/Categorization of alert | keyword |
+| rsa.threat.threat_desc | This key is used to capture the threat description from the session directly or inferred | keyword |
+| rsa.threat.threat_source | This key is used to capture source of the threat | keyword |
+| rsa.time.date | | keyword |
+| rsa.time.datetime | | keyword |
+| rsa.time.day | | keyword |
+| rsa.time.duration_str | A text string version of the duration | keyword |
+| rsa.time.duration_time | This key is used to capture the normalized duration/lifetime in seconds. | double |
+| rsa.time.effective_time | This key is the effective time referenced by an individual event in a Standard Timestamp format | date |
+| rsa.time.endtime | This key is used to capture the End time mentioned in a session in a standard form | date |
+| rsa.time.event_queue_time | This key is the Time that the event was queued. | date |
+| rsa.time.event_time | This key is used to capture the time mentioned in a raw session that represents the actual time an event occured in a standard normalized form | date |
+| rsa.time.event_time_str | This key is used to capture the incomplete time mentioned in a session as a string | keyword |
+| rsa.time.eventtime | | keyword |
+| rsa.time.expire_time | This key is the timestamp that explicitly refers to an expiration. | date |
+| rsa.time.expire_time_str | This key is used to capture incomplete timestamp that explicitly refers to an expiration. | keyword |
+| rsa.time.gmtdate | | keyword |
+| rsa.time.gmttime | | keyword |
+| rsa.time.hour | | keyword |
+| rsa.time.min | | keyword |
+| rsa.time.month | | keyword |
+| rsa.time.p_date | | keyword |
+| rsa.time.p_month | | keyword |
+| rsa.time.p_time | | keyword |
+| rsa.time.p_time1 | | keyword |
+| rsa.time.p_time2 | | keyword |
+| rsa.time.p_year | | keyword |
+| rsa.time.process_time | Deprecated, use duration.time | keyword |
+| rsa.time.recorded_time | The event time as recorded by the system the event is collected from. The usage scenario is a multi-tier application where the management layer of the system records it's own timestamp at the time of collection from its child nodes. Must be in timestamp format. | date |
+| rsa.time.stamp | Deprecated key defined only in table map. | date |
+| rsa.time.starttime | This key is used to capture the Start time mentioned in a session in a standard form | date |
+| rsa.time.timestamp | | keyword |
+| rsa.time.timezone | This key is used to capture the timezone of the Event Time | keyword |
+| rsa.time.tzone | | keyword |
+| rsa.time.year | | keyword |
+| rsa.web.alias_host | | keyword |
+| rsa.web.cn_asn_dst | | keyword |
+| rsa.web.cn_rpackets | | keyword |
+| rsa.web.fqdn | Fully Qualified Domain Names | keyword |
+| rsa.web.p_url | | keyword |
+| rsa.web.p_user_agent | | keyword |
+| rsa.web.p_web_cookie | | keyword |
+| rsa.web.p_web_method | | keyword |
+| rsa.web.p_web_referer | | keyword |
+| rsa.web.remote_domain | | keyword |
+| rsa.web.reputation_num | Reputation Number of an entity. Typically used for Web Domains | double |
+| rsa.web.urlpage | | keyword |
+| rsa.web.urlroot | | keyword |
+| rsa.web.web_cookie | This key is used to capture the Web cookies specifically. | keyword |
+| rsa.web.web_extension_tmp | | keyword |
+| rsa.web.web_page | | keyword |
+| rsa.web.web_ref_domain | Web referer's domain | keyword |
+| rsa.web.web_ref_page | This key captures Web referer's page information | keyword |
+| rsa.web.web_ref_query | This key captures Web referer's query portion of the URL | keyword |
+| rsa.web.web_ref_root | Web referer's root URL path | keyword |
+| rsa.wireless.access_point | This key is used to capture the access point name. | keyword |
+| rsa.wireless.wlan_channel | This is used to capture the channel names | long |
+| rsa.wireless.wlan_name | This key captures either WLAN number/name | keyword |
+| rsa.wireless.wlan_ssid | This key is used to capture the ssid of a Wireless Session | keyword |
+| rule.name | The name of the rule or signature generating the event. | keyword |
+| server.domain | Server domain. | keyword |
+| service.name | Name of the service data is collected from. The name of the service is normally user given. This allows for distributed services that run on multiple hosts to correlate the related instances based on the name. In the case of Elasticsearch the `service.name` could contain the cluster name. For Beats the `service.name` is by default a copy of the `service.type` field if no name is specified. | keyword |
+| source.address | Some event source addresses are defined ambiguously. The event will sometimes list an IP, a domain or a unix socket. You should always store the raw address in the `.address` field. Then it should be duplicated to `.ip` or `.domain`, depending on which one it is. | keyword |
+| source.as.number | Unique number allocated to the autonomous system. The autonomous system number (ASN) uniquely identifies each network on the Internet. | long |
+| source.as.organization.name | Organization name. | keyword |
+| source.bytes | Bytes sent from the source to the destination. | long |
+| source.domain | Source domain. | keyword |
+| source.geo.city_name | City name. | keyword |
+| source.geo.country_name | Country name. | keyword |
+| source.geo.location.lat | | double |
+| source.geo.location.lon | | double |
+| source.ip | IP address of the source (IPv4 or IPv6). | ip |
+| source.mac | MAC address of the source. | keyword |
+| source.nat.ip | Translated ip of source based NAT sessions (e.g. internal client to internet) Typically connections traversing load balancers, firewalls, or routers. | ip |
+| source.nat.port | Translated port of source based NAT sessions. (e.g. internal client to internet) Typically used with load balancers, firewalls, or routers. | long |
+| source.port | Port of the source. | long |
+| tags | List of keywords used to tag each event. | keyword |
+| url.domain | Domain of the url, such as "www.elastic.co". In some cases a URL may refer to an IP and/or port directly, without a domain name. In this case, the IP address would go to the `domain` field. | keyword |
+| url.original | Unmodified original url as seen in the event source. Note that in network monitoring, the observed URL may be a full URL, whereas in access logs, the URL is often just represented as a path. This field is meant to represent the URL as it was observed, complete or not. | keyword |
+| url.path | Path of the request, such as "/search". | keyword |
+| url.query | The query field describes the query string of the request, such as "q=elasticsearch". The `?` is excluded from the query string. If a URL contains no `?`, there is no query field. If there is a `?` but no query, the query field exists with an empty string. The `exists` query can be used to differentiate between the two cases. | keyword |
+| url.registered_domain | The highest registered url domain, stripped of the subdomain. For example, the registered domain for "foo.example.com" is "example.com". This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last two labels will not work well for TLDs such as "co.uk". | keyword |
+| url.top_level_domain | The effective top level domain (eTLD), also known as the domain suffix, is the last part of the domain name. For example, the top level domain for example.com is "com". This value can be determined precisely with a list like the public suffix list (http://publicsuffix.org). Trying to approximate this by simply taking the last label will not work well for effective TLDs such as "co.uk". | keyword |
+| user.domain | Name of the directory the user is a member of. For example, an LDAP or Active Directory domain name. | keyword |
+| user.full_name | User's full name, if available. | keyword |
+| user.id | Unique identifier of the user. | keyword |
+| user.name | Short name or login of the user. | keyword |
+| user_agent.original | Unparsed user_agent string. | keyword |
+
diff --git a/packages/zscaler/0.5.1/img/logo.svg b/packages/zscaler/0.5.1/img/logo.svg
new file mode 100755
index 0000000000..b8a21a2fa6
--- /dev/null
+++ b/packages/zscaler/0.5.1/img/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/zscaler/0.5.1/manifest.yml b/packages/zscaler/0.5.1/manifest.yml
new file mode 100755
index 0000000000..14247824f9
--- /dev/null
+++ b/packages/zscaler/0.5.1/manifest.yml
@@ -0,0 +1,32 @@
+format_version: 1.0.0
+name: zscaler
+title: Zscaler NSS Logs
+version: 0.5.1
+description: Deprecated. Use the Zscaler ZIA integration instead.
+categories: ["network", "security"]
+release: experimental
+license: basic
+type: integration
+conditions:
+ kibana.version: "^7.14.1"
+policy_templates:
+ - name: zia
+ title: Zscaler NSS
+ description: Collect Zscaler NSS logs from syslog or a file.
+ inputs:
+ - type: udp
+ title: Collect logs from Zscaler NSS via UDP
+ description: Collecting syslog from Zscaler NSS via UDP
+ - type: tcp
+ title: Collect logs from Zscaler NSS via TCP
+ description: Collecting syslog from Zscaler NSS via TCP
+ - type: logfile
+ title: Collect logs from Zscaler NSS via file
+ description: Collecting syslog from Zscaler NSS via file.
+icons:
+ - src: /img/logo.svg
+ title: Zscaler NSS logo
+ size: 32x32
+ type: image/svg+xml
+owner:
+ github: elastic/security-external-integrations