Skip to content

add new field related_integrations to the post build #2060

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Changes from 4 commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
2811249
add new field `related_integrations` to the post build
Mikaayenson Jun 27, 2022
1381e11
add exception for endpoint `integration`
Mikaayenson Jun 27, 2022
9d43b5b
Skip rules without related integrations
Mikaayenson Jun 27, 2022
21b1a8e
lint
Mikaayenson Jun 27, 2022
0f4f88e
refactor related_integrations to TOMLRuleContents class
Mikaayenson Jun 29, 2022
9982dc2
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
Mikaayenson Jun 29, 2022
62c8aa2
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
Mikaayenson Jun 30, 2022
6ae5318
update to reflect required_fields updates
Mikaayenson Jun 30, 2022
2dbff89
Merge branch '2057-add-related_integrationsto-post-transform-build-pr…
Mikaayenson Jun 30, 2022
f4e39f6
add todo
Mikaayenson Jun 30, 2022
7d25987
add new line for linting
Mikaayenson Jun 30, 2022
fa8fc84
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
brokensound77 Jul 6, 2022
f53f9d7
added changes from required_fields PR
terrancedejesus Jul 6, 2022
d818c57
related_integrations updates, get_packaged_integrations returns list …
terrancedejesus Jul 6, 2022
6dfde72
build_integrations_manifest command completed
terrancedejesus Jul 7, 2022
0170361
initial test completed for post-building related_integrations
terrancedejesus Jul 8, 2022
3ccc408
removed get_integration_manifest method from rule, removed global int…
terrancedejesus Jul 8, 2022
9685bbe
moved integration related methods to integrations.py and fixed flake …
terrancedejesus Jul 8, 2022
ddcbbde
adjustments for PipedQuery from eql sequence rules and packages with …
terrancedejesus Jul 8, 2022
aff4d08
adjusted github client import for integrations.py
terrancedejesus Jul 8, 2022
5dbab29
Update detection_rules/devtools.py
terrancedejesus Jul 12, 2022
50c8664
Update detection_rules/devtools.py
terrancedejesus Jul 12, 2022
acc408c
added integration manifest schema, made adjustments
terrancedejesus Jul 12, 2022
e031f2c
Update detection_rules/integrations.py
terrancedejesus Jul 12, 2022
40c4eb9
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
terrancedejesus Jul 13, 2022
76cb759
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
terrancedejesus Jul 13, 2022
866e577
Update detection_rules/rule.py
terrancedejesus Jul 18, 2022
8457a3c
Update detection_rules/rule.py
terrancedejesus Jul 18, 2022
7d68f51
Update detection_rules/integrations.py
terrancedejesus Jul 18, 2022
5fdba7e
Update detection_rules/integrations.py
terrancedejesus Jul 18, 2022
07c331b
Update detection_rules/integrations.py
terrancedejesus Jul 18, 2022
357662b
Update detection_rules/rule.py
terrancedejesus Jul 18, 2022
c981d9f
removed get_integrations_package to consolidate code
terrancedejesus Jul 18, 2022
03fcef5
removed type list return
terrancedejesus Jul 18, 2022
b244b18
updating rule.py with new changes
terrancedejesus Jul 18, 2022
3b2961e
adjusted import flake errors
terrancedejesus Jul 18, 2022
db5ee18
Update detection_rules/integrations.py
terrancedejesus Jul 19, 2022
30d0c82
Update detection_rules/integrations.py
terrancedejesus Jul 19, 2022
71ffa74
adjusted indentation error
terrancedejesus Jul 19, 2022
47f67cf
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
terrancedejesus Jul 19, 2022
92e3c1c
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
terrancedejesus Jul 20, 2022
561987e
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
Mikaayenson Aug 2, 2022
15fc949
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
Mikaayenson Aug 2, 2022
a88f784
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
terrancedejesus Aug 3, 2022
1f76bbd
adjusted rule.get_packaged_integrations to account for kql.ast.OrExpr…
terrancedejesus Aug 3, 2022
f5e243e
Update detection_rules/devtools.py
terrancedejesus Aug 4, 2022
553e47b
Update detection_rules/devtools.py
terrancedejesus Aug 4, 2022
165f383
Update detection_rules/integrations.py
terrancedejesus Aug 4, 2022
d57f5dc
Update detection_rules/integrations.py
terrancedejesus Aug 4, 2022
684292d
adjusted find_least_compatible_version in integrations.py
terrancedejesus Aug 4, 2022
ef58a09
Update detection_rules/integrations.py
terrancedejesus Aug 4, 2022
1e6efa1
fixed flake issues
terrancedejesus Aug 4, 2022
ca3a082
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
terrancedejesus Aug 4, 2022
ee8ac61
adjusted get_packaged_integrations
terrancedejesus Aug 4, 2022
986f19b
iterate the ast for literal event.dataset values
brokensound77 Aug 4, 2022
1dcbff8
Update detection_rules/integrations.py
terrancedejesus Aug 4, 2022
fd26283
Update detection_rules/integrations.py
terrancedejesus Aug 4, 2022
e6230cb
Update detection_rules/integrations.py
terrancedejesus Aug 4, 2022
481d233
Update detection_rules/integrations.py
terrancedejesus Aug 4, 2022
0de0c45
made small adjustments to address errors during build manifests command
terrancedejesus Aug 4, 2022
825132a
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
terrancedejesus Aug 5, 2022
565b45b
Merge branch 'main' into 2057-add-related_integrationsto-post-transfo…
Mikaayenson Aug 8, 2022
abeccd0
addressing integrations.find_least_compatible method to return None i…
terrancedejesus Aug 8, 2022
2537d07
Update detection_rules/integrations.py
terrancedejesus Aug 8, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 73 additions & 2 deletions detection_rules/rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
import copy
import dataclasses
import json
import re
import requests
import typing
import yaml
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from functools import cached_property
Expand All @@ -19,6 +22,7 @@

import kql
from . import utils
from .misc import load_current_package_version
from .mixins import MarshmallowDataclassMixin, StackCompatMixin
from .rule_formatter import toml_write, nested_normalize
from .schemas import SCHEMA_DIR, definitions, downgrade, get_stack_schemas, get_min_supported_stack_version
Expand Down Expand Up @@ -438,13 +442,80 @@ def autobumped_version(self) -> Optional[int]:

return version + 1 if self.is_dirty else version

@staticmethod
def _post_dict_transform(obj: dict) -> dict:
def get_integration_manifest(self, integration_name: str) -> str:
url = f"https://raw.githubusercontent.com/elastic/integrations/main/packages/{integration_name}/manifest.yml"
response = requests.get(url)
manifest = yaml.safe_load(response.content)

# has multiple integrations in the package
return manifest.get("policy_templates")

def get_packaged_integrations(self, indices: list) -> list:
if not any("logs-" in index for index in indices):
return []

integrations = []
for index in indices:
if not index.startswith('logs-') or 'logs-*' in index:
continue

# parse integration name from index
integration = re.search(r"(?<=-)\w+", index).group()
rule_integration = {"package": integration}

# get policy templates from the integration manifest
packaged_integrations = self.get_integration_manifest(integration)

# check for integration within package
if "endpoint" in integration:
rule_integration.update({"integration": "events"})

elif len(packaged_integrations) > 1:

# check if integrations are supplied in index
integration_list = r"|".join([x['name'] for x in packaged_integrations])
integration_search = re.search(integration_list, index, re.IGNORECASE)
if integration_search:
integration_match = integration_search.group()

# add the specific sub package integration data if available
rule_integration.update({"integration": integration_match})

integrations.append(rule_integration)

return integrations

def _post_dict_transform(self, obj: dict) -> dict:
"""Transform the converted API in place before sending to Kibana."""

# cleanup the whitespace in the rule
obj = nested_normalize(obj)

if not isinstance(self, DeprecatedRuleContents):
current_version = Version(load_current_package_version())
restricted_fields = self.data.get_restricted_fields

for field_name, stack_values in restricted_fields.items():
if "related_integrations" in field_name:

integrations = None
invalid = (MachineLearningRuleData, ThreatMatchRuleData, ThresholdQueryRuleData)
if not isinstance(self.data, invalid):
indices = self.data.index
integrations = self.get_packaged_integrations(indices)

obj.setdefault("related_integrations", integrations)
elif "setup" in field_name:
...
else:
min_stack, max_stack = stack_values

if max_stack is None:
max_stack = current_version

if Version(min_stack) <= current_version >= Version(max_stack):
obj.setdefault(field_name, obj.get(field_name, None))

# fill in threat.technique so it's never missing
for threat_entry in obj.get("threat", []):
threat_entry.setdefault("technique", [])
Expand Down