Skip to content

Feat/8712 fw default policy v4.1 - #16015

Closed
lukashino wants to merge 5 commits into
OISF:mainfrom
lukashino:feat/8712-fw-default-policy-v4.1
Closed

Feat/8712 fw default policy v4.1#16015
lukashino wants to merge 5 commits into
OISF:mainfrom
lukashino:feat/8712-fw-default-policy-v4.1

Conversation

@lukashino

Copy link
Copy Markdown
Contributor

This is a draft to make sure the overall PR works; the subset of commits ready to review is in a separate PR.

Follow-up of #15950

Add a default-policy setting that applies to all hooks below it. For any hook the most specific setting present wins.
The flat layout had no way to express a default covering only the packet hooks or only the app hooks, so both move under their own node: packet-filter becomes packet.filter and <proto> becomes app.<proto>.
Action scopes are now validated against the hook they reach. A global accept:tx arriving at a packet hook is a startup error instead of being applied silently.

Link to ticket: https://redmine.openinfosecfoundation.org/issues/8712

Describe changes:
v4:

  • refactor of policy querying to make it more readable
  • doc updates

v3:

  • commit message update

v1/v2:

  • new suricata.yaml policy config structure
  • policy hook validation and hints
  • multi-layer default policy for firewall policies

SV_BRANCH=OISF/suricata-verify#3252

To consider:
As we changed the config structure for default policies, we can consider adding upgrade checks.
But since the firewall mode is experimental in 8, I avoided any conversion checks from the previous versions to keep the code simpler.

Lukas Sismis added 5 commits August 12, 2026 22:11
To avoid back-and-forth of http1 conversion
a second query function was added to support
existing use cases.

This change will be handy for the upcoming
default-policy for firewall settings
AppProtoToString(ALPROTO_HTTP1) returns "http", so an HTTP/1 policy had to
be written as `http:` while its rule hooks were already spelled `http1:`.
Use the same name in both places.

Ticket: 8712
The policy config was a flat map mixing packet hooks and app-layer
protocols: `packet-filter` next to `dns`. There was no node that meant
"the packet hooks" or "the app-layer hooks", so a setting could not be
scoped to one group.

Move each group under its own node:

    packet-filter     -> packet.filter
    packet-pre-flow   -> packet.pre-flow
    packet-pre-stream -> packet.pre-stream
    <proto>.<hook>    -> app.<proto>.<hook>

Ticket: 8712
Every hook has a built-in default policy, but expressing anything other
than the built-in meant naming each hook explicitly. Add a
`default-policy` setting that covers all hooks below it, so unlisted
hooks still get a policy. For any hook the most specific setting present
wins:

    app.<proto>.<sub state>.<hook>
    app.<proto>.<sub state>.default-policy
    app.<proto>.default-policy
    app.default-policy
    default-policy
    built-in

The packet hooks follow the same pattern under `packet`.

Resolution moves into ResolveFirewallPolicy(), which walks the candidate
paths most-specific-first and stops at the first one that is configured.
A path that is present but empty is now a startup error rather than being
treated as unset.

DoParseAppSubStatePolicy() collapses into DoParseAppPolicy() as a sub state
hook only differs by an extra path segment. Path assembly and hook-name
normalisation move to helpers now that both are needed in more places.

Ticket: 8712
Validate the resolved scope against the class of hook it is being applied
to and fail at startup if it does not fit, naming the config path and the
scopes that would be accepted there. A global `accept:tx` is now a startup
error.

Ticket: 8712
@suricata-qa

Copy link
Copy Markdown

Information: QA ran without warnings.

Pipeline = 32942

@lukashino
lukashino force-pushed the feat/8712-fw-default-policy-v4.1 branch from 12f60fc to 560be2f Compare August 12, 2026 20:58
@codecov

codecov Bot commented Aug 12, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 89.54248% with 16 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.99%. Comparing base (57ae571) to head (560be2f).

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #16015      +/-   ##
==========================================
- Coverage   83.03%   82.99%   -0.04%     
==========================================
  Files        1001     1001              
  Lines      276657   276677      +20     
==========================================
- Hits       229716   229632      -84     
- Misses      46941    47045     +104     
Flag Coverage Δ
fuzzcorpus 61.64% <4.57%> (-0.07%) ⬇️
livemode 18.47% <4.57%> (+0.02%) ⬆️
netns 22.86% <58.82%> (-0.05%) ⬇️
pcap 45.40% <4.57%> (-0.07%) ⬇️
suricata-verify 67.06% <88.88%> (-0.06%) ⬇️
unittests 58.46% <5.22%> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@suricata-qa

Copy link
Copy Markdown

Information: QA ran without warnings.

Pipeline = 32946

@lukashino

Copy link
Copy Markdown
Contributor Author

continues in #16049

@lukashino lukashino closed this Aug 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants