Github user mmiklavc commented on the issue:
https://github.com/apache/metron/pull/840
Ok, here is the remaining bit of the test plan for verifying ES. Thanks
@cestella for pulling together some of the public test scripts around this.
# Test Script
Testing Kibana dashboards - see
[here](https://github.com/apache/metron/pull/840#issuecomment-348085037)
Testing Instructions beyond the normal smoke test (i.e. letting data
flow through to the indices and checking them).
# Preliminaries
Set an environment variable to indicate `METRON_HOME`:
* `export METRON_HOME=/usr/metron/0.4.2`
# Deploy the dummy parser
* Edit `$METRON_HOME/config/zookeeper/parsers/dummy.json`:
```
{
"parserClassName":"org.apache.metron.parsers.json.JSONMapParser",
"sensorTopic":"dummy"
}
```
* Create the dummy kafka topic:
`/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper node1:2181
--create --topic dummy --partitions 1 --replication-factor 1`
* Persist config changes: `$METRON_HOME/bin/zk_load_configs.sh -m PUSH -i
$METRON_HOME/config/zookeeper -z node1:2181`
* Start via `$METRON_HOME/bin/start_parser_topology.sh -k node1:6667 -z
node1:2181 -s dummy`
# Send dummy data through
* Edit `~/msg.json` with the following content:
```
{ "guid" : "guid0", "sensor.type" : "dummy", "timestamp" : 100 }
```
* Send `msg.json` through to kafka via `cat ~/msg.json |
/usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list
node1:6667 --topic dummy`
* Validate data has been written to the index:
```
curl -XPOST 'http://localhost:9200/dummy*/_search?pretty'
```
## Test Case: Update via patch
* Patch the message in ES and create a new field 'project' by executing
the following:
```
curl -u user:password -X PATCH --header 'Content-Type: application/json'
--header 'Accept: */*' -d '{
"guid" : "guid0",
"sensorType" : "dummy",
"patch" : [
{
"op": "add"
, "path": "/project"
, "value": "metron"
}
]
}' 'http://node1:8082/api/v1/update/patch'
```
* Validate that the message has a field 'project':
```
curl -XPOST 'http://localhost:9200/dummy*/_search?pretty' -d '
{
"_source" : [ "project" ]
}
'
```
## Test Case: Update via replace
* Replace the message in ES and create a couple of modifications:
* new field `new_field` == "brand new"
* modified `timestamp` == 7
Execute the following:
```
curl -u user:password -X POST --header 'Content-Type: application/json'
--header 'Accept: */*' -d '{
"guid" : "guid0",
"sensorType" : "dummy",
"replacement" : {
"source:type": "dummy",
"guid" : "guid0",
"new_field" : "brand new",
"timestamp" : 7
}
}' 'http://node1:8082/api/v1/update/replace'
```
* Validate that the message has a field 'new_field':
```
curl -XPOST 'http://localhost:9200/dummy*/_search?pretty' -d '
{
"_source" : [ "new_field", "timestamp" ]
}
'
```
## Meta Alerts Test
### Set Up Base Data
We're going to set up a bit of base data.
Retrieve the current list of indices so we know where to put our data
```
curl 'node1:9200/_cat/indices?v'
health status index pri rep docs.count docs.deleted
store.size pri.store.size
green open snort_index_2017.09.06.14 1 0 130 0
180.9kb 180.9kb
green open bro_index_2017.09.06.14 1 0 160 0
564.3kb 564.3kb
green open .kibana 1 0 52 0
71.2kb 71.2kb
green open metaalert_index 1 0 6 0
62.3kb 62.3kb
```
In this case, we care about `snort_index_2017.09.06.14` and
`metaalert_index`. To make our lives easier, we'll add a couple of stripped
down messages to the our snort index (Make sure to sub in the correct index
name):
```
curl -XPUT
'node1:9200/snort_index_2017.09.06.14/snort_doc/snort_test_1?pretty' -H
'Content-Type: application/json' -d'
{
"msg": "snort test alert",
"ip_dst_port": "8080",
"ethsrc": "0A:00:27:00:00:00",
"protocol": "TCP",
"source:type": "snort",
"ip_dst_addr": "192.168.66.121",
"ip_src_addr": "192.168.66.1",
"threat:triage:rules:0:score": 10,
"timestamp": 1504708744000,
"threat:triage:rules:0:reason": null,
"threat:triage:score": 10,
"is_alert": "true",
"ip_src_port": "50187",
"guid": "snort_test_1"
}
'
```
```
curl -XPUT
'node1:9200/snort_index_2017.09.06.14/snort_doc/snort_test_2?pretty' -H
'Content-Type: application/json' -d'
{
"msg": "snort test alert 2",
"ip_dst_port": "8080",
"ethsrc": "0A:00:27:00:00:00",
"protocol": "TCP",
"source:type": "snort",
"ip_dst_addr": "192.168.66.121",
"ip_src_addr": "192.168.66.1",
"threat:triage:rules:0:score": 10,
"timestamp": 1504708744000,
"threat:triage:rules:0:reason": null,
"threat:triage:score": 10,
"is_alert": "true",
"ip_src_port": "50187",
"guid": "snort_test_2"
}
'
```
### Create a Meta Alert
At this point, we'll group these alerts together. In Ambari, go to Metron
-> Quick Links -> Swagger UI and go to the "Meta Alert Controller".
Click on the create endpoint, and we'll want to send this request (but with
the appropriate index subbed in):
```
{
"groups": [
"group_one",
"group_two"
],
"guidToIndices": {
"snort_test_1":"snort_index_2017.09.06.14",
"snort_test_2":"snort_index_2017.09.06.14"
}
}
```
Validate that the metaalert was created and looks good:
```
curl 'node1:9200/m*/_search?pretty'
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "metaalerts",
"_type" : "metaalert_doc",
"_id" : "d414a9f2-7a03-4e47-9108-16b6fc800dd3",
"_score" : 1.0,
"_timestamp" : 1504725383439,
"_source" : {
"average" : 10.0,
"min" : 10.0,
"median" : 10.0,
"alert" : [ {
"msg" : "snort test alert",
"threat:triage:rules:0:reason" : null,
"ip_dst_port" : "8080",
"ethsrc" : "0A:00:27:00:00:00",
"threat:triage:score" : 10,
"is_alert" : "true",
"protocol" : "TCP",
"source:type" : "snort",
"ip_dst_addr" : "192.168.66.121",
"ip_src_port" : "50187",
"guid" : "snort_test_1",
"ip_src_addr" : "192.168.66.1",
"threat:triage:rules:0:score" : 10,
"timestamp" : 1504708744000
}, {
"msg" : "snort test alert 2",
"threat:triage:rules:0:reason" : null,
"ip_dst_port" : "8080",
"ethsrc" : "0A:00:27:00:00:00",
"threat:triage:score" : 10,
"is_alert" : "true",
"protocol" : "TCP",
"source:type" : "snort",
"ip_dst_addr" : "192.168.66.121",
"ip_src_port" : "50187",
"guid" : "snort_test_2",
"ip_src_addr" : "192.168.66.1",
"threat:triage:rules:0:score" : 10,
"timestamp" : 1504708744000
} ],
"max" : 10.0,
"threat:triage:score" : 20.0,
"count" : 2,
"guid" : "d414a9f2-7a03-4e47-9108-16b6fc800dd3",
"groups" : [ "group_one", "group_two" ],
"sum" : 20.0,
"status" : "active"
}
} ]
}
}
```
Note that both sub alerts are present, the various counts are filled in, a
GUID has been given specifically to this meta alert, etc.
### Searching
Searching from the REST API works mostly as expected. After the above data
has been created, use the search endpoint to run this query:
```
{
"from": 0,
"size": 2,
"indices": [
"*"
],
"query": "guid=snort_test_2",
"sort": [
{
"field": "_timestamp",
"sortOrder": "ASC"
}
]
}
```
The result should look similar to the following, and have the messages we'd
expect (one from snort and one from metaalerts):
```
{
"total": 2,
"results": [
{
"id": "snort_test_2",
"source": {
"msg": "snort test alert 2",
"threat:triage:rules:0:reason": null,
"ip_dst_port": "8080",
"ethsrc": "0A:00:27:00:00:00",
"threat:triage:score": 10,
"is_alert": "true",
"protocol": "TCP",
"source:type": "snort",
"ip_dst_addr": "192.168.66.121",
"ip_src_port": "50187",
"guid": "snort_test_2",
"ip_src_addr": "192.168.66.1",
"threat:triage:rules:0:score": 10,
"timestamp": 1504708744000
},
"score": 1,
"index": "snort_index_2017.09.06.14"
},
{
"id": "d414a9f2-7a03-4e47-9108-16b6fc800dd3",
"source": {
"average": 10,
"min": 10,
"median": 10,
"alert": [
{
"msg": "snort test alert",
"threat:triage:rules:0:reason": null,
"ip_dst_port": "8080",
"ethsrc": "0A:00:27:00:00:00",
"threat:triage:score": 10,
"is_alert": "true",
"protocol": "TCP",
"source:type": "snort",
"ip_dst_addr": "192.168.66.121",
"ip_src_port": "50187",
"guid": "snort_test_1",
"ip_src_addr": "192.168.66.1",
"threat:triage:rules:0:score": 10,
"timestamp": 1504708744000
},
{
"msg": "snort test alert 2",
"threat:triage:rules:0:reason": null,
"ip_dst_port": "8080",
"ethsrc": "0A:00:27:00:00:00",
"threat:triage:score": 10,
"is_alert": "true",
"protocol": "TCP",
"source:type": "snort",
"ip_dst_addr": "192.168.66.121",
"ip_src_port": "50187",
"guid": "snort_test_2",
"ip_src_addr": "192.168.66.1",
"threat:triage:rules:0:score": 10,
"timestamp": 1504708744000
}
],
"max": 10,
"threat:triage:score": 20,
"count": 2,
"guid": "d414a9f2-7a03-4e47-9108-16b6fc800dd3",
"groups": [
"group_one",
"group_two"
],
"sum": 20,
"status": "active"
},
"score": 1,
"index": "metaalerts"
}
]
}
```
---