1889 lines
95 KiB
Diff
1889 lines
95 KiB
Diff
|
From 81c2f59f42ffa2cf5a611eaeccc40c802bedd6d7 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Fri, 8 Jul 2022 17:51:57 +0200
|
||
|
Subject: [PATCH 01/23] Remove a rule from RHEL 9 OSPP
|
||
|
|
||
|
Remove rule sysctl_net_core_bpf_jit_harden from RHEL 9 OSPP. This rule
|
||
|
requires to set net.core.bpf_jit_harden value to 2, the RHEL 9 default
|
||
|
is 1. However, bpf_jit_harden=1 disables kallsyms access from bpf
|
||
|
programs and all users, and it turns on constants blinding by using
|
||
|
random value + XOR for CAP_BPF; so the only thing in which value 1 and 2
|
||
|
differ is the constants blinding for CAP_SYS_ADMIN processes in the
|
||
|
initial user namespaces. The extra constants blinding with
|
||
|
bpf_jit_harden=2 does not really help with CVE mitigation.
|
||
|
|
||
|
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2081728
|
||
|
---
|
||
|
products/rhel9/profiles/ospp.profile | 1 -
|
||
|
1 file changed, 1 deletion(-)
|
||
|
|
||
|
diff --git a/products/rhel9/profiles/ospp.profile b/products/rhel9/profiles/ospp.profile
|
||
|
index 244a421fb48..a7ba9532d2c 100644
|
||
|
--- a/products/rhel9/profiles/ospp.profile
|
||
|
+++ b/products/rhel9/profiles/ospp.profile
|
||
|
@@ -75,7 +75,6 @@ selections:
|
||
|
- sysctl_kernel_perf_event_paranoid
|
||
|
- sysctl_user_max_user_namespaces
|
||
|
- sysctl_kernel_unprivileged_bpf_disabled
|
||
|
- - sysctl_net_core_bpf_jit_harden
|
||
|
- service_kdump_disabled
|
||
|
|
||
|
### Audit
|
||
|
|
||
|
From bdcd2bafe5dd68448c0fc13e1aa1be64df607c8f Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Tue, 12 Jul 2022 11:24:42 +0200
|
||
|
Subject: [PATCH 02/23] Rename IDs in sysctl OVAL template
|
||
|
|
||
|
The sysctl template uses its sysctlvar parameter value as a part of OVAL
|
||
|
object IDs, test IDs and state IDs. That means we can't have multiple
|
||
|
rules using the sysctl template with the same value of sysctlvar
|
||
|
parameter (only differ in other parameters) because there would be
|
||
|
duplicate elements. We will fix this by using the rule ID as a part of
|
||
|
OVAL object IDs, test IDs and state IDs. That will allow to use the
|
||
|
template for the same sysctlvar in different rules.
|
||
|
---
|
||
|
.../oval/sysctl_kernel_ipv6_disable.xml | 4 +-
|
||
|
shared/templates/sysctl/oval.template | 156 +++++++++---------
|
||
|
2 files changed, 80 insertions(+), 80 deletions(-)
|
||
|
|
||
|
diff --git a/shared/checks/oval/sysctl_kernel_ipv6_disable.xml b/shared/checks/oval/sysctl_kernel_ipv6_disable.xml
|
||
|
index 1195cea518f..f971d28a047 100644
|
||
|
--- a/shared/checks/oval/sysctl_kernel_ipv6_disable.xml
|
||
|
+++ b/shared/checks/oval/sysctl_kernel_ipv6_disable.xml
|
||
|
@@ -19,8 +19,8 @@
|
||
|
</metadata>
|
||
|
<criteria comment="IPv6 disabled or net.ipv6.conf.all.disable_ipv6 set correctly" operator="OR">
|
||
|
<criteria operator="AND">
|
||
|
- <extend_definition comment="net.ipv6.conf.all.disable_ipv6 configuration setting check" definition_ref="sysctl_static_net_ipv6_conf_all_disable_ipv6" />
|
||
|
- <extend_definition comment="net.ipv6.conf.all.disable_ipv6 runtime setting check" definition_ref="sysctl_runtime_net_ipv6_conf_all_disable_ipv6" />
|
||
|
+ <extend_definition comment="net.ipv6.conf.all.disable_ipv6 configuration setting check" definition_ref="sysctl_net_ipv6_conf_all_disable_ipv6_static" />
|
||
|
+ <extend_definition comment="net.ipv6.conf.all.disable_ipv6 runtime setting check" definition_ref="sysctl_net_ipv6_conf_all_disable_ipv6_runtime" />
|
||
|
</criteria>
|
||
|
</criteria>
|
||
|
</definition>
|
||
|
diff --git a/shared/templates/sysctl/oval.template b/shared/templates/sysctl/oval.template
|
||
|
index 74583dbee1d..52671c06402 100644
|
||
|
--- a/shared/templates/sysctl/oval.template
|
||
|
+++ b/shared/templates/sysctl/oval.template
|
||
|
@@ -5,8 +5,8 @@
|
||
|
{{%- endif %}}
|
||
|
|
||
|
{{% macro state_static_sysctld(prefix) -%}}
|
||
|
- <ind:object object_ref="object_static_{{{ prefix }}}_{{{ SYSCTLID }}}"/>
|
||
|
- <ind:state state_ref="state_static_sysctld_{{{ SYSCTLID }}}"/>
|
||
|
+ <ind:object object_ref="object_static_{{{ prefix }}}_{{{ rule_id }}}"/>
|
||
|
+ <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}"/>
|
||
|
{{%- endmacro -%}}
|
||
|
{{%- macro sysctl_match() -%}}
|
||
|
{{%- if SYSCTLVAL == "" -%}}
|
||
|
@@ -20,13 +20,13 @@
|
||
|
{{%- if "P" in FLAGS -%}}
|
||
|
|
||
|
<def-group>
|
||
|
- <definition class="compliance" id="sysctl_{{{ SYSCTLID }}}" version="3">
|
||
|
+ <definition class="compliance" id="{{{ rule_id }}}" version="3">
|
||
|
{{{ oval_metadata("The '" + SYSCTLVAR + "' kernel parameter should be set to the appropriate value in both system configuration and system runtime.") }}}
|
||
|
<criteria operator="AND">
|
||
|
<extend_definition comment="{{{ SYSCTLVAR }}} configuration setting check"
|
||
|
- definition_ref="sysctl_static_{{{ SYSCTLID }}}"/>
|
||
|
+ definition_ref="{{{ rule_id }}}_static"/>
|
||
|
<extend_definition comment="{{{ SYSCTLVAR }}} runtime setting check"
|
||
|
- definition_ref="sysctl_runtime_{{{ SYSCTLID }}}"/>
|
||
|
+ definition_ref="{{{ rule_id }}}_runtime"/>
|
||
|
</criteria>
|
||
|
</definition>
|
||
|
</def-group>
|
||
|
@@ -34,7 +34,7 @@
|
||
|
{{%- elif "I" in FLAGS -%}}
|
||
|
|
||
|
<def-group>
|
||
|
- <definition class="compliance" id="sysctl_{{{ SYSCTLID }}}" version="4">
|
||
|
+ <definition class="compliance" id="{{{ rule_id }}}" version="4">
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to the appropriate value in both system configuration and system runtime.") }}}
|
||
|
<criteria comment="IPv6 disabled or {{{ SYSCTLVAR }}} set correctly" operator="OR">
|
||
|
{{% if product in ["ubuntu1604", "ubuntu1804"] %}}
|
||
|
@@ -46,9 +46,9 @@
|
||
|
{{% endif %}}
|
||
|
<criteria operator="AND">
|
||
|
<extend_definition comment="{{{ SYSCTLVAR }}} configuration setting check"
|
||
|
- definition_ref="sysctl_static_{{{ SYSCTLID }}}"/>
|
||
|
+ definition_ref="{{{ rule_id }}}_static"/>
|
||
|
<extend_definition comment="{{{ SYSCTLVAR }}} runtime setting check"
|
||
|
- definition_ref="sysctl_runtime_{{{ SYSCTLID }}}"/>
|
||
|
+ definition_ref="{{{ rule_id }}}_runtime"/>
|
||
|
</criteria>
|
||
|
</criteria>
|
||
|
</definition>
|
||
|
@@ -58,33 +58,33 @@
|
||
|
{{%- if "R" in FLAGS -%}}
|
||
|
|
||
|
<def-group>
|
||
|
- <definition class="compliance" id="sysctl_runtime_{{{ SYSCTLID }}}" version="3">
|
||
|
+ <definition class="compliance" id="{{{ rule_id }}}_runtime" version="3">
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to " + COMMENT_VALUE + " in the system runtime.") }}}
|
||
|
<criteria operator="AND">
|
||
|
<criterion comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}}"
|
||
|
- test_ref="test_sysctl_runtime_{{{ SYSCTLID }}}"/>
|
||
|
+ test_ref="test_{{{ rule_id }}}_runtime"/>
|
||
|
</criteria>
|
||
|
</definition>
|
||
|
- <unix:sysctl_test id="test_sysctl_runtime_{{{ SYSCTLID }}}" version="1"
|
||
|
+ <unix:sysctl_test id="test_{{{ rule_id }}}_runtime" version="1"
|
||
|
comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}}"
|
||
|
check="all" check_existence="all_exist">
|
||
|
- <unix:object object_ref="object_sysctl_runtime_{{{ SYSCTLID }}}"/>
|
||
|
- <unix:state state_ref="state_sysctl_runtime_{{{ SYSCTLID }}}"/>
|
||
|
+ <unix:object object_ref="object_{{{ rule_id }}}_runtime"/>
|
||
|
+ <unix:state state_ref="state_{{{ rule_id }}}_runtime"/>
|
||
|
</unix:sysctl_test>
|
||
|
|
||
|
- <unix:sysctl_object id="object_sysctl_runtime_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <unix:sysctl_object id="object_{{{ rule_id }}}_runtime" version="1">
|
||
|
<unix:name>{{{ SYSCTLVAR }}}</unix:name>
|
||
|
</unix:sysctl_object>
|
||
|
{{% if SYSCTLVAL == "" %}}
|
||
|
- <unix:sysctl_state id="state_sysctl_runtime_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <unix:sysctl_state id="state_{{{ rule_id }}}_runtime" version="1">
|
||
|
<unix:value datatype="{{{ DATATYPE }}}" operation="equals"
|
||
|
- var_ref="sysctl_{{{ SYSCTLID }}}_value"/>
|
||
|
+ var_ref="{{{ rule_id }}}_value"/>
|
||
|
</unix:sysctl_state>
|
||
|
|
||
|
- <external_variable id="sysctl_{{{ SYSCTLID }}}_value" version="1"
|
||
|
+ <external_variable id="{{{ rule_id }}}_value" version="1"
|
||
|
comment="External variable for {{{ SYSCTLVAR }}}" datatype="{{{ DATATYPE }}}"/>
|
||
|
{{%- else %}}
|
||
|
- <unix:sysctl_state id="state_sysctl_runtime_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <unix:sysctl_state id="state_{{{ rule_id }}}_runtime" version="1">
|
||
|
{{% if OPERATION == "pattern match" %}}
|
||
|
<unix:value datatype="{{{ DATATYPE }}}"
|
||
|
operation="{{{ OPERATION }}}">{{{ SYSCTLVAL_REGEX }}}</unix:value>
|
||
|
@@ -100,46 +100,46 @@
|
||
|
{{%- if "S" in FLAGS -%}}
|
||
|
|
||
|
<def-group>
|
||
|
- <definition class="compliance" id="sysctl_static_{{{ SYSCTLID }}}" version="3">
|
||
|
+ <definition class="compliance" id="{{{ rule_id }}}_static" version="3">
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to " + COMMENT_VALUE + " in the system configuration.") }}}
|
||
|
<criteria operator="AND">
|
||
|
<criteria operator="OR">
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /etc/sysctl.conf"
|
||
|
- test_ref="test_static_sysctl_{{{ SYSCTLID }}}"/>
|
||
|
+ test_ref="test_{{{ rule_id }}}_static"/>
|
||
|
<!-- see sysctl.d(5) -->
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /etc/sysctl.d/*.conf"
|
||
|
- test_ref="test_static_etc_sysctld_{{{ SYSCTLID }}}"/>
|
||
|
+ test_ref="test_{{{ rule_id }}}_static_etc_sysctld"/>
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /run/sysctl.d/*.conf"
|
||
|
- test_ref="test_static_run_sysctld_{{{ SYSCTLID }}}"/>
|
||
|
+ test_ref="test_{{{ rule_id }}}_static_run_sysctld"/>
|
||
|
{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /usr/lib/sysctl.d/*.conf"
|
||
|
- test_ref="test_static_usr_lib_sysctld_{{{ SYSCTLID }}}"/>
|
||
|
+ test_ref="test_{{{ rule_id }}}_static_usr_lib_sysctld"/>
|
||
|
{{% endif %}}
|
||
|
</criteria>
|
||
|
{{% if target_oval_version >= [5, 11] %}}
|
||
|
- <criterion comment="Check that {{{ SYSCTLID }}} is defined in only one file" test_ref="test_sysctl_{{{ SYSCTLID }}}_defined_in_one_file" />
|
||
|
+ <criterion comment="Check that {{{ SYSCTLID }}} is defined in only one file" test_ref="test_{{{ rule_id }}}_defined_in_one_file" />
|
||
|
{{% endif %}}
|
||
|
</criteria>
|
||
|
</definition>
|
||
|
|
||
|
- <ind:textfilecontent54_test id="test_static_sysctl_{{{ SYSCTLID }}}" version="1"
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static" version="1"
|
||
|
check="all" check_existence="all_exist"
|
||
|
comment="{{{ SYSCTLVAR }}} static configuration">
|
||
|
{{{ state_static_sysctld("sysctl") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
|
||
|
- <ind:textfilecontent54_test id="test_static_etc_sysctld_{{{ SYSCTLID }}}" version="1" check="all"
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_etc_sysctld" version="1" check="all"
|
||
|
comment="{{{ SYSCTLVAR }}} static configuration in /etc/sysctl.d/*.conf">
|
||
|
{{{ state_static_sysctld("etc_sysctld") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
|
||
|
- <ind:textfilecontent54_test id="test_static_run_sysctld_{{{ SYSCTLID }}}" version="1" check="all"
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_run_sysctld" version="1" check="all"
|
||
|
comment="{{{ SYSCTLVAR }}} static configuration in /run/sysctl.d/*.conf">
|
||
|
{{{ state_static_sysctld("run_sysctld") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
|
||
|
{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
- <ind:textfilecontent54_test id="test_static_usr_lib_sysctld_{{{ SYSCTLID }}}" version="1"
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_usr_lib_sysctld" version="1"
|
||
|
check="all"
|
||
|
comment="{{{ SYSCTLVAR }}} static configuration in /usr/lib/sysctl.d/*.conf">
|
||
|
{{{ state_static_sysctld("usr_lib_sysctld") }}}
|
||
|
@@ -148,79 +148,79 @@
|
||
|
|
||
|
{{% if target_oval_version >= [5, 11] %}}
|
||
|
<ind:variable_test check="all" check_existence="all_exist" comment="Check that only one file contains {{{ SYSCTLID }}}"
|
||
|
- id="test_sysctl_{{{ SYSCTLID }}}_defined_in_one_file" version="1">
|
||
|
- <ind:object object_ref="oject_sysctl_{{{ SYSCTLID }}}_defined_in_one_file" />
|
||
|
- <ind:state state_ref="state_sysctl_{{{ SYSCTLID }}}_defined_in_one_file" />
|
||
|
+ id="test_{{{ rule_id }}}_defined_in_one_file" version="1">
|
||
|
+ <ind:object object_ref="object_{{{ rule_id }}}_defined_in_one_file" />
|
||
|
+ <ind:state state_ref="state_{{{ rule_id }}}_defined_in_one_file" />
|
||
|
</ind:variable_test>
|
||
|
|
||
|
- <ind:variable_object id="oject_sysctl_{{{ SYSCTLID }}}_defined_in_one_file" version="1">
|
||
|
- <ind:var_ref>local_var_unique_sysctl_{{{ SYSCTLID }}}_counter</ind:var_ref>
|
||
|
+ <ind:variable_object id="object_{{{ rule_id }}}_defined_in_one_file" version="1">
|
||
|
+ <ind:var_ref>local_var_{{{ rule_id }}}_counter</ind:var_ref>
|
||
|
</ind:variable_object>
|
||
|
|
||
|
- <ind:variable_state id="state_sysctl_{{{ SYSCTLID }}}_defined_in_one_file" version="1">
|
||
|
+ <ind:variable_state id="state_{{{ rule_id }}}_defined_in_one_file" version="1">
|
||
|
<ind:value operation="equals" datatype="int">1</ind:value>
|
||
|
</ind:variable_state>
|
||
|
|
||
|
- <local_variable comment="Count unique sysctls" datatype="int" id="local_var_unique_sysctl_{{{ SYSCTLID }}}_counter" version="1">
|
||
|
+ <local_variable comment="Count unique sysctls" datatype="int" id="local_var_{{{ rule_id }}}_counter" version="1">
|
||
|
<count>
|
||
|
<unique>
|
||
|
- <object_component object_ref="object_static_set_sysctls_{{{ SYSCTLID }}}" item_field="filepath" />
|
||
|
+ <object_component object_ref="object_{{{ rule_id }}}_static_set_sysctls" item_field="filepath" />
|
||
|
</unique>
|
||
|
</count>
|
||
|
</local_variable>
|
||
|
|
||
|
- <ind:textfilecontent54_object id="object_static_set_sysctls_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_{{{ rule_id }}}_static_set_sysctls" version="1">
|
||
|
<set>
|
||
|
- <object_reference>object_static_set_unfiltered_sysctls_{{{ SYSCTLID }}}</object_reference>
|
||
|
- <filter action="exclude">state_{{{ SYSCTLID }}}_filepath_is_symlink</filter>
|
||
|
+ <object_reference>object_{{{ rule_id }}}_static_set_sysctls_unfiltered</object_reference>
|
||
|
+ <filter action="exclude">state_{{{ rule_id }}}_filepath_is_symlink</filter>
|
||
|
</set>
|
||
|
</ind:textfilecontent54_object>
|
||
|
|
||
|
- <ind:textfilecontent54_state id="state_{{{ SYSCTLID }}}_filepath_is_symlink" version="1">
|
||
|
- <ind:filepath operation="equals" var_check="at least one" var_ref="local_var_safe_symlinks_{{{ SYSCTLID }}}" datatype="string" />
|
||
|
+ <ind:textfilecontent54_state id="state_{{{ rule_id }}}_filepath_is_symlink" version="1">
|
||
|
+ <ind:filepath operation="equals" var_check="at least one" var_ref="local_var_{{{ rule_id }}}_safe_symlinks" datatype="string" />
|
||
|
</ind:textfilecontent54_state>
|
||
|
|
||
|
- <!-- <no simlink handling> -->
|
||
|
+ <!-- <no symlink handling> -->
|
||
|
<!-- We craft a variable with blank string to combine with the symlink paths found.
|
||
|
This ultimately avoids referencing a variable with "no values",
|
||
|
we reference a variable with a blank string -->
|
||
|
- <local_variable comment="Unique list of symlink conf files" datatype="string" id="local_var_safe_symlinks_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <local_variable comment="Unique list of symlink conf files" datatype="string" id="local_var_{{{ rule_id }}}_safe_symlinks" version="1">
|
||
|
<unique>
|
||
|
- <object_component object_ref="var_object_symlink_{{{ SYSCTLID }}}" item_field="value" />
|
||
|
+ <object_component object_ref="var_object_symlink_{{{ rule_id }}}" item_field="value" />
|
||
|
</unique>
|
||
|
</local_variable>
|
||
|
|
||
|
- <ind:variable_object id="var_object_symlink_{{{ SYSCTLID }}}" comment="combine the blank string with symlink paths found" version="1">
|
||
|
+ <ind:variable_object id="var_object_symlink_{{{ rule_id }}}" comment="combine the blank string with symlink paths found" version="1">
|
||
|
<set>
|
||
|
- <object_reference>var_obj_symlink_{{{ SYSCTLID }}}</object_reference>
|
||
|
- <object_reference>var_obj_blank_{{{ SYSCTLID }}}</object_reference>
|
||
|
+ <object_reference>var_obj_symlink_{{{ rule_id }}}</object_reference>
|
||
|
+ <object_reference>var_obj_blank_{{{ rule_id }}}</object_reference>
|
||
|
</set>
|
||
|
</ind:variable_object>
|
||
|
|
||
|
- <ind:variable_object id="var_obj_blank_{{{ SYSCTLID }}}" comment="variable object of the blank string" version="1">
|
||
|
- <ind:var_ref>local_var_blank_path_{{{ SYSCTLID }}}</ind:var_ref>
|
||
|
+ <ind:variable_object id="var_obj_blank_{{{ rule_id }}}" comment="variable object of the blank string" version="1">
|
||
|
+ <ind:var_ref>local_var_blank_path_{{{ rule_id }}}</ind:var_ref>
|
||
|
</ind:variable_object>
|
||
|
|
||
|
- <local_variable comment="Blank string" datatype="string" id="local_var_blank_path_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <local_variable comment="Blank string" datatype="string" id="local_var_blank_path_{{{ rule_id }}}" version="1">
|
||
|
<literal_component datatype="string"></literal_component>
|
||
|
</local_variable>
|
||
|
|
||
|
- <ind:variable_object id="var_obj_symlink_{{{ SYSCTLID }}}" comment="variable object of the symlinks found" version="1">
|
||
|
- <ind:var_ref>local_var_symlinks_{{{ SYSCTLID }}}</ind:var_ref>
|
||
|
+ <ind:variable_object id="var_obj_symlink_{{{ rule_id }}}" comment="variable object of the symlinks found" version="1">
|
||
|
+ <ind:var_ref>local_var_symlinks_{{{ rule_id }}}</ind:var_ref>
|
||
|
</ind:variable_object>
|
||
|
- <!-- </no simlink handling> -->
|
||
|
+ <!-- </no symlink handling> -->
|
||
|
|
||
|
- <local_variable comment="Unique list of symlink conf files" datatype="string" id="local_var_symlinks_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <local_variable comment="Unique list of symlink conf files" datatype="string" id="local_var_symlinks_{{{ rule_id }}}" version="1">
|
||
|
<unique>
|
||
|
- <object_component object_ref="object_{{{ SYSCTLID }}}_symlinks" item_field="filepath" />
|
||
|
+ <object_component object_ref="object_{{{ rule_id }}}_symlinks" item_field="filepath" />
|
||
|
</unique>
|
||
|
</local_variable>
|
||
|
|
||
|
<!-- "pattern match" doesn't seem to work with symlink_object, not sure if a bug or not.
|
||
|
Workaround by querying for all conf files found -->
|
||
|
- <unix:symlink_object comment="Symlinks referencing files in default dirs" id="object_{{{ SYSCTLID }}}_symlinks" version="1">
|
||
|
- <unix:filepath operation="equals" var_ref="local_var_conf_files_{{{ SYSCTLID }}}" />
|
||
|
- <filter action="exclude">state_symlink_points_outside_usual_dirs_{{{ SYSCTLID }}}</filter>
|
||
|
+ <unix:symlink_object comment="Symlinks referencing files in default dirs" id="object_{{{ rule_id }}}_symlinks" version="1">
|
||
|
+ <unix:filepath operation="equals" var_ref="local_var_conf_files_{{{ rule_id }}}" />
|
||
|
+ <filter action="exclude">state_symlink_points_outside_usual_dirs_{{{ rule_id }}}</filter>
|
||
|
</unix:symlink_object>
|
||
|
|
||
|
<!-- The state matches symlinks that don't point to the default dirs, i.e. paths that are not:
|
||
|
@@ -228,59 +228,59 @@
|
||
|
^/etc/sysctl.d/.*$
|
||
|
^/run/sysctl.d/.*$
|
||
|
^/usr/lib/sysctl.d/.*$ -->
|
||
|
- <unix:symlink_state comment="State that matches symlinks referencing files not in the default dirs" id="state_symlink_points_outside_usual_dirs_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <unix:symlink_state comment="State that matches symlinks referencing files not in the default dirs" id="state_symlink_points_outside_usual_dirs_{{{ rule_id }}}" version="1">
|
||
|
<unix:canonical_path operation="pattern match">^(?!(\/etc\/sysctl\.conf$|(\/etc|\/run|\/usr\/lib)\/sysctl\.d\/)).*$</unix:canonical_path>
|
||
|
</unix:symlink_state>
|
||
|
{{% endif %}}
|
||
|
|
||
|
- <local_variable comment="List of conf files" datatype="string" id="local_var_conf_files_{{{ SYSCTLID }}}" version="1">
|
||
|
- <object_component object_ref="object_static_set_unfiltered_sysctls_{{{ SYSCTLID }}}" item_field="filepath" />
|
||
|
+ <local_variable comment="List of conf files" datatype="string" id="local_var_conf_files_{{{ rule_id }}}" version="1">
|
||
|
+ <object_component object_ref="object_{{{ rule_id }}}_static_set_sysctls_unfiltered" item_field="filepath" />
|
||
|
</local_variable>
|
||
|
|
||
|
<!-- Avoid directly referencing a possibly empty collection, one empty collection will cause the
|
||
|
variable to have no value even when there are valid objects. -->
|
||
|
- <ind:textfilecontent54_object id="object_static_set_unfiltered_sysctls_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_{{{ rule_id }}}_static_set_sysctls_unfiltered" version="1">
|
||
|
<set>
|
||
|
- <object_reference>object_static_etc_sysctls_{{{ SYSCTLID }}}</object_reference>
|
||
|
- <object_reference>object_static_run_usr_sysctls_{{{ SYSCTLID }}}</object_reference>
|
||
|
+ <object_reference>object_static_etc_sysctls_{{{ rule_id }}}</object_reference>
|
||
|
+ <object_reference>object_static_run_usr_sysctls_{{{ rule_id }}}</object_reference>
|
||
|
</set>
|
||
|
</ind:textfilecontent54_object>
|
||
|
|
||
|
- <ind:textfilecontent54_object id="object_static_etc_sysctls_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_static_etc_sysctls_{{{ rule_id }}}" version="1">
|
||
|
<set>
|
||
|
- <object_reference>object_static_sysctl_{{{ SYSCTLID }}}</object_reference>
|
||
|
- <object_reference>object_static_etc_sysctld_{{{ SYSCTLID }}}</object_reference>
|
||
|
+ <object_reference>object_static_sysctl_{{{ rule_id }}}</object_reference>
|
||
|
+ <object_reference>object_static_etc_sysctld_{{{ rule_id }}}</object_reference>
|
||
|
</set>
|
||
|
</ind:textfilecontent54_object>
|
||
|
|
||
|
- <ind:textfilecontent54_object id="object_static_run_usr_sysctls_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_static_run_usr_sysctls_{{{ rule_id }}}" version="1">
|
||
|
<set>
|
||
|
- <object_reference>object_static_run_sysctld_{{{ SYSCTLID }}}</object_reference>
|
||
|
+ <object_reference>object_static_run_sysctld_{{{ rule_id }}}</object_reference>
|
||
|
{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
- <object_reference>object_static_usr_lib_sysctld_{{{ SYSCTLID }}}</object_reference>
|
||
|
+ <object_reference>object_static_usr_lib_sysctld_{{{ rule_id }}}</object_reference>
|
||
|
{{% endif %}}
|
||
|
</set>
|
||
|
</ind:textfilecontent54_object>
|
||
|
|
||
|
- <ind:textfilecontent54_object id="object_static_sysctl_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_static_sysctl_{{{ rule_id }}}" version="1">
|
||
|
<ind:filepath>/etc/sysctl.conf</ind:filepath>
|
||
|
{{{ sysctl_match() }}}
|
||
|
</ind:textfilecontent54_object>
|
||
|
|
||
|
- <ind:textfilecontent54_object id="object_static_etc_sysctld_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_static_etc_sysctld_{{{ rule_id }}}" version="1">
|
||
|
<ind:path>/etc/sysctl.d</ind:path>
|
||
|
<ind:filename operation="pattern match">^.*\.conf$</ind:filename>
|
||
|
{{{ sysctl_match() }}}
|
||
|
</ind:textfilecontent54_object>
|
||
|
|
||
|
- <ind:textfilecontent54_object id="object_static_run_sysctld_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_static_run_sysctld_{{{ rule_id }}}" version="1">
|
||
|
<ind:path>/run/sysctl.d</ind:path>
|
||
|
<ind:filename operation="pattern match">^.*\.conf$</ind:filename>
|
||
|
{{{ sysctl_match() }}}
|
||
|
</ind:textfilecontent54_object>
|
||
|
|
||
|
{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
- <ind:textfilecontent54_object id="object_static_usr_lib_sysctld_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_object id="object_static_usr_lib_sysctld_{{{ rule_id }}}" version="1">
|
||
|
<ind:path>/usr/lib/sysctl.d</ind:path>
|
||
|
<ind:filename operation="pattern match">^.*\.conf$</ind:filename>
|
||
|
{{{ sysctl_match() }}}
|
||
|
@@ -288,15 +288,15 @@
|
||
|
{{% endif %}}
|
||
|
{{% if SYSCTLVAL == "" %}}
|
||
|
|
||
|
- <ind:textfilecontent54_state id="state_static_sysctld_{{{ SYSCTLID }}}" version="1">
|
||
|
- <ind:subexpression operation="{{{ OPERATION }}}" var_ref="sysctl_{{{ SYSCTLID }}}_value"
|
||
|
+ <ind:textfilecontent54_state id="state_static_sysctld_{{{ rule_id }}}" version="1">
|
||
|
+ <ind:subexpression operation="{{{ OPERATION }}}" var_ref="{{{ rule_id }}}_value"
|
||
|
datatype="{{{ DATATYPE }}}" />
|
||
|
</ind:textfilecontent54_state>
|
||
|
|
||
|
- <external_variable id="sysctl_{{{ SYSCTLID }}}_value" version="1"
|
||
|
+ <external_variable id="{{{ rule_id }}}_value" version="1"
|
||
|
comment="External variable for {{{ SYSCTLVAR }}}" datatype="{{{ DATATYPE }}}"/>
|
||
|
{{% else %}}
|
||
|
- <ind:textfilecontent54_state id="state_static_sysctld_{{{ SYSCTLID }}}" version="1">
|
||
|
+ <ind:textfilecontent54_state id="state_static_sysctld_{{{ rule_id }}}" version="1">
|
||
|
{{% if OPERATION == "pattern match" %}}
|
||
|
<ind:subexpression operation="{{{ OPERATION }}}" datatype="{{{ DATATYPE }}}">{{{ SYSCTLVAL_REGEX }}}</ind:subexpression>
|
||
|
{{% else %}}
|
||
|
|
||
|
From ee5d91aaf33504e56b6959c17c8ebc6006a17a5f Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 13 Jul 2022 10:16:45 +0200
|
||
|
Subject: [PATCH 03/23] Use a list of values in sysctl template
|
||
|
|
||
|
This patch adds an ability to use a list of values instead of a single
|
||
|
value in the sysctlval parameter of the sysctl template. This is useful
|
||
|
for situations when we want to create a rule that passes for multiple
|
||
|
different sysctl values. This commit modifies the OVAL for the runtime
|
||
|
configuration. The runtime configuration will be allowed to be any of
|
||
|
the values in the list. There is an OR relation between the values. In
|
||
|
fact, this is a first step to enable multiple values in the sysctlval
|
||
|
parameter in the sysctl template, because we will also need to check the
|
||
|
static configuration, which is not done in this commit.
|
||
|
---
|
||
|
shared/templates/sysctl/oval.template | 32 +++++++++++++++++++++++++++
|
||
|
shared/templates/sysctl/template.py | 24 ++++++++++++--------
|
||
|
2 files changed, 47 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/shared/templates/sysctl/oval.template b/shared/templates/sysctl/oval.template
|
||
|
index 52671c06402..b73ccc94f72 100644
|
||
|
--- a/shared/templates/sysctl/oval.template
|
||
|
+++ b/shared/templates/sysctl/oval.template
|
||
|
@@ -1,5 +1,7 @@
|
||
|
{{%- if SYSCTLVAL == "" %}}
|
||
|
{{%- set COMMENT_VALUE="the appropriate value" %}}
|
||
|
+{{%- elif SYSCTLVAL is sequence %}}
|
||
|
+{{%- set COMMENT_VALUE = SYSCTLVAL | join(" or " ) %}}
|
||
|
{{%- else %}}
|
||
|
{{%- set COMMENT_VALUE=SYSCTLVAL %}}
|
||
|
{{%- endif %}}
|
||
|
@@ -60,21 +62,43 @@
|
||
|
<def-group>
|
||
|
<definition class="compliance" id="{{{ rule_id }}}_runtime" version="3">
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to " + COMMENT_VALUE + " in the system runtime.") }}}
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
<criteria operator="AND">
|
||
|
<criterion comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}}"
|
||
|
test_ref="test_{{{ rule_id }}}_runtime"/>
|
||
|
</criteria>
|
||
|
+{{% elif SYSCTLVAL is sequence %}}
|
||
|
+ <criteria operator="OR">
|
||
|
+{{% for x in SYSCTLVAL %}}
|
||
|
+ <criterion comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ x }}}"
|
||
|
+ test_ref="test_{{{ rule_id }}}_runtime_{{{ x }}}"/>
|
||
|
+{{% endfor %}}
|
||
|
+ </criteria>
|
||
|
+{{% endif %}}
|
||
|
</definition>
|
||
|
+
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
<unix:sysctl_test id="test_{{{ rule_id }}}_runtime" version="1"
|
||
|
comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}}"
|
||
|
check="all" check_existence="all_exist">
|
||
|
<unix:object object_ref="object_{{{ rule_id }}}_runtime"/>
|
||
|
<unix:state state_ref="state_{{{ rule_id }}}_runtime"/>
|
||
|
</unix:sysctl_test>
|
||
|
+{{% elif SYSCTLVAL is sequence %}}
|
||
|
+{{% for x in SYSCTLVAL %}}
|
||
|
+ <unix:sysctl_test id="test_{{{ rule_id }}}_runtime_{{{ x }}}" version="1"
|
||
|
+ comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ x }}}"
|
||
|
+ check="all" check_existence="all_exist">
|
||
|
+ <unix:object object_ref="object_{{{ rule_id }}}_runtime"/>
|
||
|
+ <unix:state state_ref="state_{{{ rule_id }}}_runtime_{{{ x }}}" />
|
||
|
+ </unix:sysctl_test>
|
||
|
+{{% endfor %}}
|
||
|
+{{% endif %}}
|
||
|
|
||
|
<unix:sysctl_object id="object_{{{ rule_id }}}_runtime" version="1">
|
||
|
<unix:name>{{{ SYSCTLVAR }}}</unix:name>
|
||
|
</unix:sysctl_object>
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
{{% if SYSCTLVAL == "" %}}
|
||
|
<unix:sysctl_state id="state_{{{ rule_id }}}_runtime" version="1">
|
||
|
<unix:value datatype="{{{ DATATYPE }}}" operation="equals"
|
||
|
@@ -94,6 +118,14 @@
|
||
|
{{% endif %}}
|
||
|
</unix:sysctl_state>
|
||
|
{{%- endif %}}
|
||
|
+{{% elif SYSCTLVAL is sequence %}}
|
||
|
+{{% for x in SYSCTLVAL %}}
|
||
|
+ <unix:sysctl_state id="state_{{{ rule_id }}}_runtime_{{{ x }}}" version="1">
|
||
|
+ <unix:value datatype="{{{ DATATYPE }}}"
|
||
|
+ operation="{{{ OPERATION }}}">{{{ x }}}</unix:value>
|
||
|
+ </unix:sysctl_state>
|
||
|
+{{% endfor %}}
|
||
|
+{{% endif %}}
|
||
|
</def-group>
|
||
|
|
||
|
{{%- endif -%}}
|
||
|
diff --git a/shared/templates/sysctl/template.py b/shared/templates/sysctl/template.py
|
||
|
index fa981a9dce9..c62591357c0 100644
|
||
|
--- a/shared/templates/sysctl/template.py
|
||
|
+++ b/shared/templates/sysctl/template.py
|
||
|
@@ -12,6 +12,13 @@ def preprocess(data, lang):
|
||
|
if "operation" not in data:
|
||
|
data["operation"] = "equals"
|
||
|
|
||
|
+ if data["datatype"] not in ["string", "int"]:
|
||
|
+ raise ValueError(
|
||
|
+ "Test scenarios for data type '{0}' are not implemented yet.\n"
|
||
|
+ "Please check if rule '{1}' has correct data type and edit "
|
||
|
+ "{2} to add tests for it.".format(
|
||
|
+ data["datatype"], data["_rule_id"], __file__))
|
||
|
+
|
||
|
# Configure data for test scenarios
|
||
|
if data["sysctlval"] == "":
|
||
|
if data["datatype"] == "int":
|
||
|
@@ -20,20 +27,19 @@ def preprocess(data, lang):
|
||
|
elif data["datatype"] == "string":
|
||
|
data["sysctl_correct_value"] = "correct_value"
|
||
|
data["sysctl_wrong_value"] = "wrong_value"
|
||
|
- else:
|
||
|
+ elif isinstance(data["sysctlval"], list):
|
||
|
+ if len(data["sysctlval"]) == 0:
|
||
|
raise ValueError(
|
||
|
- "Test scenarios for data type '{0}' are not implemented yet.\n"
|
||
|
- "Please check if rule '{1}' has correct data type and edit "
|
||
|
- "{2} to add tests for it.".format(data["datatype"], data["_rule_id"], __file__))
|
||
|
+ "The sysctlval parameter of {0} is an empty list".format(data["_rule_id"]))
|
||
|
+ data["sysctl_correct_value"] = data["sysctlval"][0]
|
||
|
+ if data["datatype"] == "int":
|
||
|
+ data["sysctl_wrong_value"] = "1" + data["sysctlval"][0]
|
||
|
+ elif data["datatype"] == "string":
|
||
|
+ data["sysctl_wrong_value"] = "wrong_value"
|
||
|
else:
|
||
|
data["sysctl_correct_value"] = data["sysctlval"]
|
||
|
if data["datatype"] == "int":
|
||
|
data["sysctl_wrong_value"] = "1" + data["sysctlval"]
|
||
|
elif data["datatype"] == "string":
|
||
|
data["sysctl_wrong_value"] = "wrong_value"
|
||
|
- else:
|
||
|
- raise ValueError(
|
||
|
- "Test scenarios for data type '{0}' are not implemented yet.\n"
|
||
|
- "Please check if rule '{1}' has correct data type and edit "
|
||
|
- "{2} to add tests for it.".format(data["datatype"], data["_rule_id"], __file__))
|
||
|
return data
|
||
|
|
||
|
From c50304234dfac1dcd74b3056c978eec2c097216d Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 13 Jul 2022 10:47:51 +0200
|
||
|
Subject: [PATCH 04/23] Move check unrelated to the test scenarios
|
||
|
|
||
|
The check for an mepty list is unrelated to the test scenarios,
|
||
|
rather is a generic check to avoid problems during the build.
|
||
|
Therefore, it shouldn't be inside code block that is handling
|
||
|
data for test scenarios, but can be extracted to a sooner position.
|
||
|
---
|
||
|
shared/templates/sysctl/template.py | 9 +++++----
|
||
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/shared/templates/sysctl/template.py b/shared/templates/sysctl/template.py
|
||
|
index c62591357c0..421e42c6ca1 100644
|
||
|
--- a/shared/templates/sysctl/template.py
|
||
|
+++ b/shared/templates/sysctl/template.py
|
||
|
@@ -11,7 +11,12 @@ def preprocess(data, lang):
|
||
|
data["flags"] = "SR" + ipv6_flag
|
||
|
if "operation" not in data:
|
||
|
data["operation"] = "equals"
|
||
|
+ if isinstance(data["sysctlval"], list) and len(data["sysctlval"]) == 0:
|
||
|
+ raise ValueError(
|
||
|
+ "The sysctlval parameter of {0} is an empty list".format(
|
||
|
+ data["_rule_id"]))
|
||
|
|
||
|
+ # Configure data for test scenarios
|
||
|
if data["datatype"] not in ["string", "int"]:
|
||
|
raise ValueError(
|
||
|
"Test scenarios for data type '{0}' are not implemented yet.\n"
|
||
|
@@ -19,7 +24,6 @@ def preprocess(data, lang):
|
||
|
"{2} to add tests for it.".format(
|
||
|
data["datatype"], data["_rule_id"], __file__))
|
||
|
|
||
|
- # Configure data for test scenarios
|
||
|
if data["sysctlval"] == "":
|
||
|
if data["datatype"] == "int":
|
||
|
data["sysctl_correct_value"] = "0"
|
||
|
@@ -28,9 +32,6 @@ def preprocess(data, lang):
|
||
|
data["sysctl_correct_value"] = "correct_value"
|
||
|
data["sysctl_wrong_value"] = "wrong_value"
|
||
|
elif isinstance(data["sysctlval"], list):
|
||
|
- if len(data["sysctlval"]) == 0:
|
||
|
- raise ValueError(
|
||
|
- "The sysctlval parameter of {0} is an empty list".format(data["_rule_id"]))
|
||
|
data["sysctl_correct_value"] = data["sysctlval"][0]
|
||
|
if data["datatype"] == "int":
|
||
|
data["sysctl_wrong_value"] = "1" + data["sysctlval"][0]
|
||
|
|
||
|
From eb1fe4f349e2dcadd9b870e074e679383601be62 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 13 Jul 2022 11:57:50 +0200
|
||
|
Subject: [PATCH 05/23] Allow multiple values in sysctl static configuration
|
||
|
|
||
|
This extends the OVAL checks for sysctl static configuration
|
||
|
to enable a list of values instead of a single value in the
|
||
|
sysctlval parameter of the sysctl template. The template
|
||
|
will generate OVAL tests for each value in the sysctlval
|
||
|
list.
|
||
|
---
|
||
|
shared/templates/sysctl/oval.template | 56 +++++++++++++++++++++++++++
|
||
|
1 file changed, 56 insertions(+)
|
||
|
|
||
|
diff --git a/shared/templates/sysctl/oval.template b/shared/templates/sysctl/oval.template
|
||
|
index b73ccc94f72..4e1bf3cfce3 100644
|
||
|
--- a/shared/templates/sysctl/oval.template
|
||
|
+++ b/shared/templates/sysctl/oval.template
|
||
|
@@ -136,6 +136,7 @@
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to " + COMMENT_VALUE + " in the system configuration.") }}}
|
||
|
<criteria operator="AND">
|
||
|
<criteria operator="OR">
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /etc/sysctl.conf"
|
||
|
test_ref="test_{{{ rule_id }}}_static"/>
|
||
|
<!-- see sysctl.d(5) -->
|
||
|
@@ -146,6 +147,21 @@
|
||
|
{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /usr/lib/sysctl.d/*.conf"
|
||
|
test_ref="test_{{{ rule_id }}}_static_usr_lib_sysctld"/>
|
||
|
+{{% endif %}}
|
||
|
+{{% elif SYSCTLVAL is sequence %}}
|
||
|
+{{% for x in SYSCTLVAL %}}
|
||
|
+ <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /etc/sysctl.conf"
|
||
|
+ test_ref="test_{{{ rule_id }}}_static_{{{ x }}}"/>
|
||
|
+ <!-- see sysctl.d(5) -->
|
||
|
+ <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /etc/sysctl.d/*.conf"
|
||
|
+ test_ref="test_{{{ rule_id }}}_static_{{{ x }}}_etc_sysctld"/>
|
||
|
+ <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /run/sysctl.d/*.conf"
|
||
|
+ test_ref="test_{{{ rule_id }}}_static_{{{ x }}}_run_sysctld"/>
|
||
|
+{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
+ <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /usr/lib/sysctl.d/*.conf"
|
||
|
+ test_ref="test_{{{ rule_id }}}_static_{{{ x }}}_usr_lib_sysctld"/>
|
||
|
+{{% endif %}}
|
||
|
+{{% endfor %}}
|
||
|
{{% endif %}}
|
||
|
</criteria>
|
||
|
{{% if target_oval_version >= [5, 11] %}}
|
||
|
@@ -154,6 +170,7 @@
|
||
|
</criteria>
|
||
|
</definition>
|
||
|
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
<ind:textfilecontent54_test id="test_{{{ rule_id }}}_static" version="1"
|
||
|
check="all" check_existence="all_exist"
|
||
|
comment="{{{ SYSCTLVAR }}} static configuration">
|
||
|
@@ -177,6 +194,37 @@
|
||
|
{{{ state_static_sysctld("usr_lib_sysctld") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
{{% endif %}}
|
||
|
+{{% elif SYSCTLVAL is sequence %}}
|
||
|
+{{% for x in SYSCTLVAL %}}
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}" version="1"
|
||
|
+ check="all" check_existence="all_exist"
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration">
|
||
|
+ <ind:object object_ref="object_static_sysctl_{{{ rule_id }}}"/>
|
||
|
+ <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
+ </ind:textfilecontent54_test>
|
||
|
+
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}_etc_sysctld" version="1" check="all"
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration in /etc/sysctl.d/*.conf">
|
||
|
+ <ind:object object_ref="object_static_etc_sysctld_{{{ rule_id }}}"/>
|
||
|
+ <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
+ </ind:textfilecontent54_test>
|
||
|
+
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}_run_sysctld" version="1" check="all"
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration in /run/sysctl.d/*.conf">
|
||
|
+ <ind:object object_ref="object_static_run_sysctld_{{{ rule_id }}}"/>
|
||
|
+ <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
+ </ind:textfilecontent54_test>
|
||
|
+
|
||
|
+{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}_usr_lib_sysctld" version="1"
|
||
|
+ check="all"
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration in /usr/lib/sysctl.d/*.conf">
|
||
|
+ <ind:object object_ref="object_static_usr_lib_sysctld_{{{ rule_id }}}"/>
|
||
|
+ <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
+ </ind:textfilecontent54_test>
|
||
|
+{{% endif %}}
|
||
|
+{{% endfor %}}
|
||
|
+{{% endif %}}
|
||
|
|
||
|
{{% if target_oval_version >= [5, 11] %}}
|
||
|
<ind:variable_test check="all" check_existence="all_exist" comment="Check that only one file contains {{{ SYSCTLID }}}"
|
||
|
@@ -318,6 +366,7 @@
|
||
|
{{{ sysctl_match() }}}
|
||
|
</ind:textfilecontent54_object>
|
||
|
{{% endif %}}
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
{{% if SYSCTLVAL == "" %}}
|
||
|
|
||
|
<ind:textfilecontent54_state id="state_static_sysctld_{{{ rule_id }}}" version="1">
|
||
|
@@ -336,5 +385,12 @@
|
||
|
{{% endif %}}
|
||
|
</ind:textfilecontent54_state>
|
||
|
{{% endif %}}
|
||
|
+{{% elif SYSCTLVAL is sequence %}}
|
||
|
+{{% for x in SYSCTLVAL %}}
|
||
|
+ <ind:textfilecontent54_state id="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}" version="1">
|
||
|
+ <ind:subexpression operation="{{{ OPERATION }}}" datatype="{{{ DATATYPE }}}">{{{ x }}}</ind:subexpression>
|
||
|
+ </ind:textfilecontent54_state>
|
||
|
+{{% endfor %}}
|
||
|
+{{% endif %}}
|
||
|
</def-group>
|
||
|
{{%- endif -%}}
|
||
|
|
||
|
From 93d496fb8dda6c47707e27c0b2cad15616261f27 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 13 Jul 2022 14:55:28 +0200
|
||
|
Subject: [PATCH 06/23] Add option to allow system default
|
||
|
|
||
|
Introduce new template option `missing_static_pass` to the
|
||
|
systemctl template. If this option is set to `"true"` in rule.yml
|
||
|
the OVAL will be generated in a way that the check will pass if
|
||
|
there is no sysctl static configuration option in the watched sysctl
|
||
|
configuration files. In other words, the OVAL check will pass if
|
||
|
the system default isn't overridden.
|
||
|
---
|
||
|
shared/templates/sysctl/oval.template | 15 +++++++++++++++
|
||
|
1 file changed, 15 insertions(+)
|
||
|
|
||
|
diff --git a/shared/templates/sysctl/oval.template b/shared/templates/sysctl/oval.template
|
||
|
index 4e1bf3cfce3..1719a59f9c7 100644
|
||
|
--- a/shared/templates/sysctl/oval.template
|
||
|
+++ b/shared/templates/sysctl/oval.template
|
||
|
@@ -134,6 +134,9 @@
|
||
|
<def-group>
|
||
|
<definition class="compliance" id="{{{ rule_id }}}_static" version="3">
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to " + COMMENT_VALUE + " in the system configuration.") }}}
|
||
|
+{{% if MISSING_STATIC_PASS == "true" %}}
|
||
|
+ <criteria operator="OR">
|
||
|
+{{% endif %}}
|
||
|
<criteria operator="AND">
|
||
|
<criteria operator="OR">
|
||
|
{{% if SYSCTLVAL is string %}}
|
||
|
@@ -168,8 +171,20 @@
|
||
|
<criterion comment="Check that {{{ SYSCTLID }}} is defined in only one file" test_ref="test_{{{ rule_id }}}_defined_in_one_file" />
|
||
|
{{% endif %}}
|
||
|
</criteria>
|
||
|
+{{% if MISSING_STATIC_PASS == "true" %}}
|
||
|
+ <criterion comment="Check that {{{ SYSCTLID }}} is not defined in any file" test_ref="test_{{{ rule_id }}}_not_defined" />
|
||
|
+ </criteria>
|
||
|
+{{% endif %}}
|
||
|
</definition>
|
||
|
|
||
|
+{{% if MISSING_STATIC_PASS == "true" %}}
|
||
|
+ <ind:textfilecontent54_test id="test_{{{ rule_id }}}_not_defined" version="1"
|
||
|
+ check="all" check_existence="none_exist"
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration">
|
||
|
+ <ind:object object_ref="object_{{{ rule_id }}}_static_set_sysctls" />
|
||
|
+ </ind:textfilecontent54_test>
|
||
|
+{{% endif %}}
|
||
|
+
|
||
|
{{% if SYSCTLVAL is string %}}
|
||
|
<ind:textfilecontent54_test id="test_{{{ rule_id }}}_static" version="1"
|
||
|
check="all" check_existence="all_exist"
|
||
|
|
||
|
From 97dca34b717621d5fbbdfdab459ac087f20d1e4b Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 13 Jul 2022 17:02:35 +0200
|
||
|
Subject: [PATCH 07/23] Accept multiple values in the sysctl remediation
|
||
|
|
||
|
A new parameter sysctlval_remediate is introduced to the sysctl
|
||
|
template. This allows to choose which of the multiple values in
|
||
|
the sysctl list will be used in the Bash and Ansible remediations.
|
||
|
---
|
||
|
docs/templates/template_reference.md | 8 ++++++++
|
||
|
shared/templates/sysctl/ansible.template | 6 +++---
|
||
|
shared/templates/sysctl/bash.template | 10 +++++-----
|
||
|
shared/templates/sysctl/template.py | 9 +++++++++
|
||
|
4 files changed, 25 insertions(+), 8 deletions(-)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index a439e3dca94..5785f1d453f 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -818,6 +818,14 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
- **sysctlval** - value of the sysctl value, eg. `'1'`. If this
|
||
|
parameter is not specified, XCCDF Value is used instead.
|
||
|
|
||
|
+ - **sysctlval_remediate** - the value that will be used in remediations.
|
||
|
+ If **sysctlval_remediate** is not specified, the template will use the
|
||
|
+ value of the **sysctlval** parameter in the remediations.
|
||
|
+ This parameter is mandatory when the **sysctlval** parameter is a list
|
||
|
+ because we need to know which of the values in the list the system
|
||
|
+ should be remedied to. When the **sysctlval** parameter is not a list
|
||
|
+ this parameter is optional.
|
||
|
+
|
||
|
- **operation** - operation used for comparison of collected object
|
||
|
with **sysctlval**. Default value: `equals`.
|
||
|
|
||
|
diff --git a/shared/templates/sysctl/ansible.template b/shared/templates/sysctl/ansible.template
|
||
|
index c13bb6637fe..7724db5e5ff 100644
|
||
|
--- a/shared/templates/sysctl/ansible.template
|
||
|
+++ b/shared/templates/sysctl/ansible.template
|
||
|
@@ -21,7 +21,7 @@
|
||
|
replace: '#{{{ SYSCTLVAR }}}'
|
||
|
loop: "{{ find_sysctl_d.files }}"
|
||
|
|
||
|
-{{%- if SYSCTLVAL == "" %}}
|
||
|
+{{%- if SYSCTLVAL_REMEDIATE == "" %}}
|
||
|
- (xccdf-var sysctl_{{{ SYSCTLID }}}_value)
|
||
|
|
||
|
- name: Ensure sysctl {{{ SYSCTLVAR }}} is set
|
||
|
@@ -29,10 +29,10 @@
|
||
|
name: "{{{ SYSCTLVAR }}}"
|
||
|
value: "{{ sysctl_{{{ SYSCTLID }}}_value }}"
|
||
|
{{%- else %}}
|
||
|
-- name: Ensure sysctl {{{ SYSCTLVAR }}} is set to {{{ SYSCTLVAL }}}
|
||
|
+- name: Ensure sysctl {{{ SYSCTLVAR }}} is set to {{{ SYSCTLVAL_REMEDIATE }}}
|
||
|
sysctl:
|
||
|
name: "{{{ SYSCTLVAR }}}"
|
||
|
- value: "{{{ SYSCTLVAL }}}"
|
||
|
+ value: "{{{ SYSCTLVAL_REMEDIATE }}}"
|
||
|
{{%- endif %}}
|
||
|
state: present
|
||
|
reload: yes
|
||
|
diff --git a/shared/templates/sysctl/bash.template b/shared/templates/sysctl/bash.template
|
||
|
index d67a59c3886..63948bd5a26 100644
|
||
|
--- a/shared/templates/sysctl/bash.template
|
||
|
+++ b/shared/templates/sysctl/bash.template
|
||
|
@@ -20,7 +20,7 @@ for f in /etc/sysctl.d/*.conf /run/sysctl.d/*.conf; do
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
-{{%- if SYSCTLVAL == "" %}}
|
||
|
+{{%- if SYSCTLVAL_REMEDIATE == "" %}}
|
||
|
{{{ bash_instantiate_variables("sysctl_" + SYSCTLID + "_value") }}}
|
||
|
|
||
|
#
|
||
|
@@ -38,11 +38,11 @@ done
|
||
|
#
|
||
|
# Set runtime for {{{ SYSCTLVAR }}}
|
||
|
#
|
||
|
-/sbin/sysctl -q -n -w {{{ SYSCTLVAR }}}="{{{ SYSCTLVAL }}}"
|
||
|
+/sbin/sysctl -q -n -w {{{ SYSCTLVAR }}}="{{{ SYSCTLVAL_REMEDIATE }}}"
|
||
|
|
||
|
#
|
||
|
-# If {{{ SYSCTLVAR }}} present in /etc/sysctl.conf, change value to "{{{ SYSCTLVAL }}}"
|
||
|
-# else, add "{{{ SYSCTLVAR }}} = {{{ SYSCTLVAL }}}" to /etc/sysctl.conf
|
||
|
+# If {{{ SYSCTLVAR }}} present in /etc/sysctl.conf, change value to "{{{ SYSCTLVAL_REMEDIATE }}}"
|
||
|
+# else, add "{{{ SYSCTLVAR }}} = {{{ SYSCTLVAL_REMEDIATE }}}" to /etc/sysctl.conf
|
||
|
#
|
||
|
-{{{ bash_replace_or_append('/etc/sysctl.conf', '^' + SYSCTLVAR , SYSCTLVAL ) }}}
|
||
|
+{{{ bash_replace_or_append('/etc/sysctl.conf', '^' + SYSCTLVAR , SYSCTLVAL_REMEDIATE ) }}}
|
||
|
{{%- endif %}}
|
||
|
diff --git a/shared/templates/sysctl/template.py b/shared/templates/sysctl/template.py
|
||
|
index 421e42c6ca1..2574d5d42b0 100644
|
||
|
--- a/shared/templates/sysctl/template.py
|
||
|
+++ b/shared/templates/sysctl/template.py
|
||
|
@@ -16,6 +16,15 @@ def preprocess(data, lang):
|
||
|
"The sysctlval parameter of {0} is an empty list".format(
|
||
|
data["_rule_id"]))
|
||
|
|
||
|
+ if not data.get("sysctlval_remediate"):
|
||
|
+ if isinstance(data["sysctlval"], list):
|
||
|
+ raise ValueError(
|
||
|
+ "Problem with rule {0}: the 'sysctlval' parameter is a list "
|
||
|
+ "but we are missing the 'sysctlval_remediate' parameter, so "
|
||
|
+ "we don't know how to generate remediation content.".format(
|
||
|
+ data["_rule_id"]))
|
||
|
+ data["sysctlval_remediate"] = data["sysctlval"]
|
||
|
+
|
||
|
# Configure data for test scenarios
|
||
|
if data["datatype"] not in ["string", "int"]:
|
||
|
raise ValueError(
|
||
|
|
||
|
From 8a3ba3f74760b360e179da221acf7bb06f4bdc12 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 13 Jul 2022 17:10:16 +0200
|
||
|
Subject: [PATCH 08/23] Introduce new rule
|
||
|
sysctl_kernel_unprivileged_bpf_disabled_accept_default
|
||
|
|
||
|
This rule is very similar to the existing rule
|
||
|
sysctl_kernel_unprivileged_bpf_disabled, but it allows the sysctl
|
||
|
setting kernel.unprivileged_bpf_disabled to be either 1 or 2. Also, the
|
||
|
rule will pass when the explicit configuration isn't present, allowing
|
||
|
to honor the system's default value which is 2. The goal of this rule is
|
||
|
to prevent unnecessary modification of the RHEL system default value
|
||
|
while still checking for the secure configuration.
|
||
|
|
||
|
See the explanation in
|
||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2081728:
|
||
|
sysctl_kernel_unprivileged_bpf_disabled sets the
|
||
|
kernel.unprivileged_bpf_disabled value to 1. However, on RHEL 9 the
|
||
|
kernel supports new value 2 which per
|
||
|
https://www.kernel.org/doc/html/latest/admin-guide/sysctl/kernel.html#unprivileged-bpf-disabled
|
||
|
makes it for a privileged admin to re-enable unprivileged BPF. The value
|
||
|
2 is also the RHEL 9 default. So the current
|
||
|
sysctl_kernel_unprivileged_bpf_disabled rule unnecessarily modifies
|
||
|
the RHEL 9 default.
|
||
|
---
|
||
|
.../rule.yml | 82 +++++++++++++++++++
|
||
|
shared/references/cce-redhat-avail.txt | 1 -
|
||
|
2 files changed, 82 insertions(+), 1 deletion(-)
|
||
|
create mode 100644 linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
new file mode 100644
|
||
|
index 00000000000..f45769dd2d0
|
||
|
--- /dev/null
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -0,0 +1,82 @@
|
||
|
+documentation_complete: true
|
||
|
+
|
||
|
+prodtype: rhel9
|
||
|
+
|
||
|
+title: 'Disable Access to Network bpf() Syscall From Unprivileged Processes'
|
||
|
+
|
||
|
+description: |-
|
||
|
+ To prevent unprivileged processes from using the <code>bpf()</code> syscall
|
||
|
+ the <code>kernel.unprivileged_bpf_disabled</code> kernel parameter must
|
||
|
+ be set to <code>1</code> or <code>2</code>.
|
||
|
+
|
||
|
+ Writing <code>1</code> to this entry will disable unprivileged calls to <code>bpf()</code>; once
|
||
|
+ disabled, calling <code>bpf()</code> without <code>CAP_SYS_ADMIN</code> or <code>CAP_BPF</code> will return <code>-EPERM</code>.
|
||
|
+ Once set to <code>1</code>, this can't be cleared from the running kernel anymore.
|
||
|
+
|
||
|
+ Writing <code>2</code> to this entry will also disable unprivileged calls to <code>bpf()</code>,
|
||
|
+ however, an admin can still change this setting later on, if needed, by
|
||
|
+ writing <code>0</code> or <code>1</code> to this entry.
|
||
|
+
|
||
|
+ {{{ describe_sysctl_option_value(sysctl="kernel.unprivileged_bpf_disabled", value="1") }}}
|
||
|
+
|
||
|
+rationale: |-
|
||
|
+ Loading and accessing the packet filters programs and maps using the bpf()
|
||
|
+ syscall has the potential of revealing sensitive information about the kernel state.
|
||
|
+
|
||
|
+severity: medium
|
||
|
+
|
||
|
+identifiers:
|
||
|
+ cce@rhel9: CCE-87712-6
|
||
|
+
|
||
|
+references:
|
||
|
+ disa: CCI-000366
|
||
|
+ nist: AC-6,SC-7(10)
|
||
|
+ ospp: FMT_SMF_EXT.1
|
||
|
+ srg: SRG-OS-000132-GPOS-00067,SRG-OS-000480-GPOS-00227
|
||
|
+ stigid@ol8: OL08-00-040281
|
||
|
+ stigid@rhel8: RHEL-08-040281
|
||
|
+
|
||
|
+ocil: |-
|
||
|
+ The runtime status of the <code>kernel.unprivileged_bpf_disabled</code>
|
||
|
+ kernel parameter can be queried by running the following command:
|
||
|
+ <pre>$ sysctl kernel.unprivileged_bpf_disabled</pre>
|
||
|
+ The output of the command should indicate either:
|
||
|
+ kernel.unprivileged_bpf_disabled = 1
|
||
|
+ or:
|
||
|
+ kernel.unprivileged_bpf_disabled = 2
|
||
|
+ The output of the command should not indicate:
|
||
|
+ kernel.unprivileged_bpf_disabled = 0
|
||
|
+
|
||
|
+ The preferable way how to assure the runtime compliance is to have
|
||
|
+ correct persistent configuration, and rebooting the system.
|
||
|
+
|
||
|
+ The persistent kernel parameter configuration is performed by specifying the appropriate
|
||
|
+ assignment in any file located in the <pre>/etc/sysctl.d</pre> directory.
|
||
|
+ Verify that there is not any existing incorrect configuration by executing the following command:
|
||
|
+ <pre>$ grep -r '^\s*{{{ sysctl }}}\s*=' /etc/sysctl.conf /etc/sysctl.d</pre>
|
||
|
+ The command should not find any assignments other than:
|
||
|
+ kernel.unprivileged_bpf_disabled = 1
|
||
|
+ or:
|
||
|
+ kernel.unprivileged_bpf_disabled = 2
|
||
|
+
|
||
|
+ Duplicate assignments are not allowed. Empty output is allowed, because the system default is 2.
|
||
|
+
|
||
|
+ocil_clause: "the kernel.unprivileged_bpf_disabled is not set to 1 or 2 or is configured to be 0"
|
||
|
+
|
||
|
+fixtext: |-
|
||
|
+ Configure {{{ full_name }}} to prevent privilege escalation thru the kernel by disabling access to the bpf syscall.
|
||
|
+
|
||
|
+srg_requirement: '{{{ full_name }}} must disable access to network bpf syscall from unprivileged processes.'
|
||
|
+
|
||
|
+platform: machine
|
||
|
+
|
||
|
+template:
|
||
|
+ name: sysctl
|
||
|
+ vars:
|
||
|
+ sysctlvar: kernel.unprivileged_bpf_disabled
|
||
|
+ sysctlval:
|
||
|
+ - '1'
|
||
|
+ - '2'
|
||
|
+ sysctlval_remediate: "2"
|
||
|
+ missing_static_pass: "true"
|
||
|
+ datatype: int
|
||
|
diff --git a/shared/references/cce-redhat-avail.txt b/shared/references/cce-redhat-avail.txt
|
||
|
index 914233f06bf..2c2cf12cafe 100644
|
||
|
--- a/shared/references/cce-redhat-avail.txt
|
||
|
+++ b/shared/references/cce-redhat-avail.txt
|
||
|
@@ -1435,7 +1435,6 @@ CCE-87708-4
|
||
|
CCE-87709-2
|
||
|
CCE-87710-0
|
||
|
CCE-87711-8
|
||
|
-CCE-87712-6
|
||
|
CCE-87713-4
|
||
|
CCE-87714-2
|
||
|
CCE-87715-9
|
||
|
|
||
|
From 0327b48990c2cf35aeff8adf63a2102378e43c54 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 13 Jul 2022 17:21:50 +0200
|
||
|
Subject: [PATCH 09/23] Add test scenarios for rule
|
||
|
sysctl_kernel_unprivileged_bpf_disabled_accept_default
|
||
|
|
||
|
---
|
||
|
.../tests/system_default.pass.sh | 5 +++++
|
||
|
.../tests/test_config.yml | 6 ++++++
|
||
|
.../tests/value_0.fail.sh | 11 +++++++++++
|
||
|
.../tests/value_1.pass.sh | 11 +++++++++++
|
||
|
.../tests/value_2.pass.sh | 11 +++++++++++
|
||
|
5 files changed, 44 insertions(+)
|
||
|
create mode 100644 linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/system_default.pass.sh
|
||
|
create mode 100644 linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
create mode 100644 linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_0.fail.sh
|
||
|
create mode 100644 linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_1.pass.sh
|
||
|
create mode 100644 linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_2.pass.sh
|
||
|
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/system_default.pass.sh b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/system_default.pass.sh
|
||
|
new file mode 100644
|
||
|
index 00000000000..b9776227bdb
|
||
|
--- /dev/null
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/system_default.pass.sh
|
||
|
@@ -0,0 +1,5 @@
|
||
|
+#!/bin/bash
|
||
|
+# platform = Red Hat Enterprise Linux 9
|
||
|
+
|
||
|
+# Clean sysctl config directories
|
||
|
+rm -rf /usr/lib/sysctl.d/* /run/sysctl.d/* /etc/sysctl.d/*
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
new file mode 100644
|
||
|
index 00000000000..dbac89b4caa
|
||
|
--- /dev/null
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
@@ -0,0 +1,6 @@
|
||
|
+deny_templated_scenarios:
|
||
|
+ - line_not_there.fail.sh
|
||
|
+ - comment.fail.sh
|
||
|
+ - wrong_value.fail.sh
|
||
|
+ - wrong_value_d_directory.fail.sh
|
||
|
+ - wrong_runtime.fail.sh
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_0.fail.sh b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_0.fail.sh
|
||
|
new file mode 100644
|
||
|
index 00000000000..9f19e0140b4
|
||
|
--- /dev/null
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_0.fail.sh
|
||
|
@@ -0,0 +1,11 @@
|
||
|
+#!/bin/bash
|
||
|
+# platform = Red Hat Enterprise Linux 9
|
||
|
+
|
||
|
+# Clean sysctl config directories
|
||
|
+rm -rf /usr/lib/sysctl.d/* /run/sysctl.d/* /etc/sysctl.d/*
|
||
|
+
|
||
|
+sed -i "/kernel.unprivileged_bpf_disabled/d" /etc/sysctl.conf
|
||
|
+echo "kernel.unprivileged_bpf_disabled = 0" >> /etc/sysctl.conf
|
||
|
+
|
||
|
+# set correct runtime value to check if the filesystem configuration is evaluated properly
|
||
|
+sysctl -w kernel.unprivileged_bpf_disabled="0"
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_1.pass.sh b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_1.pass.sh
|
||
|
new file mode 100644
|
||
|
index 00000000000..e976db594c8
|
||
|
--- /dev/null
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_1.pass.sh
|
||
|
@@ -0,0 +1,11 @@
|
||
|
+#!/bin/bash
|
||
|
+# platform = Red Hat Enterprise Linux 9
|
||
|
+
|
||
|
+# Clean sysctl config directories
|
||
|
+rm -rf /usr/lib/sysctl.d/* /run/sysctl.d/* /etc/sysctl.d/*
|
||
|
+
|
||
|
+sed -i "/kernel.unprivileged_bpf_disabled/d" /etc/sysctl.conf
|
||
|
+echo "kernel.unprivileged_bpf_disabled = 1" >> /etc/sysctl.conf
|
||
|
+
|
||
|
+# set correct runtime value to check if the filesystem configuration is evaluated properly
|
||
|
+sysctl -w kernel.unprivileged_bpf_disabled="1"
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_2.pass.sh b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_2.pass.sh
|
||
|
new file mode 100644
|
||
|
index 00000000000..b1537175eb4
|
||
|
--- /dev/null
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/value_2.pass.sh
|
||
|
@@ -0,0 +1,11 @@
|
||
|
+#!/bin/bash
|
||
|
+# platform = Red Hat Enterprise Linux 9
|
||
|
+
|
||
|
+# Clean sysctl config directories
|
||
|
+rm -rf /usr/lib/sysctl.d/* /run/sysctl.d/* /etc/sysctl.d/*
|
||
|
+
|
||
|
+sed -i "/kernel.unprivileged_bpf_disabled/d" /etc/sysctl.conf
|
||
|
+echo "kernel.unprivileged_bpf_disabled = 2" >> /etc/sysctl.conf
|
||
|
+
|
||
|
+# set correct runtime value to check if the filesystem configuration is evaluated properly
|
||
|
+sysctl -w kernel.unprivileged_bpf_disabled="2"
|
||
|
|
||
|
From 52415b3effb7bf80038b8d866982fd44c8c45312 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Thu, 14 Jul 2022 09:14:53 +0200
|
||
|
Subject: [PATCH 10/23] Use rule
|
||
|
sysctl_kernel_unprivileged_bpf_disabled_accept_default
|
||
|
|
||
|
Use rule sysctl_kernel_unprivileged_bpf_disabled_accept_default
|
||
|
instead of the rule sysctl_kernel_unprivileged_bpf_disabled
|
||
|
in the RHEL 9 OSPP profile.
|
||
|
---
|
||
|
products/rhel9/profiles/ospp.profile | 2 +-
|
||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/products/rhel9/profiles/ospp.profile b/products/rhel9/profiles/ospp.profile
|
||
|
index a7ba9532d2c..19e4878c4b0 100644
|
||
|
--- a/products/rhel9/profiles/ospp.profile
|
||
|
+++ b/products/rhel9/profiles/ospp.profile
|
||
|
@@ -74,7 +74,7 @@ selections:
|
||
|
- sysctl_kernel_yama_ptrace_scope
|
||
|
- sysctl_kernel_perf_event_paranoid
|
||
|
- sysctl_user_max_user_namespaces
|
||
|
- - sysctl_kernel_unprivileged_bpf_disabled
|
||
|
+ - sysctl_kernel_unprivileged_bpf_disabled_accept_default
|
||
|
- service_kdump_disabled
|
||
|
|
||
|
### Audit
|
||
|
|
||
|
From 4ff536a006a9d25c9c90a1b1e5fce0f957c51c28 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Thu, 14 Jul 2022 09:25:26 +0200
|
||
|
Subject: [PATCH 11/23] Document that sysctlval can be a list
|
||
|
|
||
|
---
|
||
|
docs/templates/template_reference.md | 3 ++-
|
||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index 5785f1d453f..716407fd5c9 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -815,7 +815,8 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
|
||
|
- **datatype** - data type of the sysctl value, eg. `int`.
|
||
|
|
||
|
- - **sysctlval** - value of the sysctl value, eg. `'1'`. If this
|
||
|
+ - **sysctlval** - value of the sysctl value. This can be either an atomic
|
||
|
+ value, eg. `'1'`, or a list of values, eg. `['1','2']`. If this
|
||
|
parameter is not specified, XCCDF Value is used instead.
|
||
|
|
||
|
- **sysctlval_remediate** - the value that will be used in remediations.
|
||
|
|
||
|
From df27fec11a6e8037288ee8cf5b7bfc7d05537f33 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Thu, 14 Jul 2022 11:00:59 +0200
|
||
|
Subject: [PATCH 12/23] Document the missing_static_pass option
|
||
|
|
||
|
---
|
||
|
docs/templates/template_reference.md | 5 +++++
|
||
|
1 file changed, 5 insertions(+)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index 716407fd5c9..65da697b808 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -827,6 +827,11 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
should be remedied to. When the **sysctlval** parameter is not a list
|
||
|
this parameter is optional.
|
||
|
|
||
|
+ - **missing_static_pass** - if set to `true` the check will pass if the
|
||
|
+ setting for the given **sysctlvar** is not present in sysctl
|
||
|
+ configuration files. In other words, the check will pass if the system
|
||
|
+ default isn't overriden by configuration. Default value: `false`.
|
||
|
+
|
||
|
- **operation** - operation used for comparison of collected object
|
||
|
with **sysctlval**. Default value: `equals`.
|
||
|
|
||
|
|
||
|
From e8b8497d32d84282d7f34d83f3661c02235d33cb Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Thu, 14 Jul 2022 11:03:53 +0200
|
||
|
Subject: [PATCH 13/23] Introduce sysctlval_wrong parameter
|
||
|
|
||
|
When the `sysctalval` parameter is a list, this parameter will be
|
||
|
substitued into the SYSCTL_WRONG_VALUE parameter in test scenarios. This
|
||
|
is better than current computing of the SYSCTL_WRONG_VALUE parameter
|
||
|
which is done by prepending "1" to the string value, because the
|
||
|
computed value could be invalid and the `sysctl -w` command used in the
|
||
|
test scenario wrong_runtime.fail.sh could fail to set the value to
|
||
|
SYSCTL_WRONG_VALUE therefore not changing the runtime. If at the same
|
||
|
time the `missing_static_pass` is set to `true` and the system is set to
|
||
|
system default, then the unchanged runtime would cause the check to pass
|
||
|
and therefore the test scenario wrong_runtime.fail.sh to error.
|
||
|
---
|
||
|
docs/templates/template_reference.md | 3 +++
|
||
|
.../rule.yml | 1 +
|
||
|
shared/templates/sysctl/template.py | 7 ++-----
|
||
|
3 files changed, 6 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index 65da697b808..7e1fc7049cf 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -827,6 +827,9 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
should be remedied to. When the **sysctlval** parameter is not a list
|
||
|
this parameter is optional.
|
||
|
|
||
|
+ - **sysctlval_wrong** - the value that is always wrong. This will be used
|
||
|
+ only in the test scenarios only if **sysctlval** is a list.
|
||
|
+
|
||
|
- **missing_static_pass** - if set to `true` the check will pass if the
|
||
|
setting for the given **sysctlvar** is not present in sysctl
|
||
|
configuration files. In other words, the check will pass if the system
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
index f45769dd2d0..ddff15dff8f 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -78,5 +78,6 @@ template:
|
||
|
- '1'
|
||
|
- '2'
|
||
|
sysctlval_remediate: "2"
|
||
|
+ sysctlval_wrong: "0"
|
||
|
missing_static_pass: "true"
|
||
|
datatype: int
|
||
|
diff --git a/shared/templates/sysctl/template.py b/shared/templates/sysctl/template.py
|
||
|
index 2574d5d42b0..96663694997 100644
|
||
|
--- a/shared/templates/sysctl/template.py
|
||
|
+++ b/shared/templates/sysctl/template.py
|
||
|
@@ -41,11 +41,8 @@ def preprocess(data, lang):
|
||
|
data["sysctl_correct_value"] = "correct_value"
|
||
|
data["sysctl_wrong_value"] = "wrong_value"
|
||
|
elif isinstance(data["sysctlval"], list):
|
||
|
- data["sysctl_correct_value"] = data["sysctlval"][0]
|
||
|
- if data["datatype"] == "int":
|
||
|
- data["sysctl_wrong_value"] = "1" + data["sysctlval"][0]
|
||
|
- elif data["datatype"] == "string":
|
||
|
- data["sysctl_wrong_value"] = "wrong_value"
|
||
|
+ data["sysctl_correct_value"] = data["sysctlval_remediate"]
|
||
|
+ data["sysctl_wrong_value"] = data["sysctlval_wrong"]
|
||
|
else:
|
||
|
data["sysctl_correct_value"] = data["sysctlval"]
|
||
|
if data["datatype"] == "int":
|
||
|
|
||
|
From 5f391a7053f7ce18dd34c45a1d319d65b78348d4 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Thu, 14 Jul 2022 11:23:59 +0200
|
||
|
Subject: [PATCH 14/23] Change test_config.yml
|
||
|
|
||
|
---
|
||
|
.../tests/test_config.yml | 6 +++---
|
||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
index dbac89b4caa..c379680e25c 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
@@ -1,6 +1,6 @@
|
||
|
deny_templated_scenarios:
|
||
|
+ # this rule uses missing_static_pass: true which means the check should pass
|
||
|
+ # if the configuration is missing (or commented out) therefore we disable
|
||
|
+ # line_not_there.fail.sh and comment.fail.sh test scenarios
|
||
|
- line_not_there.fail.sh
|
||
|
- comment.fail.sh
|
||
|
- - wrong_value.fail.sh
|
||
|
- - wrong_value_d_directory.fail.sh
|
||
|
- - wrong_runtime.fail.sh
|
||
|
|
||
|
From 92207a9bd11df0e69bf732e27fb91e5db270f7f6 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Fri, 15 Jul 2022 10:36:05 +0200
|
||
|
Subject: [PATCH 15/23] Simplify sysctl template
|
||
|
|
||
|
Instead of using multiple OVAL tests in OR relation we can have
|
||
|
a single OVAL test containing multiple OVAL states in OR relation.
|
||
|
That will simplify the code.
|
||
|
---
|
||
|
shared/templates/sysctl/oval.template | 82 +++++----------------------
|
||
|
1 file changed, 13 insertions(+), 69 deletions(-)
|
||
|
|
||
|
diff --git a/shared/templates/sysctl/oval.template b/shared/templates/sysctl/oval.template
|
||
|
index 1719a59f9c7..8241c391ad2 100644
|
||
|
--- a/shared/templates/sysctl/oval.template
|
||
|
+++ b/shared/templates/sysctl/oval.template
|
||
|
@@ -8,7 +8,13 @@
|
||
|
|
||
|
{{% macro state_static_sysctld(prefix) -%}}
|
||
|
<ind:object object_ref="object_static_{{{ prefix }}}_{{{ rule_id }}}"/>
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
<ind:state state_ref="state_static_sysctld_{{{ rule_id }}}"/>
|
||
|
+{{% elif SYSCTLVAL is sequence %}}
|
||
|
+{{% for x in SYSCTLVAL %}}
|
||
|
+ <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}" />
|
||
|
+{{% endfor %}}
|
||
|
+{{% endif %}}
|
||
|
{{%- endmacro -%}}
|
||
|
{{%- macro sysctl_match() -%}}
|
||
|
{{%- if SYSCTLVAL == "" -%}}
|
||
|
@@ -62,38 +68,24 @@
|
||
|
<def-group>
|
||
|
<definition class="compliance" id="{{{ rule_id }}}_runtime" version="3">
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to " + COMMENT_VALUE + " in the system runtime.") }}}
|
||
|
-{{% if SYSCTLVAL is string %}}
|
||
|
<criteria operator="AND">
|
||
|
<criterion comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}}"
|
||
|
test_ref="test_{{{ rule_id }}}_runtime"/>
|
||
|
</criteria>
|
||
|
-{{% elif SYSCTLVAL is sequence %}}
|
||
|
- <criteria operator="OR">
|
||
|
-{{% for x in SYSCTLVAL %}}
|
||
|
- <criterion comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ x }}}"
|
||
|
- test_ref="test_{{{ rule_id }}}_runtime_{{{ x }}}"/>
|
||
|
-{{% endfor %}}
|
||
|
- </criteria>
|
||
|
-{{% endif %}}
|
||
|
</definition>
|
||
|
|
||
|
-{{% if SYSCTLVAL is string %}}
|
||
|
<unix:sysctl_test id="test_{{{ rule_id }}}_runtime" version="1"
|
||
|
comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}}"
|
||
|
- check="all" check_existence="all_exist">
|
||
|
+ check="all" check_existence="all_exist" state_operator="OR">
|
||
|
<unix:object object_ref="object_{{{ rule_id }}}_runtime"/>
|
||
|
+{{% if SYSCTLVAL is string %}}
|
||
|
<unix:state state_ref="state_{{{ rule_id }}}_runtime"/>
|
||
|
- </unix:sysctl_test>
|
||
|
{{% elif SYSCTLVAL is sequence %}}
|
||
|
{{% for x in SYSCTLVAL %}}
|
||
|
- <unix:sysctl_test id="test_{{{ rule_id }}}_runtime_{{{ x }}}" version="1"
|
||
|
- comment="kernel runtime parameter {{{ SYSCTLVAR }}} set to {{{ x }}}"
|
||
|
- check="all" check_existence="all_exist">
|
||
|
- <unix:object object_ref="object_{{{ rule_id }}}_runtime"/>
|
||
|
<unix:state state_ref="state_{{{ rule_id }}}_runtime_{{{ x }}}" />
|
||
|
- </unix:sysctl_test>
|
||
|
{{% endfor %}}
|
||
|
{{% endif %}}
|
||
|
+ </unix:sysctl_test>
|
||
|
|
||
|
<unix:sysctl_object id="object_{{{ rule_id }}}_runtime" version="1">
|
||
|
<unix:name>{{{ SYSCTLVAR }}}</unix:name>
|
||
|
@@ -139,7 +131,6 @@
|
||
|
{{% endif %}}
|
||
|
<criteria operator="AND">
|
||
|
<criteria operator="OR">
|
||
|
-{{% if SYSCTLVAL is string %}}
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /etc/sysctl.conf"
|
||
|
test_ref="test_{{{ rule_id }}}_static"/>
|
||
|
<!-- see sysctl.d(5) -->
|
||
|
@@ -150,21 +141,6 @@
|
||
|
{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
<criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ COMMENT_VALUE }}} in /usr/lib/sysctl.d/*.conf"
|
||
|
test_ref="test_{{{ rule_id }}}_static_usr_lib_sysctld"/>
|
||
|
-{{% endif %}}
|
||
|
-{{% elif SYSCTLVAL is sequence %}}
|
||
|
-{{% for x in SYSCTLVAL %}}
|
||
|
- <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /etc/sysctl.conf"
|
||
|
- test_ref="test_{{{ rule_id }}}_static_{{{ x }}}"/>
|
||
|
- <!-- see sysctl.d(5) -->
|
||
|
- <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /etc/sysctl.d/*.conf"
|
||
|
- test_ref="test_{{{ rule_id }}}_static_{{{ x }}}_etc_sysctld"/>
|
||
|
- <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /run/sysctl.d/*.conf"
|
||
|
- test_ref="test_{{{ rule_id }}}_static_{{{ x }}}_run_sysctld"/>
|
||
|
-{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
- <criterion comment="kernel static parameter {{{ SYSCTLVAR }}} set to {{{ x }}} in /usr/lib/sysctl.d/*.conf"
|
||
|
- test_ref="test_{{{ rule_id }}}_static_{{{ x }}}_usr_lib_sysctld"/>
|
||
|
-{{% endif %}}
|
||
|
-{{% endfor %}}
|
||
|
{{% endif %}}
|
||
|
</criteria>
|
||
|
{{% if target_oval_version >= [5, 11] %}}
|
||
|
@@ -185,61 +161,29 @@
|
||
|
</ind:textfilecontent54_test>
|
||
|
{{% endif %}}
|
||
|
|
||
|
-{{% if SYSCTLVAL is string %}}
|
||
|
<ind:textfilecontent54_test id="test_{{{ rule_id }}}_static" version="1"
|
||
|
check="all" check_existence="all_exist"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration">
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration" state_operator="OR">
|
||
|
{{{ state_static_sysctld("sysctl") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
|
||
|
<ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_etc_sysctld" version="1" check="all"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration in /etc/sysctl.d/*.conf">
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration in /etc/sysctl.d/*.conf" state_operator="OR">
|
||
|
{{{ state_static_sysctld("etc_sysctld") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
|
||
|
<ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_run_sysctld" version="1" check="all"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration in /run/sysctl.d/*.conf">
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration in /run/sysctl.d/*.conf" state_operator="OR">
|
||
|
{{{ state_static_sysctld("run_sysctld") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
|
||
|
{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
<ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_usr_lib_sysctld" version="1"
|
||
|
check="all"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration in /usr/lib/sysctl.d/*.conf">
|
||
|
+ comment="{{{ SYSCTLVAR }}} static configuration in /usr/lib/sysctl.d/*.conf" state_operator="OR">
|
||
|
{{{ state_static_sysctld("usr_lib_sysctld") }}}
|
||
|
</ind:textfilecontent54_test>
|
||
|
{{% endif %}}
|
||
|
-{{% elif SYSCTLVAL is sequence %}}
|
||
|
-{{% for x in SYSCTLVAL %}}
|
||
|
- <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}" version="1"
|
||
|
- check="all" check_existence="all_exist"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration">
|
||
|
- <ind:object object_ref="object_static_sysctl_{{{ rule_id }}}"/>
|
||
|
- <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
- </ind:textfilecontent54_test>
|
||
|
-
|
||
|
- <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}_etc_sysctld" version="1" check="all"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration in /etc/sysctl.d/*.conf">
|
||
|
- <ind:object object_ref="object_static_etc_sysctld_{{{ rule_id }}}"/>
|
||
|
- <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
- </ind:textfilecontent54_test>
|
||
|
-
|
||
|
- <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}_run_sysctld" version="1" check="all"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration in /run/sysctl.d/*.conf">
|
||
|
- <ind:object object_ref="object_static_run_sysctld_{{{ rule_id }}}"/>
|
||
|
- <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
- </ind:textfilecontent54_test>
|
||
|
-
|
||
|
-{{% if product not in [ "ol7", "ol8", "ol9", "rhcos4", "rhel7", "rhel8", "rhel9"] %}}
|
||
|
- <ind:textfilecontent54_test id="test_{{{ rule_id }}}_static_{{{ x }}}_usr_lib_sysctld" version="1"
|
||
|
- check="all"
|
||
|
- comment="{{{ SYSCTLVAR }}} static configuration in /usr/lib/sysctl.d/*.conf">
|
||
|
- <ind:object object_ref="object_static_usr_lib_sysctld_{{{ rule_id }}}"/>
|
||
|
- <ind:state state_ref="state_static_sysctld_{{{ rule_id }}}_{{{ x }}}"/>
|
||
|
- </ind:textfilecontent54_test>
|
||
|
-{{% endif %}}
|
||
|
-{{% endfor %}}
|
||
|
-{{% endif %}}
|
||
|
|
||
|
{{% if target_oval_version >= [5, 11] %}}
|
||
|
<ind:variable_test check="all" check_existence="all_exist" comment="Check that only one file contains {{{ SYSCTLID }}}"
|
||
|
|
||
|
From d78d946740b0b8bef31c054ad0b5c4ab14159442 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Mon, 25 Jul 2022 15:40:24 +0200
|
||
|
Subject: [PATCH 16/23] Replace the sysctlval_remediate template parameter
|
||
|
|
||
|
Replace the sysctlval_remediate template parameter by using an XCCDF
|
||
|
value. The variable would be only used in the remediation and would
|
||
|
allow users to tailor the value, instead of the current solution where
|
||
|
the value is hardcoded and can be only changed during build time.
|
||
|
---
|
||
|
docs/templates/template_reference.md | 21 +++++++++----------
|
||
|
.../rule.yml | 1 -
|
||
|
products/rhel9/profiles/ospp.profile | 1 +
|
||
|
shared/templates/sysctl/ansible.template | 6 +++---
|
||
|
shared/templates/sysctl/bash.template | 10 ++++-----
|
||
|
shared/templates/sysctl/template.py | 11 +---------
|
||
|
6 files changed, 20 insertions(+), 30 deletions(-)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index 7e1fc7049cf..00f991daae7 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -815,17 +815,16 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
|
||
|
- **datatype** - data type of the sysctl value, eg. `int`.
|
||
|
|
||
|
- - **sysctlval** - value of the sysctl value. This can be either an atomic
|
||
|
- value, eg. `'1'`, or a list of values, eg. `['1','2']`. If this
|
||
|
- parameter is not specified, XCCDF Value is used instead.
|
||
|
-
|
||
|
- - **sysctlval_remediate** - the value that will be used in remediations.
|
||
|
- If **sysctlval_remediate** is not specified, the template will use the
|
||
|
- value of the **sysctlval** parameter in the remediations.
|
||
|
- This parameter is mandatory when the **sysctlval** parameter is a list
|
||
|
- because we need to know which of the values in the list the system
|
||
|
- should be remedied to. When the **sysctlval** parameter is not a list
|
||
|
- this parameter is optional.
|
||
|
+ - **sysctlval** - value of the sysctl value. This can be either not
|
||
|
+ specified, or an atomic value, eg. `'1'`, or a list of values,
|
||
|
+ eg. `['1','2']`.
|
||
|
+ - If this parameter is not specified, an XCCDF Value is used instead
|
||
|
+ in OVAL check and remediations.
|
||
|
+ - If this parameter is set to an atomic value, this atomic value
|
||
|
+ will be used in OVAL check and remediations.
|
||
|
+ - If this parameter is set to a list of values, the list will be used
|
||
|
+ in the OVAL check, but won't be used in the remediations.
|
||
|
+ All remediations will use an XCCDF value instead.
|
||
|
|
||
|
- **sysctlval_wrong** - the value that is always wrong. This will be used
|
||
|
only in the test scenarios only if **sysctlval** is a list.
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
index ddff15dff8f..9936ed777c8 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -77,7 +77,6 @@ template:
|
||
|
sysctlval:
|
||
|
- '1'
|
||
|
- '2'
|
||
|
- sysctlval_remediate: "2"
|
||
|
sysctlval_wrong: "0"
|
||
|
missing_static_pass: "true"
|
||
|
datatype: int
|
||
|
diff --git a/products/rhel9/profiles/ospp.profile b/products/rhel9/profiles/ospp.profile
|
||
|
index 19e4878c4b0..b47630c62b0 100644
|
||
|
--- a/products/rhel9/profiles/ospp.profile
|
||
|
+++ b/products/rhel9/profiles/ospp.profile
|
||
|
@@ -75,6 +75,7 @@ selections:
|
||
|
- sysctl_kernel_perf_event_paranoid
|
||
|
- sysctl_user_max_user_namespaces
|
||
|
- sysctl_kernel_unprivileged_bpf_disabled_accept_default
|
||
|
+ - sysctl_kernel_unprivileged_bpf_disabled_value=2
|
||
|
- service_kdump_disabled
|
||
|
|
||
|
### Audit
|
||
|
diff --git a/shared/templates/sysctl/ansible.template b/shared/templates/sysctl/ansible.template
|
||
|
index 7724db5e5ff..edc4d3fb667 100644
|
||
|
--- a/shared/templates/sysctl/ansible.template
|
||
|
+++ b/shared/templates/sysctl/ansible.template
|
||
|
@@ -21,7 +21,7 @@
|
||
|
replace: '#{{{ SYSCTLVAR }}}'
|
||
|
loop: "{{ find_sysctl_d.files }}"
|
||
|
|
||
|
-{{%- if SYSCTLVAL_REMEDIATE == "" %}}
|
||
|
+{{%- if SYSCTLVAL == "" or SYSCTLVAL is not string %}}
|
||
|
- (xccdf-var sysctl_{{{ SYSCTLID }}}_value)
|
||
|
|
||
|
- name: Ensure sysctl {{{ SYSCTLVAR }}} is set
|
||
|
@@ -29,10 +29,10 @@
|
||
|
name: "{{{ SYSCTLVAR }}}"
|
||
|
value: "{{ sysctl_{{{ SYSCTLID }}}_value }}"
|
||
|
{{%- else %}}
|
||
|
-- name: Ensure sysctl {{{ SYSCTLVAR }}} is set to {{{ SYSCTLVAL_REMEDIATE }}}
|
||
|
+- name: Ensure sysctl {{{ SYSCTLVAR }}} is set to {{{ SYSCTLVAL }}}
|
||
|
sysctl:
|
||
|
name: "{{{ SYSCTLVAR }}}"
|
||
|
- value: "{{{ SYSCTLVAL_REMEDIATE }}}"
|
||
|
+ value: "{{{ SYSCTLVAL }}}"
|
||
|
{{%- endif %}}
|
||
|
state: present
|
||
|
reload: yes
|
||
|
diff --git a/shared/templates/sysctl/bash.template b/shared/templates/sysctl/bash.template
|
||
|
index 63948bd5a26..cd3424b0228 100644
|
||
|
--- a/shared/templates/sysctl/bash.template
|
||
|
+++ b/shared/templates/sysctl/bash.template
|
||
|
@@ -20,7 +20,7 @@ for f in /etc/sysctl.d/*.conf /run/sysctl.d/*.conf; do
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
-{{%- if SYSCTLVAL_REMEDIATE == "" %}}
|
||
|
+{{%- if SYSCTLVAL == "" or SYSCTLVAL is not string %}}
|
||
|
{{{ bash_instantiate_variables("sysctl_" + SYSCTLID + "_value") }}}
|
||
|
|
||
|
#
|
||
|
@@ -38,11 +38,11 @@ done
|
||
|
#
|
||
|
# Set runtime for {{{ SYSCTLVAR }}}
|
||
|
#
|
||
|
-/sbin/sysctl -q -n -w {{{ SYSCTLVAR }}}="{{{ SYSCTLVAL_REMEDIATE }}}"
|
||
|
+/sbin/sysctl -q -n -w {{{ SYSCTLVAR }}}="{{{ SYSCTLVAL }}}"
|
||
|
|
||
|
#
|
||
|
-# If {{{ SYSCTLVAR }}} present in /etc/sysctl.conf, change value to "{{{ SYSCTLVAL_REMEDIATE }}}"
|
||
|
-# else, add "{{{ SYSCTLVAR }}} = {{{ SYSCTLVAL_REMEDIATE }}}" to /etc/sysctl.conf
|
||
|
+# If {{{ SYSCTLVAR }}} present in /etc/sysctl.conf, change value to "{{{ SYSCTLVAL }}}"
|
||
|
+# else, add "{{{ SYSCTLVAR }}} = {{{ SYSCTLVAL }}}" to /etc/sysctl.conf
|
||
|
#
|
||
|
-{{{ bash_replace_or_append('/etc/sysctl.conf', '^' + SYSCTLVAR , SYSCTLVAL_REMEDIATE ) }}}
|
||
|
+{{{ bash_replace_or_append('/etc/sysctl.conf', '^' + SYSCTLVAR , SYSCTLVAL ) }}}
|
||
|
{{%- endif %}}
|
||
|
diff --git a/shared/templates/sysctl/template.py b/shared/templates/sysctl/template.py
|
||
|
index 96663694997..2b779f99a62 100644
|
||
|
--- a/shared/templates/sysctl/template.py
|
||
|
+++ b/shared/templates/sysctl/template.py
|
||
|
@@ -16,15 +16,6 @@ def preprocess(data, lang):
|
||
|
"The sysctlval parameter of {0} is an empty list".format(
|
||
|
data["_rule_id"]))
|
||
|
|
||
|
- if not data.get("sysctlval_remediate"):
|
||
|
- if isinstance(data["sysctlval"], list):
|
||
|
- raise ValueError(
|
||
|
- "Problem with rule {0}: the 'sysctlval' parameter is a list "
|
||
|
- "but we are missing the 'sysctlval_remediate' parameter, so "
|
||
|
- "we don't know how to generate remediation content.".format(
|
||
|
- data["_rule_id"]))
|
||
|
- data["sysctlval_remediate"] = data["sysctlval"]
|
||
|
-
|
||
|
# Configure data for test scenarios
|
||
|
if data["datatype"] not in ["string", "int"]:
|
||
|
raise ValueError(
|
||
|
@@ -41,7 +32,7 @@ def preprocess(data, lang):
|
||
|
data["sysctl_correct_value"] = "correct_value"
|
||
|
data["sysctl_wrong_value"] = "wrong_value"
|
||
|
elif isinstance(data["sysctlval"], list):
|
||
|
- data["sysctl_correct_value"] = data["sysctlval_remediate"]
|
||
|
+ data["sysctl_correct_value"] = data["sysctlval"][0]
|
||
|
data["sysctl_wrong_value"] = data["sysctlval_wrong"]
|
||
|
else:
|
||
|
data["sysctl_correct_value"] = data["sysctlval"]
|
||
|
|
||
|
From 817b47544b4a62aad8153360839bb14dd607d46d Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Mon, 25 Jul 2022 15:47:11 +0200
|
||
|
Subject: [PATCH 17/23] Rename a template parameter
|
||
|
|
||
|
Rename the sysctlval_wrong parameter to wrong_sysctlval_for_testing
|
||
|
---
|
||
|
docs/templates/template_reference.md | 4 ++--
|
||
|
.../rule.yml | 2 +-
|
||
|
shared/templates/sysctl/template.py | 2 +-
|
||
|
3 files changed, 4 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index 00f991daae7..4e6357c1579 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -826,8 +826,8 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
in the OVAL check, but won't be used in the remediations.
|
||
|
All remediations will use an XCCDF value instead.
|
||
|
|
||
|
- - **sysctlval_wrong** - the value that is always wrong. This will be used
|
||
|
- only in the test scenarios only if **sysctlval** is a list.
|
||
|
+ - **wrong_sysctlval_for_testing** - the value that is always wrong. This will be used
|
||
|
+ only in the templated test scenarios only if **sysctlval** is a list.
|
||
|
|
||
|
- **missing_static_pass** - if set to `true` the check will pass if the
|
||
|
setting for the given **sysctlvar** is not present in sysctl
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
index 9936ed777c8..b8af4f7560d 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -77,6 +77,6 @@ template:
|
||
|
sysctlval:
|
||
|
- '1'
|
||
|
- '2'
|
||
|
- sysctlval_wrong: "0"
|
||
|
+ wrong_sysctlval_for_testing: "0"
|
||
|
missing_static_pass: "true"
|
||
|
datatype: int
|
||
|
diff --git a/shared/templates/sysctl/template.py b/shared/templates/sysctl/template.py
|
||
|
index 2b779f99a62..9083a6a4185 100644
|
||
|
--- a/shared/templates/sysctl/template.py
|
||
|
+++ b/shared/templates/sysctl/template.py
|
||
|
@@ -33,7 +33,7 @@ def preprocess(data, lang):
|
||
|
data["sysctl_wrong_value"] = "wrong_value"
|
||
|
elif isinstance(data["sysctlval"], list):
|
||
|
data["sysctl_correct_value"] = data["sysctlval"][0]
|
||
|
- data["sysctl_wrong_value"] = data["sysctlval_wrong"]
|
||
|
+ data["sysctl_wrong_value"] = data["wrong_sysctlval_for_testing"]
|
||
|
else:
|
||
|
data["sysctl_correct_value"] = data["sysctlval"]
|
||
|
if data["datatype"] == "int":
|
||
|
|
||
|
From ed48698e95f96891889fa2c2039172015ae9f069 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Mon, 25 Jul 2022 15:56:26 +0200
|
||
|
Subject: [PATCH 18/23] Rename parameter missing_static_pass
|
||
|
|
||
|
Rename the parameter missing_static_pass to missing_parameter_pass
|
||
|
to make the naming consistent with other templates where a parameter
|
||
|
with a similar meaning exist.
|
||
|
---
|
||
|
docs/templates/template_reference.md | 2 +-
|
||
|
.../rule.yml | 2 +-
|
||
|
.../tests/test_config.yml | 2 +-
|
||
|
shared/templates/sysctl/oval.template | 6 +++---
|
||
|
4 files changed, 6 insertions(+), 6 deletions(-)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index 4e6357c1579..0fff58c0a23 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -829,7 +829,7 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
- **wrong_sysctlval_for_testing** - the value that is always wrong. This will be used
|
||
|
only in the templated test scenarios only if **sysctlval** is a list.
|
||
|
|
||
|
- - **missing_static_pass** - if set to `true` the check will pass if the
|
||
|
+ - **missing_parameter_pass** - if set to `true` the check will pass if the
|
||
|
setting for the given **sysctlvar** is not present in sysctl
|
||
|
configuration files. In other words, the check will pass if the system
|
||
|
default isn't overriden by configuration. Default value: `false`.
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
index b8af4f7560d..7d8769a913f 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -78,5 +78,5 @@ template:
|
||
|
- '1'
|
||
|
- '2'
|
||
|
wrong_sysctlval_for_testing: "0"
|
||
|
- missing_static_pass: "true"
|
||
|
+ missing_parameter_pass: "true"
|
||
|
datatype: int
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
index c379680e25c..5cf68074050 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/tests/test_config.yml
|
||
|
@@ -1,5 +1,5 @@
|
||
|
deny_templated_scenarios:
|
||
|
- # this rule uses missing_static_pass: true which means the check should pass
|
||
|
+ # this rule uses missing_parameter_pass: true which means the check should pass
|
||
|
# if the configuration is missing (or commented out) therefore we disable
|
||
|
# line_not_there.fail.sh and comment.fail.sh test scenarios
|
||
|
- line_not_there.fail.sh
|
||
|
diff --git a/shared/templates/sysctl/oval.template b/shared/templates/sysctl/oval.template
|
||
|
index 8241c391ad2..1a7c4979bbe 100644
|
||
|
--- a/shared/templates/sysctl/oval.template
|
||
|
+++ b/shared/templates/sysctl/oval.template
|
||
|
@@ -126,7 +126,7 @@
|
||
|
<def-group>
|
||
|
<definition class="compliance" id="{{{ rule_id }}}_static" version="3">
|
||
|
{{{ oval_metadata("The kernel '" + SYSCTLVAR + "' parameter should be set to " + COMMENT_VALUE + " in the system configuration.") }}}
|
||
|
-{{% if MISSING_STATIC_PASS == "true" %}}
|
||
|
+{{% if MISSING_PARAMETER_PASS == "true" %}}
|
||
|
<criteria operator="OR">
|
||
|
{{% endif %}}
|
||
|
<criteria operator="AND">
|
||
|
@@ -147,13 +147,13 @@
|
||
|
<criterion comment="Check that {{{ SYSCTLID }}} is defined in only one file" test_ref="test_{{{ rule_id }}}_defined_in_one_file" />
|
||
|
{{% endif %}}
|
||
|
</criteria>
|
||
|
-{{% if MISSING_STATIC_PASS == "true" %}}
|
||
|
+{{% if MISSING_PARAMETER_PASS == "true" %}}
|
||
|
<criterion comment="Check that {{{ SYSCTLID }}} is not defined in any file" test_ref="test_{{{ rule_id }}}_not_defined" />
|
||
|
</criteria>
|
||
|
{{% endif %}}
|
||
|
</definition>
|
||
|
|
||
|
-{{% if MISSING_STATIC_PASS == "true" %}}
|
||
|
+{{% if MISSING_PARAMETER_PASS == "true" %}}
|
||
|
<ind:textfilecontent54_test id="test_{{{ rule_id }}}_not_defined" version="1"
|
||
|
check="all" check_existence="none_exist"
|
||
|
comment="{{{ SYSCTLVAR }}} static configuration">
|
||
|
|
||
|
From f022f549c6d0b5bc0d24c5d1b7c606d23efbd6d2 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Mon, 25 Jul 2022 16:26:03 +0200
|
||
|
Subject: [PATCH 19/23] Add a variable
|
||
|
sysctl_kernel_unprivileged_bpf_disabled_value
|
||
|
|
||
|
---
|
||
|
..._kernel_unprivileged_bpf_disabled_value.var | 18 ++++++++++++++++++
|
||
|
1 file changed, 18 insertions(+)
|
||
|
create mode 100644 linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_value.var
|
||
|
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_value.var b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_value.var
|
||
|
new file mode 100644
|
||
|
index 00000000000..b8bf965a255
|
||
|
--- /dev/null
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_value.var
|
||
|
@@ -0,0 +1,18 @@
|
||
|
+documentation_complete: true
|
||
|
+
|
||
|
+title: kernel.unprivileged_bpf_disabled
|
||
|
+
|
||
|
+description: |-
|
||
|
+ Prevent unprivileged processes from using the bpf() syscall.
|
||
|
+
|
||
|
+type: number
|
||
|
+
|
||
|
+operator: equals
|
||
|
+
|
||
|
+interactive: false
|
||
|
+
|
||
|
+options:
|
||
|
+ default: 2
|
||
|
+ 0: "0"
|
||
|
+ 1: "1"
|
||
|
+ 2: "2"
|
||
|
|
||
|
From 4c8ef02cc91c821d56c061f6d8e2ba1675d0c414 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Tue, 26 Jul 2022 09:36:09 +0200
|
||
|
Subject: [PATCH 20/23] Improve documentation of the sysctl template
|
||
|
|
||
|
---
|
||
|
docs/templates/template_reference.md | 10 +++++++---
|
||
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/docs/templates/template_reference.md b/docs/templates/template_reference.md
|
||
|
index 0fff58c0a23..e73b95450fe 100644
|
||
|
--- a/docs/templates/template_reference.md
|
||
|
+++ b/docs/templates/template_reference.md
|
||
|
@@ -819,15 +819,19 @@ The selected value can be changed in the profile (consult the actual variable fo
|
||
|
specified, or an atomic value, eg. `'1'`, or a list of values,
|
||
|
eg. `['1','2']`.
|
||
|
- If this parameter is not specified, an XCCDF Value is used instead
|
||
|
- in OVAL check and remediations.
|
||
|
+ in OVAL check and remediations. The XCCDF Value should have a file
|
||
|
+ name in the form `"sysctl_" + $escaped_sysctlvar + "_value.var"`,
|
||
|
+ where the `escaped_sysctlvar` is a value of the **sysctlvar**
|
||
|
+ parameter in which all characters that don't match the `\w` regular
|
||
|
+ expression are replaced by an underscore (`_`).
|
||
|
- If this parameter is set to an atomic value, this atomic value
|
||
|
will be used in OVAL check and remediations.
|
||
|
- If this parameter is set to a list of values, the list will be used
|
||
|
in the OVAL check, but won't be used in the remediations.
|
||
|
All remediations will use an XCCDF value instead.
|
||
|
|
||
|
- - **wrong_sysctlval_for_testing** - the value that is always wrong. This will be used
|
||
|
- only in the templated test scenarios only if **sysctlval** is a list.
|
||
|
+ - **wrong_sysctlval_for_testing** - the value that is always wrong. This
|
||
|
+ will be used in templated test scenarios when **sysctlval** is a list.
|
||
|
|
||
|
- **missing_parameter_pass** - if set to `true` the check will pass if the
|
||
|
setting for the given **sysctlvar** is not present in sysctl
|
||
|
|
||
|
From 0f89cab50807ecf75269acc49e0c290c139beea6 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Tue, 26 Jul 2022 09:36:34 +0200
|
||
|
Subject: [PATCH 21/23] Remove RHEL 8 STIG ID
|
||
|
|
||
|
---
|
||
|
.../rule.yml | 2 --
|
||
|
1 file changed, 2 deletions(-)
|
||
|
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
index 7d8769a913f..ec3b5aef82f 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -33,8 +33,6 @@ references:
|
||
|
nist: AC-6,SC-7(10)
|
||
|
ospp: FMT_SMF_EXT.1
|
||
|
srg: SRG-OS-000132-GPOS-00067,SRG-OS-000480-GPOS-00227
|
||
|
- stigid@ol8: OL08-00-040281
|
||
|
- stigid@rhel8: RHEL-08-040281
|
||
|
|
||
|
ocil: |-
|
||
|
The runtime status of the <code>kernel.unprivileged_bpf_disabled</code>
|
||
|
|
||
|
From 5c2116eb08b84c43d644f6ce51744732a63fb206 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Tue, 26 Jul 2022 09:36:47 +0200
|
||
|
Subject: [PATCH 22/23] Fix a typo
|
||
|
|
||
|
---
|
||
|
.../rule.yml | 2 +-
|
||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
index ec3b5aef82f..589deccb0c7 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -62,7 +62,7 @@ ocil: |-
|
||
|
ocil_clause: "the kernel.unprivileged_bpf_disabled is not set to 1 or 2 or is configured to be 0"
|
||
|
|
||
|
fixtext: |-
|
||
|
- Configure {{{ full_name }}} to prevent privilege escalation thru the kernel by disabling access to the bpf syscall.
|
||
|
+ Configure {{{ full_name }}} to prevent privilege escalation through the kernel by disabling access to the bpf syscall.
|
||
|
|
||
|
srg_requirement: '{{{ full_name }}} must disable access to network bpf syscall from unprivileged processes.'
|
||
|
|
||
|
|
||
|
From 22e5a11f3232234a939dc6a806752b1fa5c69ce4 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jan=20=C4=8Cern=C3=BD?= <jcerny@redhat.com>
|
||
|
Date: Wed, 27 Jul 2022 10:36:04 +0200
|
||
|
Subject: [PATCH 23/23] Mention both values 1 and 2 in the rule description
|
||
|
|
||
|
---
|
||
|
.../rule.yml | 4 +++-
|
||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
index 589deccb0c7..259d1f901c6 100644
|
||
|
--- a/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
+++ b/linux_os/guide/system/permissions/restrictions/sysctl_kernel_unprivileged_bpf_disabled_accept_default/rule.yml
|
||
|
@@ -13,11 +13,13 @@ description: |-
|
||
|
disabled, calling <code>bpf()</code> without <code>CAP_SYS_ADMIN</code> or <code>CAP_BPF</code> will return <code>-EPERM</code>.
|
||
|
Once set to <code>1</code>, this can't be cleared from the running kernel anymore.
|
||
|
|
||
|
+ {{{ describe_sysctl_option_value(sysctl="kernel.unprivileged_bpf_disabled", value="1") }}}
|
||
|
+
|
||
|
Writing <code>2</code> to this entry will also disable unprivileged calls to <code>bpf()</code>,
|
||
|
however, an admin can still change this setting later on, if needed, by
|
||
|
writing <code>0</code> or <code>1</code> to this entry.
|
||
|
|
||
|
- {{{ describe_sysctl_option_value(sysctl="kernel.unprivileged_bpf_disabled", value="1") }}}
|
||
|
+ {{{ describe_sysctl_option_value(sysctl="kernel.unprivileged_bpf_disabled", value="2") }}}
|
||
|
|
||
|
rationale: |-
|
||
|
Loading and accessing the packet filters programs and maps using the bpf()
|