Information
Successful/unsuccessful uses of unix_chkpwd must generate an audit record.
Reconstruction of harmful events or forensic analysis is not possible if audit records do not contain enough information.
At a minimum, the organization must audit the full-text recording of privileged commands. The organization must maintain audit trails in sufficient detail to reconstruct events to determine the cause and impact of compromise. The "unix_chkpwd" command is a helper program for the pam_unix module that verifies the password of the current user. It also checks password and account expiration dates in shadow. It is not intended to be run directly from the command line and logs a security violation if done so.
When a user logs on, the AUID is set to the UID of the account that is being authenticated. Daemons are not user sessions and have the loginuid set to "-1". The AUID representation is an unsigned 32-bit integer, which equals "4294967295". The audit system interprets "-1", "4294967295", and "unset" in the same way.
Satisfies: SRG-OS-000062-GPOS-00031, SRG-OS-000037-GPOS-00015, SRG-OS-000042-GPOS-00020, SRG-OS-000062-GPOS-00031, SRG-OS-000392-GPOS-00172, SRG-OS-000462-GPOS-00206, SRG-OS-000471-GPOS-00215
Solution
Configure the audit system to generate an audit event for any successful/unsuccessful use of the unix_chkpwd command by adding or updating the following rule in a .rules file in the /etc/audit/rules.d/ directory:
-a always,exit -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update
Example:
#!/usr/bin/env bash
{
UID_MIN=$(awk '/^\s*UID_MIN/{print $2}' /etc/login.defs)
[ -n "${UID_MIN}" ] && printf '\n%s\n' \
"-a always,exit -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=${UID_MIN} -F auid!=unset -k privileged-unix-update" \
>> /etc/audit/rules.d/50-privileged-unix-update.rules || printf "ERROR: Variable 'UID_MIN' is unset.\n"
}
Run the following command to merge and load the rules into active configuration:
# augenrules --load
Run the following command to check if reboot is required.
# if [[ $(auditctl -s | grep "enabled") =~ "2" ]]; then printf "Reboot required to load rules\n"; fi