Intrusion Prevention System

STATE: unstable

TESTS: ansibleguy.opnsense.ids_general | ansibleguy.opnsense.ids_action | ansibleguy.opnsense.ids_policy | ansibleguy.opnsense.ids_policy_rule | ansibleguy.opnsense.ids_rule | ansibleguy.opnsense.ids_ruleset | ansibleguy.opnsense.ids_user_rule

API Docs: IDS

Service Docs: Intrusion Prevention System

Definition

For basic parameters see: Basic

ansibleguy.opnsense.ids_action

Definition

Parameter

Type

Required

Default

Aliases

Comment

action

string

true

-

do, a

Action to execute. One of: ‘get_alert_info’, ‘get_alert_logs’, ‘query_alerts’, ‘status’, ‘reconfigure’, ‘restart’, ‘start’, ‘stop’, ‘drop_alert_log’, ‘reload_rules’, ‘update_rules’. These ones return information: ‘get_alert_info’, ‘get_alert_logs’, ‘query_alerts’, ‘status’

alert_id

string

false

-

alert

Parameter Alert-ID needed for ‘get_alert_info’

ansibleguy.opnsense.ids_general

Interfaces for ‘ids_general’ must be provided as used in the network config (p.e. ‘opt1’ instead of ‘DMZ’)

Definition

Parameter

Type

Required

Default

Aliases

Comment

interfaces

list

true

-

ints

Select interface(s) to use. When enabling IPS, only use physical interfaces here (no vlans etc)

enabled

boolean

false

true

-

Enable intrusion detection system

block

boolean

false

false

protection, ips

Enable protection mode (block traffic). Before enabling, please disable all hardware offloading first in advanced network!

promiscuous

boolean

false

-

physical, vlan

For certain setups (like IPS with vlans), this is required to actually capture data on the physical interface

default_packet_size

int

false

(system default)

packet_size

With this option, you can set the size of the packets on your network. It is possible that bigger packets have to be processed sometimes. The engine can still process these bigger packets, but processing it will lower the performance. Unset = system default

local_networks

list

false

[‘192.168.0.0/16’, ‘10.0.0.0/8’, ‘172.16.0.0/12’]

home_networks

Networks to interpret as local

pattern_matcher

string

false

(system default)

algorithm, matcher, algo

One of: ‘ac’, ‘ac-bs’, ‘ac-ks’, ‘hs’. Select the multi-pattern matcher algorithm to use. Options: unset = system default, ‘ac’ = ‘Aho-Corasick’, ‘ac-bs’ = ‘Aho-Corasick, reduced memory implementation’, ‘ac-ks’ = ‘Aho-Corasick, Ken Steele variant’, ‘hs’ = ‘Hyperscan’

profile

string

false

(system default)

detect_profile

One of: ‘low’, ‘medium’, ‘high’, ‘custom’. The detection engine builds internal groups of signatures. The engine allow us to specify the profile to use for them, to manage memory on an efficient way keeping a good performance. Unset = system default

profile_toclient_groups

integer

true if profile = ‘custom’

-

toclient_groups

Between 0 and 65535. If Custom is specified. The detection engine tries to split out separate signatures into groups so that a packet is only inspected against signatures that can actually match. As in large rule set this would result in way too many groups and memory usage similar groups are merged together

profile_toserver_groups

integer

true if profile = ‘custom’

-

toserver_groups

See ‘profile_toclient_groups’

schedule

string

false

‘ids rule updates’

update_cron

Name/Description of an existing cron-job that should be used to update IDS

syslog_alerts

boolean

false

-

syslog, log

Send alerts to system log in fast log format. This will not change the alert logging used by the product itself

syslog_output

boolean

false

-

log_stdout

Send alerts in eve format to syslog, using log level info. This will not change the alert logging used by the product itself. Drop logs will only be send to the internal logger, due to restrictions in suricata

log_level

string

false

(system default)

-

One of: ‘info’, ‘perf’, ‘config’, ‘debug’. Increase the verbosity of the Suricata application logging by increasing the log level from the default. Unset = system default

log_retention

integer

false

4

log_count

Number of logs to keep

log_payload

boolean

false

-

log_packet

Send packet payload to the log for further analyses

log_rotate

string

false

weekly

-

One of: ‘weekly’, ‘daily’. Rotate alert logs at provided interval

reload

boolean

false

true

-

If the running config should be reloaded on change - this may take some time. For mass-managing items you might want to reload it ‘manually’ after all changes are done => using the ansibleguy.opnsense.reload module.

ansibleguy.opnsense.ids_ruleset

The reload action will download/update the rulesets. If modifying multiple ones in a loop you might want to disable it on single calls.

Definition

Parameter

Type

Required

Default

Aliases

Comment

name

string

true

-

description, desc

Name of the ruleset you want to modify. Will show a list of existing ones if an invalid one is supplied!

enabled

boolean

false

true

-

En- or disable the ruleset

reload

boolean

false

true

-

If the running config should be reloaded on change - this may take some time. For mass-managing items you might want to reload it ‘manually’ after all changes are done => using the ansibleguy.opnsense.reload module.

ansibleguy.opnsense.ids_rule

Definition

Parameter

Type

Required

Default

Aliases

Comment

sid

integer

true

-

id

Unique signature-ID of the rule you want to modify

action

string

false

alert

a

One of ‘alert’, ‘drop’. Set action to perform here, only used when in IPS mode

enabled

boolean

false

true

-

En- or disable the rule

reload

boolean

false

true

-

If the running config should be reloaded on change - this may take some time. For mass-managing items you might want to reload it ‘manually’ after all changes are done => using the ansibleguy.opnsense.reload module.

ansibleguy.opnsense.ids_user_rule

Definition

Parameter

Type

Required

Default

Aliases

Comment

name

string

true

-

description, desc

Unique rule name

source_ip

string

false

-

source, src_ip, src

Set the source IP or network to match. Leave this field empty for using ‘any’

destination_ip

string

false

-

destination, dst_ip, dst

Set the destination IP or network to match. Leave this field empty for using ‘any’

ssl_fingerprint

string

false

-

fingerprint, ssl_fp

The SSL fingerprint, for example: ‘B5:E1:B3:70:5E:7C:FF:EB:92:C4:29:E5:5B:AC:2F:AE:70:17:E9:9E’

action

string

false

alert

a”

One of ‘alert’, ‘drop’, ‘pass’. Set action to perform here, only used when in IPS mode

bypass

boolean

false

false

bp

Set bypass keyword. Increases traffic throughput. Suricata reads a packet, decodes it, checks it in the flow table. If the corresponding flow is local bypassed then it simply skips all streaming, detection and output and the packet goes directly out in IDS mode and to verdict in IPS mode

enabled

boolean

false

true

-

En- or disable the rule

reload

boolean

false

true

-

If the running config should be reloaded on change - this may take some time. For mass-managing items you might want to reload it ‘manually’ after all changes are done => using the ansibleguy.opnsense.reload module.

ansibleguy.opnsense.ids_policy

Definition

Parameter

Type

Required

Default

Aliases

Comment

name

string

true

-

description, desc

Unique policy name

priority

integer

false

0

prio

Policies are processed on a first match basis a lower number means more important

rulesets

list

false

-

rs

Rulesets this policy applies to (all when none selected). Rulesets must be enabled beforehand!

action

list

false

-

a

One or multiple of: ‘disable’, ‘alert’, ‘drop’. Rule configured action

new_action

string

false

alert

na

One or multiple of: ‘default’, ‘disable’, ‘alert’, ‘drop’. Action to perform when filter policy applies

rules

dictionary

false

-

-

Key-value pairs of policy-rules as provided by the enabled rulesets. Values must be string or lists. Example: ‘{rules: {signature_severity: [Minor, Major], tag: Dshield}}’

enabled

boolean

false

true

-

En- or disable the Policy

reload

boolean

false

true

-

If the running config should be reloaded on change - this may take some time. For mass-managing items you might want to reload it ‘manually’ after all changes are done => using the ansibleguy.opnsense.reload module.

ansibleguy.opnsense.ids_policy_rule

Definition

Parameter

Type

Required

Default

Aliases

Comment

sid

integer

true

-

id

Unique signature-ID of the rule you want to match

action

string

false

alert

a

One of: ‘alert’, ‘drop’. Rule configured action

enabled

boolean

false

true

-

En- or disable the rule

reload

boolean

false

true

-

If the running config should be reloaded on change - this may take some time. For mass-managing items you might want to reload it ‘manually’ after all changes are done => using the ansibleguy.opnsense.reload module.

Info

Warning

The list module will not return all details of the existing entries as the current implementation does not scale well.

Examples

ansibleguy.opnsense.ids_action

