This is an automated email from the ASF dual-hosted git repository.
nickallen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metron.git
The following commit(s) were added to refs/heads/master by this push:
new ec11855 METRON-1938 Add Parser Debugger to READMEs (nickwallen)
closes apache/metron#1304
ec11855 is described below
commit ec118557cb6a9bfe91528702c7bf093977fa80d7
Author: nickwallen <[email protected]>
AuthorDate: Tue Dec 18 14:21:42 2018 -0500
METRON-1938 Add Parser Debugger to READMEs (nickwallen) closes
apache/metron#1304
---
metron-platform/metron-management/README.md | 527 +++++++++++++--------
.../apache/metron/management/ParserFunctions.java | 14 +-
2 files changed, 341 insertions(+), 200 deletions(-)
diff --git a/metron-platform/metron-management/README.md
b/metron-platform/metron-management/README.md
index bf939c2..f364627 100644
--- a/metron-platform/metron-management/README.md
+++ b/metron-platform/metron-management/README.md
@@ -25,7 +25,7 @@ have been added:
* Stellar enrichments in the Enrichment topology
* Stellar threat triage rules
-Additionally, some shell functions have been added to
+Additionally, some shell functions have been added to
* provide the ability to refer to the Stellar expression used to create a
variable
* print structured data in a way that is easier to view (i.e. tabular)
@@ -45,7 +45,6 @@ project.
* [Manage Stellar Field
Transformations](#manage-stellar-field-transformations)
* [Manage Stellar Enrichments](#manage-stellar-enrichments)
* [Manage Threat Triage Rules](#manage-threat-triage-rules)
- * [Simulate Threat Triage Rules](#simulate-threat-triage-rules)
## Functions
@@ -60,13 +59,13 @@ The functions are split roughly into a few sections:
### Grok Functions
-* `GROK_EVAL`
+#### `GROK_EVAL`
* Description: Evaluate a grok expression for a statement.
* Input:
* grokExpression - The grok expression to evaluate
* data - Either a data message or a list of data messages to evaluate
using the grokExpression
* Returns: The Map associated with the grok expression being evaluated on
the list of messages.
-* `GROK_PREDICT`
+#### `GROK_PREDICT`
* Description: Discover a grok statement for an input doc
* Input:
* data - The data to discover a grok expression from
@@ -74,73 +73,73 @@ The functions are split roughly into a few sections:
### File Functions
-* Local Files
- * `LOCAL_LS`
- * Description: Lists the contents of a directory.
- * Input:
- * path - The path of the file
- * Returns: The contents of the directory in tabular form sorted by last
modification date.
- * `LOCAL_RM`
- * Description: Removes the path
- * Input:
- * path - The path of the file or directory.
- * recursive - Recursively remove or not (optional and defaulted to false)
- * Returns: boolean - true if successful, false otherwise
- * `LOCAL_READ`
- * Description: Retrieves the contents as a string of a file.
- * Input:
- * path - The path of the file
- * Returns: The contents of the file and null otherwise.
- * `LOCAL_READ_LINES`
- * Description: Retrieves the contents of a file as a list of strings.
- * Input:
- * path - The path of the file
- * Returns: A list of lines
- * `LOCAL_WRITE`
- * Description: Writes the contents of a string to a local file
- * Input:
- * content - The content to write out
- * path - The path of the file
- * Returns: true if the file was written and false otherwise.
-* HDFS Files
- * `HDFS_LS`
- * Description: Lists the contents of a directory in HDFS.
- * Input:
- * path - The path of the file
- * Returns: The contents of the directory in tabular form sorted by last
modification date.
- * `HDFS_RM`
- * Description: Removes the path in HDFS.
- * Input:
- * path - The path of the file or directory.
- * recursive - Recursively remove or not (optional and defaulted to false)
- * Returns: boolean - true if successful, false otherwise
- * `HDFS_READ`
- * Description: Retrieves the contents as a string of a file in HDFS.
- * Input:
- * path - The path of the file
- * Returns: The contents of the file and null otherwise.
- * `HDFS_READ_LINES`
- * Description: Retrieves the contents of a HDFS file as a list of strings.
- * Input:
- * path - The path of the file
- * Returns: A list of lines
- * `HDFS_WRITE`
- * Description: Writes the contents of a string to a HDFS file
- * Input:
- * content - The content to write out
- * path - The path of the file
- * Returns: true if the file was written and false otherwise.
+#### Local Files
+##### `LOCAL_LS`
+ * Description: Lists the contents of a directory.
+ * Input:
+ * path - The path of the file
+ * Returns: The contents of the directory in tabular form sorted by last
modification date.
+##### `LOCAL_RM`
+ * Description: Removes the path
+ * Input:
+ * path - The path of the file or directory.
+ * recursive - Recursively remove or not (optional and defaulted to false)
+ * Returns: boolean - true if successful, false otherwise
+##### `LOCAL_READ`
+ * Description: Retrieves the contents as a string of a file.
+ * Input:
+ * path - The path of the file
+ * Returns: The contents of the file and null otherwise.
+##### `LOCAL_READ_LINES`
+ * Description: Retrieves the contents of a file as a list of strings.
+ * Input:
+ * path - The path of the file
+ * Returns: A list of lines
+##### `LOCAL_WRITE`
+ * Description: Writes the contents of a string to a local file
+ * Input:
+ * content - The content to write out
+ * path - The path of the file
+ * Returns: true if the file was written and false otherwise.
+#### HDFS Files
+##### `HDFS_LS`
+ * Description: Lists the contents of a directory in HDFS.
+ * Input:
+ * path - The path of the file
+ * Returns: The contents of the directory in tabular form sorted by last
modification date.
+##### `HDFS_RM`
+ * Description: Removes the path in HDFS.
+ * Input:
+ * path - The path of the file or directory.
+ * recursive - Recursively remove or not (optional and defaulted to false)
+ * Returns: boolean - true if successful, false otherwise
+##### `HDFS_READ`
+ * Description: Retrieves the contents as a string of a file in HDFS.
+ * Input:
+ * path - The path of the file
+ * Returns: The contents of the file and null otherwise.
+##### `HDFS_READ_LINES`
+ * Description: Retrieves the contents of a HDFS file as a list of strings.
+ * Input:
+ * path - The path of the file
+ * Returns: A list of lines
+##### `HDFS_WRITE`
+ * Description: Writes the contents of a string to a HDFS file
+ * Input:
+ * content - The content to write out
+ * path - The path of the file
+ * Returns: true if the file was written and false otherwise.
### Configuration Functions
-* `CONFIG_GET`
+#### `CONFIG_GET`
* Description: Retrieve a Metron configuration from zookeeper.
* Input:
* type - One of ENRICHMENT, INDEXING, PARSER, GLOBAL, PROFILER
* sensor - Sensor to retrieve (required for enrichment and parser, not
used for profiler and global)
* emptyIfNotPresent - If true, then return an empty, minimally viable
config
* Returns: The String representation of the config in zookeeper
-* `CONFIG_PUT`
+#### `CONFIG_PUT`
* Description: Updates a Metron config to Zookeeper.
* Input:
* type - One of ENRICHMENT, INDEXING, PARSER, GLOBAL, PROFILER
@@ -150,28 +149,168 @@ The functions are split roughly into a few sections:
### Parser Functions
-* `PARSER_STELLAR_TRANSFORM_ADD`
+#### `PARSER_CONFIG`
+ * Description: Returns the configuration of the parser.
+ * Input:
+ * parser - The parser created with PARSER_INIT.
+ * Returns: The parser configuration.
+
+##### Example
+
+ 1. Initialize the parser. The parser configuration for the sensor 'bro' will
be loaded automatically from Zookeeper.
+ ```
+ [Stellar]>>> parser := PARSER_INIT("bro")
+ Parser{0 successful, 0 error(s)}
+ ```
+
+ 1. Review the parser configuration for the 'bro' sensor.
+ ```
+ [Stellar]>>> PARSER_CONFIG(parser)
+ {
+ "parserClassName":"org.apache.metron.parsers.bro.BasicBroParser",
+ "filterClassName":"org.apache.metron.parsers.filters.StellarFilter",
+ "sensorTopic":"bro"
+ }
+ ```
+
+#### `PARSER_INIT`
+ * Initialize a parser to parse the raw telemetry produced by a sensor.
+ * Input:
+ * sensorType - The type of sensor to parse.
+ * config - [Optional] The parser configuration. If not provided, the
configuration will be retrieved from Zookeeper.
+ * Returns: A parser that can be used to parse sensor telemetry with
`PARSER_PARSE`.
+
+##### Example
+
+ 1. Initialize a parser. The parser configuration for the sensor 'bro' will
be loaded automatically from Zookeeper.
+ ```
+ [Stellar]>>> parser := PARSER_INIT("bro")
+ Parser{0 successful, 0 error(s)}
+ ```
+
+ 1. The parser will track the number of successes and failures and echo that
information.
+ ```
+ [Stellar]>>> parser
+ Parser{0 successful, 0 error(s)}
+ ```
+
+ 1. Alternatively, explicitly define the parser configuration. This can be
useful when creating a new parser or testing changes to an existing parser.
+ ```
+ [Stellar]>>> config := SHELL_EDIT()
+ {
+ "parserClassName":"org.apache.metron.parsers.bro.BasicBroParser",
+ "filterClassName":"org.apache.metron.parsers.filters.StellarFilter",
+ "sensorTopic":"bro"
+ }
+ ```
+
+ 1. Initialize the parser with the parser configuration.
+ ```
+ [Stellar]>>> parser := PARSER_INIT("bro", config)
+ Parser{0 successful, 0 error(s)}
+ ```
+
+#### `PARSER_PARSE`
+ * Parses the raw telemetry produced by a sensor.
+ * Input:
+ * parser - The parser created with PARSER_INIT.
+ * input - A telemetry message or list of messages to parse.
+ * Returns: A list of messages that result from parsing the input
telemetry. If the input cannot be parsed, a message encapsulating the error is
returned as part of that list.
+
+##### Example
+
+ 1. Initialize the parser. The parser configuration for the sensor 'bro' will
be loaded automatically from Zookeeper.
+ ```
+ [Stellar]>>> parser := PARSER_INIT("bro")
+ Parser{0 successful, 0 error(s)}
+ ```
+
+ 1. Grab the raw telemetry from the 'bro' input topic. You could also mock-up
a string that you would like to parse using `SHELL_EDIT`.
+ ```
+ [Stellar]>>> to_parse := KAFKA_GET('bro')
+ [{"http":
{"ts":1542313125.807068,"uid":"CUrRne3iLIxXavQtci","id.orig_h"...
+ ```
+
+ 1. Parse the telemetry.
+ ```
+ [Stellar]>>> msgs := PARSER_PARSE(parser, to_parse)
+
[{"bro_timestamp":"1542313125.807068","method":"GET","ip_dst_port":8080,...
+ ```
+
+ 1. The parser will tally the success.
+ ```
+ [Stellar]>>> parser
+ Parser{1 successful, 0 error(s)}
+ ```
+
+ 1. Review the successfully parsed message.
+ ```
+ [Stellar]>>> LENGTH(msgs)
+ 1
+ ```
+ ```
+ [Stellar]>>> msg := GET(msgs, 0)
+
+ [Stellar]>>> MAP_GET("guid", msg)
+ 7f2e0c77-c58c-488e-b1ad-fbec10fb8182
+ ```
+ ```
+ [Stellar]>>> MAP_GET("timestamp", msg)
+ 1542313125807
+ ```
+ ```
+ [Stellar]>>> MAP_GET("source.type", msg)
+ bro
+ ```
+
+ 1. Attempt to parse invalid input. This will return the error message that
is pushed onto the error topic. The error message contains all of the details
indicating why parsing failed.
+ ```
+ [Stellar]>>> errors := PARSER_PARSE(parser, "{invalid>")
+ ```
+
+ 1. Review the details of the error.
+ ```
+ [Stellar]>>> error := GET(errors, 0)
+ ```
+ ```
+ [Stellar]>>> MAP_GET("raw_message", error)
+ {invalid>
+ ```
+ ```
+ [Stellar]>>> MAP_GET("message", error)
+ Unable to parse Message: {invalid>
+ ```
+ ```
+ [Stellar]>>> MAP_GET("stack", error)
+ java.lang.IllegalStateException: Unable to parse Message: {invalid>
+ at
org.apache.metron.parsers.bro.BasicBroParser.parse(BasicBroParser.java:145)
+ ...
+ ```
+
+
+#### `PARSER_STELLAR_TRANSFORM_ADD`
* Description: Add stellar field transformation.
* Input:
* sensorConfig - Sensor config to add transformation to.
* stellarTransforms - A Map associating fields to stellar expressions
* Returns: The String representation of the config in zookeeper
-* `PARSER-STELLAR_TRANSFORM_PRINT`
+
+#### `PARSER_STELLAR_TRANSFORM_PRINT`
* Description: Retrieve stellar field transformations.
* Input:
* sensorConfig - Sensor config to add transformation to.
* Returns: The String representation of the transformations
-* `PARSER_STELLAR_TRANSFORM_REMOVE`
+
+#### `PARSER_STELLAR_TRANSFORM_REMOVE`
* Description: Remove stellar field transformation.
* Input:
* sensorConfig - Sensor config to add transformation to.
* stellarTransforms - A list of stellar transforms to remove
* Returns: The String representation of the config in zookeeper
-
### Indexing Functions
-* `INDEXING_SET_BATCH`
+#### `INDEXING_SET_BATCH`
* Description: Set batch size and timeout
* Input:
* sensorConfig - Sensor config to add transformation to.
@@ -179,14 +318,14 @@ The functions are split roughly into a few sections:
* size - batch size (integer), defaults to 1, meaning batching disabled
* timeout - (optional) batch timeout in seconds (integer), defaults to 0,
meaning system default
* Returns: The String representation of the config in zookeeper
-* `INDEXING_SET_ENABLED`
+#### `INDEXING_SET_ENABLED`
* Description: Enable or disable an indexing writer for a sensor.
* Input:
* sensorConfig - Sensor config to add transformation to.
* writer - The writer to update (e.g. elasticsearch, solr or hdfs)
* enabled? - boolean indicating whether the writer is enabled. If
omitted, then it will set enabled.
* Returns: The String representation of the config in zookeeper
-* `INDEXING_SET_INDEX`
+#### `INDEXING_SET_INDEX`
* Description: Set the index for the sensor
* Input:
* sensorConfig - Sensor config to add transformation to.
@@ -196,7 +335,7 @@ The functions are split roughly into a few sections:
### Enrichment Functions
-* `ENRICHMENT_STELLAR_TRANSFORM_ADD`
+#### `ENRICHMENT_STELLAR_TRANSFORM_ADD`
* Description: Add stellar field transformation.
* Input:
* sensorConfig - Sensor config to add transformation to.
@@ -204,13 +343,13 @@ The functions are split roughly into a few sections:
* stellarTransforms - A Map associating fields to stellar expressions
* group - Group to add to (optional)
* Returns: The String representation of the config in zookeeper
-* `ENRICHMENT_STELLAR_TRANSFORM_PRINT`
+#### `ENRICHMENT_STELLAR_TRANSFORM_PRINT`
* Description: Retrieve stellar enrichment transformations.
* Input:
* sensorConfig - Sensor config to add transformation to.
* type - ENRICHMENT or THREAT_INTEL
* Returns: The String representation of the transformations
-* `ENRICHMENT_STELLAR_TRANSFORM_REMOVE`
+#### `ENRICHMENT_STELLAR_TRANSFORM_REMOVE`
* Description: Remove one or more stellar field transformations.
* Input:
* sensorConfig - Sensor config to add transformation to.
@@ -221,41 +360,41 @@ The functions are split roughly into a few sections:
### Threat Triage Functions
-* `THREAT_TRIAGE_INIT`
+#### `THREAT_TRIAGE_INIT`
* Description: Create a threat triage engine.
* Input:
* config - the threat triage configuration (optional)
* Returns: A threat triage engine.
-* `THREAT_TRIAGE_CONFIG`
+#### `THREAT_TRIAGE_CONFIG`
* Description: Export the configuration used by a threat triage engine.
* Input:
* engine - threat triage engine returned by THREAT_TRIAGE_INIT.
* Returns: The configuration used by the threat triage engine.
-* `THREAT_TRIAGE_SCORE`
+#### `THREAT_TRIAGE_SCORE`
* Description: Scores a message using a set of triage rules.
* Inputs:
* message - a string containing the message to score.
* engine - threat triage engine returned by THREAT_TRIAGE_INIT.
* Returns: A threat triage engine.
-* `THREAT_TRIAGE_ADD`
+#### `THREAT_TRIAGE_ADD`
* Description: Add a threat triage rule.
* Input:
* sensorConfig - Sensor config to add transformation to.
* stellarTransforms - A Map associating stellar rules to scores
* triageRules - Map (or list of Maps) representing a triage rule. It must
contain 'rule' and 'score' keys, the stellar expression for the rule and triage
score respectively. It may contain 'name' and 'comment', the name of the rule
and comment associated with the rule respectively."
* Returns: The String representation of the threat triage rules
-* `THREAT_TRIAGE_REMOVE`
+#### `THREAT_TRIAGE_REMOVE`
* Description: Remove stellar threat triage rule(s).
* Input:
* sensorConfig - Sensor config to add transformation to.
* rules - A list of stellar rules or rule names to remove
* Returns: The String representation of the enrichment config
-* `THREAT_TRIAGE_PRINT`
+#### `THREAT_TRIAGE_PRINT`
* Description: Retrieve stellar enrichment transformations.
* Input:
* sensorConfig - Sensor config to add transformation to.
* Returns: The String representation of the threat triage rules
-* `THREAT_TRIAGE_SET_AGGREGATOR`
+#### `THREAT_TRIAGE_SET_AGGREGATOR`
* Description: Set the threat triage aggregator.
* Input:
* sensorConfig - Sensor config to add transformation to.
@@ -263,6 +402,105 @@ The functions are split roughly into a few sections:
* aggregatorConfig - Optional config for aggregator
* Returns: The String representation of the enrichment config
+##### Example
+
+1. Create a threat triage engine.
+
+ ```
+ [Stellar]>>> t := THREAT_TRIAGE_INIT()
+ [Stellar]>>> t
+ ThreatTriage{0 rule(s)}
+ ```
+
+1. Add a few triage rules.
+
+ ```
+ [Stellar]>>> THREAT_TRIAGE_ADD(t, {"name":"rule1", "rule":"value>10",
"score":10})
+ ```
+ ```
+ [Stellar]>>> THREAT_TRIAGE_ADD(t, {"name":"rule2", "rule":"value>20",
"score":20})
+ ```
+ ```
+ [Stellar]>>> THREAT_TRIAGE_ADD(t, {"name":"rule3", "rule":"value>30",
"score":30})
+ ```
+
+1. Review the rules that you have created.
+ ```
+ [Stellar]>>> THREAT_TRIAGE_PRINT(t)
+ ╔═══════╤═════════╤═════════════╤═══════╤════════╗
+ ║ Name │ Comment │ Triage Rule │ Score │ Reason ║
+ ╠═══════╪═════════╪═════════════╪═══════╪════════╣
+ ║ rule1 │ │ value>10 │ 10 │ ║
+ ╟───────┼─────────┼─────────────┼───────┼────────╢
+ ║ rule2 │ │ value>20 │ 20 │ ║
+ ╟───────┼─────────┼─────────────┼───────┼────────╢
+ ║ rule3 │ │ value>30 │ 30 │ ║
+ ╚═══════╧═════════╧═════════════╧═══════╧════════╝
+ ```
+
+1. Create a few test messages to simulate your telemetry.
+ ```
+ [Stellar]>>> msg1 := "{ \"value\":22 }"
+ [Stellar]>>> msg1
+ { "value":22 }
+ ```
+ ```
+ [Stellar]>>> msg2 := "{ \"value\":44 }"
+ [Stellar]>>> msg2
+ { "value":44 }
+ ```
+
+1. Score a message based on the rules that have been defined. The result
allows you to see the total score, the aggregator, along with details about
each rule that fired.
+
+ ```
+ [Stellar]>>> THREAT_TRIAGE_SCORE( msg1, t)
+ {score=20.0, aggregator=MAX, rules=[{score=10.0, name=rule1,
rule=value>10}, {score=20.0, name=rule2, rule=value>20}]}
+ ```
+ ```
+ [Stellar]>>> THREAT_TRIAGE_SCORE( msg2, t)
+ {score=30.0, aggregator=MAX, rules=[{score=10.0, name=rule1,
rule=value>10}, {score=20.0, name=rule2, rule=value>20}, {score=30.0,
name=rule3, rule=value>30}]}
+ ```
+
+1. From here you can iterate on your rule set until it does exactly what you
need it to do. Once you have a working rule set, extract the configuration and
push it into your live, Metron cluster.
+
+ ```
+ [Stellar]>>> conf := THREAT_TRIAGE_CONFIG( t)
+ [Stellar]>>> conf
+ {
+ "enrichment" : {
+ "fieldMap" : { },
+ "fieldToTypeMap" : { },
+ "config" : { }
+ },
+ "threatIntel" : {
+ "fieldMap" : { },
+ "fieldToTypeMap" : { },
+ "config" : { },
+ "triageConfig" : {
+ "riskLevelRules" : [ {
+ "name" : "rule1",
+ "rule" : "value>10",
+ "score" : 10.0
+ }, {
+ "name" : "rule2",
+ "rule" : "value>20",
+ "score" : 20.0
+ }, {
+ "name" : "rule3",
+ "rule" : "value>30",
+ "score" : 30.0
+ }],
+ "aggregator" : "MAX",
+ "aggregationConfig" : { }
+ }
+ },
+ "configuration" : { }
+ }
+ ```
+ ```
+ [Stellar]>>> CONFIG_PUT("ENRICHMENT", conf, "bro")
+ ```
+
## Deployment Instructions
* Clusters installed via Ambari Management Pack (default)
* Automatically deployed
@@ -280,7 +518,7 @@ with helpful comments to illustrate some common operations.
Stellar, Go!
Please note that functions are loading lazily in the background and will be
unavailable until loaded fully.
[Stellar]>>> # We are going to debug a squid grok statement with a bug in it
-[Stellar]>>> squid_grok_orig := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url}
+[Stellar]>>> squid_grok_orig := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url}
- %{WORD:UNWANTED}/%{IP:ip_dst_addr} %{WORD:UNWANTED}/%{WORD:UNWANTED}'
[Stellar]>>> # We have gone ot a couple of domains in squid:
[Stellar]>>> # 1475022887.362 256 127.0.0.1 TCP_MISS/301 803 GET
http://www.youtube.com/ - DIRECT/216.58.216.238 text/html
@@ -289,7 +527,7 @@ Please note that functions are loading lazily in the
background and will be unav
[Stellar]>>> # Note that flimflammadeupdomain.com and www.google.com did not
resolve to IPs
[Stellar]>>> # We can load up these messages from disk into a list of messages
[Stellar]>>> messages := LOCAL_READ_LINES( '/var/log/squid/access.log')
-27687 [Thread-1] INFO o.r.Reflections - Reflections took 26542 ms to scan 22
urls, producing 17906 keys and 121560 values
+27687 [Thread-1] INFO o.r.Reflections - Reflections took 26542 ms to scan 22
urls, producing 17906 keys and 121560 values
27837 [Thread-1] INFO o.a.m.c.d.FunctionResolverSingleton - Found 97 Stellar
Functions...
Functions loaded, you may refer to functions now...
[Stellar]>>> # and evaluate the messages against our grok statement
@@ -306,7 +544,7 @@ Functions loaded, you may refer to functions now...
[Stellar]>>> # Uh oh, looks like the messages without destination IPs do not
parse
[Stellar]>>> # We can start peeling off groups from the end of the message
until things parse
-[Stellar]>>> squid_grok := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url} - %{
+[Stellar]>>> squid_grok := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url} - %{
WORD:UNWANTED}/%{IP:ip_dst_addr}'
[Stellar]>>> GROK_EVAL(squid_grok, messages)
╔══════════╤═════════╤═════════╤═════════╤════════════════╤═════════════╤═════════╤════════════════╤═════════════════════════╗
@@ -320,7 +558,7 @@ WORD:UNWANTED}/%{IP:ip_dst_addr}'
╚══════════╧═════════╧═════════╧═════════╧════════════════╧═════════════╧═════════╧════════════════╧═════════════════════════╝
[Stellar]>>> # Still looks like it is having issues...
-[Stellar]>>> squid_grok := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url} - %{
+[Stellar]>>> squid_grok := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url} - %{
WORD:UNWANTED}/%{IP:ip_dst_addr}'
[Stellar]>>> GROK_EVAL(squid_grok, messages)
╔══════════╤═════════╤═════════╤═════════╤════════════════╤═════════════╤═════════╤════════════════╤═════════════════════════╗
@@ -334,7 +572,7 @@ WORD:UNWANTED}/%{IP:ip_dst_addr}'
╚══════════╧═════════╧═════════╧═════════╧════════════════╧═════════════╧═════════╧════════════════╧═════════════════════════╝
[Stellar]>>> # Still looks wrong. Hmm, I bet it is due to that dst_addr not
being there; we can make it optional
-[Stellar]>>> squid_grok := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url} - %{
+[Stellar]>>> squid_grok := '%{NUMBER:timestamp} %{SPACE:UNWANTED}
%{INT:elapsed} %{IP:ip_src_addr} %{WORD:action}/%{NUMBER:code} %{NUMBER:bytes}
%{WORD:method} %{NOTSPACE:url} - %{
WORD:UNWANTED}/(%{IP:ip_dst_addr})?'
[Stellar]>>> GROK_EVAL(squid_grok, messages)
╔══════════╤═══════╤══════╤═════════╤════════════════╤═════════════╤════════╤════════════════╤══════════════════════════╗
@@ -348,8 +586,8 @@ WORD:UNWANTED}/(%{IP:ip_dst_addr})?'
╚══════════╧═══════╧══════╧═════════╧════════════════╧═════════════╧════════╧════════════════╧══════════════════════════╝
[Stellar]>>> # Ahh, that is much better.
-[Stellar]>>>
-[Stellar]>>>
+[Stellar]>>>
+[Stellar]>>>
```
### Manage Stellar Field Transformations
@@ -362,7 +600,7 @@ Please note that functions are loading lazily in the
background and will be unav
{es.clustername=metron, es.ip=node1, es.port=9300,
es.date.format=yyyy.MM.dd.HH}
[Stellar]>>> # First we get the squid parser config from zookeeper
[Stellar]>>> squid_parser_config := CONFIG_GET('PARSER', 'squid')
-29089 [Thread-1] INFO o.r.Reflections - Reflections took 26765 ms to scan 22
urls, producing 17898 keys and 121518 values
+29089 [Thread-1] INFO o.r.Reflections - Reflections took 26765 ms to scan 22
urls, producing 17898 keys and 121518 values
29177 [Thread-1] INFO o.a.m.c.d.FunctionResolverSingleton - Found 83 Stellar
Functions...
Functions loaded, you may refer to functions now...
[Stellar]>>> # See what kind of transformations it already has
@@ -400,7 +638,7 @@ Functions loaded, you may refer to functions now...
[Stellar]>>> # Add another transformation in there
[Stellar]>>> domain_without_subdomains := 'cnn.com'
[Stellar]>>> upper_domain := TO_UPPER(domain_without_subdomains)
-[Stellar]>>> # Now we can look at our variables and see what expressions
created them
+[Stellar]>>> # Now we can look at our variables and see what expressions
created them
[Stellar]>>> # NOTE: the 40 is the max char for a word
[Stellar]>>> SHELL_LIST_VARS( 40 )
╔═══════════════════════════╤═══════════════════════════════════════════╤═════════════════════════════════════╗
@@ -549,7 +787,7 @@ Please note that functions are loading lazily in the
background and will be unav
[Stellar]>>> # If it is not there, which it is not by default, a suitable
default
[Stellar]>>> # config will be specified.
[Stellar]>>> squid_enrichment_config := CONFIG_GET('ENRICHMENT', 'squid')
-26307 [Thread-1] INFO o.r.Reflections - Reflections took 24845 ms to scan 22
urls, producing 17898 keys and 121520 values
+26307 [Thread-1] INFO o.r.Reflections - Reflections took 24845 ms to scan 22
urls, producing 17898 keys and 121520 values
26389 [Thread-1] INFO o.a.m.c.d.FunctionResolverSingleton - Found 84 Stellar
Functions...
Functions loaded, you may refer to functions now...
[Stellar]>>> # Just to make sure it looks right, we can view the JSON
@@ -730,7 +968,7 @@ Arguments:
Returns: The String representation of the config in zookeeper
[Stellar]>>> squid_enrichment_config_new :=
ENRICHMENT_STELLAR_TRANSFORM_REMOVE( squid_enrichment_config_new, 'ENRICHMENT',
[ 'is_local' ] )
-[Stellar]>>> # Make sure that it is really gone
+[Stellar]>>> # Make sure that it is really gone
[Stellar]>>> ENRICHMENT_STELLAR_TRANSFORM_PRINT(squid_enrichment_config_new,
'ENRICHMENT')
╔═══════╤═══════╤════════════════╗
║ Group │ Field │ Transformation ║
@@ -769,7 +1007,7 @@ Returns: The String representation of the config in
zookeeper
},
"configuration" : { }
}
-[Stellar]>>>
+[Stellar]>>>
```
### Manage Threat Triage Rules
@@ -783,7 +1021,7 @@ Please note that functions are loading lazily in the
background and will be unav
[Stellar]>>> # If it is not there, which it is not by default, a suitable
default
[Stellar]>>> # config will be specified.
[Stellar]>>> squid_enrichment_config := CONFIG_GET('ENRICHMENT', 'squid')
-26751 [Thread-1] INFO o.r.Reflections - Reflections took 24407 ms to scan 22
urls, producing 17898 keys and 121520 values
+26751 [Thread-1] INFO o.r.Reflections - Reflections took 24407 ms to scan 22
urls, producing 17898 keys and 121520 values
26828 [Thread-1] INFO o.a.m.c.d.FunctionResolverSingleton - Found 84 Stellar
Functions...
Functions loaded, you may refer to functions now...
[Stellar]>>> # We should not have any threat triage rules
@@ -795,7 +1033,7 @@ Functions loaded, you may refer to functions now...
╚═════════════════════╝
[Stellar]>>> # I have followed the blog post at
https://cwiki.apache.org/confluence/display/METRON/2016/04/28/Metron+Tutorial+-+Fundamentals+Part+2%3A+Creating+a+New+Enrichment
-[Stellar]>>> # and have some enrichment reference data loaded into hbase,
+[Stellar]>>> # and have some enrichment reference data loaded into hbase,
[Stellar]>>> # so we should be able to retrieve that as an enrichment using
the ENRICHMENT_GET
[Stellar]>>> # function to call out to hbase from stellar
[Stellar]>>> ?ENRICHMENT_GET
@@ -931,7 +1169,7 @@ Aggregation: MAX
"configuration" : { }
}
[Stellar]>>> # Now that we have admired it, we can remove the rules
-[Stellar]>>> squid_enrichment_config_new := THREAT_TRIAGE_REMOVE(
squid_enrichment_config_new, [ SHELL_GET_EXPRESSION('non_us') ,
SHELL_GET_EXPRESSION('is_local') , SHELL_GET_EXPRES
+[Stellar]>>> squid_enrichment_config_new := THREAT_TRIAGE_REMOVE(
squid_enrichment_config_new, [ SHELL_GET_EXPRESSION('non_us') ,
SHELL_GET_EXPRESSION('is_local') , SHELL_GET_EXPRES
SION('is_both') ] )
[Stellar]>>> THREAT_TRIAGE_PRINT(squid_enrichment_config_new)
╔══════╤═════════╤═════════════╤═══════╗
@@ -974,104 +1212,5 @@ SION('is_both') ] )
},
"configuration" : { }
}
-[Stellar]>>>
+[Stellar]>>>
```
-
-### Simulate Threat Triage Rules
-
-1. Create a threat triage engine.
-
- ```
- [Stellar]>>> t := THREAT_TRIAGE_INIT()
- [Stellar]>>> t
- ThreatTriage{0 rule(s)}
- ```
-
-1. Add a few triage rules.
-
- ```
- [Stellar]>>> THREAT_TRIAGE_ADD(t, {"name":"rule1", "rule":"value>10",
"score":10})
- ```
- ```
- [Stellar]>>> THREAT_TRIAGE_ADD(t, {"name":"rule2", "rule":"value>20",
"score":20})
- ```
- ```
- [Stellar]>>> THREAT_TRIAGE_ADD(t, {"name":"rule3", "rule":"value>30",
"score":30})
- ```
-
-1. Review the rules that you have created.
- ```
- [Stellar]>>> THREAT_TRIAGE_PRINT(t)
- ╔═══════╤═════════╤═════════════╤═══════╤════════╗
- ║ Name │ Comment │ Triage Rule │ Score │ Reason ║
- ╠═══════╪═════════╪═════════════╪═══════╪════════╣
- ║ rule1 │ │ value>10 │ 10 │ ║
- ╟───────┼─────────┼─────────────┼───────┼────────╢
- ║ rule2 │ │ value>20 │ 20 │ ║
- ╟───────┼─────────┼─────────────┼───────┼────────╢
- ║ rule3 │ │ value>30 │ 30 │ ║
- ╚═══════╧═════════╧═════════════╧═══════╧════════╝
- ```
-
-1. Create a few test messages to simulate your telemetry.
- ```
- [Stellar]>>> msg1 := "{ \"value\":22 }"
- [Stellar]>>> msg1
- { "value":22 }
- ```
- ```
- [Stellar]>>> msg2 := "{ \"value\":44 }"
- [Stellar]>>> msg2
- { "value":44 }
- ```
-
-1. Score a message based on the rules that have been defined. The result
allows you to see the total score, the aggregator, along with details about
each rule that fired.
-
- ```
- [Stellar]>>> THREAT_TRIAGE_SCORE( msg1, t)
- {score=20.0, aggregator=MAX, rules=[{score=10.0, name=rule1,
rule=value>10}, {score=20.0, name=rule2, rule=value>20}]}
- ```
- ```
- [Stellar]>>> THREAT_TRIAGE_SCORE( msg2, t)
- {score=30.0, aggregator=MAX, rules=[{score=10.0, name=rule1,
rule=value>10}, {score=20.0, name=rule2, rule=value>20}, {score=30.0,
name=rule3, rule=value>30}]}
- ```
-
-1. From here you can iterate on your rule set until it does exactly what you
need it to do. Once you have a working rule set, extract the configuration and
push it into your live, Metron cluster.
-
- ```
- [Stellar]>>> conf := THREAT_TRIAGE_CONFIG( t)
- [Stellar]>>> conf
- {
- "enrichment" : {
- "fieldMap" : { },
- "fieldToTypeMap" : { },
- "config" : { }
- },
- "threatIntel" : {
- "fieldMap" : { },
- "fieldToTypeMap" : { },
- "config" : { },
- "triageConfig" : {
- "riskLevelRules" : [ {
- "name" : "rule1",
- "rule" : "value>10",
- "score" : 10.0
- }, {
- "name" : "rule2",
- "rule" : "value>20",
- "score" : 20.0
- }, {
- "name" : "rule3",
- "rule" : "value>30",
- "score" : 30.0
- }],
- "aggregator" : "MAX",
- "aggregationConfig" : { }
- }
- },
- "configuration" : { }
- }
- ```
- ```
- [Stellar]>>> CONFIG_PUT("ENRICHMENT", conf, "bro")
- ```
diff --git
a/metron-platform/metron-management/src/main/java/org/apache/metron/management/ParserFunctions.java
b/metron-platform/metron-management/src/main/java/org/apache/metron/management/ParserFunctions.java
index fcb91f9..584bff9 100644
---
a/metron-platform/metron-management/src/main/java/org/apache/metron/management/ParserFunctions.java
+++
b/metron-platform/metron-management/src/main/java/org/apache/metron/management/ParserFunctions.java
@@ -46,12 +46,13 @@ public class ParserFunctions {
@Stellar(
namespace = "PARSER",
name = "INIT",
- description = "Initialize a parser to parse messages.",
+ description = "Initialize a parser to parse the raw telemetry
produced by a sensor.",
params = {
"sensorType - The type of sensor to parse.",
- "config - The parser configuration."
+ "config - [Optional] The parser configuration. If not
provided, the configuration will be " +
+ "retrieved from Zookeeper."
},
- returns = "A parser that can be used to parse messages."
+ returns = "A parser that can be used to parse sensor telemetry with
`PARSER_PARSE`."
)
public static class InitializeFunction implements StellarFunction {
@@ -121,12 +122,13 @@ public class ParserFunctions {
@Stellar(
namespace = "PARSER",
name = "PARSE",
- description = "Parse a message.",
+ description = "Parses the raw telemetry produced by a sensor.",
params = {
"parser - The parser created with PARSER_INIT.",
- "input - A message or list of messages to parse."
+ "input - A telemetry message or list of telemetry messages
to parse."
},
- returns = "A list of messages that result from parsing the input."
+ returns = "A list of messages that result from parsing the input
telemetry. If the input cannot be " +
+ "parsed, a message encapsulating the error is returned as
part of that list."
)
public static class ParseFunction implements StellarFunction {