Skip to content
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

Enable rules using patterns not regexes #743

Merged
merged 2 commits into from
Jul 29, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion test/falco_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ def check_detections_by_rule(self, res):
triggered_rules = match.group(1)

for rule, count in self.detect_counts.iteritems():
expected = '\s{}: (\d+)'.format(rule)
expected = '\s{}: (\d+)'.format(re.sub(r'([$\.*+?()[\]{}|^])', r'\\\1', rule))
match = re.search(expected, triggered_rules)

if match is None:
Expand Down
13 changes: 11 additions & 2 deletions test/falco_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,15 @@ trace_files: !mux
- rules/rule_names_with_spaces.yaml
trace_file: trace_files/cat_write.scap

rule_names_with_regex_chars:
detect: True
detect_level: WARNING
rules_file:
- rules/rule_names_with_regex_chars.yaml
detect_counts:
- 'Open From Cat ($\.*+?()[]{}|^)': 8
trace_file: trace_files/cat_write.scap

multiple_rules_first_empty:
detect: True
detect_level: WARNING
Expand Down Expand Up @@ -447,13 +456,13 @@ trace_files: !mux
- open_from_cat
trace_file: trace_files/cat_write.scap

disabled_rules_using_regex:
disabled_rules_using_substring:
detect: False
rules_file:
- rules/empty_rules.yaml
- rules/single_rule.yaml
disabled_rules:
- "open.*"
- "open_from"
trace_file: trace_files/cat_write.scap

disabled_rules_using_enabled_flag:
Expand Down
25 changes: 25 additions & 0 deletions test/rules/rule_names_with_regex_chars.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#
# Copyright (C) 2016-2018 Draios Inc dba Sysdig.
#
# This file is part of falco.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
- macro: is_cat
condition: proc.name=cat

- rule: Open From Cat ($\.*+?()[]{}|^)
desc: A process named cat does an open
condition: evt.type=open and is_cat
output: "An open was seen (command=%proc.cmdline)"
priority: WARNING
10 changes: 5 additions & 5 deletions userspace/engine/falco_engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,17 +206,17 @@ void falco_engine::load_rules_file(const string &rules_filename, bool verbose, b
load_rules(rules_content, verbose, all_events, required_engine_version);
}

void falco_engine::enable_rule(const string &pattern, bool enabled, const string &ruleset)
void falco_engine::enable_rule(const string &substring, bool enabled, const string &ruleset)
{
uint16_t ruleset_id = find_ruleset_id(ruleset);

m_sinsp_rules->enable(pattern, enabled, ruleset_id);
m_k8s_audit_rules->enable(pattern, enabled, ruleset_id);
m_sinsp_rules->enable(substring, enabled, ruleset_id);
m_k8s_audit_rules->enable(substring, enabled, ruleset_id);
}

void falco_engine::enable_rule(const string &pattern, bool enabled)
void falco_engine::enable_rule(const string &substring, bool enabled)
{
enable_rule(pattern, enabled, m_default_ruleset);
enable_rule(substring, enabled, m_default_ruleset);
}

void falco_engine::enable_rule_by_tag(const set<string> &tags, bool enabled, const string &ruleset)
Expand Down
9 changes: 5 additions & 4 deletions userspace/engine/falco_engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,17 @@ class falco_engine : public falco_common
void load_rules(const std::string &rules_content, bool verbose, bool all_events, uint64_t &required_engine_version);

//
// Enable/Disable any rules matching the provided pattern
// (regex). When provided, enable/disable these rules in the
// Enable/Disable any rules matching the provided substring.
// If the substring is "", all rules are enabled/disabled.
// When provided, enable/disable these rules in the
// context of the provided ruleset. The ruleset (id) can later
// be passed as an argument to process_event(). This allows
// for different sets of rules being active at once.
//
void enable_rule(const std::string &pattern, bool enabled, const std::string &ruleset);
void enable_rule(const std::string &substring, bool enabled, const std::string &ruleset);

// Wrapper that assumes the default ruleset
void enable_rule(const std::string &pattern, bool enabled);
void enable_rule(const std::string &substring, bool enabled);