- hosts: localhost
  gather_facts: false
  module_defaults:
    group/ansibleguy.opnsense.all:
      firewall: 'opnsense.template.ansibleguy.net'
      api_credential_file: '/home/guy/.secret/opn.key'

  tasks:
    - name: Example
      ansibleguy.opnsense.ids_action:
        action: 'status'
        # alert_id: ''
        # debug: false

    - name: Pull Alert Logs
      ansibleguy.opnsense.ids_action:
        action: 'get_alert_logs'
      register: ids_logs

    - name: Printing
      ansible.builtin.debug:
        var: ids_logs.data

    - name: Reload Rules
      ansibleguy.opnsense.ids_action:
        action: 'reload_rules'

    - name: Update Rules
      ansibleguy.opnsense.ids_action:
        action: 'update_rules'

    - name: Pull Alert Information
      ansibleguy.opnsense.ids_action:
        action: 'get_alert_info'
        alert_id: 1337
      register: ids_alert

    - name: Printing
      ansible.builtin.debug:
        var: ids_alert.data

ansibleguy.opnsense.ids_general

- hosts: localhost
  gather_facts: false
  module_defaults:
    group/ansibleguy.opnsense.all:
      firewall: 'opnsense.template.ansibleguy.net'
      api_credential_file: '/home/guy/.secret/opn.key'

    ansibleguy.opnsense.list:
      target: 'ids_general'

  tasks:
    - name: Example
      ansibleguy.opnsense.ids_general:
        interfaces: ['opt1']
        # enabled: true
        # block: true
        # promiscuous: false
        # default_packet_size: ''
        # local_networks: ['192.168.0.0/16', '10.0.0.0/8', '172.16.0.0/12']
        # pattern_matcher: ''
        # profile: ''
        # profile_toclient_groups: ''
        # profile_toserver_groups: ''
        # schedule: 'ids rule updates'
        # syslog_alerts: false
        # syslog_output: false
        # log_level: ''
        # log_retention: 4
        # log_payload: false
        # log_rotate: 'weekly'
        # reload: true
        # debug: false

    - name: Enabling IDS (learning mode)
      ansibleguy.opnsense.ids_general:
        interfaces: ['opt1']
        enabled: true
        pattern_matcher: 'ac'
        profile: 'low'
        local_networks: ['10.0.0.0/16']
        log_rotate: 'daily'
        log_retention: 14
        syslog: true
        log_level: 'info'

    - name: Enabling IPS (blocking)
      ansibleguy.opnsense.ids_general:
        interfaces: ['opt1']
        enabled: true
        block: true
        pattern_matcher: 'ac'
        profile: 'low'
        local_networks: ['10.0.0.0/16']
        log_rotate: 'daily'
        log_retention: 14
        syslog: true
        log_level: 'info'

    - name: Listing
      ansibleguy.opnsense.list:
      #  target: 'ids_general'
      register: existing_settings

    - name: Printing Settings
      ansible.builtin.debug:
        var: existing_settings.data

ansibleguy.opnsense.ids_ruleset

- hosts: localhost
  gather_facts: false
  module_defaults:
    group/ansibleguy.opnsense.all:
      firewall: 'opnsense.template.ansibleguy.net'
      api_credential_file: '/home/guy/.secret/opn.key'

    ansibleguy.opnsense.list:
      target: 'ids_ruleset'

  tasks:
    - name: Example
      ansibleguy.opnsense.ids_ruleset:
        name: 'ET open/drop'
        # enabled: true
        # reload: true
        # debug: false

    - name: Enabling & downloading ruleset 'ET open/drop'
      ansibleguy.opnsense.ids_ruleset:
        name: 'ET open/compromised'
        reload: true

    - name: Disabling ruleset 'ET open/compromised'
      ansibleguy.opnsense.ids_ruleset:
        name: 'ET open/compromised'
        enabled: false

    - name: Listing
      ansibleguy.opnsense.list:
      #  target: 'ids_ruleset'
      register: existing_rulesets

    - name: Printing Rulesets
      ansible.builtin.debug:
        var: existing_rulesets.data

ansibleguy.opnsense.ids_rule

- hosts: localhost
  gather_facts: false
  module_defaults:
    group/ansibleguy.opnsense.all:
      firewall: 'opnsense.template.ansibleguy.net'
      api_credential_file: '/home/guy/.secret/opn.key'

    ansibleguy.opnsense.list:
      target: 'ids_rule'

  tasks:
    - name: Example
      ansibleguy.opnsense.ids_rule:
        sid: 2400000
        # enabled: true
        # action: 'alert'
        # reload: true
        # debug: false

    - name: Setting rule with ID 2400000 to drop
      ansibleguy.opnsense.ids_rule:
        sid: 2400000
        action: 'drop'

    - name: Disabling rule with ID 2400011
      ansibleguy.opnsense.ids_rule:
        sid: 2400011
        enabled: false

    - name: Listing
      ansibleguy.opnsense.list:
      #  target: 'ids_rule'
      register: existing_rules

    - name: Printing Rules
      ansible.builtin.debug:
        var: existing_rules.data

