Skip to content
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
54 changes: 38 additions & 16 deletions doc/userguide/firewall/firewall-design.rst
Original file line number Diff line number Diff line change
Expand Up @@ -349,32 +349,54 @@ The example below accepts ARP again, using this mechanism.
Default policies
================

Each hook has a default policy. By default ``packet.filter`` enforces a ``drop:packet`` policy and the
``app`` hooks apply ``drop:flow``.
Each hook has a default policy applied to traffic that no firewall rule handled.
By default ``packet.filter`` enforces ``drop:packet``, ``packet.pre-flow`` and
``packet.pre-stream`` enforce ``accept:hook``, and every ``app`` hook enforces
``drop:flow``.

The policies can be configured in ``firewall`` block in the config. Packet hooks
live under ``packet`` and app-layer hooks under ``app``, keyed by protocol.

Example for ``packet.filter``, to use reject instead of drop::
Defaults are configured in the ``firewall.policies`` block. A ``default-policy``
for any hook may be given at several levels and the most specific present
setting wins::

firewall:
policies:
default-policy: ["accept:hook"] # global fallback (all hooks)
packet:
filter: [ "reject:packet" ]


Example for DNS::

firewall:
policies:
default-policy: ["drop:packet"] # fallback for packet hooks
filter: ["reject:packet"]
pre-flow: ["accept:hook"]
pre-stream: ["accept:hook"]
app:
default-policy: ["drop:flow"] # fallback for all app hooks
dns:
default-policy: ["drop:flow"] # fallback for dns hooks
request-started: ["accept:hook"]

# Drop and alert on all DNS requests that are not allowed in
# firewall.rules.
request-complete: ["drop:flow", "alert"]

# Accept all responses.
response-started: ["accept:tx"]

# Define default policies for protocols with sub states
http2:
default-policy: ["drop:flow"] # fallback for all http2 hooks
stream:
default-policy: ["drop:flow"] # fallback for http2 stream hooks
request-started: ["accept:hook"]
global:
request-started: ["accept:hook"]

Precedence:

* packet hook: ``packet.<hook>`` > ``packet.default-policy`` >
``policies.default-policy`` > built-in (``drop:packet`` or ``accept:hook``)
* app hook: ``app.<proto>.<hook>`` > ``app.<proto>.default-policy`` >
``app.default-policy`` > ``policies.default-policy`` > built-in (``drop:flow``)
* app hook in a sub state: ``app.<proto>.<sub state>.<hook>`` >
``app.<proto>.<sub state>.default-policy`` > ``app.<proto>.default-policy`` >
``app.default-policy`` > ``policies.default-policy`` > built-in (``drop:flow``)

An action scope must be valid for the hook it is applied to. For example,
defining ``accept:tx`` as a global default policy will fail to start Suricata,
because ``packet`` policies do not accept ``tx``.
Cover such hooks with a more specific setting so the incompatible default never
reaches them.
14 changes: 4 additions & 10 deletions src/detect-engine-analyzer.c
Original file line number Diff line number Diff line change
Expand Up @@ -2349,11 +2349,8 @@ int FirewallAnalyzer(const DetectEngineCtx *de_ctx)
const char *name =
AppLayerParserGetStateNameById(IPPROTO_TCP, a, state, STREAM_TOSERVER);
if (name == NULL) {
if (state == 0)
name = "request-started";
else if (state == complete_state_ts)
name = "request-complete";
else
name = DetectFirewallAppGenericHookName(state, complete_state_ts, STREAM_TOSERVER);
if (name == NULL)
name = "unknown";
}

Expand All @@ -2375,11 +2372,8 @@ int FirewallAnalyzer(const DetectEngineCtx *de_ctx)
const char *name =
AppLayerParserGetStateNameById(IPPROTO_TCP, a, state, STREAM_TOCLIENT);
if (name == NULL) {
if (state == 0)
name = "response-started";
else if (state == complete_state_tc)
name = "response-complete";
else
name = DetectFirewallAppGenericHookName(state, complete_state_tc, STREAM_TOCLIENT);
if (name == NULL)
name = "unknown";
}
char table_name[128];
Expand Down
Loading
Loading