//
// Enable/Disable any rules with any of the provided tags (set, exact matches only)
Expand Down
24 changes: 4 additions & 20 deletions userspace/engine/ruleset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,19 +202,8 @@ void falco_ruleset::add(string &name,
}
}

void falco_ruleset::enable(const string &pattern, bool enabled, uint16_t ruleset)
void falco_ruleset::enable(const string &substring, bool enabled, uint16_t ruleset)
{
regex re;
bool match_using_regex = true;

try {
re.assign(pattern);
}
catch (std::regex_error e)
{
match_using_regex = false;
}

while (m_rulesets.size() < (size_t) ruleset + 1)
{
m_rulesets.push_back(new ruleset_filters());
Expand All @@ -223,14 +212,9 @@ void falco_ruleset::enable(const string &pattern, bool enabled, uint16_t ruleset
for(const auto &val : m_filters)
{
bool matches;
if(match_using_regex)
{
matches = regex_match(val.first, re);
}
else
{
matches = (val.first.find(pattern) != string::npos);
}

matches = (substring == "" || (val.first.find(substring) != string::npos));

if (matches)
{
if(enabled)
Expand Down
5 changes: 2 additions & 3 deletions userspace/engine/ruleset.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ limitations under the License.
#include <vector>
#include <list>
#include <map>
#include <regex>

#include "sinsp.h"
#include "filter.h"
Expand All @@ -48,9 +47,9 @@ class falco_ruleset
// specifying unnecessarily large rulesets will result in
// unnecessarily large vectors.

// Find those rules matching the provided pattern and set
// Find those rules matching the provided substring and set
// their enabled status to enabled.
void enable(const std::string &pattern, bool enabled, uint16_t ruleset = 0);
void enable(const std::string &substring, bool enabled, uint16_t ruleset = 0);

// Find those rules that have a tag in the set of tags and set
// their enabled status to enabled. Note that the enabled
Expand Down
20 changes: 10 additions & 10 deletions userspace/falco/falco.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ static void usage()
" --cri <path> Path to CRI socket for container metadata\n"
" Use the specified socket to fetch data from a CRI-compatible runtime\n"
" -d, --daemon Run as a daemon\n"
" -D <pattern> Disable any rules matching the regex <pattern>. Can be specified multiple times.\n"
" -D <substring> Disable any rules with names having the substring <substring>. Can be specified multiple times.\n"
" Can not be specified with -t.\n"
" -e <events_file> Read the events from <events_file> (in .scap format for sinsp events, or jsonl for\n"
" k8s audit events) instead of tapping into live.\n"
Expand Down Expand Up @@ -471,9 +471,9 @@ int falco_init(int argc, char **argv)

try
{
set<string> disabled_rule_patterns;
string pattern;
string all_rules = ".*";
set<string> disabled_rule_substrings;
string substring;
string all_rules = "";
set<string> disabled_rule_tags;
set<string> enabled_rule_tags;

Expand Down Expand Up @@ -502,8 +502,8 @@ int falco_init(int argc, char **argv)
daemon = true;
break;
case 'D':
pattern = optarg;
disabled_rule_patterns.insert(pattern);
substring = optarg;
disabled_rule_substrings.insert(substring);
break;
case 'e':
trace_filename = optarg;
Expand Down Expand Up @@ -781,15 +781,15 @@ int falco_init(int argc, char **argv)
}

// You can't both disable and enable rules
if((disabled_rule_patterns.size() + disabled_rule_tags.size() > 0) &&
if((disabled_rule_substrings.size() + disabled_rule_tags.size() > 0) &&
enabled_rule_tags.size() > 0) {
throw std::invalid_argument("You can not specify both disabled (-D/-T) and enabled (-t) rules");
}

for (auto pattern : disabled_rule_patterns)
for (auto substring : disabled_rule_substrings)
{
falco_logger::log(LOG_INFO, "Disabling rules matching pattern: " + pattern + "\n");
engine->enable_rule(pattern, false);
falco_logger::log(LOG_INFO, "Disabling rules matching substring: " + substring + "\n");
engine->enable_rule(substring, false);
}

if(disabled_rule_tags.size() > 0)
Expand Down