Ensure the Default Umask is Set Correctly in login.defs

Classification:

compliance

Framework:

Control:

Description

To ensure the default umask controlled by /etc/login.defs is set properly, add or correct the UMASK setting in /etc/login.defs to read as follows:

UMASK 027

Rationale

The umask value influences the permissions assigned to files when they are created. A misconfigured umask value could result in files with excessive permissions that can be read and written to by unauthorized users.

Remediation

Shell script

The following script can be run on the host to remediate the issue.

# Remediation is applicable only in certain platforms
if dpkg-query --show --showformat='${db:Status-Status}\n' 'login' 2>/dev/null | grep -q installed; then

var\_accounts\_user\_umask='027'


# Strip any search characters in the key arg so that the key can be replaced without
# adding any search characters to the config file.
stripped\_key=$(sed 's/[\^=\$,;+]\*//g' <<< "^UMASK")

# shellcheck disable=SC2059
printf -v formatted\_output "%s %s" "$stripped\_key" "$var\_accounts\_user\_umask"

# If the key exists, change it. Otherwise, add it to the config\_file.
# We search for the key string followed by a word boundary (matched by \>),
# so if we search for 'setting', 'setting2' won't match.
if LC\_ALL=C grep -q -m 1 -i -e "^UMASK\\>" "/etc/login.defs"; then
 escaped\_formatted\_output=$(sed -e 's|/|\\/|g' <<< "$formatted\_output")
 LC\_ALL=C sed -i --follow-symlinks "s/^UMASK\\>.\*/$escaped\_formatted\_output/gi" "/etc/login.defs"
else
 if [[ -s "/etc/login.defs" ]] && [[ -n "$(tail -c 1 -- "/etc/login.defs" || true)" ]]; then
 LC\_ALL=C sed -i --follow-symlinks '$a'\\ "/etc/login.defs"
 fi
 printf '%s\n' "$formatted\_output" >> "/etc/login.defs"
fi

else
 >&2 echo 'Remediation is not applicable, nothing was done'
fi

Ansible playbook

The following playbook can be run with Ansible to remediate the issue.

- name: Gather the package facts
 package\_facts:
 manager: auto
 tags:
 - DISA-STIG-UBTU-20-010016
 - NIST-800-53-AC-6(1)
 - NIST-800-53-CM-6(a)
 - PCI-DSSv4-8.6.1
 - accounts\_umask\_etc\_login\_defs
 - low\_complexity
 - low\_disruption
 - medium\_severity
 - no\_reboot\_needed
 - restrict\_strategy
- name: XCCDF Value var\_accounts\_user\_umask # promote to variable
 set\_fact:
 var\_accounts\_user\_umask: !!str 027
 tags:
 - always

- name: Check if UMASK is already set
 ansible.builtin.lineinfile:
 path: /etc/login.defs
 regexp: ^(\s\*)UMASK\s+.\*
 state: absent
 check\_mode: true
 changed\_when: false
 register: result\_umask\_is\_set
 when: '"login" in ansible\_facts.packages'
 tags:
 - DISA-STIG-UBTU-20-010016
 - NIST-800-53-AC-6(1)
 - NIST-800-53-CM-6(a)
 - PCI-DSSv4-8.6.1
 - accounts\_umask\_etc\_login\_defs
 - low\_complexity
 - low\_disruption
 - medium\_severity
 - no\_reboot\_needed
 - restrict\_strategy

- name: Replace user UMASK in /etc/login.defs
 ansible.builtin.replace:
 path: /etc/login.defs
 regexp: ^(\s\*)UMASK(\s+).\*
 replace: \g<1>UMASK\g<2>{{ var\_accounts\_user\_umask }}
 when:
 - '"login" in ansible\_facts.packages'
 - result\_umask\_is\_set.found > 0
 tags:
 - DISA-STIG-UBTU-20-010016
 - NIST-800-53-AC-6(1)
 - NIST-800-53-CM-6(a)
 - PCI-DSSv4-8.6.1
 - accounts\_umask\_etc\_login\_defs
 - low\_complexity
 - low\_disruption
 - medium\_severity
 - no\_reboot\_needed
 - restrict\_strategy

- name: Ensure the Default UMASK is Appended Correctly
 ansible.builtin.lineinfile:
 create: true
 path: /etc/login.defs
 line: UMASK {{ var\_accounts\_user\_umask }}
 when:
 - '"login" in ansible\_facts.packages'
 - result\_umask\_is\_set.found == 0
 tags:
 - DISA-STIG-UBTU-20-010016
 - NIST-800-53-AC-6(1)
 - NIST-800-53-CM-6(a)
 - PCI-DSSv4-8.6.1
 - accounts\_umask\_etc\_login\_defs
 - low\_complexity
 - low\_disruption
 - medium\_severity
 - no\_reboot\_needed
 - restrict\_strategy