ansibleguy.opnsense.ids_user_rule

- hosts: localhost
  gather_facts: false
  module_defaults:
    group/ansibleguy.opnsense.all:
      firewall: 'opnsense.template.ansibleguy.net'
      api_credential_file: '/home/guy/.secret/opn.key'

    ansibleguy.opnsense.list:
      target: 'ids_user_rule'

  tasks:
    - name: Example
      ansibleguy.opnsense.ids_user_rule:
        name: 'Example'
        # source_ip: ''
        # destination_ip: ''
        # ssl_fingerprint: ''
        # action: 'alert'
        # bypass: false
        # enabled: true
        # reload: true
        # debug: false

    - name: Adding
      ansibleguy.opnsense.ids_user_rule:
        name: 'ANSIBLE_TEST_1_1'
        source_ip: '192.168.10.1'
        destination_ip: '1.1.1.1'
        action: 'alert'
        bypass: false

    - name: Disabling
      ansibleguy.opnsense.ids_user_rule:
        name: 'ANSIBLE_TEST_1_1'
        source_ip: '192.168.10.1'
        destination_ip: '1.1.1.1'
        action: 'alert'
        bypass: false
        enabled: false

    - name: Removing
      ansibleguy.opnsense.ids_user_rule:
        name: 'ANSIBLE_TEST_1_1'
        state: 'absent'

    - name: Listing
      ansibleguy.opnsense.list:
      #  target: 'ids_user_rule'
      register: existing_rules

    - name: Printing Rules
      ansible.builtin.debug:
        var: existing_rules.data

ansibleguy.opnsense.ids_policy

- hosts: localhost
  gather_facts: false
  module_defaults:
    group/ansibleguy.opnsense.all:
      firewall: 'opnsense.template.ansibleguy.net'
      api_credential_file: '/home/guy/.secret/opn.key'

    ansibleguy.opnsense.list:
      target: 'ids_policy'

  tasks:
    - name: Example
      ansibleguy.opnsense.ids_policy:
        name: 'Example'
        # priority: 0
        # rulesets: []
        # action: []
        # new_action: 'alert'
        # rules: {}
        # enabled: true
        # reload: true
        # debug: false

    - name: Adding
      ansibleguy.opnsense.ids_policy:
        name: 'ANSIBLE_TEST_1_1'
        priority: 1
        rulesets: 'ET open/drop'
        action: ['drop']
        new_action: 'alert'
        rules:
          classtype: ['misc-attack', 'bad-unknown']
          signature_severity: 'Minor'

    - name: Disabling
      ansibleguy.opnsense.ids_policy:
        name: 'ANSIBLE_TEST_1_1'
        priority: 1
        rulesets: 'ET open/drop'
        action: ['drop']
        new_action: 'alert'
        rules:
          classtype: ['misc-attack', 'bad-unknown']
          signature_severity: 'Minor'
        enabled: false

    - name: Removing
      ansibleguy.opnsense.ids_policy:
        name: 'ANSIBLE_TEST_1_1'
        state: 'absent'

    - name: Listing
      ansibleguy.opnsense.list:
      #  target: 'ids_policy'
      register: existing_policies

    - name: Printing Policies
      ansible.builtin.debug:
        var: existing_policies.data

ansibleguy.opnsense.ids_policy_rule

- hosts: localhost
  gather_facts: false
  module_defaults:
    group/ansibleguy.opnsense.all:
      firewall: 'opnsense.template.ansibleguy.net'
      api_credential_file: '/home/guy/.secret/opn.key'

    ansibleguy.opnsense.list:
      target: 'ids_policy_rule'

  tasks:
    - name: Example
      ansibleguy.opnsense.ids_policy_rule:
        sid: 2400000
        # action: 'alert'
        # enabled: true
        # reload: true
        # debug: false

    - name: Adding
      ansibleguy.opnsense.ids_policy_rule:
        sid: 2400000
        action: 'alert'

    - name: Disabling
      ansibleguy.opnsense.ids_policy_rule:
        sid: 2400000
        action: 'alert'
        enabled: false

    - name: Removing
      ansibleguy.opnsense.ids_policy_rule:
        sid: 2400000
        state: 'absent'

    - name: Listing
      ansibleguy.opnsense.list:
      #  target: 'ids_policy_rule'
      register: existing_rules

    - name: Printing Rules
      ansible.builtin.debug:
        var: existing_rules.data