Select any two versions of this STIG to compare the individual requirements
Select any old version/release of this STIG to view the previous requirements
Verify AlmaLinux OS 9 limits the number of concurrent sessions to "10" for all accounts and/or account types with the following command: $ grep -rs maxlogins /etc/security/limits.conf /etc/security/limits.d/*.conf /etc/security/limits.d/maxlogins.conf:* hard maxlogins 10 This can be set as a global domain (with the * wildcard) but may be set differently for multiple domains. If the "maxlogins" item is missing, commented out, or the value is set greater than 10, this is a finding.
Configure AlmaLinux OS 9 to limit the number of concurrent sessions to "10" for all accounts and/or account types. Add the following line to the top of the /etc/security/limits.conf or in a ".conf" file defined in /etc/security/limits.d/: * hard maxlogins 10
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 initiates a session lock after a 10-minute period of inactivity for graphical user interfaces with the following command: $ gsettings get org.gnome.desktop.session idle-delay uint32 900 If "idle-delay" is set to "0" or a value greater than "900", this is a finding.
Configure AlmaLinux OS 9 to initiate a screensaver after a 10-minute period of inactivity for graphical user interfaces. Create a database to contain the systemwide screensaver settings (if it does not already exist) with the following command: $ touch /etc/dconf/db/local.d/00-screensaver Edit /etc/dconf/db/local.d/00-screensaver and add or update the following lines: [org/gnome/desktop/session] # Set the lock time out to 900 seconds before the session is considered idle idle-delay=uint32 900 Update the system databases: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. To ensure the screensaver is configured to be blank, run the following command: $ gsettings get org.gnome.desktop.screensaver picture-uri If properly configured, the output should be "''". To ensure that users cannot set the screensaver background, run the following: $ grep picture-uri /etc/dconf/db/local.d/locks/* If properly configured, the output should be "/org/gnome/desktop/screensaver/picture-uri". If it is not set or configured properly, this is a finding.
Configure AlmaLinux OS 9 to prevent a user from overriding the picture-uri setting for graphical user interfaces. First, in the file "/etc/dconf/db/local.d/00-security-settings" add or update the following lines: [org/gnome/desktop/screensaver] picture-uri='' Then, prevent user modification by adding the following line to "/etc/dconf/db/local.d/locks/00-security-settings-lock": /org/gnome/desktop/screensaver/picture-uri Update the dconf system databases: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 prevents a user from overriding settings for graphical user interfaces. Determine which profile the system database is using with the following command: $ grep system-db /etc/dconf/profile/user system-db:local Check that graphical settings are locked from nonprivileged user modification with the following command: Note: The example below is using the database "local" for the system, so the path is "/etc/dconf/db/local.d". This path must be modified if a database other than "local" is being used. $ grep -i idle /etc/dconf/db/local.d/locks/* /org/gnome/desktop/session/idle-delay If the command does not return at least the example result, this is a finding.
Configure AlmaLinux OS 9 to prevent a user from overriding settings for graphical user interfaces. Create a database to contain the systemwide screensaver settings (if it does not already exist) with the following command: Note: The example below is using the database "local" for the system, so if the system is using another database in "/etc/dconf/profile/user", the file should be created under the appropriate subdirectory. $ touch /etc/dconf/db/local.d/locks/session Add the following setting to prevent nonprivileged users from modifying it: /org/gnome/desktop/session/idle-delay Update the system databases: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 initiates a session lock for graphical user interfaces when the screensaver is activated with the following command: $ gsettings get org.gnome.desktop.screensaver lock-delay uint32 5 If the "uint32" setting is not set to "5" or less, or is missing, this is a finding.
Configure AlmaLinux OS 9 to initiate a session lock for graphical user interfaces when a screensaver is activated. Create a database to contain the systemwide screensaver settings (if it does not already exist) with the following command: Note: The example below is using the database "local" for the system, so if the system is using another database in "/etc/dconf/profile/user", the file should be created under the appropriate subdirectory. $ touch /etc/dconf/db/local.d/00-screensaver [org/gnome/desktop/screensaver] lock-delay=uint32 5 The "uint32" must be included along with the integer key values as shown. Update the system databases: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 prevents a user from overriding settings for graphical user interfaces. Determine which profile the system database is using with the following command: $ grep system-db /etc/dconf/profile/user system-db:local Check that graphical settings are locked from nonprivileged user modification with the following command: Note: The example below is using the database "local" for the system, so the path is "/etc/dconf/db/local.d". This path must be modified if a database other than "local" is being used. $ grep -i lock-delay /etc/dconf/db/local.d/locks/* /etc/dconf/db/local.d/locks/session:/org/gnome/desktop/screensaver/lock-delay If the command does not return at least the example result, this is a finding.
Configure AlmaLinux OS 9 to prevent a user from overriding settings for graphical user interfaces. Create a database to contain the systemwide screensaver settings (if it does not already exist) with the following command: Note: The example below is using the database "local" for the system, so if the system is using another database in "/etc/dconf/profile/user", the file should be created under the appropriate subdirectory. $ touch /etc/dconf/db/local.d/locks/session Add the following setting to prevent nonprivileged users from modifying it: /org/gnome/desktop/screensaver/lock-delay Update the system databases: $ dconf update
Verify AlmaLinux OS 9 is configured to exit interactive command shell user sessions after 10 minutes of inactivity or less with the following command: $ grep TMOUT /etc/profile /etc/profile.d/*.sh /etc/profile.d/tmout.sh:declare -xr TMOUT=600 If "TMOUT" is not set to "600" or less in a script located in the "/etc/'profile.d/ directory, is missing or is commented out, this is a finding.
Configure AlmaLinux OS 9 to exit interactive command shell user sessions after 10 minutes of inactivity using the following command: echo "declare -xr TMOUT=600" > /etc/profile.d/tmout.sh
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 enables a user's session lock until that user re-establishes access using established identification and authentication procedures with the following command: $ grep -R removal-action= /etc/dconf/db/* /etc/dconf/db/distro.d/00-security-settings:removal-action='lock-screen' If the "removal-action='lock-screen'" setting is missing or commented out from the dconf database files, this is a finding.
Configure AlmaLinux OS 9 to enable a user's session lock until that user re-establishes access using established identification and authentication procedures. Select or create an authselect profile and incorporate the "with-smartcard-lock-on-removal" feature with the following example: $ authselect select sssd with-smartcard with-smartcard-lock-on-removal Alternatively, the dconf settings can be edited in the /etc/dconf/db/* location. Add or update the [org/gnome/settings-daemon/peripherals/smartcard] section of the /etc/dconf/db/local.d/00-security-settings" database file and add or update the following lines: [org/gnome/settings-daemon/peripherals/smartcard] removal-action='lock-screen' Then update the dconf system databases: $ dconf update
Verify AlmaLinux OS 9 disables the ability of the user to override the smart card removal action setting. Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Determine which profile the system database is using with the following command: $ grep system-db /etc/dconf/profile/user system-db:local Check that the removal action setting is locked from nonprivileged user modification with the following command: Note: The example below is using the database "local" for the system, so the path is "/etc/dconf/db/local.d". This path must be modified if a database other than "local" is being used. $ grep 'removal-action' /etc/dconf/db/local.d/locks/* /etc/dconf/db/local.d/locks/00-security-settings-lock:/org/gnome/settings-daemon/peripherals/smartcard/removal-action If the command does not return at least the example result, this is a finding.
Add the following line to "/etc/dconf/db/local.d/locks/00-security-settings-lock" to prevent user override of the smart card removal action: /org/gnome/settings-daemon/peripherals/smartcard/removal-action Then, update the dconf system databases: $ dconf update
Verify AlmaLinux OS 9 logs SSH connection attempts and failures to the server. Check what the SSH daemon's "LogLevel" option is set to with the following command: $ sshd -T | grep loglevel loglevel VERBOSE If a value of "VERBOSE" is not returned, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to log SSH connection attempts by running the following command: $ echo "LogLevel VERBOSE" > /etc/ssh/sshd_config.d/40-loglevel.conf
Verify that AlmaLinux OS 9 monitors all remote access methods, by running the following command: $ grep -rsE '^(auth|authpriv|daemon)\.\*' /etc/rsyslog.conf /etc/rsyslog.d/*.conf /etc/rsyslog.conf:authpriv.* /var/log/secure If "auth.*", "authpriv.*" or "daemon.*" are not configured to be logged, this is a finding.
Add or update the following line to the "/etc/rsyslog.conf" file or a .conf file within /etc/rsyslog.d/: auth.*;authpriv.*;daemon.* /var/log/secure
Verify the SSH client is configured to use only ciphers employing FIPS 140-3 approved algorithms with the following command: $ grep -i ciphers /etc/crypto-policies/back-ends/openssh.config Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr If the cipher entries in the "openssh.config" file have any ciphers other than "aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr", the order differs from the example above, they are missing, or commented out, this is a finding.
Configure the AlmaLinux OS 9 SSH client to use only ciphers employing FIPS 140-3 approved algorithms by updating the "/etc/crypto-policies/back-ends/openssh.config" file with the following line: Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr A reboot is required for the changes to take effect.
Verify that systemwide crypto policies are in effect with the following command: $ sudo grep Include /etc/ssh/sshd_config /etc/ssh/sshd_config.d/* /etc/ssh/sshd_config:Include /etc/ssh/sshd_config.d/*.conf /etc/ssh/sshd_config.d/50-redhat.conf:Include /etc/crypto-policies/back-ends/opensshserver.config If "Include /etc/ssh/sshd_config.d/*.conf" or "Include /etc/crypto-policies/back-ends/opensshserver.config" are not included in the system sshd config or the file "/etc/ssh/sshd_config.d/50-redhat.conf" is missing, this is a finding.
Configure the AlmaLinux OS 9 SSH daemon to use systemwide crypto policies by running the following commands: $ sudo dnf reinstall openssh-clients
Verify the SSH client is configured to use only ciphers employing FIPS 140-3 approved algorithms with the following command: $ grep -i macs /etc/crypto-policies/back-ends/openssh.config MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256 If the MACs entries in the "openssh.config" file have any hashes other than "MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-512", the order differs from the example above, they are missing, or commented out, this is a finding.
Configure the AlmaLinux OS 9 SSH client to use only MACs employing FIPS 140-3 approved algorithms by updating the "/etc/crypto-policies/back-ends/openssh.config" file with the following line: MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256 A reboot is required for the changes to take effect.
Verify the SSH server is configured to use only ciphers employing FIPS 140-3 approved algorithms with the following command: First, ensure that FIPS mode is enabled with the following command: $ cat /proc/sys/crypto/fips_enabled 1 If the command does not return a "1", then the systemwide crypto policy is not set to FIPS, and this is a finding. To verify the Ciphers in the systemwide SSH configuration file, use the following command: $ sudo grep -i ciphers /etc/crypto-policies/back-ends/opensshserver.config Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr If the Ciphers entries in the "opensshserver.config" file have any hashes other than "aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr", the order differs from the example above, or they are missing or commented out, this is a finding.
Configure the AlmaLinux OS 9 SSH server to use only ciphers employing FIPS 140-3 approved algorithms by updating the "/etc/crypto-policies/back-ends/opensshserver.config" file with the following commands: Note: Before enabling FIPS mode, ensure that the dracut-fips package is installed on the system. Enable FIPS mode by updating the system's crypto policy with the following command: $ sudo update-crypto-policies --set FIPS Note: If FIPS mode has never been enabled on the system, additional steps will need to be conducted. Refer to vendor documentation. To manually update the Ciphers in the systemwide SSH configuration, use the following command: $ sudo sed -i -E '/^Ciphers/s/.*/Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr/' "$(readlink -f /etc/crypto-policies/back-ends/opensshserver.config)" A reboot is required for the changes to take effect.
Verify that the SSH server is configured to use only FIPS 140-3 validated key exchange algorithms: First, ensure that FIPS mode is enabled with the following command: $ cat /proc/sys/crypto/fips_enabled 1 If the command does not return a "1", then the systemwide crypto policy is not set to FIPS, and this is a finding. $ sudo grep -i kexalgorithms /etc/crypto-policies/back-ends/opensshserver.config KexAlgorithms ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256 If the entries following "KexAlgorithms" have any algorithms defined other than "ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256", appear in different order than shown, or are missing or commented out, this is a finding.
Configure the AlmaLinux OS 9 SSH server to use only FIPS 140-3 approved algorithms by updating the "/etc/crypto-policies/back-ends/opensshserver.config" file with the following commands: Note: Before enabling FIPS mode, ensure that the dracut-fips package is installed on the system. Enable FIPS mode by updating the system's crypto policy with the following command: $ sudo update-crypto-policies --set FIPS Note: If FIPS mode has never been enabled on the system, additional steps will need to be conducted. Refer to vendor documentation. To manually update the Key Exchange Algorithms in the systemwide SSH configuration, use the following command: $ sudo sed -i -E '/^KexAlgorithms/s/.*/KexAlgorithms ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256/' "$(readlink -f /etc/crypto-policies/back-ends/opensshserver.config)" Reboot the system for the changes to take effect.
Verify that systemwide crypto policies are in effect with the following command: $ sudo /usr/sbin/sshd -dd 2>&1 | awk '/filename/ {print $4}' | tr -d '\r' | tr '\n' ' ' | xargs sudo grep -iH '^\s*include' /etc/ssh/sshd_config:Include /etc/ssh/sshd_config.d/*.conf /etc/ssh/sshd_config.d/50-redhat.conf:Include /etc/crypto-policies/back-ends/opensshserver.config If "Include /etc/ssh/sshd_config.d/*.conf" or "Include /etc/crypto-policies/back-ends/opensshserver.config" are not included in the system sshd config or the file /etc/ssh/sshd_config.d/50-redhat.conf is missing, this is a finding.
Configure the AlmaLinux OS 9 SSH daemon to use systemwide crypto policies by running the following commands: $ sudo dnf reinstall openssh-server
Verify the SSH server is configured to use only MACs employing FIPS 140-3 approved algorithms with the following command: First, ensure that FIPS mode is enabled with the following command: $ cat /proc/sys/crypto/fips_enabled 1 If the command does not return a "1", then the systemwide crypto policy is not set to FIPS, and this is a finding. To verify the MACs in the systemwide SSH configuration file, use the following command: $ sudo grep -i macs /etc/crypto-policies/back-ends/opensshserver.config MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256 If the MACs entries in the "opensshserver.config" file have any hashes other than "hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256", the order differs from the example above, or they are missing or commented out, this is a finding.
Configure the AlmaLinux OS 9 SSH server to use only MACs employing FIPS 140-3 approved algorithms by updating the "/etc/crypto-policies/back-ends/opensshserver.config" file with the following commands: Note: Before enabling FIPS mode, ensure that the dracut-fips package is installed on the system. Enable FIPS mode by updating the system's crypto policy with the following command: $ sudo update-crypto-policies --set FIPS Note: If FIPS mode has never been enabled on the system, additional steps will need to be conducted. Refer to vendor documentation. To manually update the MACs in the systemwide SSH configuration, use the following command: $ sudo sed -i -E '/^MACs/s/.*/MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256/' "$(readlink -f /etc/crypto-policies/back-ends/opensshserver.config)" A reboot is required for the changes to take effect.
Verify the SSH server is configured to force frequent session key renegotiation with the following command: $ sshd -T | grep rekeylimit rekeylimit 1073741824 3600 If "RekeyLimit" does not have a maximum data amount and maximum time defined, this is a finding.
Configure AlmaLinux OS 9 to force a frequent session key renegotiation for SSH connections to the server by running the following command: $ echo "RekeyLimit 1G 1h" > /etc/ssh/sshd_config.d/40-rekeylimit.conf
Verify if GnuTLS uses defined DOD-approved TLS Crypto Policy with the following command: $ update-crypto-policies --show FIPS If the system wide crypto policy is not set to "FIPS", this is a finding.
Configure the AlmaLinux OS 9 GnuTLS library to use only NIST-approved encryption with the following steps to enable FIPS mode: $ fips-mode-setup --enable A reboot is required for the changes to take effect.
Note: If the Libreswan package is not installed, this requirement is Not Applicable. Verify that the IPsec service uses the system crypto policy with the following command: $ grep -rE '^include ' /etc/ipsec.conf /etc/ipsec.d/ /etc/ipsec.conf:include /etc/crypto-policies/back-ends/libreswan.config /etc/ipsec.conf:include /etc/ipsec.d/*.conf If the IPsec configuration file does not contain "include /etc/crypto-policies/back-ends/libreswan.config", this is a finding.
Configure Libreswan to use the systemwide cryptographic policy. Add the following line to "/etc/ipsec.conf": include /etc/crypto-policies/back-ends/libreswan.config
Verify that AlmaLinux OS 9 OpenSSL library is configured to use only ciphers employing FIPS 140-3 approved algorithms with the following command: $ grep -i opensslcnf.config /etc/pki/tls/openssl.cnf .include = /etc/crypto-policies/back-ends/opensslcnf.config If the "opensslcnf.config" is not defined in the "/etc/pki/tls/openssl.cnf" file, this is a finding.
Configure the AlmaLinux OS 9 OpenSSL library to use the system cryptographic policy. Edit the "/etc/pki/tls/openssl.cnf" and add or modify the following line: .include = /etc/crypto-policies/back-ends/opensslcnf.config
Verify that AlmaLinux OS 9 OpenSSL library is configured to use TLS 1.2 encryption or stronger with following command: $ grep -i minprotocol /etc/crypto-policies/back-ends/opensslcnf.config TLS.MinProtocol = TLSv1.2 DTLS.MinProtocol = DTLSv1.2 If the "TLS.MinProtocol" is set to anything older than "TLSv1.2" or the "DTLS.MinProtocol" is set to anything older than "DTLSv1.2", this is a finding.
Configure the AlmaLinux OS 9 OpenSSL library to use only DOD-approved TLS encryption by editing the following line in the "/etc/crypto-policies/back-ends/opensslcnf.config" file: TLS.MinProtocol = TLSv1.2 DTLS.MinProtocol = DTLSv1.2 A reboot is required for the changes to take effect.
Verify that AlmaLinux OS 9 is using the TuxCare FIPS repositories with the following command: $ dnf repolist | grep tuxcare tuxcare-base TuxCare Enterprise Support for AlmaLinux OS 9.2 - Base tuxcare-esu TuxCare Enterprise Support for AlmaLinux OS 9.2 - ESU tuxcare-fips TuxCare Enterprise Support for AlmaLinux OS 9.2 - FIPS Compliance Extension If the 3 tuxcare-* repositories above are not enabled, this is a finding.
FIPS-validated packages are available from TuxCare as part of the Enterprise Support for AlmaLinux product line. Access the packages by purchasing an ESU license key. Configure the operating system to implement FIPS mode with the following commands: $ dnf install -y https://repo.tuxcare.com/tuxcare/tuxcare-release-latest-9.noarch.rpm $ tuxctl ---fips --license-key ESU-XXXXXXXXXXXXXXXXXXX $ dnf -y install openssl-3.0.7-20.el9_2.tuxcare.1 kernel-5.14.0-284.11.1.el9_2.tuxcare.5 gnutls-3.7.6-23.el9_2.tuxcare.3 nettle-3.8-3.el9_2.tuxcare.1 libgcrypt-1.10.0-10.el9_2.tuxcare.3 nss-3.90.0-6.el9_2.tuxcare.1 $ grubby --set-default=/boot/vmlinuz-5.14.0-284.11.1.el9_2.tuxcare.5.$(uname -i) $ fips-mode-setup --enable $ reboot
Verify that AlmaLinux OS 9 is using the TuxCare FIPS packages with the following command: $ rpm -qa | grep -E '^(gnutls|nettle|nss|openssl|libgcrypt|kernel)-[0-9]+' | grep -v tuxcare If the command returns anything, this is a finding.
Ensure FIPS-validated packages are in use instead of OS defaults using the following commands: $ dnf -y install openssl-3.0.7-20.el9_2.tuxcare.1 kernel-5.14.0-284.11.1.el9_2.tuxcare.5 gnutls-3.7.6-23.el9_2.tuxcare.3 nettle-3.8-3.el9_2.tuxcare.1 libgcrypt-1.10.0-10.el9_2.tuxcare.3 nss-3.90.0-6.el9_2.tuxcare.1 $ dnf -y upgrade $ grubby --set-default=/boot/vmlinuz-5.14.0-284.11.1.el9_2.tuxcare.5.$(uname -i) $ reboot After rebooting into a FIPS kernel, remove the OS default kernel packages, using for example: $ dnf remove kernel-5.14.0-284.11.1.el9_2.x86_64 kernel-5.14.0-284.30.1.el9_2.x86_64 $ dnf autoremove
Verify that AlmaLinux OS 9 is in FIPS mode with the following command: $ fips-mode-setup --check FIPS mode is enabled. If FIPS mode is not enabled, this is a finding.
FIPS-validated packages are available from TuxCare as part of the Enterprise Support for AlmaLinux product line. You will need to purchase an ESU license key. Configure the operating system to implement FIPS mode with the following commands: $ dnf install -y https://repo.tuxcare.com/tuxcare/tuxcare-release-latest-9.noarch.rpm $ tuxctl ---fips --license-key ESU-XXXXXXXXXXXXXXXXXXX $ dnf -y install openssl-3.0.7-20.el9_2.tuxcare.1 kernel-5.14.0-284.11.1.el9_2.tuxcare.5 gnutls-3.7.6-23.el9_2.tuxcare.3 nettle-3.8-3.el9_2.tuxcare.1 libgcrypt-1.10.0-10.el9_2.tuxcare.3 nss-3.90.0-6.el9_2.tuxcare.1 $ grubby --set-default=/boot/vmlinuz-5.14.0-284.11.1.el9_2.tuxcare.5.$(uname -i) $ fips-mode-setup --enable $ reboot
Verify temporary accounts have been provisioned with an expiration date of 72 hours. For every existing temporary account, run the following command to obtain its account expiration information: $ chage -l <account name> | grep -i "account expires" Verify each of these accounts has an expiration date set within 72 hours. If any temporary accounts have an expiration date set to "never" or do not expire within 72 hours, this is a finding.
Configure automatic account expiration after 72 hours by running the following command for each temporary account: $ chage -E $(date -d +3days +%Y-%m-%d) <account_name>
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect the "/etc/sudoers" file, with the following command: $ grep /etc/sudoers /etc/audit/audit.rules -w /etc/sudoers -p wa -k identity If the command does not return a line or the line is commented out, this is a finding. Note: The "-k" allows for specifying an arbitrary identifier, and the string after it does not need to match the example output above.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/etc/sudoers. Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /etc/sudoers -p wa -k identity Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect the "/etc/group" file, with the following command: $ grep /etc/group /etc/audit/audit.rules -w /etc/group -p wa -k identity If the command does not return a line or the line is commented out, this is a finding. Note: The "-k" allows for specifying an arbitrary identifier, and the string after it does not need to match the example output above.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/etc/group". Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /etc/group -p wa -k identity Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect the "/etc/gshadow" file, with the following command: $ grep /etc/gshadow /etc/audit/audit.rules -w /etc/gshadow -p wa -k identity If the command does not return a line or the line is commented out, this is a finding. Note: The "-k" allows for specifying an arbitrary identifier, and the string after it does not need to match the example output above.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/etc/gshadow". Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /etc/gshadow -p wa -k identity Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect the "/etc/security/opasswd" file, with the following command: $ grep /etc/security/opasswd /etc/audit/audit.rules -w /etc/security/opasswd -p wa -k identity If the command does not return a line or the line is commented out, this is a finding. Note: The "-k" allows for specifying an arbitrary identifier, and the string after it does not need to match the example output above.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/etc/security/opasswd". Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /etc/security/opasswd -p wa -k identity Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect the "/etc/passwd" file, with the following command: $ grep /etc/passwd /etc/audit/audit.rules -w /etc/passwd -p wa -k identity If the command does not return a line or the line is commented out, this is a finding. Note: The "-k" allows for specifying an arbitrary identifier, and the string after it does not need to match the example output above.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/etc/passwd". Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /etc/passwd -p wa -k identity Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect the "/etc/shadow" file, with the following command: $ grep /etc/shadow /etc/audit/audit.rules -w /etc/shadow -p wa -k identity If the command does not return a line or the line is commented out, this is a finding. Note: The "-k" allows for specifying an arbitrary identifier, and the string after it does not need to match the example output above.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/etc/shadow" using the following command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /etc/shadow -p wa -k identity Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect the files within "/etc/sudoers.d/", with the following command: $ grep /etc/sudoers.d/ /etc/audit/audit.rules -w /etc/sudoers.d/ -p wa -k identity If the command does not return a line or the line is commented out, this is a finding. Note: The "-k" allows for specifying an arbitrary identifier, and the string after it does not need to match the example output above.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/etc/sudoers.d/. Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /etc/sudoers.d/ -p wa -k identity Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify that AlmaLinux OS 9 requires authentication for emergency mode with the following command: $ grep -E 'ExecStart.*sulogin' /usr/lib/systemd/system/emergency.service ExecStart=-/usr/lib/systemd/systemd-sulogin-shell emergency If this line is not returned, or is commented out, this is a finding. If the output is different, this is a finding.
Configure AlmaLinux OS 9 to require authentication for emergency mode. Add or modify the following line in the "/usr/lib/systemd/system/emergency.service" file: ExecStart=-/usr/lib/systemd/systemd-sulogin-shell emergency "sudo systemctl edit emergency.service" can also be used to create a "/etc/systemd/system/emergency.service.d/override.conf" file.
Verify the boot loader superuser password is required using the following command: $ grep password /etc/grub2.cfg password_pbkdf2 superman ${GRUB2_PASSWORD} Verify the boot loader superuser password has been set and the password is encrypted using the following command: $ cat /boot/grub2/user.cfg GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.5766DCE424DCD4F0A2F5AC774C044BE8B904BC F0022B671CD5E522A3568C599F327EBA3F3F5AB30D69A9B9A4FD172B12435BC10BE0A9B40669FB A5C5ECBE8D1B.EAC815AE6F8A3F79F800D2EC7F454933BC3D63282532AAB1C487CA25331DD359F 5BF61166EDB53FB33977E982A9F20327D988DA15CBF7E4238357E65C5AEAF3C If a "GRUB2_PASSWORD" is not set, this is a finding.
Configure AlmaLinux OS 9 to require a grub bootloader password for the grub superuser account. Generate an encrypted grub2 password for the grub superuser account with the following command: $ grub2-setpassword Enter password: Confirm password:
Verify the boot loader superuser account has been set with the following command: $ grep -A1 "superusers" /etc/grub2.cfg set superusers="superman" export superusers password_pbkdf2 superman ${GRUB2_PASSWORD} In this example "superman" is the actual account name, changed from the default "root". If superusers contains easily guessable usernames, this is a finding.
Configure AlmaLinux OS 9 to have a unique username for the grub superuser account using the following commands: $ sed -ri 's/root/superman/' /etc/grub.d/01_users $ grub2-mkconfig -o /boot/grub2/grub.cfg
Verify that AlmaLinux OS 9 requires authentication for single-user mode with the following command: $ grep -E 'ExecStart.*sulogin' /usr/lib/systemd/system/rescue.service ExecStart=-/usr/lib/systemd/systemd-sulogin-shell rescue If this line is not returned or is commented out, this is a finding.
Configure AlmaLinux OS 9 to require authentication for single-user mode. Add or modify the following line in the "/usr/lib/systemd/system/rescue.service" file: ExecStart=-/usr/lib/systemd/systemd-sulogin-shell rescue "sudo systemctl edit rescue.service" can also be used to create a "/etc/systemd/system/rescue.service.d/override.conf" file.
Verify AlmaLinux OS 9 is configured to not reboot the system when Ctrl-Alt-Delete is pressed seven times within two seconds with the following command: $ systemd-analyze cat-config systemd/system.conf | grep -v '#' | grep CtrlAltDel CtrlAltDelBurstAction=none If "CtrlAltDelBurstAction" is not set to "none", is commented out, or is missing, this is a finding.
Configure the system to disable the CtrlAltDelBurstAction by added or modifying the following line in the "/etc/systemd/system.conf" configuration file: CtrlAltDelBurstAction=none Reload the daemon for this change to take effect. $ systemctl daemon-reexec
Verify AlmaLinux OS 9 is not configured to reboot the system when Ctrl-Alt-Delete is pressed with the following command: $ systemctl status ctrl-alt-del.target reboot.target Loaded: masked (Reason: Unit reboot.target is masked.) Active: inactive (dead) If the "reboot.target" is loaded and not masked, this is a finding.
Configure AlmaLinux OS 9 to disable the ctrl-alt-del.target with the following command: $ systemctl disable --now reboot.target $ systemctl mask --now reboot.target
Verify that the AlmaLinux OS 9 sudo package is installed with the following command: $ dnf list --installed sudo Installed Packages sudo.x86_64 1.9.5p2-9.el9 @anaconda If the "sudo" package is not installed, this is a finding.
The sudo package can be installed with the following command: $ dnf install sudo
Verify AlmaLinux OS 9 is configured to mask the debug-shell systemd service with the following command: $ systemctl status debug-shell.service debug-shell.service Loaded: masked (Reason: Unit debug-shell.service is masked.) Active: inactive (dead) If the "debug-shell.service" is loaded and not masked, this is a finding.
Configure AlmaLinux OS 9 to mask the debug-shell systemd service with the following command: $ systemctl mask --now debug-shell.service
Verify AlmaLinux OS 9 is configured to enable DAC on hardlinks with the following command: $ sysctl fs.protected_hardlinks fs.protected_hardlinks = 1 If "fs.protected_hardlinks" is not set to "1" or is missing, this is a finding. Check that the configuration files are present to enable this kernel parameter: $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F fs.protected_hardlinks | tail -1 fs.protected_hardlinks = 1 If "fs.protected_hardlinks" is not set to "1" or is missing, this is a finding.
Configure AlmaLinux OS 9 to enable DAC on hardlinks with the following command: $ echo "fs.protected_hardlinks = 1" > /etc/sysctl.d/60-hardlinks.conf Load settings from all system configuration files with the following command: $ sysctl –system
Verify AlmaLinux OS 9 is configured to enable DAC on symlinks with the following command: $ sysctl fs.protected_symlinks fs.protected_symlinks = 1 If "fs.protected_symlinks " is not set to "1" or is missing, this is a finding. Check that the configuration files are present to enable this kernel parameter: $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F fs.protected_symlinks | tail -1 fs.protected_symlinks = 1 If "fs.protected_symlinks" is not set to "1" or is missing, this is a finding.
Configure AlmaLinux OS 9 to enable DAC on symlinks with the following command: $ echo "fs.protected_symlinks = 1" > /etc/sysctl.d/60-symlinks.conf Load settings from all system configuration files with the following command: $ sysctl --system
Verify that AlmaLinux OS 9 is configured to audit the execution of the "execve" system call with the following command: $ auditctl -l | grep execve -a always,exit -F arch=b32 -S execve -C uid!=euid -F euid=0 -F key=execpriv -a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -F key=execpriv -a always,exit -F arch=b32 -S execve -C gid!=egid -F egid=0 -F key=execpriv -a always,exit -F arch=b64 -S execve -C gid!=egid -F egid=0 -F key=execpriv If the command does not return all lines, or the lines are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "sudo" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b32 -S execve -C uid!=euid -F euid=0 -k execpriv -a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k execpriv -a always,exit -F arch=b32 -S execve -C gid!=egid -F egid=0 -k execpriv -a always,exit -F arch=b64 -S execve -C gid!=egid -F egid=0 -k execpriv Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify AlmaLinux OS 9 is configured to lock an account after three unsuccessful logon attempts with the command: $ grep deny /etc/security/faillock.conf deny = 3 If the "deny" option is not set to 3 or less (but not 0), is missing or commented out, this is a finding.
Configure AlmaLinux OS 9 to lock an account when three unsuccessful logon attempts occur using pam_faillock. First, enable the feature using the following command: $ authselect enable-feature with-faillock Then, add or update the following line in the "/etc/security/faillock.conf" file: deny = 3
Verify AlmaLinux OS 9 is configured to lock the root account after three unsuccessful logon attempts with the command: $ grep even_deny_root /etc/security/faillock.conf even_deny_root If the "even_deny_root" option is not set, is missing, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to lock the root account after a number of incorrect login attempts using pam_faillock. First, enable the feature using the following command: $ authselect enable-feature with-faillock Then, add or uncomment the following line in the "/etc/security/faillock.conf" file: even_deny_root
Note: If the system administrator demonstrates the use of an approved centralized account management method that locks an account after three unsuccessful logon attempts within a period of 15 minutes, this requirement is Not Applicable. Verify AlmaLinux OS 9 locks an account after three unsuccessful logon attempts within a period of 15 minutes with the following command: $ grep fail_interval /etc/security/faillock.conf fail_interval = 900 If the "fail_interval" option is not set to 900 or less (but not 0), the line is commented out, or the line is missing, this is a finding.
Configure AlmaLinux OS 9 to lock an account after a number of incorrect login attempts within 15 minutes using pam_faillock. First, enable the feature using the following command: $ authselect enable-feature with-faillock Then, add or uncomment the following line in the "/etc/security/faillock.conf" file: fail_interval = 900
Verify the pam_faillock.so module is present in the "/etc/pam.d/system-auth" file: $ grep pam_faillock.so /etc/pam.d/system-auth auth required pam_faillock.so preauth auth required pam_faillock.so authfail account required pam_faillock.so If the pam_faillock.so module is not present in the "/etc/pam.d/system-auth" file with the "preauth" line listed before pam_unix.so, this is a finding. If the system administrator (SA) can demonstrate that the required configuration is contained in a PAM configuration file included or substacked from the system-auth file, this is not a finding.
Configure AlmaLinux OS 9 to include the use of the pam_faillock.so module in the /etc/pam.d/system-auth file. Add/modify the appropriate sections of the "/etc/pam.d/system-auth" file to match the following lines, ensuring that the "preauth" line is listed before pam_unix.so. auth required pam_faillock.so preauth auth required pam_faillock.so authfail account required pam_faillock.so Note: Do not simply copy these three lines into the file; their location/order is important.
Verify the pam_faillock.so module is present in the "/etc/pam.d/password-auth" file: $ grep pam_faillock.so /etc/pam.d/password-auth auth required pam_faillock.so preauth auth required pam_faillock.so authfail account required pam_faillock.so If the pam_faillock.so module is not present in the "/etc/pam.d/password-auth" file with the "preauth" line listed before pam_unix.so, this is a finding. If the system administrator (SA) can demonstrate that the required configuration is contained in a PAM configuration file included or substacked from the system-auth file, this is not a finding.
Configure AlmaLinux OS 9 to include the use of the pam_faillock.so module in the /etc/pam.d/password-auth file. Add/modify the appropriate sections of the "/etc/pam.d/password-auth" file to match the following lines, ensuring that the "preauth" line is listed before pam_unix.so. auth required pam_faillock.so preauth auth required pam_faillock.so authfail account required pam_faillock.so Note: Do not simply copy these three lines into the file; their location/order is important.
Verify the "/etc/security/faillock.conf" file is configured to log username information when unsuccessful logon attempts occur with the following command: $ grep audit /etc/security/faillock.conf audit If the "audit" option is not set, is missing, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to log username information when unsuccessful logon attempts occur. Add/modify the "/etc/security/faillock.conf" file to match the following line: audit
Verify AlmaLinux OS 9 is configured to lock an account until released by an administrator after three unsuccessful logon attempts with the command: $ grep unlock_time /etc/security/faillock.conf unlock_time = 0 If the "unlock_time" option is not set to "0", the line is missing, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to lock accounts until released by an administrator using pam_faillock. First, enable the feature using the following command: $ authselect enable-feature with-faillock Then, add or uncomment the following line in the "/etc/security/faillock.conf" file: unlock_time = 0
Verify the "/etc/security/faillock.conf" file is configured to use a nondefault faillock directory to ensure its contents persist after reboot with the following command: $ grep "dir =" /etc/security/faillock.conf dir = /var/log/faillock If the "dir" option is set to the default /var/run/faillock directory, is missing, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to maintain the contents of the faillock directory after a reboot. Add/modify the "/etc/security/faillock.conf" file to match the following line: dir = /var/log/faillock
Note: If the system does not have SELinux enabled and enforcing, a targeted policy, or if the pam_faillock module is not configured for use, this requirement is Not Applicable. Verify the location of the nondefault tally directory for the pam_faillock module with the following command: $ grep "dir =" /etc/security/faillock.conf dir = /var/log/faillock Check the security context type of the nondefault tally directory with the following command: $ ls -Zd /var/log/faillock system_u:object_r:faillog_t:s0 /var/log/faillock If the security context type of the nondefault tally directory is not "faillog_t", this is a finding.
Configure AlmaLinux OS 9 to allow the use of a nondefault faillock tally directory while SELinux enforces a targeted policy. Create a nondefault faillock tally directory (if it does not already exist) using the following command: $ mkdir /var/log/faillock Update the /etc/selinux/targeted/contexts/files/file_contexts.local file with the "faillog_t" context type for the nondefault faillock tally directory using the following command: $ semanage fcontext -a -t faillog_t "/var/log/faillock(/.*)?" Update the context type of the nondefault faillock directory and files within using the following command: $ restorecon -RFv /var/log/faillock
Note: This requirement assumes the use of the default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 prevents a user from disabling the banner for graphical user interfaces. Determine if the operating system prevents modification of the GNOME banner setting with the following command: $ grep banner-message-enable /etc/dconf/db/local.d/locks/* banner-message-enable If "banner-message-enable" is commented out or is missing, this is a finding.
Configure AlmaLinux OS 9 to prevent a user being able to override the GNOME banner setting by running the following commands: $ echo "banner-message-enable" | tee /etc/dconf/db/local.d/locks/00-banner > /dev/null $ dconf update
Note: This requirement assumes the use of the default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 displays a banner before granting access to the operating system via a graphical user logon. First, identify the location of the banner message file with the following command: $ grep banner-message-text /etc/dconf/db/local.d/* /etc/dconf/db/local.d/01-banner-message Determine if the operating system displays a banner at the logon screen with the following command: $ gsettings get org.gnome.login-screen banner-message-enable true Next, check that file contains the correct wording with the following command (substituting the path from above): $ cat /etc/dconf/db/local.d/01-banner-message If the banner is set correctly it will return the following text: "You are accessing a U.S. Government (USG) Information System (IS) that is provided for USG-authorized use only. By using this IS (which includes any device attached to this IS), you consent to the following conditions: -The USG routinely intercepts and monitors communications on this IS for purposes including, but not limited to, penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM), law enforcement (LE), and counterintelligence (CI) investigations. -At any time, the USG may inspect and seize data stored on this IS. -Communications using, or data stored on, this IS are not private, are subject to routine monitoring, interception, and search, and may be disclosed or used for any USG-authorized purpose. -This IS includes security measures (e.g., authentication and access controls) to protect USG interests--not for your personal benefit or privacy. -Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching or monitoring of the content of privileged communications, or work product, related to personal representation or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work product are private and confidential. See User Agreement for details." If the banner text does not match the Standard Mandatory DOD Notice and Consent Banner exactly, or the dconf database does not include the "banner-message-text" setting or if it is not enabled, this is a finding.
Configure AlmaLinux OS 9 to display the Standard Mandatory DOD Notice and Consent Banner before granting access to the system via a graphical user logon. Create a database to contain the systemwide graphical user logon settings (if it does not already exist) with the following command: $ touch /etc/dconf/db/local.d/01-banner-message Add the following lines to the [org/gnome/login-screen] section of the "/etc/dconf/db/local.d/01-banner-message": [org/gnome/login-screen] banner-message-enable=true banner-message-text='You are accessing a U.S. Government (USG) Information System (IS) that is provided for USG-authorized use only.\nBy using this IS (which includes any device attached to this IS), you consent to the following conditions:\n-The USG routinely intercepts and monitors communications on this IS for purposes including, but not limited to, penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM), law enforcement (LE), and counterintelligence (CI) investigations.\n-At any time, the USG may inspect and seize data stored on this IS.\n-Communications using, or data stored on, this IS are not private, are subject to routine monitoring, interception, and search, and may be disclosed or used for any USG-authorized purpose.\n-This IS includes security measures (e.g., authentication and access controls) to protect USG interests--not for your personal benefit or privacy.\n-Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching or monitoring of the content of privileged communications, or work product, related to personal representation or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work product are private and confidential. See User Agreement for details.' Run the following command to update the database: $ dconf update
Verify AlmaLinux OS 9 displays the Standard Mandatory DOD Notice and Consent Banner before granting access to the operating system via a command line user logon. Check that a banner is displayed at the command line login screen with the following command: $ cat /etc/issue If the banner is set correctly it will return the following text: "You are accessing a U.S. Government (USG) Information System (IS) that is provided for USG-authorized use only. By using this IS (which includes any device attached to this IS), you consent to the following conditions: -The USG routinely intercepts and monitors communications on this IS for purposes including, but not limited to, penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM), law enforcement (LE), and counterintelligence (CI) investigations. -At any time, the USG may inspect and seize data stored on this IS. -Communications using, or data stored on, this IS are not private, are subject to routine monitoring, interception, and search, and may be disclosed or used for any USG-authorized purpose. -This IS includes security measures (e.g., authentication and access controls) to protect USG interests--not for your personal benefit or privacy. -Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching or monitoring of the content of privileged communications, or work product, related to personal representation or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work product are private and confidential. See User Agreement for details." If the banner text does not match the Standard Mandatory DOD Notice and Consent Banner exactly, this is a finding.
Configure AlmaLinux OS 9 to display the Standard Mandatory DOD Notice and Consent Banner before granting access to the system via command line logon by running the command: $ cat << EOF | tee /etc/issue You are accessing a U.S. Government (USG) Information System (IS) that is provided for USG-authorized use only. By using this IS (which includes any device attached to this IS), you consent to the following conditions: -The USG routinely intercepts and monitors communications on this IS for purposes including, but not limited to, penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM), law enforcement (LE), and counterintelligence (CI) investigations. -At any time, the USG may inspect and seize data stored on this IS. -Communications using, or data stored on, this IS are not private, are subject to routine monitoring, interception, and search, and may be disclosed or used for any USG-authorized purpose. -This IS includes security measures (e.g., authentication and access controls) to protect USG interests--not for your personal benefit or privacy. -Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching or monitoring of the content of privileged communications, or work product, related to personal representation or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work product are private and confidential. See User Agreement for details. EOF
Verify AlmaLinux OS 9 displays the Standard Mandatory DOD Notice and Consent Banner before granting access to the operating system via a command line user logon. First, check that a banner text is correct with the following command: $ cat /etc/issue.net If the banner is set correctly it will return the following text: "You are accessing a U.S. Government (USG) Information System (IS) that is provided for USG-authorized use only. By using this IS (which includes any device attached to this IS), you consent to the following conditions: -The USG routinely intercepts and monitors communications on this IS for purposes including, but not limited to, penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM), law enforcement (LE), and counterintelligence (CI) investigations. -At any time, the USG may inspect and seize data stored on this IS. -Communications using, or data stored on, this IS are not private, are subject to routine monitoring, interception, and search, and may be disclosed or used for any USG-authorized purpose. -This IS includes security measures (e.g., authentication and access controls) to protect USG interests--not for your personal benefit or privacy. -Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching or monitoring of the content of privileged communications, or work product, related to personal representation or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work product are private and confidential. See User Agreement for details." Next, check that the OpenSSH server is configured to display the banner using the following command: $ sshd -T | grep banner banner /etc/issue.net If the banner text does not match the Standard Mandatory DOD Notice and Consent Banner exactly, or the SSH configuration does not include "Banner /etc/issue.net", this is a finding.
Configure AlmaLinux OS 9 to display the Standard Mandatory DOD Notice and Consent Banner before granting access to the system via command line logon by running the command: cat << EOF | tee /etc/issue.net You are accessing a U.S. Government (USG) Information System (IS) that is provided for USG-authorized use only. By using this IS (which includes any device attached to this IS), you consent to the following conditions: -The USG routinely intercepts and monitors communications on this IS for purposes including, but not limited to, penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM), law enforcement (LE), and counterintelligence (CI) investigations. -At any time, the USG may inspect and seize data stored on this IS. -Communications using, or data stored on, this IS are not private, are subject to routine monitoring, interception, and search, and may be disclosed or used for any USG-authorized purpose. -This IS includes security measures (e.g., authentication and access controls) to protect USG interests--not for your personal benefit or privacy. -Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching or monitoring of the content of privileged communications, or work product, related to personal representation or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work product are private and confidential. See User Agreement for details. EOF
Verify that AlmaLinux OS 9 has the "s-nail" package is installed on the system with the following command: $ dnf list --installed s-nail s-nail.x86_64 14.9.22-6.el9 @AppStream If "s-nail" package is not installed, this is a finding.
The s-nail package can be installed with the following command: $ dnf install s-nail
Verify the SSH daemon does not allow GSSAPI authentication with the following command: $ /usr/sbin/sshd -dd 2>&1 | awk '/filename/ {print $4}' | tr -d '\r' | tr '\n' ' ' | xargs sudo grep -iH '^\s*gssapiauthentication' gssapiauthentication no If the value is returned as "yes", the returned line is commented out, no output is returned, and the use of GSSAPI authentication has not been documented with the information system security officer (ISSO), this is a finding. If the required value is not set, this is a finding.
Configure the SSH daemon to not allow GSSAPI authentication. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "no": GSSAPIAuthentication no Alternatively, add the setting to an included file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: GSSAPIAuthentication no Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the SSH daemon does not allow Kerberos authentication with the following command: $ /usr/sbin/sshd -dd 2>&1 | awk '/filename/ {print $4}' | tr -d '\r' | tr '\n' ' ' | xargs sudo grep -iH '^\s*kerberosauthentication' kerberosauthentication no If the value is returned as "yes", the returned line is commented out, no output is returned, and the use of Kerberos authentication has not been documented with the information system security officer (ISSO), this is a finding.
Configure the SSH daemon to not allow Kerberos authentication. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "no": KerberosAuthentication no Alternatively, add the setting to an included file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: KerberosAuthentication no Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify that dnf always checks the GPG signature of software packages originating from external software repositories before installation: $ grep gpgcheck /etc/dnf/dnf.conf gpgcheck=1 If "gpgcheck" is not set to "1", or if the option is missing or commented out, ask the system administrator how the GPG signatures of software packages are verified. If there is no process to verify GPG signatures that is approved by the organization, this is a finding.
Configure dnf to always check the GPG signature of software packages originating from external software repositories before installation. Add or update the following line in the [main] section of the /etc/dnf/dnf.conf file: gpgcheck=1
Confirm AlmaLinux and TuxCare package-signing keys are installed on the system and verify their fingerprints match vendor values. The keys are stored as "RPM-GPG-KEY-AlmaLinux-9" and "RPM-GPG-KEY-TuxCare" inside the "/etc/pki/rpm-gpg/" directory. List GPG keys installed on the system using the following command: $ rpm -q --queryformat "%{SUMMARY}\n" gpg-pubkey TuxCare (Software Signing Key) <packager@tuxcare.com> public key AlmaLinux OS 9 <packager@almalinux.org> public key If the AlmaLinux and TuxCare GPG keys are not installed, this is a finding. List key fingerprints of installed GPG keys using the following commands: $ gpg -q --keyid-format short --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9 pub rsa4096/B86B3716 2022-01-18 [SC] Key fingerprint = BF18 AC28 7617 8908 D6E7 1267 D36C B86C B86B 3716 uid AlmaLinux OS 9 <packager@almalinux.org> sub rsa4096/C9BA6CAA 2022-01-18 [E] $ gpg -q --keyid-format short --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare pub rsa4096/8D50EB66 2023-03-06 [SC] Key fingerprint = FAD7 8590 81D0 738B 7A82 8496 D07B F2A0 8D50 EB66 uid TuxCare (Software Signing Key) <packager@tuxcare.com> sub rsa4096/A9C70659 2023-03-06 [E] If either "/etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9" or "/etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare" key files are missing, this is a finding. Compare key fingerprints of installed AlmaLinux and TuxCare GPG keys with fingerprints listed at https://almalinux.org/security/ https://docs.tuxcare.com/enterprise-support-for-almalinux/#gnupg-keys If the key fingerprints do not match, this is a finding.
Install AlmaLinux and TuxCare package-signing keys on the system and verify their fingerprints match vendor values. $ curl https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux-9 -o /etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9 $ curl https://repo.tuxcare.com/tuxcare/RPM-GPG-KEY-TuxCare -o /etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare $ rpm --import https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux-9 $ rpm --import https://repo.tuxcare.com/tuxcare/RPM-GPG-KEY-TuxCare Using the steps listed in the Check, confirm the newly imported keys show as installed on the system and verify their fingerprints match vendor values.
Verify that dnf always checks the GPG signature of locally installed software packages before installation: $ grep localpkg_gpgcheck /etc/dnf/dnf.conf localpkg_gpgcheck=1 If "localpkg_gpgcheck" is not set to "1", or if the option is missing, or is commented out, ask the system administrator (SA) how the GPG signatures of local software packages are being verified. If there is no process to verify GPG signatures that is approved by the organization, this is a finding.
Configure dnf to always check the GPG signature of local software packages before installation. Add or update the following line in the [main] section of the /etc/dnf/dnf.conf file: localpkg_gpgcheck=1
Verify that dnf always checks the GPG signature of repository metadata: $ grep repo_gpgcheck /etc/dnf/dnf.conf /etc/yum.repos.d/*.repo repo_gpgcheck=1 If "repo_gpgcheck" is not set to "1" in the global "/etc/dnf/dnf.conf" file, or if the option is missing or commented out, this is a finding. If "repo_gpgcheck" is set to "0" in any of the "/etc/yum.repos.d/*.repo" files and the information system security officer (ISSO) lacks a documented requirement, this is a finding. Note: Not all repositories support this feature.
Configure dnf to always check the GPG signature of repository metadata. Add or update the following line in the [main] section of the /etc/dnf/dnf.conf file: repo_gpgcheck=1 Remove any instances of "repo_gpgcheck=0" from any "/etc/yum.repos.d/*.repo" files.
Verify that all software repositories defined in "/etc/yum.repos.d/" have been configured with "gpgcheck" enabled: $ grep gpgcheck /etc/yum.repos.d/*.repo /etc/yum.repos.d/tuxcare-fips.repo:gpgcheck=1 If "gpgcheck" is not set to "1" for all returned lines, this is a finding.
Configure all software repositories defined in "/etc/yum.repos.d/" to have "gpgcheck" enabled: $ sed -i 's/gpgcheck\s*=.*/gpgcheck=1/g' /etc/yum.repos.d/*
Verify AlmaLinux OS 9 is configured to disable kernel image loading. Check the status of the kernel.kexec_load_disabled kernel parameter with the following command: $ sysctl kernel.kexec_load_disabled kernel.kexec_load_disabled = 1 If "kernel.kexec_load_disabled" is not set to "1" or is missing, this is a finding. Check that the configuration files are present to enable this kernel parameter with the following command: $ /usr/lib/systemd/systemd-sysctl --cat-config | kernel.kexec_load_disabled kernel.kexec_load_disabled = 1 If "kernel.kexec_load_disabled" is not set to "1" or is missing, this is a finding.
Add or edit the following line in a system configuration file in the "/etc/sysctl.d/" directory: kernel.kexec_load_disabled = 1 Load settings from all system configuration files with the following command: $ sysctl –system
Verify the system commands contained in the following directories are group-owned by "root", or a required system account, with the following command: $ find -L /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin ! -group root -exec ls -l {} \; If any system commands are returned and is not group-owned by a required system account, this is a finding.
Configure the system commands to be protected from unauthorized access. Run the following command, replacing "[FILE]" with any system command file not group-owned by "root" or a required system account. $ chgrp root [FILE]
Verify the system commands contained in the following directories are owned by "root" with the following command: $ find -L /bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/local/bin /usr/local/sbin ! -user root -exec ls -l {} \; If any system commands are found to not be owned by root, this is a finding.
Configure the system commands to be protected from unauthorized access. Run the following command, replacing "[FILE]" with any system command file not owned by "root". $ chown root [FILE]
Verify the system commands contained in the following directories have mode "755" or less permissive with the following command: $ find -L /bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/local/bin /usr/local/sbin -perm /022 -exec ls -l {} \; If any system commands are found to be group-writable or world-writable, this is a finding.
Configure the system commands to be protected from unauthorized access. Run the following command, replacing "[FILE]" with any system command with a mode more permissive than "755". $ chmod 755 [FILE]
Verify the systemwide shared library directories are group-owned by "root" with the following command: $ find -L /lib /lib64 /usr/lib /usr/lib64 ! -group root -type d -exec stat -c "%n %G" '{}' \; If any systemwide shared library directory is returned and is not group owned by a required system account, this is a finding.
Configure the systemwide shared library directories (/lib, /lib64, /usr/lib and /usr/lib64) to be protected from unauthorized access. Run the following command, replacing "[DIRECTORY]" with any library directory not group-owned by "root". $ chgrp root [DIRECTORY]
Verify the systemwide shared library directories are owned by "root" with the following command: $ find -L /lib /lib64 /usr/lib /usr/lib64 ! -user root -type d -exec stat -c "%n %U" '{}' \; If any systemwide shared library directory is not owned by root, this is a finding.
Configure the systemwide shared library directories within (/lib, /lib64, /usr/lib and /usr/lib64) to be protected from unauthorized access. Run the following command, replacing "[DIRECTORY]" with any library directory not owned by "root". $ chown root [DIRECTORY]
Verify the systemwide shared library directories have mode "755" or less permissive with the following command: $ find -L /lib /lib64 /usr/lib /usr/lib64 -perm /022 -type d -exec ls -l {} \; If any systemwide shared library file is found to be group-writable or world-writable, this is a finding.
Configure the systemwide shared library directories (/lib, /lib64, /usr/lib and /usr/lib64) to be protected from unauthorized access. Run the following command, replacing "[DIRECTORY]" with any library directory with a mode more permissive than 755. $ chmod 755 [DIRECTORY]
Verify the systemwide shared library files are group-owned by "root" with the following command: $ find -L /lib /lib64 /usr/lib /usr/lib64 ! -group root -exec ls -l {} \; If any systemwide shared library file is returned and is not group-owned by a required system account, this is a finding.
Configure the systemwide shared library files (/lib, /lib64, /usr/lib and /usr/lib64) to be protected from unauthorized access. Run the following command, replacing "[FILE]" with any library file not group-owned by "root". $ chgrp root [FILE]
Verify the systemwide shared library files are owned by "root" with the following command: $ find -L /lib /lib64 /usr/lib /usr/lib64 ! -user root -exec ls -l {} \; If any systemwide shared library file is not owned by root, this is a finding.
Configure the systemwide shared library files (/lib, /lib64, /usr/lib and /usr/lib64) to be protected from unauthorized access. Run the following command, replacing "[FILE]" with any library file not owned by "root". $ chown root [FILE]
Verify the systemwide shared library files contained in the following directories have mode "755" or less permissive with the following command: $ find -L /lib /lib64 /usr/lib /usr/lib64 -perm /022 -type f -exec ls -l {} \; If any systemwide shared library file is found to be group-writable or world-writable, this is a finding.
Configure the library files to be protected from unauthorized access. Run the following command, replacing "[FILE]" with any library file with a mode more permissive than 755. $ chmod 755 [FILE]
Verify AlmaLinux OS 9 disables core dumps for all users by issuing the following command: $ grep -s core /etc/security/limits.conf /etc/security/limits.d/*.conf /etc/security/limits.conf:# - core - limits the core file size (KB) /etc/security/limits.conf:#* soft core 0 This can be set as a global domain (with the * wildcard) but may be set differently for multiple domains. If the "core" item is missing, commented out, or the value is anything other than "0" and the need for core dumps is not documented with the information system security officer (ISSO) as an operational requirement for all domains that have the "core" item assigned, this is a finding.
Configure the operating system to disable core dumps for all users. Create a *.conf file in /etc/security/limits.d/ with the following content: * hard core 0
Verify AlmaLinux OS 9 is not configured to acquire, save, or process core dumps with the following command: $ systemctl status systemd-coredump.socket systemd-coredump.socket Loaded: masked (Reason: Unit systemd-coredump.socket is masked.) Active: inactive (dead) since Mon 2024-02-26 13:31:02 UTC; 26s ago Duration: 3h 13min 22.428s If the "systemd-coredump.socket" is loaded and not masked and the need for core dumps is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Configure the system to disable the systemd-coredump.socket with the following command: $ systemctl mask --now systemd-coredump.socket Create symlink /etc/systemd/system/systemd-coredump.socket -> /dev/null Reload the daemon for this change to take effect. $ systemctl daemon-reload
Verify AlmaLinux OS 9 disables storing core dumps for all users by issuing the following command: $ systemd-analyze cat-config systemd/coredump.conf | grep Storage Storage=none If the "Storage" item is missing, commented out, or the value is anything other than "none" and the need for core dumps is not documented with the information system security officer (ISSO) as an operational requirement for all domains that have the "core" item assigned, this is a finding.
Configure the operating system to disable storing core dumps for all users. Add or modify the following line in the [Coredump} section of /etc/systemd/coredump.conf: Storage=none
Verify AlmaLinux OS 9 disables core dump backtraces by issuing the following command: $ systemd-analyze cat-config systemd/coredump.conf | grep ProcessSizeMax ProcessSizeMax=0 If the "ProcessSizeMax" item is missing, commented out, or the value is anything other than "0" and the need for core dumps is not documented with the information system security officer (ISSO) as an operational requirement for all domains that have the "core" item assigned, this is a finding.
Configure the operating system to disable core dump backtraces. Add or modify the following line in the [Coredump} section of /etc/systemd/coredump.conf: ProcessSizeMax=0
Verify AlmaLinux OS 9 disables storing core dumps with the following commands: $ sysctl kernel.core_pattern kernel.core_pattern = |/bin/false If the returned line does not have a value of "|/bin/false", or a line is not returned and the need for core dumps is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding. Check that the configuration files are present to disable core dump storage. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F kernel.core_pattern | tail -1 kernel.core_pattern = |/bin/false If "kernel.core_pattern" is not set to "|/bin/false" and is not documented with the ISSO as an operational requirement, or is missing, this is a finding.
Configure AlmaLinux OS 9 to disable storing core dumps. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: kernel.core_pattern = |/bin/false The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Verify the group ownership of all cron configuration files with the following command: $ stat -c "%G %n" /etc/cron* root /etc/cron.d root /etc/cron.daily root /etc/cron.deny root /etc/cron.hourly root /etc/cron.monthly root /etc/crontab root /etc/cron.weekly If any crontab is not group owned by root, this is a finding.
Configure any cron configuration not group-owned by root with the following command: $ chgrp root [cron config file]
Verify the ownership of all cron configuration files with the command: $ stat -c "%U %n" /etc/cron* root /etc/cron.d root /etc/cron.daily root /etc/cron.deny root /etc/cron.hourly root /etc/cron.monthly root /etc/crontab root /etc/cron.weekly If any crontab is not owned by root, this is a finding.
Configure any cron configuration not owned by root with the following command: $ chown root [cron config file]
Verify the permissions of the cron directories with the following command: $ find /etc/cron* -type d | xargs stat -c "%#a %n" 0700 /etc/cron.d 0700 /etc/cron.daily 0700 /etc/cron.hourly 0700 /etc/cron.monthly 0700 /etc/cron.weekly If any cron configuration directory is more permissive than "700", this is a finding.
Configure any AlmaLinux OS 9 cron configuration directory with a mode more permissive than "0700" as follows: chmod 0700 [cron configuration directory]
Verify the permissions of /etc/crontab with the following command: $ stat -c "%#a %n" /etc/crontab 0600 If /etc/crontab does not have a mode of "0600", this is a finding.
Configure the AlmaLinux OS 9 file /etc/crontab with mode 600. $ chmod 0600 /etc/crontab
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 is configured to ignore the Ctrl-Alt-Del sequence in the GNOME desktop with the following command: $ gsettings get org.gnome.settings-daemon.plugins.media-keys logout "['']" If the GNOME desktop is configured to shut down when Ctrl-Alt-Del is pressed, this is a finding.
Configure AlmaLinux OS 9 to ignore the Ctrl-Alt-Del sequence in the GNOME desktop. Add or update the [org/gnome/settings-daemon/plugins/media-keys] section of the /etc/dconf/db/local.d/00-security-settings database file and add or update the following lines: [org/gnome/settings-daemon/plugins/media-keys] logout=[''] Run the following command to update the database: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify that users cannot enable the Ctrl-Alt-Del sequence in the GNOME desktop with the following command: $ grep logout /etc/dconf/db/local.d/locks/* /org/gnome/settings-daemon/plugins/media-keys/logout If the output is not "/org/gnome/settings-daemon/plugins/media-keys/logout", the line is commented out, or the line is missing, this is a finding.
Configure AlmaLinux OS 9 to disallow the user changing the Ctrl-Alt-Del sequence in the GNOME desktop. Create a database to container systemwide graphical user logon settings (if it does not already exist) with the following command: $ touch /etc/dconf/db/local.d/locks/session Add the following line to the session locks file to prevent nonprivileged users from modifying the Ctrl-Alt-Del setting: /org/gnome/settings-daemon/plugins/media-keys/logout Run the following command to update the database: $ dconf update
Verify all local files and directories on AlmaLinux OS 9 have a valid group with the following command: $ df --local -P | awk {'if (NR!=1) print $6'} | xargs -I '{}' find '{}' -xdev -nogroup If any files on the system do not have an assigned group, this is a finding.
Either remove all files and directories from AlmaLinux OS 9 that do not have a valid group, or assign a valid group to all files and directories on the system with the "chgrp" command: $ chgrp <group> <file>
Verify all local files and directories on AlmaLinux OS 9 have a valid owner with the following command: $ df --local -P | awk {'if (NR!=1) print $6'} | xargs -I '{}' find '{}' -xdev -nouser If any files on the system do not have an assigned owner, this is a finding.
Either remove all files and directories from the system that do not have a valid user, or assign a valid user to all unowned files and directories on AlmaLinux OS 9 with the "chown" command: $ chown <user> <file>
Verify the group ownership of the "/etc/group-" file with the following command: $ stat -c "%G %n" /etc/group- root /etc/group- If "/etc/group-" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/group- to root by running the following command: $ chgrp root /etc/group-
Verify the ownership of the "/etc/group-" file with the following command: $ stat -c "%U %n" /etc/group- root /etc/group- If "/etc/group-" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/group- to root by running the following command: $ chown root /etc/group-
Verify that the "/etc/group-" file has mode "0644" or less permissive with the following command: $ stat -c "%#a %n" /etc/group- 0644 /etc/group- If a value of "0644" or less permissive is not returned, this is a finding.
Change the mode of the file "/etc/group-" to "0644" by running the following command: $ chmod 0644 /etc/group-
Verify the group ownership of the "/etc/group" file with the following command: $ stat -c "%G %n" /etc/group root /etc/group If "/etc/group" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/group to root by running the following command: $ chgrp root /etc/group
Verify the ownership of the "/etc/group" file with the following command: $ stat -c "%U %n" /etc/group root /etc/group If "/etc/group" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/group to root by running the following command: $ chown root /etc/group
Verify that the "/etc/group" file has mode "0644" or less permissive with the following command: $ stat -c "%#a %n" /etc/group 0644 /etc/group If a value of "0644" or less permissive is not returned, this is a finding.
Change the mode of the file "/etc/group" to "0644" by running the following command: $ chmod 0644 /etc/group
Verify the group ownership of the "/boot/grub2/grub.cfg" file with the following command: $ stat -c "%G %n" /boot/grub2/grub.cfg root /boot/grub2/grub.cfg If "/boot/grub2/grub.cfg" file does not have a group owner of "root", this is a finding.
Change the group of the file /boot/grub2/grub.cfg to root by running the following command: $ chgrp root /boot/grub2/grub.cfg
Verify the ownership of the "/boot/grub2/grub.cfg" file with the following command: $ stat -c "%U %n" /boot/grub2/grub.cfg root /boot/grub2/grub.cfg If "/boot/grub2/grub.cfg" file does not have an owner of "root", this is a finding.
Change the owner of the file /boot/grub2/grub.cfg to root by running the following command: $ chown root /boot/grub2/grub.cfg
Verify that GRUB 2 is configured to disable interactive boot. Check that the current GRUB 2 configuration disables the ability of systemd to spawn an interactive boot process with the following command: $ grubby --info=ALL | grep args | grep 'systemd.confirm_spawn' If any output is returned, this is a finding.
Configure AlmaLinux OS 9 to disable the ability of systemd to spawn an interactive boot process with the following command: $ grubby --update-kernel=ALL --remove-args="systemd.confirm_spawn"
Verify the group ownership of the "/etc/gshadow-" file with the following command: $ stat -c "%G %n" /etc/gshadow- root /etc/gshadow- If "/etc/gshadow-" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/gshadow- to root by running the following command: $ chgrp root /etc/gshadow-
Verify the ownership of the "/etc/gshadow-" file with the following command: $ stat -c "%U %n" /etc/gshadow- root /etc/gshadow- If "/etc/gshadow-" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/gshadow- to root by running the following command: $ chown root /etc/gshadow-
Verify that the "/etc/gshadow-" file has mode "0000" with the following command: $ stat -c "%a %n" /etc/gshadow- 0 /etc/gshadow- If a value of "0" is not returned, this is a finding.
Change the mode of the file "/etc/gshadow-" to "0000" by running the following command: $ chmod 0000 /etc/gshadow-
Verify the group ownership of the "/etc/gshadow" file with the following command: $ stat -c "%G %n" /etc/gshadow root /etc/gshadow If "/etc/gshadow" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/gshadow to root by running the following command: $ chgrp root /etc/gshadow
Verify the ownership of the "/etc/gshadow" file with the following command: $ stat -c "%U %n" /etc/gshadow root /etc/gshadow If "/etc/gshadow" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/gshadow to root by running the following command: $ chown root /etc/gshadow
Verify that the "/etc/gshadow" file has mode "0000" with the following command: $ stat -c "%a %n" /etc/gshadow 0 /etc/gshadow If a value of "0" is not returned, this is a finding.
Change the mode of the file "/etc/gshadow" to "0000" by running the following command: $ chmod 0000 /etc/gshadow
Verify that AlmaLinux OS 9 is configured to boot to the command line: $ systemctl get-default multi-user.target If the system default target is not set to "multi-user.target" and the information system security officer (ISSO) lacks a documented requirement for a graphical user interface, this is a finding.
Document the requirement for a graphical user interface with the ISSO or set the default target to multi-user with the following command: $ systemctl set-default multi-user.target
Verify that AlmaLinux OS 9 disables the user logon list for graphical user interfaces with the following command: Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. $ gsettings get org.gnome.login-screen disable-user-list true If the setting is "false", this is a finding.
Configure AlmaLinux OS 9 to disable the user list at logon for graphical user interfaces. Create a database to contain the systemwide screensaver settings (if it does not already exist) with the following command: Note: The example below is using the database "local" for the system, so if the system is using another database in "/etc/dconf/profile/user", the file should be created under the appropriate subdirectory. $ touch /etc/dconf/db/local.d/02-login-screen [org/gnome/login-screen] disable-user-list=true Update the system databases: $ dconf update
Verify all local interactive users on AlmaLinux OS 9 are assigned a home directory upon creation with the following command: $ grep CREATE_HOME /etc/login.defs CREATE_HOME yes If the value for "CREATE_HOME" parameter is not set to "yes", the line is missing, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to assign home directories to all new local interactive users by setting the "CREATE_HOME" parameter in "/etc/login.defs" to "yes" as follows: CREATE_HOME yes
Verify the assigned home directories of all interactive users on the system exist with the following command: $ pwck -r user 'testdupe': directory '/home/testdupe' does not exist The output should not return any interactive users. If users home directory does not exist, this is a finding.
Create home directories to all local interactive users that currently do not have a home directory assigned. Use the following commands to create the user home directory assigned in "/etc/ passwd": Note: The example will be for the user testdupe, who has a home directory of "/home/testdupe", a UID of "testdupe", and a GID of "testdupe" in "/etc/passwd": $ mkdir /home/testdupe $ chown testdupe /home/testdupe $ chgrp testdupe /home/testdupe $ chmod 0700 /home/testdupe
Verify the assigned home directory of all local interactive users is group-owned by that user's primary GID with the following command: Note: This may miss local interactive users that have been assigned a privileged UID. Evidence of interactive use may be obtained from a number of log files containing system logon information. The returned directory "/home/test" is used as an example. $ stat --format="%n: GID=%g (%G), UID=%u (%U), MODE=%0.4a" $(awk -F: '($3>=1000)&&($7 !~ /nologin/){print $6}' /etc/passwd) /home/test: GID=1001 (test), UID=1001 (test), MODE=0700 Check the user's primary group with the following command: $ grep $(grep -E '^test:' /etc/passwd | awk -F: '{print $4}') /etc/group test:x:1001: If the user home directory referenced in "/etc/passwd" is not group-owned by that user's primary GID (1001 in the above example) this is a finding.
Change the group owner of a local interactive user's home directory to the group found in "/etc/passwd". To change the group owner of a local interactive user's home directory, use the following command: Note: The example will be for the user "test", who has a home directory of "/home/test", and has a primary group of "test". $ chgrp test /home/test
Verify "/home" is mounted with the "noexec" option with the following command: Note: If a separate file system has not been created for the user home directories (user home directories are mounted under "/"), this is automatically a finding, as the "noexec" option cannot be used on the "/" system. $ mount | grep /home /dev/mapper/luks-10a20c46-483d-4d12-831f-5328eda18fd1 on /home type xfs (rw,noexec,nosuid,nodev,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/home" file system is mounted without the "noexec" option, this is a finding.
Modify "/etc/fstab" to use the "noexec" option on the "/home" directory.
Verify that a separate file system/partition has been created for "/home" with the following command: $ mount | grep /home /dev/mapper/luks-10a20c46-483d-4d12-831f-5328eda18fd1 on /home type xfs (rw,nosuid,nodev,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If a separate entry for "/home" is not in use, this is a finding.
Migrate the "/home" directory onto a separate file system/partition.
Verify that interactive users on the system have a home directory assigned with the following command: $ awk -F: '($3>=1000)&&($7 !~ /nologin/){print $1, $6}' /etc/passwd simon /home/simon test /home/test testdupe /home/testdupe Inspect the output and verify that all interactive users (normally users with a UID greater that 1000) have a home directory defined. If users home directory is not defined, this is a finding.
Create and assign home directories to all local interactive users on AlmaLinux OS 9 that currently do not have a home directory assigned.
Verify that all local interactive user initialization file executable search path statements do not contain statements that will reference a working directory other than user home directories with the following commands: $ grep -i path= /home/*/.* grep -i path= /home/*/.* 2>/dev/null /home/simon/.bashrc: PATH="$HOME/.local/bin:$HOME/bin:$PATH" /home/test/.bashrc: PATH="$HOME/.local/bin:$HOME/bin:$PATH" If any local interactive user initialization files have executable search path statements that include directories outside of their home directory and is not documented with the ISSO as an operational requirement, this is a finding.
Edit the local interactive user initialization files to change any PATH variable statements that reference directories other than their home directory. If a local interactive user requires path variables to reference a directory owned by the application, it must be documented with the ISSO.
Note: This may miss interactive users that have been assigned a privileged user identifier (UID). Evidence of interactive use may be obtained from a number of log files containing system logon information. Verify the assigned home directory of all local interactive users has a mode of "0750" or less permissive with the following command: $ ls -ld $(awk -F: '($3>=1000)&&($7 !~ /nologin/){print $6}' /etc/passwd) drwx------. 2 simon simon 83 Nov 30 12:30 /home/simon drwx------. 2 test test 83 Jan 19 14:18 /home/test drwx------. 2 test testdupe 62 Jan 15 11:44 /home/testdupe If home directories referenced in "/etc/passwd" do not have a mode of "0750" or less permissive, this is a finding.
Change the mode of interactive user's home directories to "0750". To change the mode of a local interactive user's home directory, use the following command: Note: The example will be for the user "test". $ chmod 0750 /home/test
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 does not allow an unattended or automatic logon to the system via a graphical user interface. Check for the value of the "AutomaticLoginEnable" in the "/etc/gdm/custom.conf" file with the following command: $ grep -i automaticlogin /etc/gdm/custom.conf [daemon] AutomaticLoginEnable=false If the value of "AutomaticLoginEnable" is not set to "false", this is a finding.
Configure the GNOME desktop display manager to disable automatic login. Set AutomaticLoginEnable to false in the [daemon] section in /etc/gdm/custom.conf. For example: [daemon] AutomaticLoginEnable=false
Verify AlmaLinux OS 9 enforces a delay of at least four seconds between console logon prompts following a failed logon attempt with the following command: $ grep -i fail_delay /etc/login.defs FAIL_DELAY 4 If the value of "FAIL_DELAY" is not set to "4" or greater, or the line is commented out, this is a finding.
Configure the AlmaLinux OS 9 to enforce a delay of at least four seconds between logon prompts following a failed console logon attempt. Modify the "/etc/login.defs" file to set the "FAIL_DELAY" parameter to 4 or greater: FAIL_DELAY 4
Verify that null passwords cannot be used with the following command: $ grep -i nullok /etc/pam.d/system-auth /etc/pam.d/password-auth If output is produced, this is a finding. If the system administrator (SA) can demonstrate that the required configuration is contained in a PAM configuration file included or substacked from the system-auth file, this is not a finding.
Remove any instances of the "nullok" option in the "/etc/pam.d/password-auth" and "/etc/pam.d/system-auth" files to prevent logons with empty passwords. Note: Manual changes to the listed file may be overwritten by the "authselect" program.
Verify that null or blank passwords cannot be used with the following command: $ awk -F: '!$2 {print $1}' /etc/shadow If the command returns any results, this is a finding.
Configure all accounts on AlmaLinux OS 9 to have a password or lock the account with the following commands: Perform a password reset: $ passwd [username] To lock an account: $ passwd -l [username]
Verify the group ownership of the "/etc/passwd-" file with the following command: $ stat -c "%G %n" /etc/passwd- root /etc/passwd- If "/etc/passwd-" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/passwd- to root by running the following command: $ chgrp root /etc/passwd-
Verify the ownership of the "/etc/passwd-" file with the following command: $ stat -c "%U %n" /etc/passwd- root /etc/passwd- If "/etc/passwd-" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/passwd- to root by running the following command: $ chown root /etc/passwd-
Verify that the "/etc/passwd-" file has mode "0644" or less permissive with the following command: $ stat -c "%#a %n" /etc/passwd- 0644 /etc/passwd- If a value of "0644" or less permissive is not returned, this is a finding.
Change the mode of the file "/etc/passwd-" to "0644" by running the following command: $ chmod 0644 /etc/passwd-
Verify the group ownership of the "/etc/passwd" file with the following command: $ stat -c "%G %n" /etc/passwd root /etc/passwd If "/etc/passwd" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/passwd to root by running the following command: $ chgrp root /etc/passwd
Verify the ownership of the "/etc/passwd" file with the following command: $ stat -c "%U %n" /etc/passwd root /etc/passwd If "/etc/passwd" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/passwd to root by running the following command: $ chown root /etc/passwd
Verify that the "/etc/passwd" file has mode "0644" or less permissive with the following command: $ stat -c "%#a %n" /etc/passwd 0644 /etc/passwd If a value of "0644" or less permissive is not returned, this is a finding.
Change the mode of the file "/etc/passwd" to "0644" by running the following command: $ chmod 0644 /etc/passwd
Verify the group ownership of the "/etc/shadow-" file with the following command: $ stat -c "%G %n" /etc/shadow- root /etc/shadow- If "/etc/shadow-" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/shadow- to root by running the following command: $ chgrp root /etc/shadow-
Verify the ownership of the "/etc/shadow-" file with the following command: $ stat -c "%U %n" /etc/shadow- root /etc/shadow- If "/etc/shadow-" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/shadow- to root by running the following command: $ chown root /etc/shadow-
Verify that the "/etc/shadow-" file has mode "0000" with the following command: $ stat -c "%a %n" /etc/shadow- 0 /etc/shadow- If a value of "0" is not returned, this is a finding.
Change the mode of the file "/etc/shadow-" to "0000" by running the following command: $ chmod 0000 /etc/shadow-
Verify the group ownership of the "/etc/shadow" file with the following command: $ stat -c "%G %n" /etc/shadow root /etc/shadow If "/etc/shadow" file does not have a group owner of "root", this is a finding.
Change the group of the file /etc/shadow to root by running the following command: $ chgrp root /etc/shadow
Verify the ownership of the "/etc/shadow" file with the following command: $ stat -c "%U %n" /etc/shadow root /etc/shadow If "/etc/shadow" file does not have an owner of "root", this is a finding.
Change the owner of the file /etc/shadow to root by running the following command: $ chown root /etc/shadow
Verify that the "/etc/shadow" file has mode "0000" with the following command: $ stat -c "%a %n" /etc/shadow 0 /etc/shadow If a value of "0" is not returned, this is a finding.
Change the mode of the file "/etc/shadow" to "0000" by running the following command: $ chmod 0000 /etc/shadow
Verify AlmaLinux OS 9 restricts privilege elevation to authorized personnel with the following command: $ grep -w ALL /etc/sudoers /etc/sudoers.d/* | grep -v '#' /etc/sudoers:root ALL=(ALL) ALL /etc/sudoers:%wheel ALL=(ALL) NOPASSWD: ALL If the either of the following entries are returned, including their NOPASSWD equivalents, this is a finding: ALL ALL=(ALL) ALL ALL ALL=(ALL:ALL) ALL
Remove the following entries from the /etc/sudoers file or configuration files under /etc/sudoers.d/ (including NOPASSWD equivalents): ALL ALL=(ALL) ALL ALL ALL=(ALL:ALL) ALL
Verify that the sudoers security policy is configured to use the invoking user's password for privilege escalation with the following command: $ grep -E '(!rootpw|!targetpw|!runaspw)' /etc/sudoers /etc/sudoers.d/* | grep -v '#' /etc/sudoers.d/01_stig:Defaults !targetpw /etc/sudoers.d/01_stig:Defaults !rootpw /etc/sudoers.d/01_stig:Defaults !runaspw If no results are returned, this is a finding. If results are returned from more than one file location, this is a finding. If "Defaults !targetpw" is not defined, this is a finding. If "Defaults !rootpw" is not defined, this is a finding. If "Defaults !runaspw" is not defined, this is a finding.
Define the following in the Defaults section of the /etc/sudoers file or a single configuration file in the /etc/sudoers.d/ directory: Defaults !targetpw Defaults !rootpw Defaults !runaspw
Verify that the default umask for all local interactive users is "077". Identify the locations of all local interactive user home directories by looking at the "/etc/passwd" file. Check all local interactive user initialization files for interactive users with the following command: Note: The example is for a system that is configured to create users home directories in the "/home" directory. $ grep -ir umask /home | grep -v '.bash_history' If any local interactive user initialization files are found to have a umask statement that sets a value less restrictive than "077", this is a finding.
Remove the umask statement from all local interactive user's initialization files. If the account is for an application, the requirement for a umask less restrictive than "077" can be documented with the information system security officer (ISSO), but the user agreement for access to the account must specify that the local interactive user must first log on to their account and then switch the user to the application account with the correct option to gain the account's environment variables.
Verify AlmaLinux OS 9 defines default permissions for all authenticated users in such a way that the user can only read and modify their own files with the following command: Note: If the value of the "UMASK" parameter is set to "000" in the "/etc/login.defs" file, the severity is raised to a CAT I. $ grep UMASK /etc/login.defs UMASK 077 If the value for the "UMASK" parameter is not "077", or the "UMASK" parameter is missing or is commented out, this is a finding.
Configure AlmaLinux OS 9 to define default permissions for all authenticated users in such a way that the user can only read and modify their own files. Add or edit the lines for the "UMASK" parameter in the "/etc/login.defs" file to "077": UMASK 077
Verify that the "pam_umask" module is enabled with the following command: $ grep -i umask /etc/pam.d/* /etc/pam.d/postlogin:session optional pam_umask.so silent umask=0022 If a "pam_umask.so" line is not returned, this is a finding. If the "umask" setting is set to anything other than "0077", this is a finding. Note: If the "umask" setting is not found, it will use the default UMASK entry in /etc/login.defs.
Configure AlmaLinux OS 9 to define default permissions for all authenticated users so the user can only read and modify their own files. Add or edit the following line at the top of /etc/pam.d/postlogin: session optional pam_umask.so silent
Verify that the "umask" setting for installed shells is "077". Note: If the value of the "umask" parameter is set to "000", the severity is raised to a CAT I. $ grep -ir umask /etc/profile* /etc/bashrc* /etc/csh* /etc/csh.cshrc: umask 077 If the "umask" parameter is set to anything other than "077", this is a finding.
Configure AlmaLinux OS 9 to define default permissions for all authenticated users in such a way that the user can only read and modify their own files. Change any found "umask" parameters in the "/etc/bashrc*", "/etc/csh*", and "/etc/profile*" files to "077": umask 077
Verify that there are no unauthorized interactive user accounts with the following command: $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ... sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt simon:x:1000:1000::/home/simon:/bin/bash Interactive user accounts, generally will have a user identifier (UID) of 1000 or greater, a home directory in a specific partition, and an interactive shell. Obtain the list of interactive user accounts authorized to be on the system from the system administrator or information system security officer (ISSO) and compare it to the list of local interactive user accounts on the system. If there are unauthorized local user accounts on the system, this is a finding.
Remove unauthorized local interactive user accounts with the following command where <unauthorized_user> is the unauthorized account: $ userdel -rf <unauthorized_user>
Verify that that AIDE is verifying ACLs with the following command: $ grep acl /etc/aide.conf All= p+i+n+u+g+s+m+S+sha512+acl+xattrs+selinux If the "acl" rule is not being used on all uncommented selection lines in the "/etc/aide.conf" file, or ACLs are not being checked by another file integrity tool, this is a finding.
Configure the file integrity tool to check file and directory ACLs. If AIDE is installed, ensure the "acl" rule is present on all uncommented file and directory selection lists.
Verify that AIDE is configured to use FIPS 140-3 file hashing with the following command: $ grep sha512 /etc/aide.conf All=p+i+n+u+g+s+m+S+sha512+acl+xattrs+selinux If the "sha512" rule is not being used on all uncommented selection lines in the "/etc/aide.conf" file, or another file integrity tool is not using FIPS 140-3-approved cryptographic hashes for validating file contents and directories, this is a finding.
Configure the file integrity tool to use FIPS 140-3 cryptographic hashes for validating file and directory contents. If AIDE is installed, ensure the "sha512" rule is present on all uncommented file and directory selection lists. Exclude any log files, or files expected to change frequently, to reduce unnecessary notifications.
Verify that AIDE is configured to verify extended attributes with the following command: $ grep xattrs /etc/aide.conf All= p+i+n+u+g+s+m+S+sha512+acl+xattrs+selinux If the "xattrs" rule is not being used on all uncommented selection lines in the "/etc/aide.conf" file, or extended attributes are not being checked by another file integrity tool, this is a finding. If the "acl" rule is not being used on all uncommented selection lines in the "/etc/aide.conf" file, or ACLs are not being checked by another file integrity tool, this is a finding.
Configure the file integrity tool to check file and directory extended attributes. If AIDE is installed, ensure the "xattrs" rule is present on all uncommented file and directory selection lists.
Verify AlmaLinux OS 9 prevents the use of dictionary words for passwords with the following command: $ grep -r dictcheck /etc/security/pwquality.conf* /etc/security/pwquality.conf.d/stig.conf:dictcheck = 1 If the value of "dictcheck" is not "1" , is not set, is commented out, or if conflicting results are returned, this is a finding.
Configure AlmaLinux OS 9 to prevent the use of dictionary words for passwords. Add or update the following line in the "/etc/security/pwquality.conf" file or a configuration file in the "/etc/security/pwquality.conf.d/" directory: dictcheck = 1 Remove any configurations that conflict with the above value.
Note: If IPv6 is disabled on the system, this requirement is Not Applicable. Verify AlmaLinux OS 9 does not accept router advertisements on any IPv6 interfaces, unless the system is a router. Determine if router advertisements are not accepted by using the following command: $ sysctl -a | grep 'accept_ra ' net.ipv6.conf.all.accept_ra = 1 net.ipv6.conf.default.accept_ra = 1 net.ipv6.conf.enp1s0.accept_ra = 0 net.ipv6.conf.lo.accept_ra = 1 If any of the returned lines are not set to "0" and it is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Configure AlmaLinux OS 9 to not accept router advertisements on all IPv6 interfaces unless the system is a router. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv6.conf.all.accept_ra = 0 net.ipv6.conf.default.accept_ra = 0 net.ipv6.conf.lo.accept_ra = 0 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Verify AlmaLinux OS 9 will not accept ICMP redirect messages. Check the value of the "accept_redirects" variables with the following command: $ sysctl -a | grep accept_redirects net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.enp1s0.accept_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv6.conf.enp1s0.accept_redirects = 0 net.ipv6.conf.lo.accept_redirects = 0 If the returned lines do not all have a value of "0", this is a finding.
Configure AlmaLinux OS 9 to ignore ICMP redirect messages. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv6.conf.lo.accept_redirects = 0 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Verify that "firewalld" is active with the following command: $ systemctl is-active firewalld active If the firewalld service is not active, this is a finding.
Enable the firewalld service using the following command: $ systemctl enable --now firewalld
Verify the AlmaLinux OS 9 "firewalld" is configured to employ a deny-all, allow-by-exception policy for allowing connections to other systems. First ensure firewalld is running: $ firewall-cmd --state running Next, get the active zones: $ firewall-cmd --get-active-zones public interfaces: enp1s0 Check the target of the zones returned from the previous command: $ firewall-cmd --info-zone=public | grep target target: DROP Check the runtime and permanent rules match: $ firewall-cmd --permanent --info-zone=public | grep target target: DROP If no zones are active on the AlmaLinux OS 9 interfaces or if runtime and permanent targets are set to a different option other than "DROP", this is a finding.
Configure the "firewalld" daemon to employ a deny-all, allow-by-exception. Start by adding the exceptions that are required for mission functionality to the "drop" zone. If SSH access on port 22 is needed for example, run the following command: $ firewall-cmd --permanent --add-service=ssh --zone=drop Set the default zone to the "drop" zone: $ firewall-cmd --set-default-zone=drop Note: This is a runtime and a permanent change. Add any interfaces to the newly modified "drop" zone: $ firewall-cmd --permanent --zone=drop --change-interface=enp1s0 Reload the firewall rules for changes to take effect: $ firewall-cmd --reload Check zones and interfaces: $ firewall-cmd --get-active-zones drop interfaces: enp1s0 Check new default zone's target is set to "DROP": $ firewall-cmd --permanent --info-zone=drop | grep target target: DROP The same outcome is achieved by creating a new zone, for example: $ firewall-cmd --permanent --new-zone=stig $ firewall-cmd --reload $ firewall-cmd --permanent --change-interface=enp1s0 --zone=stig $ firewall-cmd --permanent --add-service=ssh --zone=stig $ firewall-cmd --permanent --set-target=DROP --zone=stig $ firewall-cmd --set-default-zone=stig
Verify AlmaLinux OS 9 ignores bogus ICMP error responses with the following command: $ sysctl net.ipv4.icmp_ignore_bogus_error_responses net.ipv4.icmp_ignore_bogus_error_responses = 1 If the returned line does not have a value of "1", this is a finding.
Configure AlmaLinux OS 9 to use reverse path filtering on all IP interfaces. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.icmp_ignore_bogus_error_responses = 1 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl --system
Verify AlmaLinux OS 9 does not respond to ICMP echoes sent to a broadcast address with the following command: $ sysctl net.ipv4.icmp_echo_ignore_broadcasts net.ipv4.icmp_echo_ignore_broadcasts = 1 If the returned line does not have a value of "1", this is a finding.
Configure AlmaLinux OS 9 to use reverse path filtering on all IP interfaces. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.icmp_echo_ignore_broadcasts = 1 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Verify AlmaLinux OS 9 is not performing IP packet forwarding, unless the system is a router. Check that IP forwarding is disabled using the following command: $ sysctl -a | grep -E '\.forwarding' net.ipv4.conf.all.forwarding = 0 net.ipv4.conf.default.forwarding = 0 net.ipv4.conf.enp1s0.forwarding = 0 net.ipv4.conf.lo.forwarding = 0 net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.default.forwarding = 0 net.ipv6.conf.enp1s0.forwarding = 0 net.ipv6.conf.lo.forwarding = 0 If any of the returned lines are not set to "0" and it is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Configure AlmaLinux OS 9 to not allow IP packet forwarding, unless the system is a router. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.conf.all.forwarding = 0 net.ipv4.conf.default.forwarding = 0 net.ipv4.conf.lo.forwarding = 0 net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.default.forwarding = 0 net.ipv6.conf.lo.forwarding = 0 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Verify that AlmaLinux OS 9 does not have unauthorized IP tunnels configured. Determine if the "IPsec" service is active with the following command: $ systemctl status ipsec ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec Loaded: loaded (/usr/lib/systemd/system/ipsec.service; disabled; preset: disabled) Active: inactive (dead) If the "IPsec" service is active, check for configured IPsec connections ("conn"), with the following command: $ grep -ri conn /etc/ipsec.conf /etc/ipsec.d/ | grep -v '#' Verify any returned results are documented with the ISSO. If the IPsec tunnels are active and not approved, this is a finding.
Remove all unapproved tunnels from the system, or document them with the ISSO.
Verify AlmaLinux OS 9 logs martian packets. Check the value of the "log_martians" variables with the following command: $ sysctl -a | grep log_martians net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 net.ipv4.conf.enp1s0.log_martians = 1 net.ipv4.conf.lo.log_martians = 1 If the returned lines do not all have a value of "1", this is a finding.
Configure AlmaLinux OS 9 to log martian packets. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 net.ipv4.conf.lo.log_martians = 1 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl --system
Note: If postfix is not installed, this is Not Applicable. Verify AlmaLinux OS 9 is configured to prevent unrestricted mail relaying with the following command: $ postconf -n smtpd_client_restrictions smtpd_client_restrictions = permit_mynetworks,reject If the "smtpd_client_restrictions" parameter contains any entries other than "permit_mynetworks" and "reject", and the additional entries have not been documented with the information system security officer (ISSO), this is a finding.
Modify the postfix configuration file to restrict client connections to the local network with the following command: $ postconf -e 'smtpd_client_restrictions = permit_mynetworks,reject'
Verify that AlmaLinux OS 9 has the nss-tools package installed with the following command: $ dnf list --installed nss-tools Installed Packages nss-tools.x86_64 3.90.0-6.el9_2.tuxcare.1 @@commandline If the "nss-tools" package is not installed, this is a finding.
The nss-tools package can be installed with the following command: $ dnf install nss-tools
Verify network interfaces are not in promiscuous mode with the following command: $ ip link | grep -i promisc If network interfaces are found on the system in promiscuous mode and their use has not been approved by the ISSO and documented, this is a finding.
Configure network interfaces to turn off promiscuous mode unless approved by the ISSO and documented. Set the promiscuous mode of an interface to off with the following command: $ ip link set dev <devicename> multicast off promisc off
Verify AlmaLinux OS 9 uses reverse path filtering on all IP interfaces with the following command: $ sysctl -a | grep -E '\.rp_filter' net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.enp1s0.rp_filter = 1 net.ipv4.conf.lo.rp_filter = 1 If the returned lines do not all have a value of "1", this is a finding.
Configure AlmaLinux OS 9 to use reverse path filtering on all IP interfaces. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.lo.rp_filter = 1 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl --system
Verify AlmaLinux OS 9 does not send ICMP redirects. Check the value of the "send_redirects" variables with the following command: $ sysctl -a | grep send_redirects net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.enp1s0.send_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 If the returned lines do not all have a value of "0", this is a finding.
Configure AlmaLinux OS 9 to not allow interfaces to perform ICMP redirects. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 EOF The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Verify there are no ".shosts" files on AlmaLinux OS 9 with the following command: $ find / -name .shosts If a ".shosts" file is found, this is a finding.
Remove any found ".shosts" files from the system. $ rm /[path]/[to]/[file]/.shosts
Verify there are no "shosts.equiv" files on AlmaLinux OS 9 with the following command: $ find / -name shosts.equiv If a "shosts.equiv" file is found, this is a finding.
Remove any found "shosts.equiv" files from the system. $ rm /[path]/[to]/[file]/shosts.equiv
Verify AlmaLinux OS 9 will not accept source-routed packets. Check the value of the "accept_source_route" variables with the following command: $ sysctl -a | grep accept_source_route net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.enp1s0.accept_source_route = 0 net.ipv4.conf.lo.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv6.conf.default.accept_source_route = 0 net.ipv6.conf.enp1s0.accept_source_route = 0 net.ipv6.conf.lo.accept_source_route = 0 If the returned lines do not all have a value of "0", this is a finding.
Configure AlmaLinux OS 9 to ignore source-routed packets. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.lo.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv6.conf.default.accept_source_route = 0 net.ipv6.conf.lo.accept_source_route = 0 The system configuration files must be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Verify the SSH daemon performs compression after a user successfully authenticates with the following command: $ sshd -T | grep compression Compression no If the "Compression" keyword is set to "yes", this is a finding.
Configure the SSH daemon to not allow compression. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "delayed" or preferably "no": Compression no Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo 'Compression no' > /etc/ssh/sshd_config.d/40-compression.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the group ownership of "/etc/ssh/sshd_config" and any "/etc/ssh/sshd_config.d/*.conf" files with the following command: $ find /etc/ssh/sshd_config /etc/ssh/sshd_config.d -exec stat -c "%G %n" {} \; root /etc/ssh/sshd_config root /etc/ssh/sshd_config.d root /etc/ssh/sshd_config.d/40-stig.conf root /etc/ssh/sshd_config.d/50-redhat.conf root /etc/ssh/sshd_config.d/clientalive.conf If any of the files do not have a group owner of "root", this is a finding.
Configure the SSHD config files to be group-owned by root with the following command: $ chgrp root /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf
Verify the ownership of "/etc/ssh/sshd_config" and any "/etc/ssh/sshd_config.d/*.conf" files with the following command: $ find /etc/ssh/sshd_config /etc/ssh/sshd_config.d -exec stat -c "%U %n" {} \; root /etc/ssh/sshd_config root /etc/ssh/sshd_config.d root /etc/ssh/sshd_config.d/40-stig.conf root /etc/ssh/sshd_config.d/50-redhat.conf root /etc/ssh/sshd_config.d/clientalive.conf If any of the files do not have an owner of "root", this is a finding.
Configure the SSHD config files to be owned by root with the following command: $ chown root /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf
Verify the permissions of "/etc/ssh/sshd_config" and any "/etc/ssh/sshd_config.d/*.conf" files with the following command: $ find /etc/ssh/sshd_config /etc/ssh/sshd_config.d -exec stat -c "%#a %n" {} \; 600 /etc/ssh/sshd_config 755 /etc/ssh/sshd_config.d 600 /etc/ssh/sshd_config.d/40-stig.conf 600 /etc/ssh/sshd_config.d/50-redhat.conf 600 /etc/ssh/sshd_config.d/clientalive.conf If any of the files do not have "0600" permissions, this is a finding.
Configure the SSHD config files to have "0600" permissions with the following command: $ chmod 0600 /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf
Verify the operating system does not allow a noncertificate trusted host SSH logon to the system with the following command: $ sshd -T | grep hostbasedauthentication hostbasedauthentication no If the "HostbasedAuthentication" keyword is not set to "no", this is a finding.
Configure the AlmaLinux OS 9 SSH daemon to not allow a noncertificate trusted host SSH logon to the system with the following command: Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "no": HostbasedAuthentication no Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo 'HostbasedAuthentication no' > /etc/ssh/sshd_config.d/40-hostbasedauthentication.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the SSH private host key files have a mode of "0640" or less permissive with the following command: $ stat -c "%#a %n" /etc/ssh/ssh_host*key 0640 /etc/ssh/ssh_host_ecdsa_key 0640 /etc/ssh/ssh_host_rsa_key If any private host key file has a mode more permissive than "0640", this is a finding.
Configure the mode of SSH private host key files under "/etc/ssh" to "0640" with the following command: $ chmod 0640 /etc/ssh/ssh_host*key Restart the SSH daemon for the changes to take effect: $ systemctl restart sshd.service
Verify the SSH public host key files have a mode of "0644" or less permissive with the following command: Note: SSH public key files may be found in other directories on the system depending on the installation. $ stat -c "%#a %n" /etc/ssh/ssh_host*key.pub 0644 /etc/ssh/ssh_host_ecdsa_key.pub 0644 /etc/ssh/ssh_host_rsa_key.pub If any public key has a mode more permissive than "0644", this is a finding.
Change the mode of public host key files under "/etc/ssh" to "0644" with the following command: $ chmod 0644 /etc/ssh/*key.pub Restart the SSH daemon for the changes to take effect: $ systemctl restart sshd.service
Verify the SSH daemon does not allow known hosts authentication with the following command: $ sshd -T | grep ignoreuserknownhosts ignoreuserknownhosts yes If the value is returned as "no", this is a finding.
Configure the SSH daemon to not allow known hosts authentication. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": IgnoreUserKnownHosts yes Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo 'IgnoreUserKnownHosts yes' > /etc/ssh/sshd_config.d/40-knownhosts.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the SSH daemon provides users with feedback on when account accesses last occurred with the following command: $ sshd -T | grep printlastlog printlastlog yes If the value is returned as "no", this is a finding.
Configure the SSH daemon to provide users with feedback on when account accesses last occurred. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": PrintLastLog yes Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo 'PrintLastLog yes' > /etc/ssh/sshd_config.d/40-lastlog.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the SSH daemon does not allow rhosts authentication with the following command: $ sshd -T | grep ignorerhosts ignorerhosts yes If the "IgnoreRhosts" keyword is set to "no", this is a finding.
Configure the SSH daemon to not allow rhosts authentication. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": IgnoreRhosts yes Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo 'IgnoreRhosts yes' > /etc/ssh/sshd_config.d/40-rhosts.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the SSH daemon does not allow X11Forwarding with the following command: $ sshd -T | grep x11forwarding x11forwarding no If the value is returned as "yes" and X11 forwarding is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Configure the SSH daemon to not allow X11 forwarding. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "no": X11forwarding no Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo 'X11forwarding no' > /etc/ssh/sshd_config.d/40-x11forwarding.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the SSH daemon prevents remote hosts from connecting to the proxy display with the following command: $ sshd -T | grep x11uselocalhost x11uselocalhost yes If the value is returned as "no", this is a finding.
Configure the SSH daemon to prevent remote hosts from connecting to the proxy display. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": X11UseLocalhost yes Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo 'X11UseLocalhost yes' > /etc/ssh/sshd_config.d/40-x11local.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Note: If a TFTP server is not installed, this requirement is Not Applicable. Verify the TFTP daemon is configured to operate in secure mode. Check if a TFTP server is installed with the following command: $ dnf list --installed tftp-server Installed Packages tftp-server.x86_64 5.2-37.el9 @appstream If a TFTP server is installed, check for the server arguments with the following command: $ systemctl cat tftp | grep ExecStart= ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot If the "ExecStart" line does not have a "-s" option, and a subdirectory is not assigned, this is a finding.
Configure the TFTP daemon to operate in secure mode with the following command: $ systemctl edit tftp.service Insert the following between the two sets of comments, making sure to add the "-s" option with a nonroot ("/") directory. [Service] ExecStart= ExecStart=/usr/sbin/in.tftpd -s /tftp
Verify AlmaLinux OS 9 enables hardening for the BPF JIT with the following commands: $ sysctl net.core.bpf_jit_harden net.core.bpf_jit_harden = 2 If the returned line does not have a value of "2", or a line is not returned, this is a finding. Check that the configuration files are present to enable this kernel parameter. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F net.core.bpf_jit_harden | tail -1 net.core.bpf_jit_harden = 2 If the network parameter "net.core.bpf_jit_harden" is not equal to "2" or nothing is returned, this is a finding.
Configure AlmaLinux OS 9 to enable hardening for the BPF JIT compiler. Create a numbered *.conf file in /etc/sysctl.d/ with the following content: net.core.bpf_jit_harden = 2 The system configuration files must be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl –system
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Check the last modification time of the local databases, comparing it to the last modification time of the related keyfiles. The following command will check every dconf database and compare its modification time to the related system keyfiles: $ function dconf_needs_update { for db in $(find /etc/dconf/db -maxdepth 1 -type f); do db_mtime=$(stat -c %Y "$db"); keyfile_mtime=$(stat -c %Y "$db".d/* | sort -n | tail -1); if [ -n "$db_mtime" ] && [ -n "$keyfile_mtime" ] && [ "$db_mtime" -lt "$keyfile_mtime" ]; then echo "$db needs update"; return 1; fi; done; }; dconf_needs_update If the command has any output, then a dconf database needs to be updated, and this is a finding.
Update the dconf databases by running the following command: $ dconf update
Verify that all system device files are correctly labeled to prevent unauthorized modification. List all device files on the system that are incorrectly labeled with the following commands: Note: Device files are normally found under "/dev", but applications may place device files in other directories and may necessitate a search of the entire system. # find /dev -context *:device_t:* \( -type c -o -type b \) -printf "%p %Z\n" # find /dev -context *:unlabeled_t:* \( -type c -o -type b \) -printf "%p %Z\n" Note: There are device files, such as "/dev/vmci", that are used when the operating system is a host virtual machine. They will not be owned by a user on the system and require the "device_t" label to operate. These device files are not a finding. If there is output from either of these commands, other than already noted, this is a finding.
Restore the SELinux policy for the affected device file from the system policy database using the following command: $ restorecon -v <device_path> Substituting "<device_path>" with the path to the affected device file (from the output of the previous commands). An example device file path would be "/dev/ttyUSB0". If the output of the above command does not indicate that the device was relabeled to a more specific SELinux type label, then the SELinux policy of the system must be updated with more specific policy for the device class specified. If a package was used to install support for a device class, that package could be reinstalled using the following command: $ dnf reinstall <package_name> If a package was not used to install the SELinux policy for a given device class, then it must be generated manually and provide specific type labels.
Verify that all local initialization files have a mode of "0740" or less permissive with the following command: Note: The example will be for the "testuser" account, who has a home directory of "/home/testuser". $ find /home/testuser/.[^.]* -maxdepth 0 -perm -740 -exec stat -c "%a %n" {} \; | more 755 /home/testuser/.cache 755 /home/testuser/.mozilla If any local initialization files have a mode more permissive than "0740", this is a finding.
Set the mode of the local initialization files to "0740" with the following command: Note: The example will be for the "testuser" account, who has a home directory of "/home/testuser". $ chmod 0740 /home/testuser/.<INIT_FILE>
Verify that AlmaLinux OS 9 has the gnutls-utils package installed with the following command: $ dnf list --installed gnutls-utils Installed Packages gnutls-utils.x86_64 3.7.6-23.el9_2.tuxcare.3 @@commandline If the "gnutls-utils" package is not installed, this is a finding.
The gnutls-utils package can be installed with the following command: $ dnf install gnutls-utils
Verify that the kdump service is disabled in system boot configuration with the following command: $ systemctl is-enabled kdump masked Verify that the kdump service is not active (i.e., not running) through current runtime configuration with the following command: $ systemctl is-active kdump inactive Verify that the kdump service is masked with the following command: $ systemctl show kdump | grep "LoadState\|UnitFileState" LoadState=masked UnitFileState=masked If the "kdump" service is loaded or active, and is not masked, this is a finding.
Disable the kdump service with the following command: $ systemctl mask --now kdump
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, Gnome Shell. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 disables a user's ability to restart the system with the following command: $ grep -R disable-restart-buttons /etc/dconf/db/* /etc/dconf/db/distro.d/20-authselect:disable-restart-buttons='true' If the "disable-restart-button" setting is not set to "true", is missing or commented out from the dconf database files, this is a finding.
Configure AlmaLinux OS 9 to disable a user's ability to restart the system. Add or update the [org/gnome/settings-daemon/] section of the /etc/dconf/db/local.d/00-security-settings" database file and add or update the following lines: [org/gnome/login-screen] disable-restart-buttons=true Then update the dconf system databases: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 prevents a user from overriding the disable-restart-buttons setting for graphical user interfaces. Determine which profile the system database is using with the following command: $ grep system-db /etc/dconf/profile/user system-db:local Check that graphical settings are locked from nonprivileged user modification with the following command: Note: The example below is using the database "local" for the system, so the path is "/etc/dconf/db/local.d". This path must be modified if a database other than "local" is being used. $ grep disable-restart-buttons /etc/dconf/db/local.d/locks/* /org/gnome/login-screen/disable-restart-buttons If the command does not return at least the example result, this is a finding.
Configure AlmaLinux OS 9 to prevent a user from overriding the disable-restart-buttons setting for graphical user interfaces. Create a database to contain the systemwide graphical user logon settings (if it does not already exist) with the following command: $ touch /etc/dconf/db/local.d/locks/session Add the following line to prevent nonprivileged users from modifying it: /org/gnome/login-screen/disable-restart-buttons Run the following command to update the database: $ dconf update
Verify file systems that are used for removable media are mounted with the "nodev" option with the following command: $ cat /etc/fstab UUID=0cb43738-b102-48f8-9174-061d8ee537b8 /mnt/usbdrive vfat noauto,owner,ro,nosuid,nodev,noexec 0 0 If a file system found in "/etc/fstab" refers to removable media and it does not have the "nodev" option set, this is a finding.
Configure the "/etc/fstab" to use the "nodev" option on file systems that are associated with removable media.
Verify file systems that are used for removable media are mounted with the "noexec" option with the following command: $ cat /etc/fstab UUID=0cb43738-b102-48f8-9174-061d8ee537b8 /mnt/usbdrive vfat noauto,owner,ro,nosuid,nodev,noexec 0 0 If a file system found in "/etc/fstab" refers to removable media and it does not have the "noexec" option set, this is a finding.
Configure the "/etc/fstab" to use the "noexec" option on file systems that are associated with removable media.
Verify file systems that are used for removable media are mounted with the "nosuid" option with the following command: $ cat /etc/fstab UUID=0cb43738-b102-48f8-9174-061d8ee537b8 /mnt/usbdrive vfat noauto,owner,ro,nosuid,nodev,noexec 0 0 If a file system found in "/etc/fstab" refers to removable media and it does not have the "nosuid" option set, this is a finding.
Configure the "/etc/fstab" to use the "nosuid" option on file systems that are associated with removable media.
Verify AlmaLinux OS 9 disables the use of user namespaces with the following commands: $ sysctl user.max_user_namespaces user.max_user_namespaces = 0 If the returned line does not have a value of "0", or a line is not returned, this is a finding. Check that the configuration files are present to enable this kernel parameter. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F user.max_user_namespaces | tail -1 user.max_user_namespaces = 0 If the network parameter "user.max_user_namespaces" is not equal to "0", or nothing is returned, this is a finding.
Configure AlmaLinux OS 9 to disable the use of user namespaces. $ sysctl -w user.max_user_namespaces=0 The system configuration files need to be reloaded for the changes to take effect. To reload the contents of the files, run the following command: $ sysctl --system
Note: If no NFS mounts are configured, this requirement is Not Applicable. Verify AlmaLinux OS 9 has the "nodev" option configured for all NFS mounts with the following command: $ grep nfs /etc/fstab 192.168.1.9:/mnt/export /backups nfs4 rw,nosuid,nodev,noexec,sync,soft,sec=krb5p:krb5i:krb5 If the system is mounting file systems via NFS and the "nodev" option is missing, this is a finding.
Update each NFS mounted file system to use the "nodev" option on file systems that are being imported via NFS.
Note: If no NFS mounts are configured, this requirement is Not Applicable. Verify AlmaLinux OS 9 has the "noexec" option configured for all NFS mounts with the following command: $ grep nfs /etc/fstab 192.168.1.9:/mnt/export /backups nfs4 rw,nosuid,nodev,noexec,sync,soft,sec=krb5p:krb5i:krb5 If the system is mounting file systems via NFS and the "noexec" option is missing, this is a finding.
Update each NFS mounted file system to use the "noexec" option on file systems that are being imported via NFS.
Note: If no NFS mounts are configured, this requirement is Not Applicable. Verify AlmaLinux OS 9 has the "nosuid" option configured for all NFS mounts with the following command: $ grep nfs /etc/fstab 192.168.22.2:/mnt/export /data nfs4 rw,nosuid,nodev,noexec,sync,soft,sec=krb5:krb5i:krb5p If the system is mounting file systems via NFS and the "nosuid" option is missing, this is a finding.
Update each NFS mounted file system to use the "nosuid" option on file systems that are being imported via NFS.
Note: If AlmaLinux OS 9 is configured to use a DNS resolver other than Network Manager, the configuration must be documented and approved by the information system security officer (ISSO). Verify that AlmaLinux OS 9 has a DNS mode configured in Network Manager. $ NetworkManager --print-config [main] dns=none If the "dns" key in the [main] section does not exist or is not set to "none" or "default", this is a finding.
Configure NetworkManager in AlmaLinux OS 9 to use a DNS mode. In "/etc/NetworkManager/NetworkManager.conf" add the following line in the "[main]" section: dns = none NetworkManager must be reloaded for the change to take effect. $ systemctl reload NetworkManager
Verify the name servers used by the system with the following command: $ grep nameserver /etc/resolv.conf nameserver 192.168.2.4 nameserver 192.168.2.5 If less than two lines are returned that are not commented out, this is a finding.
Configure the operating system to use two or more name servers for DNS resolution based on the DNS mode of the system. If the NetworkManager DNS mode is set to "none" in the [main] section of /etc/NetworkManager/NetworkManager.conf, then add the following lines to "/etc/resolv.conf": nameserver [name server 1] nameserver [name server 2] Replace [name server 1] and [name server 2] with the IPs of two different DNS resolvers. If the NetworkManager DNS mode is set to "default", then add two DNS servers to a NetworkManager connection using the following commands: $ nmcli connection modify [connection name] ipv4.dns [name server 1] $ nmcli connection modify [connection name] ipv4.dns [name server 2] Replace [name server 1] and [name server 2] with the IPs of two different DNS resolvers. Replace [connection name] with a valid NetworkManager connection name on the system. Replace "ipv4" with "ipv6" if IPv6 DNS servers are used.
Verify all nonroot local partitions are mounted with the "nodev" option with the following command: $ mount | grep '^/dev\S* on /\S' | grep --invert-match 'nodev' If any output is produced, this is a finding.
Configure the "/etc/fstab" to use the "nodev" option on all nonroot local partitions.
Verify that only the "root" account has a UID "0" assignment with the following command: $ awk -F: '$3 == 0 {print $1}' /etc/passwd root If any accounts other than "root" have a UID of "0", this is a finding.
Change the UID of any account on the system, other than root which has a UID of "0". If the account is associated with system commands or applications, the UID should be changed to one greater than "0" but less than "1000". Otherwise, assign a UID of greater than "1000" that has not already been assigned.
The following command will list which files on the system have file hashes different from what is expected by the RPM database: $ rpm -Va --noconfig | awk '$1 ~ /..5/ && $2 != "c"' If there is an output, this is a finding.
Given the output from the check command, identify the package that provides the output and reinstall it. The following trimmed example output shows a package that has failed verification, been identified, reinstalled, and then passed re-verification: $ rpm -Va --noconfig | awk '$1 ~ /..5/ && $2 != "c"' S.5....T. /usr/bin/tar $ dnf whatprovides /usr/bin/tar tar-2:1.34-6.el9_1.x86_64 : GNU file archiving program $ dnf reinstall tar $ rpm -Va --noconfig | awk '$1 ~ /..5/ && $2 != "c"' [no output]
Verify that GRUB 2 is configured to enable page poisoning to mitigate use-after-free vulnerabilities. Check that the current GRUB 2 configuration has page poisoning enabled with the following command: $ grubby --info=ALL | grep args | grep -v 'page_poison=1' If any output is returned, this is a finding. Check that page poisoning is enabled by default to persist in kernel updates with the following command: $ grep page_poison /etc/default/grub GRUB_CMDLINE_LINUX="page_poison=1" If "page_poison" is not set to "1", is missing or commented out, this is a finding.
Configure AlmaLinux OS 9 to enable page poisoning with the following commands: $ grubby --update-kernel=ALL --args="page_poison=1" Add or modify the following line in "/etc/default/grub" to ensure the configuration survives kernel updates: GRUB_CMDLINE_LINUX="page_poison=1"
Verify users are provided with feedback on when account accesses last occurred with the following command: $ grep pam_lastlog /etc/pam.d/postlogin session required pam_lastlog.so showfailed If "pam_lastlog" is missing from "/etc/pam.d/postlogin" file, or the silent option is present, this is a finding.
Configure AlmaLinux OS 9 to provide users with feedback on when account accesses last occurred by setting the required configuration options in "/etc/pam.d/postlogin". Add the following line to the top of "/etc/pam.d/postlogin": session required pam_lastlog.so showfailed
Verify AlmaLinux OS 9 security patches and updates are installed and up to date. Updates are required to be applied with a frequency determined by organizational policy. Obtain the list of available package security updates from TuxCare. The URL for updates is https://cve.tuxcare.com/els/cve/. It is important to note that updates may not be present on the system if the underlying packages are not installed. Check if there are security updates available that have not been installed with the following command: $ dnf updateinfo list updates security CLSA-2024:1708029809 Important/Sec. gnutls-3.7.6-21.el9_2.tuxcare.els1.x86_64 CLSA-2024:1708029936 Important/Sec. gnutls-3.7.6-21.el9_2.tuxcare.els2.x86_64 CLSA-2024:1708416911 Important/Sec. libxml2-2.9.13-3.el9_2.1.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. python3-rpm-4.16.1.3-22.el9.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. rpm-4.16.1.3-22.el9.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. rpm-build-libs-4.16.1.3-22.el9.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. rpm-libs-4.16.1.3-22.el9.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. rpm-plugin-audit-4.16.1.3-22.el9.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. rpm-plugin-selinux-4.16.1.3-22.el9.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. rpm-plugin-systemd-inhibit-4.16.1.3-22.el9.tuxcare.els1.x86_64 CLSA-2024:1708417063 Moderate/Sec. rpm-sign-libs-4.16.1.3-22.el9.tuxcare.els1.x86_64 Typical update frequency may be overridden by Information Assurance Vulnerability Alert (IAVA) notifications from CYBERCOM. If the system is in not compliant with the organizational patching policy, this is a finding.
Install AlmaLinux OS 9 security patches and updates at the organizationally defined frequency. If system updates are installed via a centralized repository that is configured on the system, all updates can be installed with the following command: $ dnf upgrade
Verify that AlmaLinux OS 9 policycoreutils-python-utils service package is installed with the following command: $ dnf list --installed policycoreutils-python-utils policycoreutils-python-utils.noarch 3.5-1.el9 @AppStream If the "policycoreutils-python-utils" package is not installed, this is a finding.
Install the policycoreutils-python-utils package with the following command: $ dnf install policycoreutils-python-utils
Note: For AlmaLinux OS 9 systems running with FIPS mode enabled, this requirement is Not Applicable. Verify that AlmaLinux OS 9 has enabled the hardware random number generator entropy gatherer service with the following command: $ systemctl is-active rngd active If the "rngd" service is not active, this is a finding.
Install the rng-tools package with the following command: $ dnf install rng-tools Then enable the rngd service run the following command: $ systemctl enable --now rngd
Verify that AlmaLinux OS 9 has the rng-tools package installed with the following command: $ dnf list --installed rng-tools rng-tools.x86_64 6.15-3.el9 @baseos If the "rng-tools" package is not installed, this is a finding.
The rng-tools package can be installed with the following command: $ dnf install rng-tools
Verify the SSH daemon performs strict mode checking of home directory configuration files with the following command: $ sshd -T | grep strictmodes strictmodes yes If the "StrictModes" keyword is set to "no", or no output is returned, this is a finding.
To configure the SSH daemon to perform strict mode checking of home directory configuration files, add or modify the following line in "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": StrictModes yes Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo "StrictModes yes" > /etc/ssh/sshd_config.d/strictmodes.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify that system accounts must not have an interactive login shell with the following command: $ awk -F: '($3<1000){print $1 ":" $3 ":" $7}' /etc/passwd root:0:/bin/bash bin:1:/sbin/nologin daemon:2:/sbin/nologin adm:3:/sbin/nologin lp:4:/sbin/nologin sync:5:/bin/sync shutdown:6:/sbin/shutdown halt:7:/sbin/halt mail:8:/sbin/nologin operator:11:/sbin/nologin games:12:/sbin/nologin ftp:14:/sbin/nologin systemd-coredump:999:/sbin/nologin dbus:81:/sbin/nologin polkitd:998:/sbin/nologin tss:59:/sbin/nologin sssd:997:/sbin/nologin unbound:996:/sbin/nologin fapolicyd:995:/sbin/nologin postfix:89:/sbin/nologin sshd:74:/sbin/nologin chrony:994:/sbin/nologin systemd-oom:989:/usr/sbin/nologin Identify the system accounts from this listing that do not have a nologin shell. If any system account (other than the root account) has a login shell and it is not documented with the information system security officer (ISSO), this is a finding.
Configure AlmaLinux OS 9 so that all noninteractive accounts on the system do not have an interactive shell assigned to them. If the system account needs a shell assigned for mission operations, document the need with the ISSO. Run the following command to disable the interactive shell for a specific noninteractive user account, replacing <user> with the user that has a login shell. $ usermod --shell /sbin/nologin <user> Do not perform the steps in this section on the root account. Doing so will cause the system to become inaccessible.
Verify that a separate file system/partition has been created for "/tmp" with the following command: $ mount | grep ' /tmp ' tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,size=2097152k,inode64) If a separate entry for "/tmp" is not in use, this is a finding.
Migrate the "/tmp" path onto a separate file system.
Verify that local initialization files do not execute world-writable programs with the following command: Note: The example will be for a system that is configured to create user home directories in the "/home" directory. $ find /home -perm -002 -type f -name ".[^.]*" -exec ls -ld {} \; If any local initialization files are found to reference world-writable files, this is a finding.
Set the mode on files being executed by the local initialization files with the following command: $ chmod 0755 <file>
Verify that a separate file system/partition has been created for "/var/log" with the following command: $ mount | grep ' /var/log ' /dev/mapper/luks-e0d162f5-fad8-463e-8e39-6bd09e672961 on /var/log type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If a separate entry for "/var/log" is not in use, this is a finding.
Migrate the "/var/log" path onto a separate file system.
Verify that a separate file system/partition has been created for "/var" with the following command: $ mount | grep ' /var ' /dev/mapper/luks-b23d8276-7844-4e79-8a58-505150b6eb42 on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If a separate entry for "/var" is not in use, this is a finding.
Migrate the "/var" path onto a separate file system.
Verify that a separate file system/partition has been created for "/var/tmp" with the following command: $ mount | grep /var/tmp /dev/mapper/luks-0e7206e7-bfb1-4a23-ae14-b9cea7cf76d5 on /var/tmp type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If a separate entry for "/var/tmp" is not in use, this is a finding.
Migrate the "/var/tmp" path onto a separate file system.
Verify the current GRUB 2 configuration disables virtual system calls with the following command: $ grubby --info=ALL | grep args | grep -v 'vsyscall=none' If any output is returned, this is a finding. Check that virtual system calls are disabled by default to persist in kernel updates with the following command: $ grep vsyscall /etc/default/grub GRUB_CMDLINE_LINUX="vsyscall=none" If "vsyscall" is not set to "none", is missing or commented out, and is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Document the use of virtual system calls with the ISSO as an operational requirement, or disable them with the following command: $ grubby --update-kernel=ALL --args="vsyscall=none" Add or modify the following line in "/etc/default/grub" to ensure the configuration survives kernel updates: GRUB_CMDLINE_LINUX="vsyscall=none"
Verify that "rsyslog" is configured to log cron events with the following command: Note: If another logging package is used, substitute the utility configuration file for "/etc/rsyslog.conf" or "/etc/rsyslog.d/*.conf" files. $ grep -s cron /etc/rsyslog.conf /etc/rsyslog.d/*.conf /etc/rsyslog.conf:*.info;mail.none;authpriv.none;cron.none /var/log/messages /etc/rsyslog.conf:# Log cron stuff /etc/rsyslog.conf:cron.* /var/log/cron If the command does not return a response, check for cron logging all facilities with the following command: $ grep -s /var/log/messages /etc/rsyslog.conf /etc/rsyslog.d/*.conf /etc/rsyslog.conf:*.info;mail.none;authpriv.none;cron.none /var/log/messages If "rsyslog" is not logging messages for the cron facility or all facilities, this is a finding.
Configure "rsyslog" to log all cron messages by adding or updating the following line to "/etc/rsyslog.conf" or a configuration file in the /etc/rsyslog.d/ directory: cron.* /var/log/cron The rsyslog daemon must be restarted for the changes to take effect: $ systemctl restart rsyslog.service
Verify that AlmaLinux OS 9 is not configured to receive remote logs using rsyslog with the following commands: $ grep -i modload /etc/rsyslog.conf /etc/rsyslog.d/* $ModLoad imtcp $ModLoad imrelp $ grep -i serverrun /etc/rsyslog.conf /etc/rsyslog.d/* $InputTCPServerRun 514 $InputRELPServerRun 514 Note: An error regarding no files or directories may be returned. This is not a finding. If any lines are returned by the command, then rsyslog is configured to receive remote messages, and this is a finding. If any modules are being loaded in the "/etc/rsyslog.conf" file or in the "/etc/rsyslog.d" subdirectories, ask to view the documentation for the system being used for log aggregation. If the documentation does not exist or does not specify the server as a log aggregation system, this is a finding.
Configure AlmaLinux OS 9 to not receive remote logs using rsyslog. Remove the lines in /etc/rsyslog.conf and any files in the /etc/rsyslog.d directory that match any of the following: $ModLoad imtcp $ModLoad imudp $ModLoad imrelp $InputTCPServerRun [0-9]* $UDPServerRun [0-9]* $InputRELPServerRun [0-9]* The rsyslog daemon must be restarted for the changes to take effect: $ systemctl restart rsyslog.service
Verify "/home" is mounted with the "nosuid" option with the following command: Note: If a separate file system has not been created for the user home directories (user home directories are mounted under "/"), this is automatically a finding, as the "nosuid" option cannot be used on the "/" system. $ mount | grep /home /dev/mapper/luks-10a20c46-483d-4d12-831f-5328eda18fd1 on /home type xfs (rw,nosuid,nodev,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/home" file system is mounted without the "nosuid" option, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/home" directory.
Verify "/home" is mounted with the "nodev" option with the following command: Note: If a separate file system has not been created for the user home directories (user home directories are mounted under "/"), this is automatically a finding, as the "nodev" option cannot be used on the "/" system. $ mount | grep /home /dev/mapper/luks-10a20c46-483d-4d12-831f-5328eea18fd1 on /home type xfs (rw,nosuid,nodev,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/home" file system is mounted without the "nodev" option, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/home" directory.
Note: For systems that use BIOS, this requirement is Not Applicable. Verify the /boot/efi directory is mounted with the "nosuid" option with the following command: $ mount | grep '\s/boot/efi\s' /dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro) If the /boot/efi file system does not have the "nosuid" option set, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/boot/efi" directory.
Verify that the "/boot" mount point has the "nodev" option is with the following command: $ mount | grep '\s/boot\s' /dev/sda2 on /boot type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/boot" file system does not have the "nodev" option set, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/boot" directory.
Verify the /boot directory is mounted with the "nosuid" option with the following command: $ mount | grep '\s/boot\s' /dev/sda2 on /boot type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the /boot file system does not have the "nosuid" option set, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/boot" directory.
Verify "/dev/shm" is mounted with the "nodev" option with the following command: $ mount | grep /dev/shm tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,seclabel,size=2097152k,inode64) If the /dev/shm file system is mounted without the "nodev" option, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/dev/shm" file system.
Verify "/dev/shm" is mounted with the "noexec" option with the following command: $ mount | grep /dev/shm tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,seclabel,size=2097152k,inode64) If the /dev/shm file system is mounted without the "noexec" option, this is a finding.
Modify "/etc/fstab" to use the "noexec" option on the "/dev/shm" file system.
Verify "/dev/shm" is mounted with the "nosuid" option with the following command: $ mount | grep /dev/shm tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,seclabel,size=2097152k,inode64) If the /dev/shm file system is mounted without the "noexec" option, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/dev/shm" file system.
Verify "/tmp" is mounted with the "nodev" option: $ mount | grep ' /tmp' tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,size=2097152k,inode64) If the "/tmp" file system is mounted without the "nodev" option, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/tmp" directory.
Verify "/tmp" is mounted with the "noexec" option: $ mount | grep ' /tmp' tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,size=2097152k,inode64) If the "/tmp" file system is mounted without the "noexec" option, this is a finding.
Modify "/etc/fstab" to use the "noexec" option on the "/tmp" directory.
Verify "/tmp" is mounted with the "nosuid" option: $ mount | grep ' /tmp' tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,size=2097152k,inode64) If the "/tmp" file system is mounted without the "nosuid" option, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/tmp" directory.
Verify "/var/log/audit" is mounted with the "nodev" option: $ mount | grep /var/log/audit /dev/mapper/luks-29b74747-2f82-4472-82f5-0b5eb763effc on /var/log/audit type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/log/audit" file system is mounted without the "nodev" option, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/var/log/audit" directory.
Verify "/var/log/audit" is mounted with the "noexec" option: $ mount | grep /var/log/audit /dev/mapper/luks-29b74747-2f82-4472-82f5-0b5eb763effc on /var/log/audit type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/log/audit" file system is mounted without the "noexec" option, this is a finding.
Modify "/etc/fstab" to use the "noexec" option on the "/var/log/audit" directory.
Verify "/var/log/audit" is mounted with the "nosuid" option: $ mount | grep /var/log/audit /dev/mapper/luks-29b74747-2f82-4472-82f5-0b5eb763effc on /var/log/audit type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/log/audit" file system is mounted without the "nosuid" option, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/var/log/audit" directory.
Verify "/var/log" is mounted with the "nodev" option: $ mount | grep '/var/log ' /dev/mapper/luks-e0d162f5-fad8-463e-8e39-6bd09e672961 on /var/log type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/log" file system is mounted without the "nodev" option, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/var/log" directory.
Verify "/var/log" is mounted with the "noexec" option: $ mount | grep '/var/log ' /dev/mapper/luks-e0d162f5-fad8-463e-8e39-6bd09e672961 on /var/log type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/log" file system is mounted without the "noexec" option, this is a finding.
Modify "/etc/fstab" to use the "noexec" option on the "/var/log" directory.
Verify "/var/log" is mounted with the "nosuid" option: $ mount | grep '/var/log ' /dev/mapper/luks-e0d162f5-fad8-463e-8e39-6bd09e672961 on /var/log type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/log" file system is mounted without the "nosuid" option, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/var/log" directory.
Verify "/var" is mounted with the "nodev" option: $ mount | grep ' /var ' /dev/mapper/luks-b23d8276-7844-4e79-8a58-505150b6eb42 on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var" file system is mounted without the "nodev" option, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/var" directory.
Verify "/var/tmp" is mounted with the "nodev" option: $ mount | grep /var/tmp /dev/mapper/luks-0e7206e7-bfb1-4a23-ae14-b9cea7cf76d5 on /var/tmp type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/tmp" file system is mounted without the "nodev" option, this is a finding.
Modify "/etc/fstab" to use the "nodev" option on the "/var/tmp" directory.
Verify "/var/tmp" is mounted with the "noexec" option: $ mount | grep /var/tmp /dev/mapper/luks-0e7206e7-bfb1-4a23-ae14-b9cea7cf76d5 on /var/tmp type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/tmp" file system is mounted without the "noexec" option, this is a finding.
Modify "/etc/fstab" to use the "noexec" option on the "/var/tmp" directory.
Verify "/var/tmp" is mounted with the "nosuid" option: $ mount | grep /var/tmp /dev/mapper/luks-0e7206e7-bfb1-4a23-ae14-b9cea7cf76d5 on /var/tmp type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) If the "/var/tmp" file system is mounted without the "nosuid" option, this is a finding.
Modify "/etc/fstab" to use the "nosuid" option on the "/var/tmp" directory.
Verify that AlmaLinux OS 9 fapolicyd is active with the following command: $ systemctl status fapolicyd fapolicyd.service - File Access Policy Daemon Loaded: loaded (/usr/lib/systemd/system/fapolicyd.service; enabled; preset: disabled) Active: active (running) since Thu 2024-02-08 09:42:05 UTC; 3h 38min ago If fapolicyd module is not active, this is a finding.
Enable the fapolicyd with the following command: $ systemctl enable --now fapolicyd
Verify that AlmaLinux OS 9 fapolicyd package is installed with the following command: $ dnf list --installed fapolicyd Installed Packages fapolicyd.x86_64 1.1.3-104.el9 @AppStream If the "fapolicyd" package is not installed, this is a finding.
Install the fapolicyd package with the following command: $ dnf install fapolicyd
Verify AlmaLinux OS 9 disables remote management of the chrony daemon with the following command: $ chronyd -p | grep -w cmdport cmdport 0 If the "cmdport" option is not set to "0" or is missing, this is a finding.
Configure AlmaLinux OS 9 to disable remote management of the chrony daemon by adding/modifying the following line in the /etc/chrony.conf file: cmdport 0
Verify AlmaLinux OS 9 disables the chrony daemon from acting as a server with the following command: $ chronyd -p | grep -w port port 0 If the "port" option is not set to "0" or is missing, this is a finding.
Configure AlmaLinux OS 9 to disable the chrony daemon from acting as a server by adding/modifying the following line in the /etc/chrony.conf file: port 0
Verify that the iprutils package is not installed with the following command: $ dnf list --installed iprutils Error: No matching Packages to list If the "iprutils" package is installed and is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Remove the iprutils package with the following command: $ dnf remove iprutils
Verify that the quagga package is not installed with the following command: $ dnf list --installed quagga Error: No matching Packages to list If the "quagga" package is installed, and is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Remove the quagga package with the following command: $ dnf remove quagga
Verify that the sendmail package is not installed with the following command: $ dnf list --installed sendmail Error: No matching Packages to list If the "sendmail" package is installed, this is a finding.
Remove the sendmail package with the following command: $ dnf remove sendmail
Verify that the telnet-server package is not installed with the following command: $ dnf list --installed telnet-server Error: No matching Packages to list If the "telnet-server" package is installed, this is a finding.
Remove the telnet-server package with the following command: $ dnf remove telnet-server
Verify that the tftp package is not installed with the following command: $ dnf list --installed tftp If the "tftp" package is installed, this is a finding.
Remove the tftp package with the following command: $ dnf remove tftp
Verify that the cups package is not installed with the following command: $ dnf list –installed cups Error: No matching Packages to list If the "cups" package is installed, this is a finding.
Remove the cups package with the following command: $ dnf remove cups
Verify that the gssproxy package is not installed with the following command: $ dnf list --installed gssproxy Error: No matching Packages to list If the "gssproxy" package is installed and is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Remove the gssproxy package with the following command: $ dnf remove gssproxy
Verify that AlmaLinux OS 9 disables the ability to load the atm kernel module with the following command: $ grep -r atm /etc/modprobe.conf /etc/modprobe.d/* /etc/modprobe.d/atm.conf:install atm /bin/false /etc/modprobe.d/atm.conf:blacklist atm If the command does not return any output, or the line is commented out, and use of atm is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the atm kernel module from being loaded, run the following command: $ cat << EOF | tee /etc/modprobe.d/atm.conf install atm /bin/false blacklist atm EOF
Verify that AlmaLinux OS 9 disables the ability to load the Bluetooth kernel module with the following command: $ grep -r bluetooth /etc/modprobe.conf /etc/modprobe.d/* /etc/modprobe.d/bluetooth.conf:install bluetooth /bin/false /etc/modprobe.d/bluetooth.conf:blacklist bluetooth If the command does not return any output, or the line is commented out, and use of Bluetooth is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the Bluetooth kernel module from being loaded, run the following command: $ cat << EOF | tee /etc/modprobe.d/bluetooth.conf install bluetooth /bin/false blacklist bluetooth EOF
Verify that AlmaLinux OS 9 disables the ability to load the can kernel module with the following command: $ grep -r can /etc/modprobe.conf /etc/modprobe.d/* /etc/modprobe.d/can.conf:install can /bin/false /etc/modprobe.d/can.conf:blacklist can If the command does not return any output, or the line is commented out, and use of CAN is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the can kernel module from being loaded, run the following command: $ cat << EOF | tee /etc/modprobe.d/can.conf install can /bin/false blacklist can EOF
Verify that AlmaLinux OS 9 disables the ability to load the cramfs kernel module with the following command: $ grep cramfs /etc/modprobe.conf /etc/modprobe.d/* blacklist cramfs If the command does not return any output, or the line is commented out, and use of cramfs is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the cramfs kernel module from being loaded, create a *.conf file in /etc/modprobe.d/ with the following content: install cramfs /bin/false blacklist cramfs
Verify that AlmaLinux OS 9 disables the ability to load the SCTP kernel module with the following command: $ grep -r sctp /etc/modprobe.conf /etc/modprobe.d/* /etc/modprobe.d/sctp.conf:install sctp /bin/false /etc/modprobe.d/sctp.conf:blacklist sctp If the command does not return any output, or the line is commented out, and use of SCTP is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the SCTP kernel module from being loaded, run the following command: $ cat << EOF | tee /etc/modprobe.d/sctp.conf install sctp /bin/false blacklist sctp EOF
Verify that AlmaLinux OS 9 disables the ability to load the squashfs kernel module with the following command: $ grep squashfs /etc/modprobe.conf /etc/modprobe.d/* blacklist squashfs If the command does not return any output, or the line is commented out, and use of squashfs is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the squashfs kernel module from being loaded, create a *.conf file in /etc/modprobe.d/ with the following content: install squashfs /bin/false blacklist squashfs
Verify that AlmaLinux OS 9 disables the ability to load the TIPC kernel module with the following command: $ grep -r tipc /etc/modprobe.conf /etc/modprobe.d/* /etc/modprobe.d/tipc.conf:install tipc /bin/false /etc/modprobe.d/tipc.conf:blacklist tipc If the command does not return any output, or the line is commented out, and use of TIPC is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the TIPC kernel module from being loaded, run the following command: $ cat << EOF | tee /etc/modprobe.d/tipc.conf install tipc /bin/false blacklist tipc EOF
Verify that AlmaLinux OS 9 disables the ability to load the udf kernel module with the following command: $ grep udf /etc/modprobe.conf /etc/modprobe.d/* blacklist udf If the command does not return any output, or the line is commented out, and use of UDF is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the udf kernel module from being loaded, create a *.conf file in /etc/modprobe.d/ with the following content: install udf /bin/false blacklist udf
Verify the operating system disables the ability to load the uvcvideo kernel module: $ grep -r uvcvideo /etc/modprobe.conf /etc/modprobe.d/* /etc/modprobe.d/uvcvideo.conf:install uvcvideo /bin/false /etc/modprobe.d/uvcvideo.conf:blacklist uvcvideo If the command does not return any output, or either line is commented out, and the collaborative computing device has not been authorized for use, this is a finding. If a built-in camera is not protected with a cover or is not physically disabled, this is a finding. For an external camera, if there is not a method for the operator to manually disconnect the camera (e.g., unplug, power off) at the end of collaborative computing sessions, this is a finding. If the device or operating system does not have a camera installed, this requirement is not applicable.
To configure the system to prevent the uvcvideo kernel module from being loaded, run the following command: $ cat << EOF | tee /etc/modprobe.d/uvcvideo.conf install uvcvideo /bin/false blacklist uvcvideo EOF
Verify that the nfs-utils package is not installed with the following command: $ dnf list --installed nfs-utils Error: No matching Packages to list If the "nfs-utils" package is installed, this is a finding.
Remove the nfs-utils package with the following command: $ dnf remove nfs-utils
Verify that the rsh package is not installed with the following command: $ dnf list --installed rsh Error: No matching Packages to list If the "rsh" package is installed, this is a finding.
Remove the rsh package with the following command: $ dnf remove rsh
Verify that the rsh-server package is not installed with the following command: $ dnf list --installed rsh-server Error: No matching Packages to list If the "rsh-server" package is installed, this is a finding.
Remove the rsh-server package with the following command: $ dnf remove rsh-server
Verify that the tuned package is not installed with the following command: $ dnf list --installed tuned Error: No matching Packages to list If the "tuned" package is installed and is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Remove the tuned package with the following command: $ dnf remove tuned
Verify that a graphical user interface is not installed with the following command: $ dnf list --installed "xorg-x11-server-common" Error: No matching Packages to list If the "xorg-x11-server-common" package is installed, and the use of a graphical user interface has not been documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Document the requirement for a graphical user interface with the ISSO or remove all xorg packages with the following command: Warning: If accessing the system through the graphical user interface, change to the multi-user.target with the following command: $ systemctl isolate multi-user.target Warning: Removal of the graphical user interface will immediately render it useless. The following commands must not be run from a virtual terminal emulator in the graphical interface. $ dnf remove "xorg*" $ systemctl set-default multi-user.target
Verify that the ypserv package is not installed with the following command: $ dnf list --installed ypserv Error: No matching Packages to list If the "ypserv" package is installed, this is a finding.
Remove the nfs-utils package with the following command: $ dnf remove ypserv
Verify that the avahi package is not installed with the following command: $ dnf list –installed avahi Error: No matching Packages to list If the "avahi" package is installed, this is a finding.
Remove the avahi package with the following command: $ dnf remove avahi
Verify that AlmaLinux OS 9 disables the ability to load the USB Storage kernel module with the following command: $ grep -r usb-storage /etc/modprobe.conf /etc/modprobe.d/* /etc/modprobe.d/usb-storage.conf:install usb-storage /bin/false /etc/modprobe.d/usb-storage.conf:blacklist usb-storage If the command does not return any output, or the line is commented out, and use of usb-storage is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
To configure the system to prevent the usb-storage kernel module from being loaded, run the following command: $ cat << EOF | tee /etc/modprobe.d/usb-storage.conf install usb-storage /bin/false blacklist usb-storage EOF
Verify that the firewalld package is installed with the following command: $ dnf list --installed firewalld Installed Packages firewalld.noarch 1.2.1-1.el9 @anaconda If the "firewalld" package is not installed, this is a finding.
Install the "firewalld" package using the following command: $ dnf install firewalld
Verify that "/etc/sudoers" has no occurrences of "!authenticate" with the following command: $ grep '!authenticate' /etc/sudoers /etc/sudoers.d/* If any occurrences of "!authenticate" are returned, this is a finding.
Configure AlmaLinux OS 9 to not allow users to execute privileged actions without authenticating. Remove any occurrence of "!authenticate" found in the "/etc/sudoers" file or files in the "/etc/sudoers.d" directory with the following command: $ sed -i '/\!authenticate/ s/^/# /g' /etc/sudoers /etc/sudoers.d/*
Verify that the sudo configuration files have no occurrences of "NOPASSWD" with the following command: $ grep NOPASSWD /etc/sudoers /etc/sudoers.d/* If any occurrences of "NOPASSWD" are returned from the command and have not been documented with the information systems security officer (ISSO) as an organizationally defined administrative group using multifactor authentication (MFA), this is a finding.
Configure AlmaLinux OS 9 to not allow users to execute privileged actions without authenticating with a password. Remove any occurrence of "NOPASSWD" found in the "/etc/sudoers" file or files in the "/etc/sudoers.d" directory using the following command: $ sed -i '/NOPASSWD/ s/^/# /g' /etc/sudoers /etc/sudoers.d/*
Verify the operating system is not configured to bypass password requirements for privilege escalation with the following command: $ grep pam_succeed_if /etc/pam.d/sudo If any occurrences of "pam_succeed_if" are returned, this is a finding.
Configure the operating system to require users to supply a password for privilege escalation. Remove any occurrences of " pam_succeed_if " in the "/etc/pam.d/sudo" file.
Verify AlmaLinux OS 9 requires reauthentication when using the "sudo" command to elevate privileges with the following command: $ grep timestamp_timeout /etc/sudoers /etc/sudoers.d/* /etc/sudoers.d/01_stig:Defaults timestamp_timeout=0 If "timestamp_timeout" is set to a negative number, is commented out, conflicting results or no results are returned, this is a finding.
Configure AlmaLinux OS 9 to reauthenticate "sudo" commands after the specified timeout: Add the following line to "/etc/sudoers" or a file within "/etc/sudoers.d/": Defaults timestamp_timeout=0
Verify that AlmaLinux OS 9 requires uses to be members of the "wheel" group with the following command: $ grep pam_wheel /etc/pam.d/su auth required pam_wheel.so use_uid If a line for "pam_wheel.so" does not exist, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to require users to be in the "wheel" group to run "su" command. In the "/etc/pam.d/su" file, uncomment the "pam_wheel.so" line as per the instructions in the file: # Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid If necessary, create a "wheel" group and add administrative users to the group.
Verify that AlmaLinux OS 9 contains no duplicate GIDs with the following command: $ cut -f3 -d":" /etc/group | uniq -d If the system has duplicate GIDs, this is a finding.
Provide each group that has a duplicate GID with a unique GID using the "groupmod" command, for example: $ groupmod -g 1002 mygroup
Verify that AlmaLinux OS 9 contains no duplicate UIDs for interactive users with the following command: $ cut -f3 -d":" /etc/passwd | uniq -d If output is produced and the UIDs listed are for interactive user accounts, this is a finding.
Provide each interactive user that has a duplicate UID with a unique UID using the "usermod" command, for example: $ usermod -u 1002 myuser
Verify that all AlmaLinux OS 9 interactive users have a valid GID with the following command: $ pwck -r /etc/passwd If the system has any interactive users with a nonexistent primary group, this is a finding.
Configure the system so that all GIDs referenced in "/etc/passwd" are defined in "/etc/group".
Note: If the system administrator (SA) demonstrates the use of an approved alternate multifactor authentication method, this requirement is Not Applicable. Verify that AlmaLinux OS 9 SSH daemon accepts public key encryption with the following command: $ sshd -T | grep -i pubkeyauthentication pubkeyauthentication yes If "PubkeyAuthentication" is set to no, or the line is missing, this is a finding.
Configure the SSH daemon to accept public key encryption. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": PubkeyAuthentication yes Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ cat << EOF | tee /etc/ssh/sshd_config.d/pubkey.conf PubkeyAuthentication yes EOF Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify that AlmaLinux OS 9 has the opensc package installed with the following command: $ dnf list --installed opensc Installed Packages opensc.x86_64 0.22.0-2.el9 @anaconda If the "opensc" package is not installed, this is a finding.
The opensc package can be installed with the following command: $ dnf install opensc
Verify that the "pcscd" socket is active with the following command: $ systemctl status pcscd.socket pcscd.socket - PC/SC Smart Card Daemon Activation Socket Loaded: loaded (/usr/lib/systemd/system/pcscd.socket; enabled; preset: enabled) Active: active (listening) since Thu 2024-04-11 16:03:24 BST; 2 weeks 3 days ago Triggers: pcscd.service Listen: /run/pcscd/pcscd.comm (Stream) CGroup: /system.slice/pcscd.socket If the pcscd.socket is not active, this is a finding.
To enable pcscd run the following command: $ systemctl enable --now pcscd.socket $ systemctl enable --now pcscd.service The pcscd service will be enabled when software tries to access the socket.
Note: If the System Administrator demonstrates the use of an approved alternate multifactor authentication method, this requirement is Not Applicable. Verify that AlmaLinux OS 9 has the pcsc-lite package installed with the following command: $ dnf list --installed pcsc-lite Installed Packages pcsc-lite.x86_64 1.9.4-1.el9 @anaconda If the "pcsc-lite" package is not installed, this is a finding.
The pcsc-lite package can be installed with the following command: $ dnf install pcsc-lite
Note: If the system administrator (SA) demonstrates the use of an approved alternate multifactor authentication method, this requirement is Not Applicable. Verify the operating system implements Online Certificate Status Protocol (OCSP) and is using the proper digest value on the system with the following command: $ grep certificate_verification /etc/sssd/sssd.conf /etc/sssd/conf.d/*.conf /etc/sssd/conf.d/certificate_verification.conf:certificate_verification = ocsp_dgst=sha512 If the certificate_verification line is missing from the [sssd] section, or is missing "ocsp_dgst=sha512", ask the administrator to indicate what type of multifactor authentication is being used and how the system implements certificate status checking. If there is no evidence of certificate status checking being used, this is a finding.
Edit the file "/etc/sssd/sssd.conf" or a "*.conf" file within the "/etc/sssd/conf.d/" directory and add or edit the following line within the [sssd] section: certificate_verification = ocsp_dgst=sha512
Note: If the System Administrator demonstrates the use of an approved alternate multifactor authentication method, this requirement is Not Applicable. Verify that AlmaLinux OS 9 has smart cards are enabled in System Security Services Daemon (SSSD), run the following command: $ grep pam_cert_auth /etc/sssd/sssd.conf /etc/sssd/conf.d/*.conf /etc/sssd/conf.d/certificate_verification.conf:pam_cert_auth = True If "pam_cert_auth" is not set to "True", the line is commented out, or the line is missing, this is a finding.
Edit the file "/etc/sssd/sssd.conf" or a "*.conf" file within the "/etc/sssd/conf.d/" directory and add or edit the following line within the [pam] section: pam_cert_auth = True
Note: If the System Administrator demonstrates the use of an approved alternate multifactor authentication method, this requirement is Not Applicable. Verify that AlmaLinux OS 9 has the openssl-pkcs11 package installed with the following command: $ dnf list --installed openssl-pkcs11 Installed Packages openssl-pkcs11.x86_64 0.4.11-7.el9 @baseos If the "openssl-pkcs11" package is not installed, this is a finding.
The openssl-pkcs11 package can be installed with the following command: $ dnf install openssl-pkcs11
Verify AlmaLinux OS 9 remote access using SSH prevents logging on with a blank password with the following command: $ sshd -T | grep -i permitemptypasswords permitemptypasswords no If "PermitEmptyPasswords" is set to "yes", or the line is missing, this is a finding.
Configure the SSH daemon to prevent users logging in with blank passwords. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": PermitEmptyPasswords no Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ cat << EOF | tee /etc/ssh/sshd_config.d/emptypasswords.conf PermitEmptyPasswords no EOF Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify that AlmaLinux OS 9 loads the CAC driver with the following command: $ grep card_drivers /etc/opensc.conf card_drivers = cac; If "cac" is not listed as a card driver, or there is no line returned for "card_drivers", this is a finding.
Configure AlmaLinux OS 9 to load the CAC driver. Add or modify the following line in the "/etc/opensc.conf" file: card_drivers = cac;
Verify AlmaLinux OS 9 prevents users from logging on directly as "root" over SSH with the following command: $ sshd -T |grep -I permitrootlogin permitrootlogin no If the "PermitRootLogin" keyword is set to "yes" or "without-password", this is a finding.
To configure the system to prevent users from logging on directly as root over SSH, add or modify the following line in "/etc/ssh/sshd_config": PermitRootLogin no Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo "PermitRootLogin no" > /etc/ssh/sshd_config.d/root.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 disables the graphical user interface automount function with the following command: $ gsettings get org.gnome.desktop.media-handling automount-open false If "automount-open" is set to "true", and is not documented with the information system security officer (ISSO) as an operational requirement, this is a finding.
Configure the GNOME desktop to disable automated mounting of removable media. The dconf settings can be edited in the /etc/dconf/db/* location. Update the [org/gnome/desktop/media-handling] section of the "/etc/dconf/db/local.d/00-security-settings" database file and add or update the following lines: [org/gnome/desktop/media-handling] automount-open=false Then update the dconf system databases: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 disables ability of the user to override the graphical user interface automount setting. Determine which profile the system database is using with the following command: $ grep system-db /etc/dconf/profile/user system-db:local Check that the automount setting is locked from nonprivileged user modification with the following command: Note: The example below is using the database "local" for the system, so the path is "/etc/dconf/db/local.d". This path must be modified if a database other than "local" is being used. $ grep 'automount-open' /etc/dconf/db/local.d/locks/* /org/gnome/desktop/media-handling/automount-open If the command does not return at least the example result, this is a finding.
Configure the GNOME desktop to not allow a user to change the setting that disables automated mounting of removable media. Add the following line to "/etc/dconf/db/local.d/locks/00-security-settings-lock" to prevent user modification: /org/gnome/desktop/media-handling/automount-open Then update the dconf system databases: $ dconf update
Note: This requirement assumes the use of the AlmaLinux OS 9 default graphical user interface, the GNOME desktop environment. If the system does not have any graphical user interface installed, this requirement is Not Applicable. Verify AlmaLinux OS 9 disables ability of the user to override the graphical user interface autorun setting. Determine which profile the system database is using with the following command: $ grep system-db /etc/dconf/profile/user system-db:local Check that the automount setting is locked from nonprivileged user modification with the following command: Note: The example below is using the database "local" for the system, so the path is "/etc/dconf/db/local.d". This path must be modified if a database other than "local" is being used. $ grep 'autorun-never' /etc/dconf/db/local.d/locks/* /org/gnome/desktop/media-handling/autorun-never If the command does not return at least the example result, this is a finding.
Configure the GNOME desktop to not allow a user to change the setting that disables autorun on removable media. Add the following line to "/etc/dconf/db/local.d/locks/00-security-settings-lock" to prevent user modification: /org/gnome/desktop/media-handling/autorun-never Then update the dconf system databases: $ dconf update
Note: If the system is virtual machine with no virtual or physical USB peripherals attached, this is not a finding. Verify USBGuard is installed on the operating system with the following command: $ dnf list installed usbguard Installed Packages usbguard.x86_64 1.0.0-15.el9 @AppStream If the USBGuard package is not installed, ask the SA to indicate how unauthorized peripherals are being blocked. If there is no evidence that unauthorized peripherals are being blocked before establishing a connection, this is a finding.
Install the usbguard package with the following command: $ dnf install usbguard
Note: If the system is virtual machine with no virtual or physical USB peripherals attached, this is not a finding. Verify AlmaLinux OS 9 has USBGuard enabled with the following command: $ systemctl status usbguard usbguard.service - USBGuard daemon Loaded: loaded (/usr/lib/systemd/system/usbguard.service; enabled; preset: disabled) Active: active (running) since Thu 2024-02-08 09:42:05 UTC; 1h 24min ago If USBGuard is not active, ask the SA to indicate how unauthorized peripherals are being blocked. If there is no evidence that unauthorized peripherals are being blocked before establishing a connection, this is a finding.
To enable the USBGuard service run the following command: $ systemctl enable --now usbguard
Note: If the system is virtual machine with no virtual or physical USB peripherals attached, this is not a finding. Verify the USBGuard has a policy configured with the following command: $ usbguard list-rules 1: allow id 1d6b:0002 serial "0000:03:00.0" name "xHCI Host Controller" with-interface 09:00:00 with-connect-type "" 2: allow id 1d6b:0003 serial "0000:03:00.0" name "xHCI Host Controller" with-interface 09:00:00 with-connect-type "" 3: allow id 0627:0001 serial "28754-0000:00:02.2:00.0-1" name "QEMU USB Tablet" with-interface 03:00:00 with-connect-type "unknown" If the command does not return results or an error is returned, ask the SA to indicate how unauthorized peripherals are being blocked. If there is no evidence that unauthorized peripherals are being blocked before establishing a connection, this is a finding.
Configure the operating system to enable the blocking of unauthorized peripherals with the following command: Note: This command will create an allow list for any USB devices currently connect to the system. $ usbguard generate-policy --no-hashes | tee /etc/usbguard/rules.conf Note: Enabling and starting USBGuard without properly configuring it for an individual system will immediately prevent any access over a USB device such as a keyboard or mouse.
Note: If the autofs service is not installed, this requirement is Not Applicable. Verify that the autofs package is not installed with the following command: $ dnf list --installed autofs Error: No matching Packages to list If the "autofs" package is installed, and is not documented as an operational requirement with the information system security officer (ISSO), this is a finding.
Remove the autofs package with the following command: $ dnf remove autofs
Verify that AlmaLinux OS 9 account identifiers (individuals, groups, roles, and devices) are disabled after 35 days of inactivity with the following command: $ useradd -D | grep INACTIVE INACTIVE=35 If the value of "INACTIVE" is set to "-1", a value greater than "35", or is missing, this is a finding.
Configure AlmaLinux OS 9 to disable account identifiers after 35 days of inactivity after the password expiration. Run the following command to change the configuration for useradd: $ useradd -D -f 35 The recommendation is 35 days, but a lower value is acceptable.
Verify that AlmaLinux OS 9 enforces password complexity by requiring at least one lowercase character with the following command: $ grep -r lcredit /etc/security/pwquality.conf* /etc/security/pwquality.conf.d/stig.conf:lcredit = -1 If the value of "lcredit" is a positive number, is not set, is commented out, or if conflicting results are returned, this is a finding.
Configure AlmaLinux OS 9 to enforce password complexity by requiring at least one lowercase character be used by setting the "lcredit" option. Add or update the following line in the "/etc/security/pwquality.conf" file or a configuration file in the "/etc/security/pwquality.conf.d/" directory: lcredit = -1 Remove any configurations that conflict with the above value.
Verify AlmaLinux OS 9 uses "pwquality" to enforce the password complexity rules in the password-auth file with the following command: Check for the use of the "pwquality" module in the PAM auth files with the following command: $ grep pam_pwquality.so /etc/pam.d/system-auth /etc/pam.d/password-auth /etc/pam.d/system-auth:password required pam_pwquality.so retry=3 /etc/pam.d/password-auth:password required pam_pwquality.so retry=3 If the command does not return a line in each file containing the value "pam_pwquality.so", or the line is commented out, this is a finding. If the system administrator (SA) can demonstrate that the required configuration is contained in a PAM configuration file included or substacked from the system-auth file, this is not a finding.
Configure AlmaLinux OS 9 to use "pwquality" to enforce password complexity rules. Add the following line to the "/etc/pam.d/system-auth" and "/etc/pam.d/password-auth" files (or modify the line to have the required value): password required pam_pwquality.so retry=3
Verify AlmaLinux OS 9 is configured to limit the "pwquality" retry option to "3". Check for the use of the "pwquality" retry option in the PAM auth files with the following command: $ grep pam_pwquality.so /etc/pam.d/system-auth /etc/pam.d/password-auth /etc/pam.d/system-auth:password required pam_pwquality.so retry=3 /etc/pam.d/password-auth:password required pam_pwquality.so retry=3 If the value of "retry" is set to "0" or greater than "3", or is missing from either, this is a finding. If the system administrator (SA) can demonstrate that the required configuration is contained in a PAM configuration file included or substacked from the system-auth file, this is not a finding.
Configure AlmaLinux OS 9 to limit the "pwquality" retry option to "3". Add the following line to the "/etc/pam.d/system-auth" and "/etc/pam.d/password-auth" files (or modify the line to have the required value): password required pam_pwquality.so retry=3
Verify that AlmaLinux OS 9 enforces password complexity rules for the root account. Check if root user is required to use complex passwords with the following command: $ grep enforce_for_root /etc/security/pwquality.conf /etc/security/pwquality.conf.d/*.conf /etc/security/pwquality.conf:# enforce_for_root /etc/security/pwquality.conf.d/stig.conf:enforce_for_root If "enforce_for_root" is commented or missing, this is a finding.
Configure AlmaLinux OS 9 to enforce password complexity on the root account. Add or update the following line in /etc/security/pwquality.conf: enforce_for_root Note: Unlike most Linux tools, pam_pwquality does not override its defaults with those in a drop-in file, so edit /etc/security/pwquality.conf and not use a file in /etc/security/pwquality.conf.d/ or comment out the setting in /etc/security/pwquality.conf if using a drop-in file.
Verify that AlmaLinux OS 9 enforces password complexity by requiring at least one uppercase character with the following command: $ grep -r ucredit /etc/security/pwquality.conf* /etc/security/pwquality.conf.d/stig.conf:ucredit = -1 If the value of "ucredit" is a positive number, is not set, is commented out, or if conflicting results are returned, this is a finding.
Configure AlmaLinux OS 9 to enforce password complexity by requiring at least one uppercase character be used by setting the "ucredit" option. Add or update the following line in the "/etc/security/pwquality.conf" file or a configuration file in the "/etc/security/pwquality.conf.d/" directory: ucredit = -1 Remove any configurations that conflict with the above value.
Verify that AlmaLinux OS 9 enforces password complexity by requiring at least one special character with the following command: $ grep -E ocredit /etc/security/pwquality.conf* /etc/security/pwquality.conf.d/stig.conf:ocredit = -1 If the value of "ocredit" is a positive number, is not set, is commented out, or if conflicting results are returned, this is a finding.
Configure AlmaLinux OS 9 to enforce password complexity by requiring at least one special character be used by setting the "ocredit" option. Add or update the following line in the "/etc/security/pwquality.conf" file or a configuration file in the "/etc/security/pwquality.conf.d/" directory: ocredit = -1 Remove any configurations that conflict with the above value.
Verify that AlmaLinux OS 9 enforces a minimum 15-character password length for new user accounts by running the following command: $ grep PASS_MIN_LEN /etc/login.defs PASS_MIN_LEN 15 If the "PASS_MIN_LEN" parameter value is less than "15", is not set, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to enforce a minimum 15-character password length for new user accounts. Modify the "/etc/login.defs" file to set the "PASS_MIN_LEN" parameter to 15 or greater: PASS_MIN_LEN 15
Verify that AlmaLinux OS 9 enforces a minimum 15-character password length with the following command: $ grep -r minlen /etc/security/pwquality.conf* /etc/security/pwquality.conf.d/stig.conf:minlen = 15 If the value of "minlen" is less than 15, is not set, is commented out, or if conflicting results are returned, this is a finding.
Configure AlmaLinux OS 9 to require a minimum 15-character password length by setting the "minlen" option. Add or update the following line in the "/etc/security/pwquality.conf" file or a configuration file in the "/etc/security/pwquality.conf.d/" directory: minlen = 15 Remove any configurations that conflict with the above value.
Verify that AlmaLinux OS 9 enforces password complexity by requiring at least one numeric character with the following command: $ grep -r dcredit /etc/security/pwquality.conf* /etc/security/pwquality.conf.d/stig.conf:dcredit = -1 If the value of "dcredit" is a positive number, is not set, is commented out, or if conflicting results are returned, this is a finding.
Configure AlmaLinux OS 9 to enforce password complexity by requiring at least one numeric character be used by setting the "dcredit" option. Add or update the following line in the "/etc/security/pwquality.conf" file or a configuration file in the "/etc/security/pwquality.conf.d/" directory: dcredit = -1 Remove any configurations that conflict with the above value.
Verify the value of the "minclass" option in "/etc/security/pwquality.conf" with the following command: $ grep -ir minclass /etc/security/pwquality.conf* /etc/security/pwquality.conf:# minclass = 0 /etc/security/pwquality.conf.d/stig.conf:minclass = 4 If the value of "minclass" is set to less than "4", or is commented out, this is a finding.
Configure AlmaLinux OS 9 to require the change of at least four character classes when passwords are changed by setting the "minclass" option. Add the following line to "/etc/security/pwquality.conf" (or modify the line to have the required value): minclass = 4
Verify the value of the "maxrepeat" option in "/etc/security/pwquality.conf" with the following command: $ grep -ir maxrepeat /etc/security/pwquality.conf* /etc/security/pwquality.conf:# maxrepeat = 0 /etc/security/pwquality.conf.d/stig.conf:maxrepeat = 3 If the value of "maxrepeat" is set to more than "3", or is commented out, this is a finding.
Configure AlmaLinux OS 9 to require the change of the number of repeating consecutive characters when passwords are changed by setting the "maxrepeat" option. Add the following line to "/etc/security/pwquality.conf" (or modify the line to have the required value): maxrepeat = 3
Verify the value of the "maxclassrepeat" option in "/etc/security/pwquality.conf" with the following command: $ grep -ir maxclassrepeat /etc/security/pwquality.conf* /etc/security/pwquality.conf:# maxclassrepeat = 0 /etc/security/pwquality.conf.d/stig.conf:maxclassrepeat = 4 If the value of "maxclassrepeat" is set to "0", more than "4", or is commented out, this is a finding.
Configure AlmaLinux OS 9 to require the change of the number of repeating characters of the same character class when passwords are changed by setting the "maxclassrepeat" option. Add the following line to "/etc/security/pwquality.conf" conf (or modify the line to have the required value): maxclassrepeat = 4
Verify that AlmaLinux OS 9 enforces password complexity by requiring at least eight characters differ when passwords are changed with the following command: $ grep -r difok /etc/security/pwquality.conf* /etc/security/pwquality.conf.d/stig.conf:difok = 8 If the value of "difok" is less than "8", is not set, is commented out, or if conflicting results are returned, this is a finding.
Configure AlmaLinux OS 9 to require the change of at least eight of the total number of characters when passwords are changed by setting the "difok" option. Add or update the following line in the "/etc/security/pwquality.conf" file or a configuration file in the "/etc/security/pwquality.conf.d/" directory: difok = 8 Remove any configurations that conflict with the above value.
Verify the number of rounds for the password hashing algorithm is configured with the following command: $ grep rounds /etc/pam.d/password-auth /etc/pam.d/system-auth /etc/pam.d/password-auth:password sufficient pam_unix.so sha512 shadow rounds=100000 use_authtok /etc/pam.d/system-auth:password sufficient pam_unix.so sha512 shadow rounds=100000 use_authtok If a matching line is not returned in both files, or "rounds" is less than "100000", this a finding. Add/modify the appropriate sections of the "/etc/pam.d/password-auth" file to match the following lines, ensuring that the "preauth" line is listed before pam_unix.so
Configure AlmaLinux OS 9 to use at least 100000 hashing rounds for hashing passwords. Add or modify the following line in "/etc/pam.d/password-auth" and "/etc/pam.d/system-auth" and set "rounds" to "100000" or higher: password sufficient pam_unix.so sha512 rounds=100000
Verify the user and group account administration utilities are configured to store only encrypted representations of passwords with the following command: $ grep crypt_style /etc/libuser.conf crypt_style = sha512 If the "crypt_style" variable is not set to "sha512", is not in the defaults section, is commented out, or does not exist, this is a finding.
Configure AlmaLinux OS 9 to use the SHA-512 algorithm for password hashing. Add or change the following line in the "[defaults]" section of the "/etc/libuser.conf" file: crypt_style = sha512
Verify the system's shadow file is configured to store only encrypted representations of passwords with a hash value of SHA512 with the following command: $ grep ENCRYPT_METHOD /etc/login.defs ENCRYPT_METHOD SHA512 If "ENCRYPT_METHOD" does not have a value of "SHA512", or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to use the SHA-512 algorithm for password hashing. Add or update the following line in the "/etc/login.defs" file: ENCRYPT_METHOD SHA512
Verify that the pam_unix.so module is configured to use sha512 in /etc/pam.d/password-auth with the following command: $ grep -E "password.*pam_unix.so.*sha512" /etc/pam.d/password-auth password sufficient pam_unix.so sha512 shadow rounds=100000 use_authtok If "sha512" is missing, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to use the SHA-512 algorithm for password hashing. Edit/modify the following line in the "/etc/pam.d/password-auth" file to include the sha512 option for pam_unix.so: password sufficient pam_unix.so sha512 shadow rounds=100000 use_authtok
Verify that the interactive user account passwords are using a strong password hash with the following command: $ cut -d: -f1,2 /etc/shadow root:$6$88upzIIyml/6UEya$QMLbF.L6gMNnIhzcxRorHgubK6jl3CHZ.MZrMkrEApOlt/MP.N.BFea.ykhPnIS.EYICo6To42koq0DCH8AjB/ bin:* daemon:* Password hashes "!" or "*" indicate inactive accounts not available for logon and are not evaluated. If any interactive user password hash does not begin with "$6", this is a finding.
Lock all interactive user accounts not using SHA-512 hashing until the passwords can be regenerated with SHA-512.
Verify that AlmaLinux OS 9 does not have an FTP client or server package installed with the following command: $ rpm -qa | grep ftp If the "vsftpd" server or "ftp" client packages are installed, this is a finding. Note that there may be third-party or alternative packages that provide the same functionality, which should also be removed.
Remove the default FTP client and server packages using the following command: $ dnf remove vsftpd ftp
Verify that AlmaLinux OS 9 does not have a telnet client or server package installed with the following command: $ rpm -qa | grep telnet If the "telnet-server" server or "telnet" client packages are installed, this is a finding. Note that there may be third-party or alternative packages that provide the same functionality, which should also be removed.
Remove the default telnet client and server packages using the following command: $ dnf remove telnet-server telnet
Check whether the maximum time period for existing passwords is restricted to 60 days with the following command: $ awk -F: '$5 <= 0 || $5 > 60 {print $1 " " $5}' /etc/shadow If any results are returned that are not associated with a system account, this is a finding.
Configure noncompliant accounts to enforce a 60-day maximum password lifetime restriction using the following command, substituting in the username: $ chage -M 60 [user]
Verify that AlmaLinux OS 9 enforces a 60-day maximum password lifetime for new user accounts by running the following command: $ grep PASS_MAX_DAYS /etc/login.defs PASS_MAX_DAYS 60 If the "PASS_MAX_DAYS" parameter value is greater than "60", is not set, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to enforce a 60-day maximum password lifetime. Modify the "/etc/login.defs" file to set the "PASS_MAX_DAYS" parameter to 60 or greater: PASS_MAX_DAYS 60
Verify the minimum time period between password changes for all user accounts is a day or more by running the following command: $ awk -F: '$4 < 1 {print $1 " " $4}' /etc/shadow If any results are returned that are not associated with a system account, this is a finding.
Configure noncompliant accounts to enforce a 24 hours/one day minimum password lifetime using the following command, substituting in the username: $ chage -m 1 [user]
Verify AlmaLinux OS 9 enforces 24 hours as the minimum password lifetime for new user accounts with the following command: $ grep PASS_MIN_DAYS /etc/login.defs PASS_MIN_DAYS 1 If the value of "PASS_MIN_DAYS" is less than "1", is not set, or is commented out, this is a finding.
Configure AlmaLinux OS 9 to enforce 24 hours as the minimum password lifetime. Modify the "/etc/login.defs" file to set the "PASS_MIN_DAYS" parameter to 1 or greater: PASS_MIN_DAYS 1
Note: If smart card authentication is not being used on the system, this requirement is Not Applicable. Verify that the System Security Services Daemon (SSSD) prohibits the use of cached authentications after one day. Check that SSSD allows cached authentications with the following command: $ grep cache_credentials /etc/sssd/sssd.conf /etc/sssd/conf.d/* /etc/sssd/conf.d/certificate_verification.conf:cache_credentials = true If "cache_credentials" is set to "false" or missing from the configuration, this is not a finding and no further checks are required. If "cache_credentials" is set to "true", check that SSSD prohibits the use of cached authentications after one day with the following command: $ grep offline_credentials_expiration /etc/sssd/sssd.conf /etc/sssd/conf.d/ /etc/sssd/conf.d/certificate_verification.conf:offline_credentials_expiration = 1 If "offline_credentials_expiration" is not set to a value of "1", this is a finding.
Configure the SSSD to prohibit the use of cached authentications after one day. Add/modify the following line in "/etc/sssd/sssd.conf" (or a conf file in /etc/sssd/conf.d/) just below the line [pam]: offline_credentials_expiration = 1
Verify the SSH private key files have a passcode. For each private key stored on the system, use the following command: $ ssh-keygen -y -f /path/to/file If the contents of the key are displayed, instead of a passphrase prompt, this is a finding.
Create a new private and public key pair that uses a passcode, as the correct user, with the following command: $ ssh-keygen -n [passphrase]
Note: If the system administrator (SA) demonstrates the use of an approved alternate multifactor authentication method, this requirement is not applicable. Verify the operating system implements Online Certificate Status Protocol (OCSP) and is using the proper digest value on the system with the following command: $ grep certmap /etc/sssd/sssd.conf /etc/sssd/conf.d/*.conf /etc/sssd/conf.d/mapping.conf:[certmap/testing.test/rule_name] If the certmap section does not exist, ask the system administrator (SA) to indicate how certificates are mapped to accounts. If there is no evidence of certificate mapping, this is a finding.
Configure AlmaLinux OS 9 to map the authenticated identity to the user or group account by adding or modifying the certmap section of the "/etc/sssd/sssd.conf" file or a "*.conf" file within the "/etc/sssd/conf.d/" directory, based on the following example: [certmap/testing.test/rule_name] matchrule = .*EDIPI@mil maprule = (userCertificate;binary={cert!bin}) domains = testing.test The "sssd" service must be restarted for the changes to take effect. To restart the "sssd" service, run the following command: $ systemctl restart sssd.service
Verify AlmaLinux OS 9 for PKI-based authentication has valid certificates by constructing a certification path (which includes status information) to an accepted trust anchor. Check that the system has a valid DOD root CA installed with the following command: $ openssl x509 -text -in /etc/sssd/pki/sssd_auth_ca_db.pem Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, O = U.S. Government, OU = DOD, OU = PKI, CN = DOD Root CA 3 Validity Not Before: Mar 20 18:46:41 2012 GMT Not After: Dec 30 18:46:41 2029 GMT Subject: C = US, O = U.S. Government, OU = DOD, OU = PKI, CN = DOD Root CA 3 Subject Public Key Info: Public Key Algorithm: rsaEncryption If the root CA file is not a DOD-issued certificate with a valid date and installed in the "/etc/sssd/pki/sssd_auth_ca_db.pem" location, this is a finding.
Configure AlmaLinux OS 9, for PKI-based authentication, to validate certificates by constructing a certification path (which includes status information) to an accepted trust anchor. Obtain a valid copy of the DOD root CA file from the PKI CA certificate bundle from cyber.mil and copy the DOD_PKE_CA_chain.pem into the following file: /etc/sssd/pki/sssd_auth_ca_db.pem
Verify that the symlink exists and targets the correct Kerberos crypto policy, with the following command: $ file /etc/crypto-policies/back-ends/krb5.config /etc/crypto-policies/back-ends/krb5.config: symbolic link to /usr/share/crypto-policies/FIPS/krb5.txt If the symlink does not exist or points to a different target, this is a finding.
Configure Kerberos to use systemwide crypto policy. Create a symlink pointing to system crypto policy in the Kerberos configuration using the following command: $ ln -s /etc/crypto-policies/back-ends/krb5.config /usr/share/crypto-policies/FIPS/krb5.txt
Verify that AlmaLinux OS 9 prevents system daemons from using Kerberos for authentication with the following command: $ ls -alR /etc/*.keytab ls: cannot access '/etc/*.keytab': No such file or directory If this command produces any "keytab" file(s), this is a finding.
Configure AlmaLinux OS 9 to prevent system daemons from using Kerberos for authentication. Remove any files with the .keytab extension from the operating system. rm -f /etc/*.keytab
Verify that the libreswan package is installed with the following command: $ dnf list --installed libreswan libreswan.x86_64 4.9-4.el9_2 @appstream If the "libreswan" package is not installed, this is a finding.
Install the libreswan package with the following command: $ dnf install libreswan
Verify that the rsyslog-gnutls package is installed with the following command: $ dnf list --installed rsyslog-gnutls rsyslog-gnutls.x86_64 8.2102.0-111.el9 @AppStream If the "rsyslog-gnutls" package is not installed, this is a finding.
Install the rsyslog-gnutls package with the following command: $ dnf install rsyslog-gnutls
Verify that the AlmaLinux OS 9 crypto-policies package is installed with the following command: $ dnf list --installed crypto-policies Installed Packages crypto-policies.noarch 20221215-1.git9a18988.el9 @anaconda If the "crypto-policies" package is not installed, this is a finding.
Install the crypto-policies package with the following command: $ dnf install crypto-policies
Verify that the AlmaLinux OS 9 cryptography policy has been configured correctly with the following commands: $ update-crypto-policies --show FIPS If the cryptography is not set to "FIPS" and is not applied, this is a finding. $ update-crypto-policies --check The configured policy matches the generated policy. If the command does not return "The configured policy matches the generated policy", this is a finding.
Configure the operating system to implement FIPS mode with the following command: $ fips-mode-setup --enable Reboot the system for the changes to take effect.
Verify that the "ClientAliveInterval" variable is set to a value of "600" or less and "ClientAliveCountMax" is set to "1" by performing the following command: $ sshd -T | grep clientalive clientaliveinterval 600 clientalivecountmax 1 If "ClientAliveInterval" does not have a value of "600" or less, or "ClientAliveCountMax" is not set to "1", this is a finding.
To configure the SSH server to terminate a user session automatically after the SSH client has become unresponsive, add or modify the following lines in "/etc/ssh/sshd_config": ClientAliveInterval 600 ClientAliveCountMax 1 Alternatively, add the settings to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ cat << EOF | tee /etc/ssh/sshd_config.d/clientalive.conf ClientAliveInterval 600 ClientAliveCountMax 1 EOF Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify the AlmaLinux OS 9 SSHD is configured to allow for the UsePAM interface with the following command: $ sshd -T | grep usepam usepam yes If the "UsePAM" keyword is set to "no", is missing, or is commented out, this is a finding.
Configure the SSH daemon to use PAM. Add the following line to "/etc/ssh/sshd_config", or uncomment the line and set the value to "yes": UsePAM yes Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ cat << EOF | tee /etc/ssh/sshd_config.d/pam.conf UsePAM yes EOF Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Verify that AlmaLinux OS 9 logs out sessions that are idle for 15 minutes with the following command: $ systemd-analyze cat-config systemd/logind.conf | grep StopIdleSessionSec #StopIdleSessionSec=infinity StopIdleSessionSec=900 If "StopIdleSessionSec" is not configured to "900" seconds, this is a finding.
Configure AlmaLinux OS 9 to log out idle sessions. Create the directory if necessary: $ mkdir -p /etc/systemd/logind.conf.d/ Create a *.conf file in /etc/systemd/logind.conf.d/ with the following content: [Login] StopIdleSessionSec=900 KillUserProcesses=no Restart systemd-logind: $ systemctl restart systemd-logind
Verify AlmaLinux OS 9 prevents privilege escalation thru the kernel by disabling access to the bpf system call with the following commands: $ sysctl kernel.unprivileged_bpf_disabled kernel.unprivileged_bpf_disabled = 1 If the returned line does not have a value of "1", or a line is not returned, this is a finding. Check that the configuration files are present to enable this kernel parameter. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F kernel.unprivileged_bpf_disabled | tail -1 kernel.unprivileged_bpf_disabled = 1 If "kernel.unprivileged_bpf_disabled" is not set to "1", or nothing is returned, this is a finding.
Configure AlmaLinux OS 9 to prevent privilege escalation through the kernel by disabling access to the bpf syscall with the following command: $ echo "kernel.unprivileged_bpf_disabled = 1" > /etc/sysctl.d/60-bpf.conf Load settings from all system configuration files with the following command: $ sysctl --system
Verify the runtime status of the kernel.kptr_restrict kernel parameter with the following command: $ sysctl kernel.kptr_restrict kernel.kptr_restrict = 1 Verify the configuration of the kernel.kptr_restrict kernel parameter with the following command: $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F kernel.kptr_restrict | tail -1 kernel.kptr_restrict =1 If "kernel.kptr_restrict" is not set to "1" or is missing, this is a finding.
Configure AlmaLinux OS 9 to restrict exposed kernel pointer addresses access with the following command: $ echo "kernel.kptr_restrict = 1" > /etc/sysctl.d/60-kptr.conf Load settings from all system configuration files with the following command: $ sysctl --system
Verify AlmaLinux OS 9 restricts usage of ptrace to descendant processes (1), admins only (2), or disables ptrace entirely (3) with the following command: $ sysctl kernel.yama.ptrace_scope kernel.yama.ptrace_scope = 1 If the returned line has a value of "0" or a line is not returned, this is a finding. Check that the configuration files are present to enable this kernel parameter. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F kernel.yama.ptrace_scope | tail -1 kernel.yama.ptrace_scope = 1 If "kernel.yama.ptrace_scope" is equal to "0" or nothing is returned, this is a finding.
Configure AlmaLinux OS 9 to restrict usage of ptrace to with the following command: $ echo "kernel.yama.ptrace_scope = 1" > /etc/sysctl.d/60-ptrace.conf Load settings from all system configuration files with the following command: $ sysctl --system
Verify AlmaLinux OS 9 is configured to restrict access to the kernel message buffer with the following commands: Check the status of the kernel.dmesg_restrict kernel parameter. $ sysctl kernel.dmesg_restrict kernel.dmesg_restrict = 1 If "kernel.dmesg_restrict" is not set to "1" or is missing, this is a finding. Check that the configuration files are present to enable this kernel parameter. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F kernel.dmesg_restrict | tail -1 kernel.dmesg_restrict = 1 If "kernel.dmesg_restrict" is not set to "1" or is missing, this is a finding.
Configure AlmaLinux OS 9 to restrict access to the kernel message buffer with the following command: $ echo "kernel.dmesg_restrict = 1 > /etc/sysctl.d/60-dmesg.conf" Load settings from all system configuration files with the following command: $ sysctl --system
Verify AlmaLinux OS 9 is configured to prevent kernel profiling by nonprivileged users with the following commands: Check the status of the kernel.perf_event_paranoid kernel parameter. $ sysctl kernel.perf_event_paranoid kernel.perf_event_paranoid = 2 If "kernel.perf_event_paranoid" is not set to "2" or is missing, this is a finding. Check that the configuration files are present to enable this kernel parameter. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F kernel.perf_event_paranoid | tail -1 kernel.perf_event_paranoid = 2 If "kernel.perf_event_paranoid" is not set to "2" or is missing, this is a finding.
Configure AlmaLinux OS 9 to prevent kernel profiling by nonprivileged users with the following command: $ echo "kernel.perf_event_paranoid = 2" > /etc/sysctl.d/60-perf.conf Load settings from all system configuration files with the following command: $ sysctl --system
Verify AlmaLinux OS 9 only allows the use of DOD PKI-established certificate authorities using the following command: $ trust list pkcs11:id=%7C%42%96%AE%DE%4B%48%3B%FA%92%F8%9E%8C%CF%6D%8B%A9%72%37%95;type=cert type: certificate label: ISRG Root X2 trust: anchor category: authority If any nonapproved CAs are returned, this is a finding.
Configure AlmaLinux OS 9 to only allow the use of DOD PKI-established certificate authorities. For each untrusted CA, export the certificate to a file and add it to the blocklist: $ trust dump --filter "pkcs11:id=%7C%42%96%AE%DE%4B%48%3B%FA%92%F8%9E%8C%CF%6D%8B%A9%72%37%95;type=cert" > /etc/pki/ca-trust/source/blocklist/ISRGRootX2 $ update-ca-trust Verify that the certificate is in the blocklist: $ trust list --filter=blocklist p11-kit: overriding trust for anchor in blocklist: ISRGRootX2 pkcs11:id=%7C%42%96%AE%DE%4B%48%3B%FA%92%F8%9E%8C%CF%6D%8B%A9%72%37%95;type=cert type: certificate label: ISRG Root X2 trust: distrusted category: authority pkcs11:id=%88%68%BF%E0%8E%35%C4%3B%38%6B%62%F7%28%3B%84%81%C8%0C%D7%4D;type=cert type: certificate label: Explicitly Distrust DigiNotar Root CA trust: distrusted category: authority
Verify that "systemd-journald" is active with the following command: $ systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static) Active: active (running) since Tue 2024-02-20 11:02:20 UTC; 14min ago If the systemd-journald service is not active, this is a finding.
To enable the systemd-journald service, run the following command: $ systemctl enable --now systemd-journald
Note: If there is a documented and approved reason for not having data-at-rest encryption at the operating system level, such as encryption provided by a hypervisor or a disk storage array in a virtualized environment, this requirement is Not Applicable. Verify AlmaLinux OS 9 prevents unauthorized disclosure or modification of all information requiring at-rest protection by using disk encryption. Verify all system partitions are encrypted with the following command: $ lsblk -e11 -oNAME,FSTYPE,FSVER,MOUNTPOINTS NAME FSTYPE FSVER MOUNTPOINTS sda +-sda1 vfat FAT16 /boot/efi +-sda2 xfs /boot +-sda3 LVM2_member LVM2 001 +-rootvg-root crypto_LUKS 2 ¦ +-luks-8a7154ec-8eeb-46c8-9d75-66fc4b81d665 xfs / +-rootvg-swap crypto_LUKS 2 ¦ +-luks-89bf0df8-547f-4613-af07-215e5f63e9a9 swap 1 [SWAP] +-rootvg-home crypto_LUKS 2 ¦ +-luks-10a20c46-483d-4d12-831f-5328eda28fd1 xfs /home +-rootvg-varlogaudit crypto_LUKS 2 ¦ +-luks-29b74747-2f82-4472-82f5-0b5eb764effc xfs /var/log/audit +-rootvg-varlog crypto_LUKS 2 ¦ +-luks-e0d162f5-fad8-463e-8e39-6bd09e682961 xfs /var/log +-rootvg-vartmp crypto_LUKS 2 ¦ +-luks-0e7206e7-bfb1-4a23-ae14-b9cea7cf46d5 xfs /var/tmp +-rootvg-var crypto_LUKS 2 +-luks-b23d8276-7844-4e79-8a58-505150b4eb42 xfs /var Every persistent disk partition present must be of type "crypto_LUKS". If any partitions other than the /boot partitions are not type "crypto_LUKS", ask the administrator to indicate how the partitions are encrypted. If there is no evidence that these partitions are encrypted, this is a finding.
Configure AlmaLinux OS 9 to prevent unauthorized modification of all information at rest by using disk encryption. Encrypting a partition in an already installed system is more difficult, because existing partitions will need to be resized and changed. To encrypt an entire partition, dedicate a partition for encryption in the partition layout.
Ensure that AlmaLinux OS 9 verifies correct operation of security functions through the use of SELinux with the following command: $ getenforce Enforcing If SELINUX is not set to "Enforcing", this is a finding. Verify that SELinux is configured to be enforcing at boot. $ grep -E "^SELINUX=" /etc/selinux/config SELINUX=enforcing If SELINUX line is missing, commented out, or not set to "enforcing", this is a finding. Verify that SELinux is enabled and Enforcing for all kernels: $ grubby --info=ALL | grep -E 'selinux|enforcing' args="ro audit=1 selinux=1 enforcing=1 audit_backlog_limit=8192 page_poison=1 vsyscall=none slub_debug=P pti=on iommu=force resume=/dev/mapper/luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.luks.uuid=luks-8a7154ec-8eeb-46c8-9d75-66fc4b80d665 rd.lvm.lv=rootvg/root rd.luks.uuid=luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.lvm.lv=rootvg/swap rd.shell=0 quiet splash fips=1 boot=UUID=eda01e9b-b7e1-431b-9549-16d5dcddf665" args="ro audit=1 selinux=1 enforcing=1 audit_backlog_limit=8192 page_poison=1 vsyscall=none slub_debug=P pti=on iommu=force resume=/dev/mapper/luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.luks.uuid=luks-8a7154ec-8eeb-46c8-9d75-66fc4b80d665 rd.lvm.lv=rootvg/root rd.luks.uuid=luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.lvm.lv=rootvg/swap rd.shell=0 quiet splash fips=1 boot=UUID=eda01e9b-b7e1-431b-9549-16d5dcddf665" If selinux=1 is missing or set to 0, or enforcing=1 is missing or set to 0, this is a finding.
Configure AlmaLinux OS 9 to verify correct operation of security functions. Edit the file "/etc/selinux/config" and add or modify the following line: SELINUX=enforcing Update the grub bootloader settings: $ grubby --args="selinux=1 enforcing=1" --update-kernel=ALL A reboot is required for the changes to take effect.
Verify AlmaLinux OS 9 has the policycoreutils package installed with the following command: $ dnf list --installed policycoreutils policycoreutils.x86_64 3.5-1.el9 @anaconda If the "policycoreutils" package is not installed, this is a finding.
The policycoreutils package can be installed with the following command: $ dnf install policycoreutils
Verify that world writable directories are owned by root, a system account, or an application account with the following command. It will discover and print world-writable directories that are not owned by root. Run it once for each local partition [PART] e.g. "/": $ find PART -xdev -type d -perm -0002 -uid +0 -print If there is output, this is a finding.
Configure all public directories to be owned by root or a system account to prevent unauthorized and unintended information transferred via shared system resources. Set the owner of all public directories as root or a system account using the command, replace "[Public Directory]" with any directory path not owned by root or a system account: $ chown root [Public Directory]
Verify that all world-writable directories have the sticky bit set. Determine if all world-writable directories have the sticky bit set by running the following command: $ find / -type d \( -perm -0002 -a ! -perm -1000 \) -exec ls -ld {} \; drwxrwxrwt 7 root root 4096 Jul 26 11:19 /tmp If any of the returned directories are world-writable and do not have the sticky bit set (trailing "t"), this is a finding.
Configure all world-writable directories to have the sticky bit set to prevent unauthorized and unintended information transferred via shared system resources. Set the sticky bit on all world-writable directories using the command, replace "[World-Writable Directory]" with any directory path missing the sticky bit: $ chmod a+t [World-Writable Directory]
Verify "nftables" is configured to allow rate limits on any connection to the system with the following command: $ grep -i firewallbackend /etc/firewalld/firewalld.conf # FirewallBackend FirewallBackend=nftables If the "nftables" is not set as the "FirewallBackend" default, this is a finding.
Configure "nftables" to be the default "firewallbackend" for "firewalld" by adding or editing the following line in "etc/firewalld/firewalld.conf": FirewallBackend=nftables Establish rate-limiting rules based on organization-defined types of DoS attacks on impacted network interfaces.
Verify AlmaLinux OS 9 is configured to use IPv4 TCP syncookies with the following command: $ sysctl net.ipv4.tcp_syncookies net.ipv4.tcp_syncookies = 1 Check that the configuration files are present to enable this kernel parameter. $ /usr/lib/systemd/systemd-sysctl --cat-config | egrep -v '^(#|;)' | grep -F net.ipv4.tcp_syncookies | tail -1 net.ipv4.tcp_syncookies = 1 If the network parameter "ipv4.tcp_syncookies" is not equal to "1" or nothing is returned, this is a finding.
Configure AlmaLinux OS 9 to use TCP syncookies using the following command: $ echo 'net.ipv4.tcp_syncookies = 1' > /etc/sysctl.d/60-syncookies.conf Load settings from all system configuration files with the following command: $ sysctl --system
Verify that AlmaLinux OS 9 has the openssh client package installed with the following command: $ dnf list --installed openssh Installed Packages openssh.x86_64 8.7p1-28.el9 @anaconda If the "openssh" client package is not installed, this is a finding.
The openssh client package can be installed with the following command: $ dnf install openssh
Verify that "sshd" is active with the following command: $ systemctl status sshd sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled) Active: active (running) since Fri 2024-01-26 09:41:09 UTC; 2h 48min ago If the "sshd" service is not enabled and active, this is a finding.
To enable the sshd service run the following command: $ systemctl enable --now sshd
Verify that AlmaLinux OS 9 has the openssh-server package installed with the following command: $ dnf list --installed openssh-server Installed Packages openssh-server.x86_64 8.7p1-28.el9 @anaconda If the "openssh-server" package is not installed, this is a finding.
The openssh-server package can be installed with the following command: $ dnf install openssh-server
Verify the SSH daemon prevents users from overriding SSH environment variables with the following command: $ sshd -T | grep permituserenvironment permituserenvironment no If the "PermitUserEnvironment" keyword is set to "yes", or no output is returned, this is a finding.
To configure the system to prevent users from overriding SSH environment variables, add or modify the following line in "/etc/ssh/sshd_config": PermitUserEnvironment no Alternatively, add the setting to an include file if the line "Include /etc/ssh/sshd_config.d/*.conf" is found at the top of the "/etc/ssh/sshd_config" file: $ echo "PermitUserEnvironment no" > /etc/ssh/sshd_config.d/environment.conf Restart the SSH daemon for the settings to take effect: $ systemctl restart sshd.service
Note: If the "bind" package is not installed, this requirement is Not Applicable. Verify that BIND uses the system crypto policy with the following command: $ grep include /etc/named.conf include "/etc/crypto-policies/back-ends/bind.config"; If BIND is installed and the BIND config file does not contain the "/etc/crypto-policies/back-ends/bind.config" directive, or the line is commented out, this is a finding.
Configure BIND to use the systemwide crypto policy. Add the following line to the "options" section in "/etc/named.conf": include "/etc/crypto-policies/back-ends/bind.config";
Note: If the system does not have physical wireless network radios, this requirement is Not Applicable. Verify there are no wireless interfaces configured on the system with the following commands: $ nmcli radio all WIFI-HW WIFI WWAN-HW WWAN enabled enabled missing disabled $ nmcli device status DEVICE TYPE STATE CONNECTION wlp2s0 wifi connected cafe lo loopback connected (externally) lo p2p-dev-wlp2s0 wifi-p2p disconnected -- enp3s0f2 ethernet unavailable -- If a wireless interface is configured and has not been documented and approved by the information system security officer (ISSO), this is a finding.
Configure the system to disable all wireless network interfaces with the following command: $ nmcli radio all off
Without using the "quiet" grub kernel parameter, the hardware and service information are printed to the console on boot and sometimes afterwards. This information could be useful for attackers with physical access, or so-called "shoulder surfers". Boot failures will still be shown, as will the LUKS password prompt. Verify the grub bootloader has the "quiet" option set with the following command: $ grubby --info=ALL | grep quiet args="ro audit=1 audit_backlog_limit=8192 page_poison=1 vsyscall=none slub_debug=P pti=on iommu=force resume=/dev/mapper/luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.luks.uuid=luks-8a7154ec-8eeb-46c8-9d75-66fc4b80d665 rd.lvm.lv=rootvg/root rd.luks.uuid=luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.lvm.lv=rootvg/swap rd.shell=0 quiet splash fips=1 boot=UUID=eda01e9b-b7e1-431b-9549-16d5dcddf665 selinux=1 enforcing=1" args="ro audit=1 audit_backlog_limit=8192 page_poison=1 vsyscall=none slub_debug=P pti=on iommu=force resume=/dev/mapper/luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.luks.uuid=luks-8a7154ec-8eeb-46c8-9d75-66fc4b80d665 rd.lvm.lv=rootvg/root rd.luks.uuid=luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.lvm.lv=rootvg/swap rd.shell=0 quiet splash fips=1 boot=UUID=eda01e9b-b7e1-431b-9549-16d5dcddf665 selinux=1 enforcing=1" If nothing is returned, this is a finding.
Configure the grub bootloader to use the "quiet" parameter using the following command: $ grubby --update-kernel=ALL --args=quiet
Verify the "/var/log" directory is group-owned by root with the following command: $ stat -c "%U:%G %#a %n" /var/log root:root 0755 /var/log If "/var/log" does not have a group-owner of "root", this is a finding.
Configure the group-owner of the directory "/var/log" to "root" by running the following command: $ chgrp root /var/log
Verify the "/var/log/messages" file is group-owned by root with the following command: $ stat -c "%U:%G %#a %n" /var/log root:root 0755 /var/log If "/var/log/messages" does not have a group-owner of "root", this is a finding.
Change the group-owner of the "/var/log/messages" file to "root" by running the following command: $ chgrp root /var/log/messages
Verify the "/var/log/messages" file is owned by root with the following command: $ stat -c "%U:%G %#a %n" /var/log root:root 0755 /var/log If "/var/log/messages" does not have an owner of "root", this is a finding.
Change the owner of the "/var/log/messages" file to "root" by running the following command: $ chown root /var/log/messages
Verify the "/var/log/messages" file has a mode of "0640" or less permissive with the following command: $ stat -c "%U:%G %#a %n" /var/log/messages root:root 0600 /var/log/messages If "/var/log/messages" does not have a mode of "0640" or less permissive, this is a finding.
Configure the "/var/log/messages" file to have a mode of "0640" by running the following command: $ chmod 0640 /var/log/messages
Verify the "/var/log" directory is owned by root with the following command: $ stat -c "%U:%G %#a %n" /var/log root:root 0755 /var/log If "/var/log" does not have an owner of "root", this is a finding.
Configure the owner of the directory "/var/log" to "root" by running the following command: $ chown root /var/log
Verify that the "/var/log" directory has a mode of "0755" or less permissive with the following command: $ stat -c "%U:%G %#a %n" /var/log root:root 0755 /var/log If "/var/log" does not have a mode of "0755" or less permissive, this is a finding.
Configure the "/var/log" directory to a mode of "0755" by running the following command: $ chmod 0755 /var/log
Verify ExecShield is enabled on 64-bit AlmaLinux OS 9 systems with the following command: $ dmesg | grep '[NX|DX]*protection' [ 0.000000] NX (Execute Disable) protection: active If "dmesg" does not show "NX (Execute Disable) protection active", this is a finding.
Update the GRUB 2 bootloader configuration to ensure the noexec kernel parameter is not enabled using the following command: $ grubby --update-kernel=ALL --remove-args=noexec Enable the NX bit execute protection in the system BIOS.
Verify AlmaLinux OS 9 enables kernel page-table isolation with the following command: $ grubby --info=ALL | grep pti args="ro audit=1 selinux=1 enforcing=1 audit_backlog_limit=8192 page_poison=1 vsyscall=none slub_debug=P pti=on iommu=force resume=/dev/mapper/luks-88bf0df8-547f-4613-af07-215e5f62e9a9 rd.luks.uuid=luks-8a7154ec-8eeb-47c8-9d75-66fd4b80d665 rd.lvm.lv=rootvg/root rd.luks.uuid=luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.lvm.lv=rootvg/swap rd.shell=0 quiet splash fips=1 boot=UUID=eda01e9b-b7e1-431b-9549-16d5dcddf665" If the "pti" entry does not equal "on", or is missing, this is a finding. Check that kernel page-table isolation is enabled by default to persist in kernel updates: $ grep pti /etc/default/grub GRUB_CMDLINE_LINUX="pti=on" If "pti" is not set to "on", is missing or commented out, this is a finding.
Configure AlmaLinux OS 9 to enable kernel page-table isolation with the following command: $ grubby --update-kernel=ALL --args="pti=on" Add or modify the following line in "/etc/default/grub" to ensure the configuration survives kernel updates: GRUB_CMDLINE_LINUX="pti=on"
Verify that GRUB 2 is configured to enable poisoning of SLUB/SLAB objects to mitigate use-after-free vulnerabilities with the following commands: Check that the current GRUB 2 configuration has poisoning of SLUB/SLAB objects enabled: $ grubby --info=ALL | grep args | grep -v 'slub_debug=P' If any output is returned, this is a finding. Check that poisoning of SLUB/SLAB objects is enabled by default to persist in kernel updates: $ grep slub_debug /etc/default/grub GRUB_CMDLINE_LINUX="slub_debug=P" If "slub_debug" is not set to "P", is missing or commented out, this is a finding.
Configure AlmaLinux OS 9 to enable poisoning of SLUB/SLAB objects with the following commands: $ grubby --update-kernel=ALL --args="slub_debug=P" Add or modify the following line in "/etc/default/grub" to ensure the configuration survives kernel updates: GRUB_CMDLINE_LINUX="slub_debug=P"
Verify AlmaLinux OS 9 is implementing ASLR with the following command: $ sysctl kernel.randomize_va_space kernel.randomize_va_space = 2 If "kernel.randomize_va_space" is not set to "2", or is missing, this is a finding.
Configure the system to enable ASLR with the following command: $ echo 'kernel.randomize_va_space = 2' > /etc/sysctl.d/60-aslr.conf Reload settings from all system configuration files with the following command: $ sysctl --system
Verify AlmaLinux OS 9 removes all software components after updated versions have been installed with the following command: $ dnf config-manager --dump | grep clean clean_requirements_on_remove = 1 If "clean_requirements_on_remove" is not set to "1", this is a finding.
Configure AlmaLinux OS 9 to remove all software components after updated versions have been installed. Run the following command to change the configuration of DNF: $ dnf config-manager --setopt clean_requirements_on_remove=1 --save
Verify that the version of AlmaLinux is vendor supported with the following command: $ hostnamectl status | grep -i system AlmaLinux OS 9.2 (Turquois Kodkod) If the installed version of AlmaLinux is not supported, this is a finding.
Upgrade to a supported version of AlmaLinux.
Verify the SELinux on AlmaLinux OS 9 is using the targeted policy with the following command: $ sestatus | grep policy Loaded policy name: targeted If the loaded policy name is not "targeted", this is a finding.
Configure AlmaLinux OS 9 to use the targeted SELINUX policy. Edit the file "/etc/selinux/config" and add or modify the following line: SELINUXTYPE=targeted A reboot is required for the changes to take effect.
Verify that AlmaLinux OS 9 has the AIDE package installed with the following command: $ dnf list --installed aide aide.x86_64 0.16-100.el9 @AppStream If AIDE is not installed, ask the system administrator (SA) how file integrity checks are performed on the system. If there is no application installed to perform integrity checks, this is a finding. If AIDE is installed, check if it has been initialized with the following command: $ /usr/sbin/aide --check If the output is "Couldn't open file /var/lib/aide/aide.db.gz for reading", this is a finding.
Install AIDE, initialize it, and perform a manual check. Install AIDE: $ dnf install aide Initialize AIDE: $ /usr/sbin/aide --init Example output: Start timestamp: 2024-01-26 09:59:41 +0000 (AIDE 0.16) AIDE initialized database at /var/lib/aide/aide.db.new.gz Number of entries: 27922 --------------------------------------------------- The attributes of the (uncompressed) database(s): --------------------------------------------------- /var/lib/aide/aide.db.new.gz MD5 : p2o2MgLyXqLfsHGmHWR9nQ== SHA1 : C5R2JcZCSv3KRz0dMrcQ0JZdZV4= SHA256 : tUAG19G4gskBEfN+Z9pyVJi13rHA9f7P d9R5OivGk40= SHA512 : u26Um0w9hzsMmwZHNssCsmuxVqr9kBx+ Qx+9UBNQCBXlmWFCbq2Yx88BPCU5s/qy njPIODmPRg4I09jxs5KYjw== End timestamp: 2024-01-26 09:59:49 +0000 (run time: 0m 8s) The new database will need to be renamed to be read by AIDE: $ mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz Perform a manual check: $ /usr/sbin/aide --check Example output: Start timestamp: 2024-01-26 10:00:50 +0000 (AIDE 0.16) AIDE found NO differences between database and filesystem. Looks okay!!
Verify that AlmaLinux OS 9 routinely executes a file integrity scan for changes to the system baseline. The command used in the example will use a daily occurrence. Check the cron directories for scripts controlling the execution and notification of results of the file integrity application. For example, if Advanced Intrusion Detection Environment (AIDE) is installed on the system, use the following commands: $ find /etc/cron* -name '*aide*' /etc/cron.d/0aide $ grep aide /etc/crontab /var/spool/cron/root /var/spool/cron/root:30 04 * * * root /usr/sbin/aide --check $ more /etc/cron.d/aide @daily root /usr/sbin/aide --check | /bin/mail -s "$HOSTNAME - Daily aide integrity check run" root If the file integrity application does not exist, or a script file controlling the execution of the file integrity application does not exist, or the file integrity application does not notify designated personnel of changes, this is a finding.
Configure the file integrity tool to run automatically on the system at least weekly and to notify designated personnel if baseline configurations are changed in an unauthorized manner. The AIDE tool can be configured to email designated personnel with the use of the cron system. The following example output is generic. It will set cron to run AIDE daily and to send email at the completion of the analysis: $ more /etc/cron.d/0aide /usr/sbin/aide --check | echo "Subject: $HOSTNAME - Daily aide integrity check run" | /bin/mail -t root
Verify that the AlmaLinux OS 9 audit system is configured to audit local events with the following command: $ grep local_events /etc/audit/auditd.conf local_events = yes If "local_events" is not set to "yes", if the command does not return a line, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records for local events by adding or updating the following line in "/etc/audit/auditd.conf": local_events = yes The audit daemon must be restarted for the changes to take effect.
Verify the mode of /etc/audit/auditd.conf with the command: $ stat -c "%#a %n" /etc/audit/auditd.conf 0640 /etc/audit/auditd.conf If "/etc/audit/auditd.conf" does not have a mode of "0640", this is a finding.
Set the mode of /etc/audit/auditd.conf file to 0640 with the command: $ chmod 0640 /etc/audit/auditd.conf
Verify that the following files have a mode of "0640" or less permissive with the following command: $ stat -c "%U:%G %#a %n" /etc/audit/rules.d/*.rules /etc/audit/audit.rules /etc/audit/auditd.conf root:root 0600 /etc/audit/rules.d/audit.rules root:root 0640 /etc/audit/audit.rules root:root 0640 /etc/audit/auditd.conf If the files file have a mode more permissive than "0640", this is a finding.
Configure the "/etc/audit/rules.d/*.rules", "/etc/audit/audit.rules" and "/etc/audit/auditd.conf" files to have a mode of "0640" with the following command: $ chmod 0640 /etc/audit/rules.d/*.rules /etc/audit/auditd.conf /etc/audit/audit.rules
Verify that AlmaLinux OS 9 is configured to audit the execution of the "init" command with the following command: $ auditctl -l | grep init -a always,exit -S all -F path=/usr/sbin/init -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-init If the command does not return a line, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "init" command. Add the following lines to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/init -F perm=x -F auid>=1000 -F auid!=unset -k privileged-init Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "poweroff" command with the following command: $ auditctl -l | grep poweroff -a always,exit -S all -F path=/usr/sbin/poweroff -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-poweroff If the command does not return an audit rule for "poweroff" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "poweroff" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/poweroff -F perm=x -F auid>=1000 -F auid!=unset -k privileged-poweroff Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "reboot" command with the following command: $ auditctl -l | grep reboot -a always,exit -S all -F path=/usr/sbin/reboot -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-reboot If the command does not return an audit rule for "reboot" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "reboot" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/reboot -F perm=x -F auid>=1000 -F auid!=unset -k privileged-reboot Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "shutdown" command with the following command: $ auditctl -l | grep shutdown -a always,exit -S all -F path=/usr/sbin/shutdown -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-shutdown If the command does not return an audit rule for "shutdown" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "shutdown" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/shutdown -F perm=x -F auid>=1000 -F auid!=unset -k privileged-shutdown Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Note: If the USBGuard daemon is not installed and enabled, this requirement is not applicable. Verify AlmaLinux OS 9 enables Linux audit logging of the USBGuard daemon with the following commands. $ grep AuditBackend /etc/usbguard/usbguard-daemon.conf AuditBackend=LinuxAudit If the "AuditBackend" entry does not equal "LinuxAudit", is missing, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to enable Linux audit logging of the USBGuard daemon by adding or modifying the following line in "/etc/usbguard/usbguard-daemon.conf": AuditBackend=LinuxAudit
Verify that AlmaLinux OS 9 is configured to audit the execution of the "delete_module", "init_module" and "finit_module" system calls with the following command: $ auditctl -l | grep module -a always,exit -F arch=b32 -S init_module,finit_module -F auid>=1000 -F auid!=unset -k module_chng -a always,exit -F arch=b64 -S init_module,finit_module -F auid>=1000 -F auid!=unset -k module_chng -a always,exit -F arch=b32 -S delete_module -F auid>=1000 -F auid!=unset -k module_chng -a always,exit -F arch=b64 -S delete_module -F auid>=1000 -F auid!=unset -k module_chng If both the "b32" and "b64" audit rules are not defined for the "delete_module", "init_module" and "finit_module" system calls, or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate an audit event for any successful/unsuccessful use of the "delete_module", "init_module" and "finit_module" system calls. Add the following lines to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b32 -S init_module,finit_module -F auid>=1000 -F auid!=unset -k module_chng -a always,exit -F arch=b64 -S init_module,finit_module -F auid>=1000 -F auid!=unset -k module_chng -a always,exit -F arch=b32 -S delete_module -F auid>=1000 -F auid!=unset -k module_chng -a always,exit -F arch=b64 -S delete_module -F auid>=1000 -F auid!=unset -k module_chng Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect "/var/log/tallylog" with the following command: $ grep /var/log/tallylog /etc/audit/audit.rules -w /var/log/tallylog -p wa -k logins If the command does not return a line or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/var/log/tallylog". Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /var/log/tallylog -p wa -k logins Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify that the AlmaLinux OS 9 audit system is configured to resolve audit information before writing to disk with the following command: $ grep log_format /etc/audit/auditd.conf log_format = ENRICHED If the "log_format" option is not "ENRICHED", or the line is commented out, this is a finding.
Edit the /etc/audit/auditd.conf file and add or update the "log_format" option: log_format = ENRICHED The audit daemon must be restarted for changes to take effect.
Verify that the audit package is installed with the following command: $ dnf list --installed audit Installed Packages audit.x86_64 3.0.7-103.el9 @anaconda If the "audit" package is not installed, this is a finding.
Install the AlmaLinux OS 9 audit package with the following command: $ dnf install audit
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect "/var/log/lastlog" with the following command: $ grep /var/log/lastlog /etc/audit/audit.rules -w /var/log/lastlog -p wa -k logins If the command does not return a line, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/var/log/lastlog". Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /var/log/lastlog -p wa -k logins Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify that AlmaLinux OS 9 is configured to audit the execution of the "mount" command with the following command: $ auditctl -l | grep mount -a always,exit -F path=/usr/bin/mount -F perm=x -F auid>=1000 -F auid!=unset -k privileged-mount If the command does not return an audit rule for "/usr/bin/mount" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "umount" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/mount -F perm=x -F auid>=1000 -F auid!=unset -k privileged-mount Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "umount" command with the following command: $ auditctl -l | grep umount -a always,exit -F path=/usr/bin/umount -F perm=x -F auid>=1000 -F auid!=unset -k privileged-mount If the command does not return an audit rule for "umount" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "umount" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/umount -F perm=x -F auid>=1000 -F auid!=unset -k privileged-mount Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "umount2" system call with the following command: $ auditctl -l | grep umount2 -a always,exit -F arch=b32 -S umount2 -F auid>=1000 -F auid!=unset -F key=perm_mod -a always,exit -F arch=b64 -S umount2 -F auid>=1000 -F auid!=unset -F key=perm_mod If both the "b32" and "b64" audit rules are not defined for the "umount2" system call, or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "umount2" syscall. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b32 -S umount2 -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b64 -S umount2 -F auid>=1000 -F auid!=unset -k perm_mod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that GRUB 2 is configured to enable auditing of processes that start prior to the audit daemon with the following commands: Check that the all GRUB2 entries have auditing enabled: $ grubby --info=ALL | grep audit args="ro audit=1 selinux=1 enforcing=1 audit_backlog_limit=8192 page_poison=1 vsyscall=none slub_debug=P pti=on iommu=force boot=UUID=eda01e9b-b7e1-431b-9549-16d5dcddf665 resume=/dev/mapper/luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.luks.uuid=luks-8a7154ec-8eeb-46c8-9d75-66fc4b80d665 rd.lvm.lv=rootvg/root rd.luks.uuid=luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.lvm.lv=rootvg/swap fips=1 rd.shell=0 quiet splash" If "audit" is not set to "1" or is missing, this is a finding. Check that auditing is enabled by default to persist in kernel updates: $ grep audit /etc/default/grub GRUB_CMDLINE_LINUX="audit=1 selinux=1 enforcing=1 audit_backlog_limit=8192 page_poison=1 vsyscall=none slub_debug=P pti=on iommu=force boot=UUID=eda01e9b-b7e1-431b-9549-16d5dcddf665 resume=/dev/mapper/luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.luks.uuid=luks-8a7154ec-8eeb-46c8-9d75-66fc4b80d665 rd.lvm.lv=rootvg/root rd.luks.uuid=luks-89bf0df8-547f-4613-af07-215e5f62e9a9 rd.lvm.lv=rootvg/swap fips=1 rd.shell=0 quiet splash" If "audit" is not set to "1", is missing, or is commented out, this is a finding.
Enable auditing of processes that start prior to the audit daemon with the following command: $ grubby --update-kernel=ALL --args="audit=1"
Verify that AlmaLinux OS 9 is configured to audit the execution of the "truncate", "ftruncate", "creat", "open", "openat", and "open_by_handle_at" system calls with the following command: $ grep -E 'open|truncate|creat' /etc/audit/audit.rules -a always,exit -F arch=b32 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=perm_access -a always,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=perm_access -a always,exit -F arch=b32 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=perm_access -a always,exit -F arch=b64 -S open,truncate,ftruncate,creat,openat,open_by_handle_at -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=perm_access If both the "b32" and "b64" audit rules are not defined for the "truncate", "ftruncate", "creat", "open", "openat", and "open_by_handle_at" system calls, or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "truncate", "ftruncate", "creat", "open", "openat", and "open_by_handle_at" syscalls. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access -a always,exit -F arch=b64 -S creat,open,openat,truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=unset -k access -a always,exit -F arch=b32 -S creat,open,openat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access -a always,exit -F arch=b32 -S creat,open,openat,truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=unset -k access Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "chacl" command with the following command: $ grep /chacl /etc/audit/audit.rules -a always,exit -S all -F path=/usr/bin/chacl -F perm=x -F auid>=1000 -F auid!=unset -F key=perm_mod If the command does not return an audit rule for "chacl" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "chacl" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/chacl -F perm=x -F auid>=1000 -F auid!=unset -k perm_mod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "chage" command with the following command: $ grep /chage /etc/audit/audit.rules -a always,exit -S all -F path=/usr/bin/chage -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-chage If the command does not return an audit rule for "chage" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "chage" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/chage -F perm=x -F auid>=1000 -F auid!=unset -k privileged Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "chcon" command with the following command: $ grep /chcon /etc/audit/audit.rules -a always,exit -S all -F path=/usr/bin/chcon -F perm=x -F auid>=1000 -F auid!=unset -F key=perm_mod If the command does not return an audit rule for "chcon" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "chcon" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/chcon -F perm=x -F auid>=1000 -F auid!=unset -k perm_mod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "chmod", "fchmod", and "fchmodat" system calls with the following command: $ auditctl -l | grep chmod -a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod If both the "b32" and "b64" audit rules are not defined for the "chmod", "fchmod", and "fchmodat" system calls, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "chmod", "fchmod", and "fchmodat" syscalls. Add the following lines to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "chown", "fchown", "fchownat", and "lchown" system calls with the following command: $ auditctl -l | grep chown -a always,exit -F arch=b32 -S chown,fchown,fchownat,lchown -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b64 -S chown,fchown,fchownat,lchown -F auid>=1000 -F auid!=unset -k perm_mod If both the "b32" and "b64" audit rules are not defined for the "chown", "fchown", "fchownat", and "lchown" system calls, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "chown", "fchown", and "fchownat" and "lchown" syscalls. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b32 -S chown,fchown,fchownat,lchown -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b64 -S chown,fchown,fchownat,lchown -F auid>=1000 -F auid!=unset -k perm_mod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "chsh" command with the following command: $ auditctl -l | grep chsh -a always,exit -S all -F path=/usr/bin/chsh -F perm=x -F auid>=1000 -F auid!=unset -F key=priv_cmd If the command does not return an audit rule for "chsh" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "chsh" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/chsh -F perm=x -F auid>=1000 -F auid!=unset -k priv_cmd Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "crontab" command with the following command: $ auditctl -l | grep crontab -a always,exit -S all -F path=/usr/bin/crontab -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-crontab If the command does not return an audit rule for "crontab" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "crontab" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/crontab -F perm=x -F auid>=1000 -F auid!=unset -k privileged-crontab Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "rename", "unlink", "rmdir", "renameat", and "unlinkat" system calls with the following command: $ auditctl -l | grep rename -a always,exit -F arch=b32 -S unlink,rename,rmdir,unlinkat,renameat -F auid>=1000 -F auid!=unset -F key=delete -a always,exit -F arch=b64 -S rename,rmdir,unlink,unlinkat,renameat -F auid>=1000 -F auid!=unset -F key=delete If both the "b32" and "b64" audit rules are not defined for the "rename", "unlink", "rmdir", "renameat", and "unlinkat" system calls, or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "rename", "unlink", "rmdir", "renameat", and "unlinkat" syscalls. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b64 -S rename,unlink,unlinkat,renameat -F auid>=1000 -F auid!=unset -F key=delete -a always,exit -F arch=b32 -S rename,unlink,unlinkat,renameat -F auid>=1000 -F auid!=unset -F key=delete Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify AlmaLinux OS 9 generates audit records for all account creations, modifications, disabling, and termination events that affect "/var/log/faillock" with the following command: $ grep /var/log/faillock /etc/audit/audit.rules -w /var/log/faillock -p wa -k logins If the command does not return a line, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records for all account creations, modifications, disabling, and termination events that affect "/var/log/faillock". Add the following to the "/etc/audit/rules.d/audit.rules" file: -w /var/log/faillock -p wa -k logins Merge the rules into /etc/audit/audit.rules: $ augenrules --load Reboot the server so the changes to take effect.
Verify that AlmaLinux OS 9 is configured to audit the execution of the "gpasswd" command with the following command: $ auditctl -l | grep gpasswd -a always,exit -S all -F path=/usr/bin/gpasswd -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-gpasswd If the command does not return an audit rule for "gpasswd" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "gpasswd" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/gpasswd -F perm=x -F auid>=1000 -F auid!=unset -k privileged-gpasswd Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "kmod" command with the following command: $ auditctl -l | grep kmod -a always,exit -F path=/usr/bin/kmod -F perm=x -F auid>=1000 -F auid!=unset -k modules If the command does not return a line, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "kmod" command. Add the following lines to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/kmod -F perm=x -F auid>=1000 -F auid!=unset -k modules Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "newgrp" command with the following command: $ auditctl -l | grep newgrp -a always,exit -S all -F path=/usr/bin/newgrp -F perm=x -F auid>=1000 -F auid!=unset -F key=priv_cmd If the command does not return an audit rule for "newgrp" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "newgrp" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/newgrp -F perm=x -F auid>=1000 -F auid!=unset -k priv_cmd Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "passwd" command with the following command: $ auditctl -l | grep passwd -a always,exit -S all -F path=/usr/bin/passwd -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-passwd If the command does not return an audit rule for "passwd" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "passwd" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/passwd -F perm=x -F auid>=1000 -F auid!=unset -k privileged-passwd Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "postdrop" command with the following command: $ auditctl -l | grep postdrop -a always,exit -S all -F path=/usr/sbin/postdrop -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-unix-update If the command does not return an audit rule for "postdrop" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "postdrop" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/postdrop -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "postqueue" command with the following command: $ auditctl -l | grep postqueue -a always,exit -S all -F path=/usr/sbin/postqueue -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-unix-update If the command does not return an audit rule for "postqueue" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "postqueue" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/postqueue -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "su" command with the following command: $ grep -w path=/usr/bin/su /etc/audit/audit.rules -a always,exit -S all -F path=/usr/bin/su -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-priv_change If the command does not return a matching line, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "su" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -S all -F path=/usr/bin/su -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-priv_change Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "sudo" command. $ grep -w path=/usr/bin/sudo /etc/audit/audit.rules -a always,exit -S all -F path=/usr/bin/sudo -F perm=x -F auid>=1000 -F auid!=unset -F key=priv_cmd If the command does not return a matching line, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "sudo" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -S all -F path=/usr/bin/sudo -F perm=x -F auid>=1000 -F auid!=unset -F key=priv_cmd Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "semanage" command with the following command: $ auditctl -l | grep semanage -a always,exit -S all -F path=/usr/sbin/semanage -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-unix-update If the command does not return an audit rule for "semanage" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "semanage" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/semanage -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update" Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "setfacl" command with the following command: $ auditctl -l | grep setfacl -a always,exit -S all -F path=/usr/bin/setfacl -F perm=x -F auid>=1000 -F auid!=unset -F key=perm_mod If the command does not return an audit rule for "setfacl" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "setfacl" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/setfacl -F perm=x -F auid>=1000 -F auid!=unset -k perm_mod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "setfiles" command with the following command: $ auditctl -l | grep setfiles -a always,exit -F path=/usr/sbin/setfiles -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update If the command does not return an audit rule for "setfiles" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "setfiles" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/setfiles -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "setsebool" command with the following command: $ auditctl -l | grep setsebool -a always,exit -S all -F path=/usr/sbin/setsebool -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged If the command does not return an audit rule for "setsebool" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "setsebool" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/setsebool -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "ssh-agent" command with the following command: $ auditctl -l | grep ssh-agent -a always,exit -S all -F path=/usr/bin/ssh-agent -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-ssh If the command does not return an audit rule for "ssh-agent" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "ssh-agent" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/ssh-agent -F perm=x -F auid>=1000 -F auid!=unset -k privileged-ssh Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "ssh-keysign" command with the following command: $ auditctl -l | grep ssh-keysign -a always,exit -S all -F path=/usr/bin/ssh-keysign -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-ssh If the command does not return an audit rule for "ssh-keysign" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "ssh-keysign" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/ssh-keysign -F perm=x -F auid>=1000 -F auid!=unset -k privileged-ssh Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "sudoedit" command with the following command: $ auditctl -l | grep sudoedit -a always,exit -S all -F path=/usr/bin/sudoedit -F perm=x -F auid>=1000 -F auid!=unset -F key=priv_cmd If the command does not return an audit rule for "sudoedit" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "sudoedit" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/bin/sudoedit -F perm=x -F auid>=1000 -F auid!=unset -k priv_cmd Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "pam_timestamp_check" command with the following command: $ auditctl -l | grep timestamp -a always,exit -S all -F path=/usr/sbin/pam_timestamp_check -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-pam_timestamp_check If the command does not return an audit rule for "pam_timestamp_check" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "pam_timestamp_check" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/pam_timestamp_check -F perm=x -F auid>=1000 -F auid!=unset -k privileged-pam_timestamp_check Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "unix_chkpwd" command with the following command: $ auditctl -l | grep unix_chkpwd -a always,exit -S all -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-unix-update If the command does not return an audit rule for "unix_chkpwd" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "unix_chkpwd" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "unix_update" command with the following command: $ grep /unix_update /etc/audit/audit.rules -a always,exit -S all -F path=/usr/sbin/unix_update -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-unix-update If the command does not return an audit rule for "unix_update" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "unix_update" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/unix_update -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "userhelper" command with the following command: $ auditctl -l | grep userhelper -a always,exit -S all -F path=/usr/sbin/userhelper -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-unix-update If the command does not return an audit rule for "userhelper" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "userhelper" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/userhelper -F perm=x -F auid>=1000 -F auid!=unset -k privileged-unix-update Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "usermod" command with the following command: $ auditctl -l | grep usermod -a always,exit -S all -F path=/usr/sbin/usermod -F perm=x -F auid>=1000 -F auid!=unset -F key=privileged-usermod If the command does not return an audit rule for "usermod" or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "usermod" command. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F path=/usr/sbin/usermod -F perm=x -F auid>=1000 -F auid!=unset -k privileged-usermod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify that AlmaLinux OS 9 is configured to audit the execution of the "setxattr", "fsetxattr", "lsetxattr", "removexattr", "fremovexattr", and "lremovexattr" system calls with the following command: $ auditctl -l | grep xattr -a always,exit -F arch=b32 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid>=1000 -F auid!=unset -F key=perm_mod -a always,exit -F arch=b64 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid>=1000 -F auid!=unset -F key=perm_mod -a always,exit -F arch=b32 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid=0 -F key=perm_mod -a always,exit -F arch=b64 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid=0 -F key=perm_mod If both the "b32" and "b64" audit rules are not defined for the "setxattr", "fsetxattr", "lsetxattr", "removexattr", "fremovexattr", and "lremovexattr" system calls, or any of the lines returned are commented out, this is a finding.
Configure AlmaLinux OS 9 to generate audit records upon successful/unsuccessful attempts to use the "setxattr", "fsetxattr", "lsetxattr", "removexattr", "fremovexattr", and "lremovexattr" syscalls. Add the following to the "/etc/audit/rules.d/audit.rules" file: -a always,exit -F arch=b32 -S setxattr,fsetxattr,lsetxattr,removexattr,fremovexattr,lremovexattr -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b64 -S setxattr,fsetxattr,lsetxattr,removexattr,fremovexattr,lremovexattr -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b32 -S setxattr,fsetxattr,lsetxattr,removexattr,fremovexattr,lremovexattr -F auid=0 -k perm_mod -a always,exit -F arch=b64 -S setxattr,fsetxattr,lsetxattr,removexattr,fremovexattr,lremovexattr -F auid=0 -k perm_mod Merge the rules into /etc/audit/audit.rules: $ augenrules --load
Verify AlmaLinux OS 9 allocates a sufficient audit_backlog_limit to capture processes that start prior to the audit daemon with the following command: $ grubby --info=ALL | grep args | grep -v 'audit_backlog_limit=8192' If the command returns any outputs, and audit_backlog_limit is less than "8192", this is a finding.
Configure AlmaLinux OS 9 to allocate sufficient audit_backlog_limit to capture processes that start prior to the audit daemon with the following command: $ grubby --update-kernel=ALL --args=audit_backlog_limit=8192
Verify that a separate file system/partition has been created for the system audit data path with the following command: Note: /var/log/audit is used as the example as it is a common location. $ findmnt /var/log/audit TARGET SOURCE FSTYPE OPTIONS /var/log/audit /dev/mapper/luks-29b74747-2f82-4472-82f5-0b5eb763effc xfs rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota If no line is returned, this is a finding.
Migrate the system audit data path onto a separate file system.
Verify AlmaLinux OS 9 allocates audit record storage capacity to store at least one week of audit records when audit records are not immediately sent to a central audit record storage facility. Note: The partition size needed to capture a week of audit records is based on the activity level of the system and the total storage capacity available. Typically 10GB of storage space for audit records should be sufficient. Determine which partition the audit records are being written to with the following command: $ grep -w log_file /etc/audit/auditd.conf log_file = /var/log/audit/audit.log Check the size of the partition that audit records are written to with the following command and verify whether it is sufficiently large: $ df -h /var/log/audit/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/luks-29b74747-2f82-4472-82f5-0b8eb763effc 1002M 77M 926M 8% /var/log/audit If the audit record partition is not allocated for sufficient storage capacity, this is a finding.
Allocate enough storage capacity for at least one week of audit records when audit records are not immediately sent to a central audit record storage facility. If audit records are stored on a partition made specifically for audit records, resize the partition with sufficient space to contain one week of audit records. If audit records are not stored on a partition made specifically for audit records, a new partition with sufficient space will need be to be created.
Verify that AlmaLinux OS 9 has the audispd-plugins package for installed with the following command: $ dnf list --installed audispd-plugins audispd-plugins.x86_64 3.0.7-103.el9 @anaconda If the "audispd-plugins" package is not installed, this is a finding.
The audispd-plugins package can be installed with the following command: $ dnf install audispd-plugins
Verify that AlmaLinux OS 9 Audit Daemon is configured to label all offloaded audit logs, with the following command: $ grep name_format /etc/audit/auditd.conf name_format = HOSTNAME If the "name_format" option is not "HOSTNAME", "fqd", or "numeric", or the line is commented out, this is a finding.
Edit the /etc/audit/auditd.conf file and add or update the "name_format" option: name_format = HOSTNAME The audit daemon must be restarted for changes to take effect.
Verify that AlmaLinux OS 9 audit system is configured to take an appropriate action when the internal event queue is full: $ grep -i overflow_action /etc/audit/auditd.conf overflow_action = SYSLOG If the value of the "overflow_action" option is not set to "SYSLOG", "SINGLE", "HALT" or the line is commented out, ask the system administrator (SA) to indicate how the audit logs are offloaded to a different system or media. If there is no evidence that the transfer of the audit logs being offloaded to another system or media takes appropriate action if the internal event queue becomes full, this is a finding.
Edit the /etc/audit/auditd.conf file and add or update the "overflow_action" option: overflow_action = SYSLOG The audit daemon must be restarted for changes to take effect.
Verify AlmaLinux OS 9 is configured use the audisp-remote syslog service with the following command: $ grep active /etc/audit/plugins.d/syslog.conf active = yes If the "active" keyword does not have a value of "yes", the line is commented out, or the line is missing, this is a finding.
Edit the /etc/audit/plugins.d/syslog.conf file and add or update the "active" option: active = yes The audit daemon must be restarted for changes to take effect.
Verify AlmaLinux OS 9 authenticates the remote logging server for offloading audit logs with the following command: $ grep -i '$ActionSendStreamDriverAuthMode' /etc/rsyslog.conf /etc/rsyslog.d/*.conf /etc/rsyslog.d/stig.conf:$ActionSendStreamDriverAuthMode x509/name If the value of the "$ActionSendStreamDriverAuthMode" option is not set to "x509/name" or the line is commented out, ask the system administrator (SA) to indicate how the audit logs are offloaded to a different system or media. If there is no evidence that the transfer of the audit logs being offloaded to another system or media is encrypted, this is a finding.
Configure AlmaLinux OS 9 to authenticate the remote logging server for offloading audit logs by setting the following option in "/etc/rsyslog.conf" or "/etc/rsyslog.d/[customfile].conf": $ActionSendStreamDriverAuthMode x509/name
Verify AlmaLinux OS 9 encrypts audit records offloaded onto a different system or media from the system being audited via rsyslog with the following command: $ grep -i '$ActionSendStreamDriverMode' /etc/rsyslog.conf /etc/rsyslog.d/*.conf /etc/rsyslog.d/stig.conf:$ActionSendStreamDriverMode 1 If the value of the "$ActionSendStreamDriverMode" option is not set to "1" or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to encrypt offloaded audit records via rsyslog by setting the following options in "/etc/rsyslog.conf" or "/etc/rsyslog.d/[customfile].conf": $ActionSendStreamDriverMode 1
Verify AlmaLinux OS 9 uses the gtls driver to encrypt audit records offloaded onto a different system or media from the system being audited with the following command: $ grep -i '$DefaultNetstreamDriver' /etc/rsyslog.conf /etc/rsyslog.d/*.conf /etc/rsyslog.d/stig.conf:$DefaultNetstreamDriver gtls If the value of the "$DefaultNetstreamDriver" option is not set to "gtls" or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to use the gtls driver to encrypt offloaded audit records by setting the following options in "/etc/rsyslog.conf" or "/etc/rsyslog.d/[customfile].conf": $DefaultNetstreamDriver gtls
Verify that AlmaLinux OS 9 has the rsyslog package installed with the following command: $ dnf list --installed rsyslog rsyslog.x86_64 8.2102.0-113.el9_2.1 @appstream If the "rsyslog" package is not installed, this is a finding.
The rsyslog package can be installed with the following command: $ dnf install rsyslog
Verify that AlmaLinux OS 9 audit system offloads audit records onto a different system or media from the system being audited via rsyslog using TCP with the following command: $ grep @@ /etc/rsyslog.conf /etc/rsyslog.d/*.conf /etc/rsyslog.d/stig.conf:*.* @@loghost.example.com" If a remote server is not configured, or the line is commented out, ask the system administrator (SA) to indicate how the audit logs are offloaded to a different system or media. If there is no evidence that the audit logs are being offloaded to another system or media, this is a finding.
Configure AlmaLinux OS 9 to offload audit records onto a different system or media from the system being audited via TCP using rsyslog by specifying the remote logging server in "/etc/rsyslog.conf"" or "/etc/rsyslog.d/[customfile].conf" with the name or IP address of the log aggregation server. *.* @@[server]:[port]"
Verify that "rsyslog" is active with the following command: $ systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled) Active: active (running) since Mon 2024-03-04 10:10:08 UTC; 3h 20min ago If the rsyslog service is not active, this is a finding.
To enable the rsyslog service, run the following command: $ systemctl enable --now rsyslog
Verify AlmaLinux OS 9 takes action when allocated audit record storage volume reaches 95 percent of the repository maximum audit record storage capacity with the following command: $ grep -w admin_space_left /etc/audit/auditd.conf admin_space_left = 5% If the value of the "admin_space_left" keyword is not set to 5 percent of the storage volume allocated to audit logs, or if the line is commented out, ask the system administrator (SA) to indicate how the system is taking action if the allocated storage is about to reach capacity. If the "space_left" value is not configured to the correct value, this is a finding.
Configure AlmaLinux OS 9 to initiate an action when allocated audit record storage volume reaches 95 percent of the repository maximum audit record storage capacity by adding/modifying the following line in the /etc/audit/auditd.conf file. admin_space_left = 5%
Verify that AlmaLinux OS 9 is configured to take action in the event of allocated audit record storage volume reaches 95 percent of the repository maximum audit record storage capacity with the following command: $ grep admin_space_left_action /etc/audit/auditd.conf admin_space_left_action = single If the value of the "admin_space_left_action" is not set to "single", or if the line is commented out, ask the system administrator (SA) to indicate how the system is providing real-time alerts to the SA and information system security officer (ISSO). If there is no evidence that real-time alerts are configured on the system, this is a finding.
Configure the "auditd" service to take action in the event of allocated audit record storage volume reaches 95 percent of the repository maximum audit record storage capacity. Edit the following line in "/etc/audit/auditd.conf" to ensure that the system is forced into single user mode in the event the audit record storage volume is about to reach maximum capacity: admin_space_left_action = single The audit daemon must be restarted for changes to take effect.
Verify AlmaLinux OS 9 takes action when allocated audit record storage volume reaches 75 percent of the repository maximum audit record storage capacity with the following command: $ grep -w space_left /etc/audit/auditd.conf space_left = 25% If the value of the "space_left" keyword is not set to 25 percent of the storage volume allocated to audit logs, or if the line is commented out, ask the system administrator (SA) to indicate how the system is providing real-time alerts to the SA and information system security officer (ISSO). If the "space_left" value is not configured to the correct value, this is a finding.
Configure AlmaLinux OS 9 to initiate an action to notify the SA and ISSO (at a minimum) when allocated audit record storage volume reaches 75 percent of the repository maximum audit record storage capacity by adding/modifying the following line in the /etc/audit/auditd.conf file. space_left = 25%
Verify AlmaLinux OS 9 notifies the SA and ISSO (at a minimum) when allocated audit record storage volume reaches 75 percent of the repository maximum audit record storage capacity with the following command: $ grep -w space_left_action /etc/audit/auditd.conf space_left_action = email If the value of the "space_left_action" is not set to "email", or if the line is commented out, ask the SA to indicate how the system is providing real-time alerts to the SA and ISSO. If there is no evidence that real-time alerts are configured on the system, this is a finding.
Configure AlmaLinux OS 9 to initiate an action to notify the SA and ISSO (at a minimum) when allocated audit record storage volume reaches 75 percent of the repository maximum audit record storage capacity by adding/modifying the following line in the /etc/audit/auditd.conf file. space_left_action = email
Verify that AlmaLinux OS 9 is configured to notify the SA and/or ISSO (at a minimum) in the event of an audit processing failure with the following command: $ grep action_mail_acct /etc/audit/auditd.conf action_mail_acct = root If the value of the "action_mail_acct" keyword is not set to "root" and/or other accounts for security personnel, the "action_mail_acct" keyword is missing, or the retuned line is commented out, ask the SA to indicate how they and the ISSO are notified of an audit process failure (e.g. using syslog). If there is no evidence of the proper personnel being notified of an audit processing failure, this is a finding.
Configure the "auditd" service to notify the SA and ISSO in the event of an audit processing failure. Edit the following line in "/etc/audit/auditd.conf" to ensure that administrators are notified via email for those situations: action_mail_acct = root
Note: If postfix is not installed or used to send email remotely, then this requirement is Not Applicable. Verify that AlmaLinux OS 9 is configured to notify the appropriate interactive users in the event of an audit processing failure. Find the alias maps that are being used with the following command: $ postconf alias_maps alias_maps = hash:/etc/aliases Query the Postfix alias maps for an alias for the root user with the following command: $ postmap -q root hash:/etc/aliases isso If an alias is not set, this is a finding.
Edit the aliases map file (by default /etc/aliases) used by Postfix and configure a root alias (using the user isso as an example): root: isso Update the aliases database with the command: $ newaliases
Verify that AlmaLinux OS 9 takes the appropriate action when an audit processing failure occurs due to a disk error, with the following command: $ grep disk_error_action /etc/audit/auditd.conf disk_error_action = HALT If the value of the "disk_error_action" option is not "SYSLOG", "SINGLE", or "HALT", is commented out, or is missing, this is a finding.
Configure AlmaLinux OS 9 to shut down by default upon audit failure (unless availability is an overriding concern). Add or update the following line ("disk_error_action" can be set to "HALT" or "SINGLE" depending on configuration) in the "/etc/audit/auditd.conf" file: disk_error_action = HALT If availability has been determined to be more important, and this decision is documented with the information system security officer (ISSO), configure AlmaLinux OS 9 to notify system administration staff and ISSO staff in the event of an audit processing failure by setting the "disk_error_action" to "SYSLOG".
Verify that AlmaLinux OS 9 takes the appropriate action when the audit storage volume is full, with the following command: $ grep disk_full_action /etc/audit/auditd.conf disk_full_action = HALT If the value of the "disk_full_action" option is not "SYSLOG", "SINGLE", or "HALT", is commented out, or is missing, this is a finding.
Configure AlmaLinux OS 9 to shut down by default upon audit failure (unless availability is an overriding concern). Add or update the following line ("disk_full_action" can be set to "HALT" or "SINGLE" depending on configuration) in the "/etc/audit/auditd.conf" file: disk_full_action = HALT If availability has been determined to be more important, and this decision is documented with the information system security officer (ISSO), configure AlmaLinux OS 9 to notify system administration staff and ISSO staff in the event of an audit processing failure by setting the "disk_full_action" to "SYSLOG".
Verify the auditd service is configured to panic on a critical error with the following command: $ auditctl -s failure 2 A number of parameters will display. If the value for "failure" is not "2", and availability is not documented as an overriding concern, this is a finding.
Configure AlmaLinux OS 9 to halt the system when auditing failures occur. Add the following line to the /etc/audit/audit.rules file: -f 2 Reload the audit rules with the following command: auditctl -R /etc/audit/audit.rules
Verify that AlmaLinux OS 9 is configured to make full use of the auditd storage volume when rotation is enabled, with the following command: $ grep max_log_file /etc/audit/auditd.conf max_log_file = 8 If the value of the "max_log_file" option is not sufficiently large to maximize the use of the storage volume, is commented out, or is missing, this is a finding.
Configure AlmaLinux OS 9 to make full use of the auditd storage volume with rotation enabled. Add or update the following line in the "/etc/audit/auditd.conf" file to a value large enough to make efficient use of the auditd storage volume: max_log_file = 100
Verify that AlmaLinux OS 9 takes the appropriate action when the audit files have reached maximum size, with the following command: $ grep max_log_file_action /etc/audit/auditd.conf max_log_file_action = ROTATE If the value of the "max_log_file_action" option is not "ROTATE", "KEEP_LOGS", is commented out, or is missing, this is a finding.
Configure AlmaLinux OS 9 to rotate the audit log when it reaches maximum size. Add or update the following line ("max_log_file_action" can be set to "ROTATE" or "KEEP_LOGS" depending on configuration) in the "/etc/audit/auditd.conf" file: max_log_file_action = ROTATE
Verify that AlmaLinux OS 9 is configured to make full use of the auditd storage volume when rotation is enabled, with the following command: $ grep num_logs /etc/audit/auditd.conf num_logs = 5 If the value of the "num_logs" option is not between 2 and 99, is commented out, or is missing, this is a finding.
Configure AlmaLinux OS 9 to make full use of the auditd storage volume with rotation enabled. Add or update the following line ("num_logs" can be set to a number between 2 and 99) in the "/etc/audit/auditd.conf" file: num_logs = 5
Verify that audit system is configured to flush to disk after every 100 records with the following command: $ grep freq /etc/audit/auditd.conf freq = 100 If "freq" is not set to a value between "1" and "100", the value is missing, or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 to flush audit to disk by adding or updating the following rule in "/etc/audit/auditd.conf": freq = 100 The audit daemon must be restarted for the changes to take effect.
Verify that the auditd service is enabled with the following command: $ systemctl status auditd.service auditd.service - Security Auditing Service Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled; preset: enabled) Active: active (running) since Fri 2024-01-05 14:04:30 UTC; 10min ago If the audit service is not "active" and "running", this is a finding.
To enable the auditd service run the following command: $ systemctl enable --now auditd
Verify the chronyd service is active with the following command: $ systemctl is-active chronyd active If the chronyd service is not active, this is a finding.
To enable the chronyd service run the following command: $ systemctl enable --now chronyd
Verify that AlmaLinux OS 9 has the chrony package installed with the following command: $ dnf list --installed chrony Installed Packages chrony.x86_64 4.3-1.el9 @anaconda If the "chrony" package is not installed, this is a finding.
The chrony package can be installed with the following command: $ dnf install chrony
Verify AlmaLinux OS 9 is securely comparing internal information system clocks at least every 24 hours with an NTP server with the following commands: $ grep maxpoll /etc/chrony.conf server 0.us.pool.ntp.mil iburst maxpoll 16 If the "maxpoll" option is set to a number greater than 16 or the line is commented out, this is a finding. Verify the "chrony.conf" file is configured to an authoritative DOD time source by running the following command: $ grep -i server /etc/chrony.conf server 0.us.pool.ntp.mil If the parameter "server" is not set or is not set to an authoritative DOD time source, this is a finding.
Configure AlmaLinux OS 9 to securely compare internal information system clocks at least every 24 hours with an NTP server by adding/modifying the following line in the /etc/chrony.conf file. server <ntp.server.name> iburst maxpoll 16
Verify the audit log directory is owned by "root". First determine where the audit logs are stored with the following command: $ grep -w log_file /etc/audit/auditd.conf log_file = /var/log/audit/audit.log Then using the location of the audit log file, determine if the audit log is owned by the "root" user and group using the following command: $ stat -c "%U:%G %n" /var/log/audit root:root /var/log/audit If the audit log directory is not owned by "root:root", this is a finding.
Change the audit directory to be owned by the root user and group: $ chown root:root /var/log/audit
Verify the audit log directory has 0700 (u=rwx) permissions. First determine where the audit logs are stored with the following command: $ grep -w log_file /etc/audit/auditd.conf log_file = /var/log/audit/audit.log Then using the location of the audit log file, determine if the audit log directory has 0700 permissions using the following command: $ stat -c "%U:%G %#a %n" /var/log/audit root:root 0700 /var/log/audit If the audit log directory does not have 0700 permissions, this is a finding.
Change the audit directory to have 0700 permissions: $ chmod 0700 /var/log/audit
Verify the audit logs are owned by the "root" group. First determine if a group other than "root" has been assigned to the audit logs with the following command: $ grep log_group /etc/audit/auditd.conf log_group = root Then determine where the audit logs are stored with the following command: $ grep -w log_file /etc/audit/auditd.conf log_file = /var/log/audit/audit.log Then using the location of the audit log file, determine if the audit log is owned by the "root" group using the following command: $ stat -c "%G" /var/log/audit/audit.log root If the audit log is not owned by the "root" group, or log_group is not set to "root", this is a finding.
Change the audit logs to be owned by the root group: $ chgrp root /var/log/audit/audit.log Then set the group to root in /etc/audit/auditd.conf by adding or updating the following line: log_group = root
Verify the audit logs are owned by the "root" user. First determine where the audit logs are stored with the following command: $ grep -w log_file /etc/audit/auditd.conf log_file = /var/log/audit/audit.log Then using the location of the audit log file, determine if the audit log is owned by the "root" user using the following command: $ stat -c "%U" /var/log/audit/audit.log root If the audit log is not owned by the "root" user this is a finding.
Change the audit logs to be owned by the root user: $ chown root /var/log/audit/*
Verify the audit log files have 0600 (u=rw-) permissions. First determine where the audit logs are stored with the following command: $ grep -w log_file /etc/audit/auditd.conf log_file = /var/log/audit/audit.log Then using the location of the audit log file, determine if the audit logs have 0600 permissions using the following command: $ stat -c "%U:%G %#a %n" /var/log/audit/* root:root 0600 /var/log/audit/audit.log If the audit log files do not have 0600 permissions, this is a finding.
Change the audit logs to have 0600 permissions: $ chmod 0600 /var/log/audit/*
Verify the audit tools are group owned by "root" with the following command: $ stat -c "%G %n" /sbin/auditctl /sbin/aureport /sbin/ausearch /sbin/autrace /sbin/auditd /sbin/rsyslogd /sbin/augenrules root /sbin/auditctl root /sbin/aureport root /sbin/ausearch root /sbin/autrace root /sbin/auditd root /sbin/rsyslogd root /sbin/augenrules If any audit tools do not have a group owner of "root", this is a finding.
Configure the audit tools to be group-owned by "root" by running the following command: $ chgrp root [audit_tool] Replace "[audit_tool]" with each audit tool not group-owned by "root".
Verify the audit tools are owned by "root" with the following command: $ stat -c "%U %n" /sbin/auditctl /sbin/aureport /sbin/ausearch /sbin/autrace /sbin/auditd /sbin/rsyslogd /sbin/augenrules root /sbin/auditctl root /sbin/aureport root /sbin/ausearch root /sbin/autrace root /sbin/auditd root /sbin/rsyslogd root /sbin/augenrules If any audit tools do not have an owner of "root", this is a finding.
Configure the audit tools to be owned by "root" by running the following command: $ chown root [audit_tool] Replace "[audit_tool]" with each audit tool not owned by "root".
Verify the audit tools have a mode of "0755" or less with the following command: $ stat -c "%#a %n" /sbin/auditctl /sbin/aureport /sbin/ausearch /sbin/autrace /sbin/auditd /sbin/rsyslogd /sbin/augenrules 0755 /sbin/auditctl 0755 /sbin/aureport 0755 /sbin/ausearch 0750 /sbin/autrace 0755 /sbin/auditd 0755 /sbin/rsyslogd 0755 /sbin/augenrules If any of the audit tool files have a mode more permissive than "0755", this is a finding.
Configure the audit tools to have a mode of "0755" by running the following command: $ chmod 0755 [audit_tool] Replace "[audit_tool]" with each audit tool that has a more permissive mode than 0755.
Verify the audit system prevents unauthorized changes to logon UIDs with the following command: $ grep immutable /etc/audit/audit.rules --loginuid-immutable If the "--loginuid-immutable" option is not returned in the "/etc/audit/audit.rules", or the line is commented out, this is a finding.
Configure AlmaLinux OS 9 auditing to prevent modification of login UIDs once they are set by adding the following line to /etc/audit/rules.d/audit.rules: --loginuid-immutable
Check that AIDE is properly configured to use cryptographic mechanisms to protect the integrity of the audit tools with the following command: $ grep /usr/sbin/au /etc/aide.conf /usr/sbin/auditctl p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/auditd p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/ausearch p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/aureport p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/autrace p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/augenrules p+i+n+u+g+s+b+acl+xattrs+sha512 If AIDE is not installed, ask the system administrator (SA) how file integrity checks are performed on the system. If any of the audit tools listed above do not have a corresponding line including "sha512", ask the SA to indicate what cryptographic mechanisms are being used to protect the integrity of the audit tools. If there is no evidence of integrity protection, this is a finding.
Add or update the following lines to "/etc/aide.conf", to protect the integrity of the audit tools: /usr/sbin/auditctl p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/auditd p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/ausearch p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/aureport p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/autrace p+i+n+u+g+s+b+acl+xattrs+sha512 /usr/sbin/augenrules p+i+n+u+g+s+b+acl+xattrs+sha512
Verify the audit system prevents unauthorized changes to the rules with the following command: $ grep -E '^-e 2' /etc/audit/audit.rules -e 2 If the audit system is not set to be immutable by adding the "-e 2" option to the end of "/etc/audit/audit.rules", this is a finding.
Configure the audit system to set the audit rules to be immutable by adding the following line to the end of "/etc/audit/rules.d/audit.rules" -e 2