Blame SOURCES/scap-security-guide-0.1.59-BZ1884687C-PR_7824.patch

ff1465
commit dc273bb872cc53f2d52af4396f4d3bba0acc178f
ff1465
Author: Gabriel Becker <ggasparb@redhat.com>
ff1465
Date:   Thu Feb 24 17:30:42 2022 +0100
ff1465
ff1465
    Manual edited patch scap-security-guide-0.1.59-BZ1884687C-PR_7824.patch.
ff1465
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/ansible/shared.yml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/ansible/shared.yml
ff1465
new file mode 100644
ff1465
index 0000000..ff41e19
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/ansible/shared.yml
ff1465
@@ -0,0 +1,32 @@
ff1465
+# platform = multi_platform_all
ff1465
+# reboot = false
ff1465
+# strategy = restrict
ff1465
+# complexity = low
ff1465
+# disruption = low
ff1465
+
ff1465
+- name: Get all local users from /etc/passwd
ff1465
+  ansible.builtin.getent:
ff1465
+    database: passwd
ff1465
+    split: ':'
ff1465
+
ff1465
+- name: Create local_users variable from the getent output
ff1465
+  ansible.builtin.set_fact:
ff1465
+    local_users: '{{ ansible_facts.getent_passwd|dict2items }}'
ff1465
+
ff1465
+- name: Test for existence home directories to avoid creating them, but only fixing ownership
ff1465
+  ansible.builtin.stat:
ff1465
+    path: '{{ item.value[4] }}'
ff1465
+  register: path_exists
ff1465
+  loop: '{{ local_users }}'
ff1465
+  when:
ff1465
+    - item.value[2]|int >= {{{ gid_min }}}
ff1465
+    - item.value[2]|int != 65534
ff1465
+
ff1465
+- name: Ensure interactive local users are the owners of their respective home directories
ff1465
+  ansible.builtin.file:
ff1465
+    path: '{{ item.0.value[4] }}'
ff1465
+    group: '{{ item.0.value[2] }}'
ff1465
+    recurse: yes
ff1465
+  loop: '{{ local_users|zip(path_exists.results)|list }}'
ff1465
+  when:
ff1465
+    - item.1.stat is defined and item.1.stat.exists
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/bash/shared.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/bash/shared.sh
ff1465
new file mode 100644
ff1465
index 0000000..e392d2f
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/bash/shared.sh
ff1465
@@ -0,0 +1,14 @@
ff1465
+# platform = multi_platform_all
ff1465
+# reboot = false
ff1465
+# strategy = restrict
ff1465
+# complexity = low
ff1465
+# disruption = low
ff1465
+
ff1465
+for user in $(awk -F':' '{ if ($4 >= {{{ gid_min }}} && $4 != 65534) print $1 }' /etc/passwd); do
ff1465
+    home_dir=$(getent passwd $user | cut -d: -f6)
ff1465
+    group=$(getent passwd $user | cut -d: -f4)
ff1465
+    # Only update the group-ownership when necessary. This will avoid changing the inode timestamp
ff1465
+    # when the group is already defined as expected, therefore not impacting in possible integrity
ff1465
+    # check systems that also check inodes timestamps.
ff1465
+    find $home_dir -not -group $group -exec chgrp -f $group {} \;
ff1465
+done
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/oval/shared.xml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/oval/shared.xml
ff1465
new file mode 100644
ff1465
index 0000000..1fd016a
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/oval/shared.xml
ff1465
@@ -0,0 +1,52 @@
ff1465
+<def-group>
ff1465
+  <definition class="compliance" id="{{{ rule_id }}}" version="1">
ff1465
+    {{{ oval_metadata("All User Files and Directories In The Home Directory Must Be Group-Owned By The Primary User") }}}
ff1465
+    <criteria>
ff1465
+      
ff1465
+                 comment="All User Files and Directories In The Home Directory Must Be Group-Owned By The Primary User"/>
ff1465
+    </criteria>
ff1465
+  </definition>
ff1465
+
ff1465
+  <unix:password_object id="object_accounts_users_home_files_groupownership_objects" version="1">
ff1465
+    <unix:username datatype="string" operation="not equal">nobody</unix:username>
ff1465
+    <filter action="include">state_accounts_users_home_files_groupownership_interactive_gids</filter>
ff1465
+  </unix:password_object>
ff1465
+
ff1465
+  <unix:password_state id="state_accounts_users_home_files_groupownership_interactive_gids" version="1">
ff1465
+    <unix:user_id datatype="int" operation="greater than or equal">{{{ gid_min }}}</unix:user_id>
ff1465
+  </unix:password_state>
ff1465
+
ff1465
+  
ff1465
+                  comment="Variable including all home dirs from interactive users">
ff1465
+    
ff1465
+                      object_ref="object_accounts_users_home_files_groupownership_objects"/>
ff1465
+  </local_variable>
ff1465
+
ff1465
+  
ff1465
+                  comment="List of interactive users gids">
ff1465
+    
ff1465
+                      object_ref="object_accounts_users_home_files_groupownership_objects"/>
ff1465
+  </local_variable>
ff1465
+
ff1465
+  
ff1465
+  <unix:file_object id="object_accounts_users_home_files_groupownership_dirs" version="1">
ff1465
+    
ff1465
+                    recurse_file_system="local"/>
ff1465
+    <unix:path var_ref="var_accounts_users_home_files_groupownership_dirs" var_check="at least one"/>
ff1465
+    <unix:filename operation="pattern match">.*</unix:filename>
ff1465
+  </unix:file_object>
ff1465
+
ff1465
+  
ff1465
+  <unix:file_state id="state_accounts_users_home_files_groupownership_gids" version="1">
ff1465
+    
ff1465
+                  var_ref="var_accounts_users_home_files_groupownership_gids"/>
ff1465
+  </unix:file_state>
ff1465
+
ff1465
+  
ff1465
+  
ff1465
+                  check_existence="any_exist" version="1"
ff1465
+                  comment="All home directories files are group-owned by a local interactive user">
ff1465
+    <unix:object object_ref="object_accounts_users_home_files_groupownership_dirs"/>
ff1465
+    <unix:state state_ref="state_accounts_users_home_files_groupownership_gids"/>
ff1465
+  </unix:file_test>
ff1465
+</def-group>
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/rule.yml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/rule.yml
ff1465
index 1c0f93a..31a0f1d 100644
ff1465
--- a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/rule.yml
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/rule.yml
ff1465
@@ -10,6 +10,9 @@ description: |-
ff1465
     local interactive users files and directories, use the following command:
ff1465
     
$ sudo chgrp USER_GROUP /home/USER/FILE_DIR
ff1465
 
ff1465
+    This rule ensures every file or directory under the home directory related
ff1465
+    to an interactive user is group-owned by an interactive user.
ff1465
+
ff1465
 rationale: |-
ff1465
     If a local interactive users files are group-owned by a group of which the
ff1465
     user is not a member, unintended users may be able to access them.
ff1465
@@ -33,3 +36,9 @@ ocil: |-
ff1465
     group-owned by a group the user is a member of, run the
ff1465
     following command:
ff1465
     
$ sudo ls -lLR /home/USER
ff1465
+
ff1465
+warnings:
ff1465
+    - general: |-
ff1465
+       Due to OVAL limitation, this rule can report a false negative in a
ff1465
+       specific situation where two interactive users swap the group-ownership
ff1465
+       of folders or files in their respective home directories.
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/expected_groupowner.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/expected_groupowner.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..8538430
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/expected_groupowner.pass.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chgrp -f $USER /home/$USER/$USER.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/home_dirs_all_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/home_dirs_all_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..af24025
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/home_dirs_all_absent.pass.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -M $USER
ff1465
+# This make sure home dirs related to test environment users are also removed.
ff1465
+rm -Rf /home/*
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/home_dirs_one_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/home_dirs_one_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..5bce517
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/home_dirs_one_absent.pass.sh
ff1465
@@ -0,0 +1,7 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER1="cac_user1"
ff1465
+USER2="cac_user2"
ff1465
+
ff1465
+useradd -m $USER1
ff1465
+useradd -M $USER2
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/interactive_users_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/interactive_users_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..ed34f09
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/interactive_users_absent.pass.sh
ff1465
@@ -0,0 +1,4 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+# remove all interactive users (ID >= 1000) from /etc/passwd
ff1465
+sed -i '/.*:[0-9]\{4,\}:/d' /etc/passwd
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/unexpected_groupowner_system_gid.fail.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/unexpected_groupowner_system_gid.fail.sh
ff1465
new file mode 100644
ff1465
index 0000000..f105723
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/unexpected_groupowner_system_gid.fail.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chgrp 2 /home/$USER/$USER.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/unexpected_groupowner_unknown_gid.fail.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/unexpected_groupowner_unknown_gid.fail.sh
ff1465
new file mode 100644
ff1465
index 0000000..00fa481
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/unexpected_groupowner_unknown_gid.fail.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chgrp 10005 /home/$USER/$USER.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/warning_home_dirs_swapped_groupowner.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/warning_home_dirs_swapped_groupowner.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..052aa7c
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_groupownership/tests/warning_home_dirs_swapped_groupowner.pass.sh
ff1465
@@ -0,0 +1,14 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER1="cac_user1"
ff1465
+USER2="cac_user2"
ff1465
+
ff1465
+useradd -m $USER1
ff1465
+useradd -m $USER2
ff1465
+echo "$USER1" > /home/$USER1/$USER1.txt
ff1465
+echo "$USER2" > /home/$USER2/$USER2.txt
ff1465
+# Swap the ownership of files in two home directories
ff1465
+# WARNING: This test scenario will report a false negative, as explained in the
ff1465
+# warning section of this rule.
ff1465
+chgrp -f $USER2 /home/$USER1/$USER1.txt
ff1465
+chgrp -f $USER1 /home/$USER2/$USER2.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/ansible/shared.yml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/ansible/shared.yml
ff1465
new file mode 100644
ff1465
index 0000000..40a0579
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/ansible/shared.yml
ff1465
@@ -0,0 +1,32 @@
ff1465
+# platform = multi_platform_all
ff1465
+# reboot = false
ff1465
+# strategy = restrict
ff1465
+# complexity = low
ff1465
+# disruption = low
ff1465
+
ff1465
+- name: Get all local users from /etc/passwd
ff1465
+  ansible.builtin.getent:
ff1465
+    database: passwd
ff1465
+    split: ':'
ff1465
+
ff1465
+- name: Create local_users variable from the getent output
ff1465
+  ansible.builtin.set_fact:
ff1465
+    local_users: '{{ ansible_facts.getent_passwd|dict2items }}'
ff1465
+
ff1465
+- name: Test for existence home directories to avoid creating them, but only fixing ownership
ff1465
+  ansible.builtin.stat:
ff1465
+    path: '{{ item.value[4] }}'
ff1465
+  register: path_exists
ff1465
+  loop: '{{ local_users }}'
ff1465
+  when:
ff1465
+    - item.value[1]|int >= {{{ uid_min }}}
ff1465
+    - item.value[1]|int != 65534
ff1465
+
ff1465
+- name: Ensure interactive local users are the owners of their respective home directories
ff1465
+  ansible.builtin.file:
ff1465
+    path: '{{ item.0.value[4] }}'
ff1465
+    owner: '{{ item.0.value[1] }}'
ff1465
+    recurse: yes
ff1465
+  loop: '{{ local_users|zip(path_exists.results)|list }}'
ff1465
+  when:
ff1465
+    - item.1.stat is defined and item.1.stat.exists
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/bash/shared.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/bash/shared.sh
ff1465
new file mode 100644
ff1465
index 0000000..236c800
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/bash/shared.sh
ff1465
@@ -0,0 +1,13 @@
ff1465
+# platform = multi_platform_all
ff1465
+# reboot = false
ff1465
+# strategy = restrict
ff1465
+# complexity = low
ff1465
+# disruption = low
ff1465
+
ff1465
+for user in $(awk -F':' '{ if ($3 >= {{{ uid_min }}} && $3 != 65534) print $1 }' /etc/passwd); do
ff1465
+    home_dir=$(getent passwd $user | cut -d: -f6)
ff1465
+    # Only update the ownership when necessary. This will avoid changing the inode timestamp
ff1465
+    # when the owner is already defined as expected, therefore not impacting in possible integrity
ff1465
+    # check systems that also check inodes timestamps.
ff1465
+    find $home_dir -not -user $user -exec chown -f $user {} \;
ff1465
+done
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/oval/shared.xml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/oval/shared.xml
ff1465
new file mode 100644
ff1465
index 0000000..1850cfb
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/oval/shared.xml
ff1465
@@ -0,0 +1,52 @@
ff1465
+<def-group>
ff1465
+  <definition class="compliance" id="{{{ rule_id }}}" version="1">
ff1465
+    {{{ oval_metadata("All User Files and Directories In The Home Directory Must Have a Valid Owner") }}}
ff1465
+    <criteria>
ff1465
+      
ff1465
+                 comment="All User Files and Directories In The Home Directory Must Have a Valid Owner"/>
ff1465
+    </criteria>
ff1465
+  </definition>
ff1465
+
ff1465
+  <unix:password_object id="object_accounts_users_home_files_ownership_objects" version="1">
ff1465
+    <unix:username datatype="string" operation="not equal">nobody</unix:username>
ff1465
+    <filter action="include">state_accounts_users_home_files_ownership_interactive_uids</filter>
ff1465
+  </unix:password_object>
ff1465
+
ff1465
+  <unix:password_state id="state_accounts_users_home_files_ownership_interactive_uids" version="1">
ff1465
+    <unix:user_id datatype="int" operation="greater than or equal">{{{ uid_min }}}</unix:user_id>
ff1465
+  </unix:password_state>
ff1465
+
ff1465
+  
ff1465
+                  comment="Variable including all home dirs from interactive users">
ff1465
+    
ff1465
+                      object_ref="object_accounts_users_home_files_ownership_objects"/>
ff1465
+  </local_variable>
ff1465
+
ff1465
+  
ff1465
+                  comment="List of interactive users uids">
ff1465
+    
ff1465
+                      object_ref="object_accounts_users_home_files_ownership_objects"/>
ff1465
+  </local_variable>
ff1465
+
ff1465
+  
ff1465
+  <unix:file_object id="object_accounts_users_home_files_ownership_dirs" version="1">
ff1465
+    
ff1465
+                    recurse_file_system="local"/>
ff1465
+    <unix:path var_ref="var_accounts_users_home_files_ownership_dirs" var_check="at least one"/>
ff1465
+    <unix:filename operation="pattern match">.*</unix:filename>
ff1465
+  </unix:file_object>
ff1465
+
ff1465
+  
ff1465
+  <unix:file_state id="state_accounts_users_home_files_ownership_uids" version="1">
ff1465
+    
ff1465
+                  var_ref="var_accounts_users_home_files_ownership_uids"/>
ff1465
+  </unix:file_state>
ff1465
+
ff1465
+  
ff1465
+  
ff1465
+                  check_existence="any_exist" version="1"
ff1465
+                  comment="All home directories files are owned by a local interactive user">
ff1465
+    <unix:object object_ref="object_accounts_users_home_files_ownership_dirs"/>
ff1465
+    <unix:state state_ref="state_accounts_users_home_files_ownership_uids"/>
ff1465
+  </unix:file_test>
ff1465
+</def-group>
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/rule.yml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/rule.yml
ff1465
index 13f6bfe..5bfb388 100644
ff1465
--- a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/rule.yml
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/rule.yml
ff1465
@@ -10,6 +10,9 @@ description: |-
ff1465
     directories, use the following command:
ff1465
     
$ sudo chown -R USER /home/USER
ff1465
 
ff1465
+    This rule ensures every file or directory under the home directory related
ff1465
+    to an interactive user is owned by an interactive user.
ff1465
+
ff1465
 rationale: |-
ff1465
     If local interactive users do not own the files in their directories,
ff1465
     unauthorized users may be able to access them. Additionally, if files are not
ff1465
@@ -34,3 +37,9 @@ ocil: |-
ff1465
     To verify all files and directories in interactive users home directory
ff1465
     are owned by the user, run the following command:
ff1465
     
$ sudo ls -lLR /home/USER
ff1465
+
ff1465
+warnings:
ff1465
+    - general: |-
ff1465
+       Due to OVAL limitation, this rule can report a false negative in a
ff1465
+       specific situation where two interactive users swap the ownership of
ff1465
+       folders or files in their respective home directories.
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/expected_owner.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/expected_owner.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..da68cb4
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/expected_owner.pass.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chown $USER /home/$USER/$USER.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/home_dirs_all_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/home_dirs_all_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..af24025
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/home_dirs_all_absent.pass.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -M $USER
ff1465
+# This make sure home dirs related to test environment users are also removed.
ff1465
+rm -Rf /home/*
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/home_dirs_one_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/home_dirs_one_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..5bce517
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/home_dirs_one_absent.pass.sh
ff1465
@@ -0,0 +1,7 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER1="cac_user1"
ff1465
+USER2="cac_user2"
ff1465
+
ff1465
+useradd -m $USER1
ff1465
+useradd -M $USER2
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/interactive_users_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/interactive_users_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..ed34f09
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/interactive_users_absent.pass.sh
ff1465
@@ -0,0 +1,4 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+# remove all interactive users (ID >= 1000) from /etc/passwd
ff1465
+sed -i '/.*:[0-9]\{4,\}:/d' /etc/passwd
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/unexpected_owner_system_id.fail.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/unexpected_owner_system_id.fail.sh
ff1465
new file mode 100644
ff1465
index 0000000..59c46a9
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/unexpected_owner_system_id.fail.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chown 2 /home/$USER/$USER.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/unexpected_owner_unknown_id.fail.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/unexpected_owner_unknown_id.fail.sh
ff1465
new file mode 100644
ff1465
index 0000000..e0f5514
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/unexpected_owner_unknown_id.fail.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chown 10005 /home/$USER/$USER.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/warning_home_dirs_swapped_owner.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/warning_home_dirs_swapped_owner.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..1174ec6
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_ownership/tests/warning_home_dirs_swapped_owner.pass.sh
ff1465
@@ -0,0 +1,14 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER1="cac_user1"
ff1465
+USER2="cac_user2"
ff1465
+
ff1465
+useradd -m $USER1
ff1465
+useradd -m $USER2
ff1465
+echo "$USER1" > /home/$USER1/$USER1.txt
ff1465
+echo "$USER2" > /home/$USER2/$USER2.txt
ff1465
+# Swap the ownership of files in two home directories
ff1465
+# WARNING: This test scenario will report a false negative, as explained in the
ff1465
+# warning section of this rule.
ff1465
+chown -f $USER2 /home/$USER1/$USER1.txt
ff1465
+chown -f $USER1 /home/$USER2/$USER2.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/ansible/shared.yml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/ansible/shared.yml
ff1465
new file mode 100644
ff1465
index 0000000..9473710
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/ansible/shared.yml
ff1465
@@ -0,0 +1,33 @@
ff1465
+# platform = multi_platform_all
ff1465
+# reboot = false
ff1465
+# strategy = restrict
ff1465
+# complexity = low
ff1465
+# disruption = low
ff1465
+
ff1465
+- name: Get all local users from /etc/passwd
ff1465
+  ansible.builtin.getent:
ff1465
+    database: passwd
ff1465
+    split: ':'
ff1465
+
ff1465
+- name: Create local_users variable from the getent output
ff1465
+  ansible.builtin.set_fact:
ff1465
+    local_users: '{{ ansible_facts.getent_passwd|dict2items }}'
ff1465
+
ff1465
+- name: Test for existence home directories to avoid creating them, but only fixing group ownership
ff1465
+  ansible.builtin.stat:
ff1465
+    path: '{{ item.value[4] }}'
ff1465
+  register: path_exists
ff1465
+  loop: '{{ local_users }}'
ff1465
+  when:
ff1465
+    - item.value[2]|int >= {{{ uid_min }}}
ff1465
+    - item.value[2]|int != 65534
ff1465
+
ff1465
+- name: Ensure interactive local users are the group-owners of their respective home directories
ff1465
+  ansible.builtin.file:
ff1465
+    path: '{{ item.0.value[4] }}'
ff1465
+    mode: 'g-w,o=-'
ff1465
+    follow: no
ff1465
+    recurse: yes
ff1465
+  loop: '{{ local_users|zip(path_exists.results)|list }}'
ff1465
+  when:
ff1465
+    - item.1.stat is defined and item.1.stat.exists
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/bash/shared.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/bash/shared.sh
ff1465
new file mode 100644
ff1465
index 0000000..186d55d
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/bash/shared.sh
ff1465
@@ -0,0 +1,12 @@
ff1465
+# platform = multi_platform_all
ff1465
+# reboot = false
ff1465
+# strategy = restrict
ff1465
+# complexity = low
ff1465
+# disruption = low
ff1465
+
ff1465
+for home_dir in $(awk -F':' '{ if ($4 >= {{{ uid_min }}} && $4 != 65534) print $6 }' /etc/passwd); do
ff1465
+    # Only update the permissions when necessary. This will avoid changing the inode timestamp when
ff1465
+    # the permission is already defined as expected, therefore not impacting in possible integrity
ff1465
+    # check systems that also check inodes timestamps.
ff1465
+    find $home_dir -perm /027 -exec chmod g-w,o=- {} \;
ff1465
+done
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/oval/shared.xml b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/oval/shared.xml
ff1465
new file mode 100644
ff1465
index 0000000..d3db46d
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/oval/shared.xml
ff1465
@@ -0,0 +1,52 @@
ff1465
+<def-group>
ff1465
+  <definition class="compliance" id="{{{ rule_id }}}" version="1">
ff1465
+    {{{ oval_metadata("All User Files and Directories In The Home Directory Must Have Mode 0750 Or Less Permissive") }}}
ff1465
+    <criteria>
ff1465
+      
ff1465
+                 comment="All files under interactive user's Home Directories must have proper permissions"/>
ff1465
+    </criteria>
ff1465
+  </definition>
ff1465
+
ff1465
+  
ff1465
+       "file_ownership_home_directories" rule. -->
ff1465
+  <unix:password_object id="object_accounts_users_home_files_permissions_objects" version="1">
ff1465
+    <unix:username datatype="string" operation="not equal">nobody</unix:username>
ff1465
+    <filter action="include">state_accounts_users_home_files_permissions_interactive_uids</filter>
ff1465
+  </unix:password_object>
ff1465
+
ff1465
+  <unix:password_state id="state_accounts_users_home_files_permissions_interactive_uids" version="1">
ff1465
+    <unix:user_id datatype="int" operation="greater than or equal">{{{ uid_min }}}</unix:user_id>
ff1465
+  </unix:password_state>
ff1465
+
ff1465
+  
ff1465
+  
ff1465
+                  comment="Variable including all home dirs from interactive users">
ff1465
+    <object_component item_field="home_dir" object_ref="object_accounts_users_home_files_permissions_objects"/>
ff1465
+  </local_variable>
ff1465
+
ff1465
+  
ff1465
+  <unix:file_object id="object_accounts_users_home_files_permissions_dirs" version="1">
ff1465
+    
ff1465
+                    recurse_file_system="local"/>
ff1465
+    <unix:path var_ref="var_accounts_users_home_files_permissions_dirs" var_check="at least one"/>
ff1465
+    <unix:filename operation="pattern match">.*</unix:filename>
ff1465
+  </unix:file_object>
ff1465
+
ff1465
+  
ff1465
+  <unix:file_state id="state_accounts_users_home_files_permissions_dirs" version="1" operator='AND'>
ff1465
+    <unix:suid datatype="boolean">false</unix:suid>
ff1465
+    <unix:sgid datatype="boolean">false</unix:sgid>
ff1465
+    <unix:sticky datatype="boolean">false</unix:sticky>
ff1465
+    <unix:gwrite datatype="boolean">false</unix:gwrite>
ff1465
+    <unix:oread datatype="boolean">false</unix:oread>
ff1465
+    <unix:owrite datatype="boolean">false</unix:owrite>
ff1465
+    <unix:oexec datatype="boolean">false</unix:oexec>
ff1465
+  </unix:file_state>
ff1465
+
ff1465
+  
ff1465
+  
ff1465
+                  version="1" comment="All home directories have proper permissions">
ff1465
+    <unix:object object_ref="object_accounts_users_home_files_permissions_dirs"/>
ff1465
+    <unix:state state_ref="state_accounts_users_home_files_permissions_dirs"/>
ff1465
+  </unix:file_test>
ff1465
+</def-group>
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/acceptable_permission.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/acceptable_permission.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..3561847
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/acceptable_permission.pass.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chmod -Rf 750 /home/$USER/.*
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/expected_permissions.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/expected_permissions.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..8ed7fa2
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/expected_permissions.pass.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chmod -Rf 700 /home/$USER/.*
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/home_dirs_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/home_dirs_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..af24025
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/home_dirs_absent.pass.sh
ff1465
@@ -0,0 +1,6 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -M $USER
ff1465
+# This make sure home dirs related to test environment users are also removed.
ff1465
+rm -Rf /home/*
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/interactive_users_absent.pass.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/interactive_users_absent.pass.sh
ff1465
new file mode 100644
ff1465
index 0000000..ed34f09
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/interactive_users_absent.pass.sh
ff1465
@@ -0,0 +1,4 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+# remove all interactive users (ID >= 1000) from /etc/passwd
ff1465
+sed -i '/.*:[0-9]\{4,\}:/d' /etc/passwd
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/lenient_permission.fail.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/lenient_permission.fail.sh
ff1465
new file mode 100644
ff1465
index 0000000..b561671
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/lenient_permission.fail.sh
ff1465
@@ -0,0 +1,7 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/$USER.txt
ff1465
+chmod -Rf 700 /home/$USER/.*
ff1465
+chmod -f o+r /home/$USER/$USER.txt
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/lenient_permission_hidden_files.fail.sh b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/lenient_permission_hidden_files.fail.sh
ff1465
new file mode 100644
ff1465
index 0000000..d7811bc
ff1465
--- /dev/null
ff1465
+++ b/linux_os/guide/system/accounts/accounts-session/accounts_users_home_files_permissions/tests/lenient_permission_hidden_files.fail.sh
ff1465
@@ -0,0 +1,7 @@
ff1465
+#!/bin/bash
ff1465
+
ff1465
+USER="cac_user"
ff1465
+useradd -m $USER
ff1465
+echo "$USER" > /home/$USER/.init_file
ff1465
+chmod -Rf 700 /home/$USER/.*
ff1465
+chmod -f o+r /home/$USER/.init_file
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_system_id.fail.sh b/linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_system_uid.fail.sh
ff1465
similarity index 100%
ff1465
rename from linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_system_id.fail.sh
ff1465
rename to linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_system_uid.fail.sh
ff1465
diff --git a/linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_unknown_id.fail.sh b/linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_unknown_uid.fail.sh
ff1465
similarity index 100%
ff1465
rename from linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_unknown_id.fail.sh
ff1465
rename to linux_os/guide/system/accounts/accounts-session/file_groupownership_home_directories/tests/unexpected_groupowner_unknown_uid.fail.sh