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
Check if the system requires a password for entering single-user mode. # grep '~:S:' /etc/inittab If /sbin/sulogin is not listed, this is a finding.
Edit /etc/inittab and set sulogin to run in single-user mode. Example line in /etc/inittab: # what to do in single-user mode ls:S:wait:/etc/init.d/rc S ~~:S:respawn:/sbin/sulogin
Use the last command to check for multiple accesses to an account from different workstations/IP addresses. # last -R If users log directly onto accounts, rather than using the switch user (su) command from their own named account to access them, this is a finding (such as logging directly on to oracle). Verify with the SA or the IAO on documentation for users/administrators to log into their own accounts first and then switch user (su) to the account to be shared has been maintained including requirements and procedures. If no such documentation exists, this is a finding.
Use the switch user (su) command from a named account login to access shared accounts. Maintain audit trails to identify the actual user of the account name. Document requirements and procedures for users/administrators to log into their own accounts first and then switch user (su) to the account to be shared.
Check the system for duplicate account names. Example: # pwck -r If any duplicate account names are found, this is a finding.
Change user account names, or delete accounts, so each account has a unique name.
Perform the following to ensure there are no duplicate UIDs: # pwck -r If any duplicate UIDs are found, this is a finding.
Edit user accounts to provide unique UIDs for each account.
Access the system console and make a login attempt. Check for either of the following login banners based on the character limitations imposed by the system. An exact match is required. If one of these banners is not displayed, this is a finding. 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. OR I've read & consent to terms in IS user agreem't.
Edit /etc/issue and add one of the DoD login banners (based on the character limitations imposed by the system). DoD Login Banners: 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. OR I've read & consent to terms in IS user agreem't.
Determine if all logon attempts are being logged. Procedure: Verify successful logins are being logged: # last -R | more If the command does not return successful logins, this is a finding. Verify if unsuccessful logons are being logged: # lastb -R | more If the command does not return unsuccessful logins, this is a finding.
Make sure the collection files exist. Procedure: If there are no successful logins being returned from the "last" command, create /var/log/wtmp: # touch /var/log/wtmp If there are no unsuccessful logins being returned from the "lastb" command, create /var/log/btmp: # touch /var/log/btmp
Check the pam_tally configuration. # more /etc/pam.d/login Confirm the following line is configured, before the "common-auth” file is included: auth required pam_tally.so deny=3 onerr=fail # more /etc/pam.d/sshd Confirm the following line is configured, before the "common-auth” file is included: auth required pam_tally.so deny=3 onerr=fail If no such line is found, this is a finding.
Edit /etc/pam.d/login and/or /etc/pam.d/sshd and add the following line, before the "common-auth" file is included: auth required pam_tally.so deny=3 onerr=fail
Check the value of the FAIL_DELAY variable and the ability to use it Procedure:. # grep FAIL_DELAY /etc/login.defs If the value does not exist, or is less than 4, this is a finding. Check for the use of pam_faildelay. # grep pam_faildelay /etc/pam.d/common-auth* If the pam_faildelay.so module is not listed, this is a finding.
Add the pam_faildelay module and set the FAIL_DELAY variable. Procedure: Edit /etc/login.defs and set the value of the FAIL_DELAY variable to 4 or more. Edit /etc/pam.d/common-auth and add a pam_faildelay entry if one does not exist, such as: auth optional pam_faildelay.so
If there is an application running on the system continuously in use (such as a network monitoring application), ask the SA what the name of the application is. Verify documentation exists for the requirement and justification of the application. If no documentation exists, this is a finding. Execute "ps -ef | more" to determine which user owns the process(es) associated with the application. If the owner is root, this is a finding.
Configure the system so the owner of a session requires a continuous screen display, such as a network management display, is not root. Ensure the display is also located in a secure, controlled access area. Document and justify this requirement and ensure the terminal and keyboard for the display (or workstation) are secure from all but authorized personnel by maintaining them in a secure area, in a locked cabinet where a swipe card, or other positive forms of identification, must be used to gain entry.
Verify the system will not log in accounts with blank passwords. # grep nullok /etc/pam.d/common-auth # grep nullok /etc/pam.d/common-account # grep nullok /etc/pam.d/common-password # grep nullok /etc/pam.d/common-session If an entry for nullok is found, this is a finding on Linux.
Edit /etc/pam.d/<configuration file> and remove the "nullok" setting. OR Use ‘pam-config’ to configure the affected module if it is supported by pam-config
Check the system for duplicate UID 0 assignments by listing all accounts assigned UID 0. Procedure: # cat /etc/passwd | awk -F":" '{print$1":"$3":"}' | grep ":0:" If any accounts other than root are assigned UID 0, this is a finding.
Remove or change the UID of accounts other than root that have UID 0.
Determine if root is assigned a home directory other than / by listing its home directory. Procedure: # grep "^root" /etc/passwd | awk -F":" '{print $6}' If the root user home directory is /, this is a finding.
The root home directory should be something other than / (such as /roothome). Procedure: # mkdir /rootdir # chown root /rootdir # chgrp root /rootdir # chmod 700 /rootdir # cp -r /.??* /rootdir/. Then, edit the passwd file and change the root home directory to /rootdir. The cp -r /.??* command copies all files and subdirectories of file names beginning with "." into the new root directory, which preserves the previous root environment. Ensure you are in the "/" directory when executing the "cp" command. _ OR Use the YaST ‘Security and Users’ > ‘User and Group Management’ module to update the home directory for root.
Check the mode of the root home directory. Procedure: # grep "^root" /etc/passwd | awk -F":" '{print $6}' # ls -ld <root home directory> If the mode of the directory is not equal to 0700, this is a finding. If the home directory is /, this check will be marked "Not Applicable".
The root home directory will have permissions of 0700. Do not change the protections of the / directory. Use the following command to change protections for the root home directory: # chmod 0700 /rootdir.
To view the root user's PATH, log in as the root user, and execute: # env | grep PATH OR # echo $PATH This variable is formatted as a colon-separated list of directories. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry starts with a character other than a slash (/), this is a finding. If directories beyond those in the vendor's default root path are present. This is a finding.
Edit the root user's local initialization files ~/.profile,~/.bashrc (assuming root shell is bash). Change any found PATH variable settings to the vendor's default path for the root user. Remove any empty path entries or references to relative paths.
Check for world-writable permissions on all directories in the root user's executable search path. Procedure: # ls -ld `echo $PATH | sed "s/:/ /g"` If any of the directories in the PATH variable are world-writable, this is a finding.
For each world-writable path in root's executable search path, do one of the following: 1. Remove the world-writable permission on the directory. Procedure: # chmod o-w <path> 2. Remove the world-writable directory from the executable search path. Procedure: Identify and edit the initialization file referencing the world-writable directory and remove it from the PATH variable.
Check /etc/securetty # more /etc/securetty If the file does not exist, or contains more than "console" or a single "tty" device this is a finding.
Create if needed and set the contents of /etc/securetty to a "console" or "tty" device. # echo console > /etc/securetty or # echo ttyS0 > /etc/securetty
Confirm all accounts with a GID of 499 and below are used by a system account. Procedure: List all the users with a GID of 0-499. # awk -F: '$4 <= 499 {printf "%15s:%4s\n", $1, $4}' /etc/passwd | sort -n -t: -k2 If a GID reserved for system accounts (0 - 499) is used by a non-system account, this is a finding.
Change the primary group GID numbers for non-system accounts with reserved primary group GIDs (those less or equal to 499).
Perform the following to ensure there are no GIDs referenced in /etc/passwd not defined in /etc/group: # pwck -r If GIDs referenced in /etc/passwd are not defined in /etc/group are returned, this is a finding.
Add a group to the system for each GID referenced without a corresponding group.
Ask the SA or IAO if a host-based intrusion detection application is loaded on the system. The preferred intrusion detection system is McAfee HBSS available through Cybercom. If another host-based intrusion detection application, such as SELinux, is used on the system, this is not a finding. Procedure: Examine the system to see if the Host Intrusion Prevention System (HIPS) is installed #rpm -qa | grep MFEhiplsm If the MFEhiplsm package is installed, HBSS is being used on the system. If another host-based intrusion detection system is loaded on the system # find / -name <daemon name> Where <daemon name> is the name of the primary application daemon to determine if the application is loaded on the system. Determine if the application is active on the system. Procedure: # ps -ef | grep <daemon name> If no host-based intrusion detection system is installed on the system, this is a finding.
Install a host-based intrusion detection tool.
Obtain the list of available package security updates from Novell. Check the available package updates have been installed on the system. Use the "rpm" command to list the packages installed on the system. Example: # rpm -qa --last If updated packages are available and applicable to the system and have not been installed, this is a finding.
Install the security patches or updated packages available from the vendor.
Check system directories for uneven file permissions. Procedure: # ls –lL /etc /bin /usr/bin /usr/local/bin /sbin /usr/sbin /usr/local/sbin Uneven file permissions exist if the file owner has less permissions than the group or other user classes. If any of the files in the above listed directories contain uneven file permissions, this is a finding.
Change the mode of files with uneven permissions so owners do not have less permission than group or world users.
Check the system for files with no assigned owner. Procedure: # find / -nouser If any files have no assigned owner, this is a finding. Caution should be used when centralized authorization is used because valid files may appear as unowned due to communication issues.
All directories and files (executable and data) will have an identifiable owner and group name. Either trace files to an authorized user, change the file’s owner to root, or delete them. Determine the legitimate owner of the files and use the chown command to set the owner and group to the correct value. If the legitimate owner cannot be determined, change the owner to root (but make sure none of the changed files remain executable because they could be Trojan horses or other malicious code). Examine the files to determine their origin and the reason for their lack of an owner/group.
Check the mode of network services daemons. # find /usr/sbin -type f -perm +022 -exec stat -c %a:%n {} \; This will return the octal permissions and name of all files that are group or world writable. If any network services daemon listed is world or group writable (either or both of the 2 lowest order digits contain a 2, 3 or 6), this is a finding. Note: Network daemons not residing in these directories (such as httpd or sshd) must also be checked for the correct permissions.
Change the mode of the network services daemon. # chmod go-w <path>
Check the mode of log files. Procedure: # ls -lL /var/log /var/log/syslog /var/adm With the exception of /var/log/wtmp, if any of the log files have modes more permissive than 0640, this is a finding.
Change the mode of the system log file(s) to 0640 or less permissive. Procedure: # chmod 0640 /path/to/system-log-file Note: Do not confuse system log files with audit logs.
Check skeleton files permissions. # ls -alL /etc/skel If a skeleton file has a mode more permissive than 0644, this is a finding.
Change the mode of skeleton files with incorrect mode: # chmod 0644 <skeleton file>
Perform the following to check NIS file ownership: # ls -la /var/yp/*; If the file ownership is not root, sys, or bin, this is a finding.
Change the ownership of NIS/NIS+/yp files to root, sys or bin. Procedure (example): # chown root <filename>
Perform the following to check the group ownership of NIS files: # ls -la /var/yp/* If the file group ownership is not root, sys, or bin, this is a finding.
Perform the following to change the group ownership of NIS files: # chgrp root /var/yp/*
Perform the following to check NIS file premissions. # ls -la /var/yp/*; If the file's mode is more permissive than 0755, this is a finding.
Change the mode of NIS/NIS+/yp command files to 0755 or less permissive. Procedure (example): # chmod 0755 <filename>
Check the mode of the manual page files. Procedure: # ls -lL /usr/share/man /usr/share/info /usr/share/man/man* If any of the manual page files have a mode more permissive than 0644, this is a finding.
Change the mode of manual page files to 0644 or less permissive. Procedure (example): # chmod 0644 /path/to/manpage
Check the mode of library files. Procedure: # DIRS="/usr/lib /usr/lib64 /lib /lib64";for DIR in $DIRS;do find $DIR -type f -perm +022 -exec stat -c %a:%n {} \;;done This will return the octal permissions and name of all group or world writable files. If any file listed is world or group writable (either or both of the 2 lowest order digits contain a 2, 3 or 6), this is a finding.
Change the mode of library files to 0755 or less permissive. Procedure (example): # chmod go-w </path/to/library-file> Note: Library files should have an extension of ".a" or a ".so" extension, possibly followed by a version number.
Check the permissions for files in /etc, /bin, /usr/bin, /usr/local/bin, /sbin, /usr/sbin and /usr/local/sbin. Procedure: # DIRS="/etc /bin /usr/bin /usr/local/bin /sbin /usr/sbin /usr/local/sbin";for DIR in $DIRS;do find $DIR -type f -perm +022 -exec stat -c %a:%n {} \;;done This will return the octal permissions and name of all group or world writable files. If any file listed is world or group writable (either or both of the 2 lowest order digits contain a 2, 3 or 6), this is a finding. Note: Elevate to Severity Code I if any file listed is world-writable.
Change the mode for system command files to 0755 or less permissive taking into account necessary GUID and SUID bits. Procedure: # chmod go-w <filename>
Check the ownership of system files, programs, and directories. Procedure: # ls -lLa /etc /bin /usr/bin /usr/local/bin /sbin /usr/sbin /usr/local/sbin If any of the system files, programs, or directories are not owned by a system account, this is a finding.
Change the owner of system files, programs, and directories to a system account. Procedure: # chown root /some/system/file (A different system user may be used in place of root.)
Check the group-ownership of system files, programs, and directories. Procedure: # ls –lLa /etc /bin /usr/bin /usr/local/bin /sbin /usr/sbin /usr/local/sbin If any system file, program, or directory is not owned by a system group, this is a finding.
Change the group-owner of system files to a system group. Procedure: # chgrp root /path/to/system/file (System groups other than root may be used.)
Check the ownership of the /etc/shadow file. # ls -lL /etc/shadow If the /etc/shadow file is not owned by root, this is a finding.
Change the ownership of the /etc/shadow (or equivalent) file. # chown root /etc/shadow
Check the mode of the /etc/passwd file. Procedure: # ls -lL /etc/passwd If /etc/passwd has a mode more permissive than 0644, this is a finding.
Change the mode of the passwd file to 0644. Procedure: # chmod 0644 /etc/passwd
Check the mode of the /etc/shadow file. # ls -lL /etc/shadow If the /etc/shadow file has a mode more permissive than 0400, this is a finding.
Change the mode of the /etc/shadow (or equivalent) file. # chmod 0400 /etc/shadow
If STIGID GEN000220 is satisfied, this is not a finding. List all setuid files on the system. Procedure: # find / -perm -4000 -exec ls -l {} \; | more Note: Executing these commands may result in large listings of files; the output may be redirected to a file for easier analysis. Ask the SA or IAO if files with the suid bit set have been documented. If any undocumented file has its suid bit set, this is a finding.
Document the files with the suid bit set or unset the suid bit on the executable.
List all setgid files on the system. Procedure: # find / -perm -2000 -exec ls -l {} \; | more Note: Executing these commands may result in large listings of files; the output may be redirected to a file for easier analysis. Ask the SA or IAO if files with the sgid bit set have been documented. If any undocumented file has its sgid bit set, this is a finding.
Document the files with the sgid bit set or unset the sgid bit on the executable.
Determine if a weekly automated or manual process is used to generate a list of suid files on the system and compare it with the prior list. If no such process is in place, this is a finding. NOTE: For MAC I systems, increase the frequency to daily.
Establish a weekly automated or manual process to generate a list of suid files on the system and compare it with the prior list. To create a list of suid files: # find / -perm -4000 > suid-file-list NOTE: For MAC I systems, increase the frequency to daily.
Determine if a weekly automated or manual process is used to generate a list of sgid files on the system and compare it with the prior list. If no such process is in place, this is a finding. NOTE: For MAC I systems, increase the frequency to daily.
Establish a weekly automated or manual process to generate a list of sgid files on the system and compare it with the prior list. To create a list of sgid files: # find / -perm -2000 > suid-file-list NOTE: For MAC I systems, increase the frequency to daily.
Check /etc/fstab and verify the "nosuid" mount option is used on file systems mounted from removable media, network shares, or any other file system not containing approved setuid or setgid files. If any of these files systems do not mount with the "nosuid" option, it is a finding.
Edit /etc/fstab and add the "nosuid" mount option to all file systems mounted from removable media or network shares, and any file system not containing approved setuid or setgid files.
Check all world-writable directories have the sticky bit set. Procedure: # find / -type d -perm -002 ! -perm -1000 > wwlist If the sticky bit is not set on a world-writable directory, this is a finding.
Set the sticky bit on all public directories. Procedure: # chmod 1777 /tmp (Replace /tmp with the public directory missing the sticky bit, if necessary.
Check the ownership of all public directories. Procedure: # find / -type d -perm -1002 -exec ls -ld {} \; If any public directory is not owned by root or an application user, this is a finding.
Change the owner of public directories to root or an application account. Procedure: # chown root /tmp (Replace root with an application user and/or /tmp with another public directory as necessary.)
Check global initialization files for the configured umask value. Procedure: # grep umask /etc/* Check local initialization files for the configured umask value. Procedure: # cut -d: -f6 /etc/passwd |xargs -n1 -IDIR find DIR -name ".*" -type f -maxdepth 1 -exec grep umask {} \; If the system and user default umask is not 077, this a finding. Note: If the default umask is 000 or allows for the creation of world-writable files this becomes a Severity Code I finding.
Edit local and global initialization files that contain "umask" and change them to use 077 instead of the current value.
Determine if default system accounts (such as those for sys, bin, uucp, nuucp, daemon, smtp) have been disabled. # cat /etc/shadow If an account's password field is "*", "*LK*", or is prefixed with a '!', the account is locked or disabled. If there are any unlocked default system accounts this is a finding.
Lock the default system account(s). # passwd -l <user>
Determine if auditing is enabled. # ps -ef |grep auditd If the auditd process is not found, this is a finding.
Start the auditd service and set it to start on boot. # service auditd start ; chkconfig auditd on
Perform the following to determine the location of audit logs and then check the ownership. Procedure: # (audit_log_file=$(grep "^log_file" /etc/audit/auditd.conf|sed s/^[^\/]*//) && if [ -f "${audit_log_file}" ] ; then printf "Log(s) found in "${audit_log_file%/*}":\n"; ls -l ${audit_log_file%/*}; else printf "audit log file(s) not found\n"; fi) If any audit log file is not owned by root, this is a finding.
Change the ownership of the audit log file(s). Procedure: # chown root <audit log file>
Perform the following to determine the location of audit logs and then check the mode of the files. Procedure: # grep "^log_file" /etc/audit/auditd.conf|sed s/^[^\/]*//|xargs stat -c %a:%n If any audit log file has a mode more permissive than 0640, this is a finding.
Change the mode of the audit log file(s). # chmod 0640 <audit log file>
Verify auditd is configured to audit failed file access attempts. There must be an audit rule for each of the access syscalls logging all failed accesses (-F success=0) or there must both an "-F exit=-EPERM" and "-F exit=-EACCES" for each access syscall. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S creat" | grep -e "-F success=0" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S creat" | grep -e "-F exit=-EPERM" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S creat" | grep -e "-F exit=-EACCES" If an "-S creat" audit rule with "-F success" does not exist and no separate rules containing "-F exit=-EPERM" and "-F exit=-EACCES" for "creat" exist, then this is a finding.
Edit the audit.rules file and add the following line(s) to enable auditing of failed attempts to access files and programs: either: -a exit,always -F arch=<ARCH> -S creat -F success=0 or both: -a exit,always -F arch=<ARCH> -S creat -F exit=-EPERM -a exit,always -F arch=<ARCH> -S creat -S exit=-EACCES Restart the auditd service. # service auditd restart
Check the system audit configuration to determine if file and directory deletions are audited. # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "unlink" If no results are returned, or the results do not contain "-S unlink", this is a finding.
Edit the audit.rules file and add the following line to enable auditing of deletions: -a exit,always -S unlink Restart the auditd service. # rcauditd restart OR# service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -i "auditd.conf" If no results are returned, or the line does not start with "-w", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Add the following lines to the audit.rules file to enable auditing of administrative, privileged, and security actions: -w /etc/audit/auditd.conf Restart the auditd service. # rcauditd restart OR # service auditd restart
The message types that are always recorded to /var/log/audit/audit.log include LOGIN,USER_LOGIN,USER_START,USER_END among others and do not need to be added to audit_rules. The log files /var/log/faillog and /var/log/lastlog must be protected from tampering of the login records. Procedure: # egrep "faillog|lastlog" /etc/audit/audit.rules|grep -e "-p (wa|aw)" If both /var/log/faillog and /var/log/lastlog entries do not exist, this is a finding.
Ensure logins Procedure: Modify /etc/audit/audit.rules to contain: -w /var/log/faillog -p wa -w /var/log/lastlog -p wa Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " chmod " If "-S chmod" is not in the result, this is a finding
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S chmod Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the owner of the xinetd configuration files. Procedure: # ls -lL /etc/xinetd.conf # ls -laL /etc/xinetd.d This is a finding if any of the above files or directories are not owned by root or bin.
Change the owner of the xinetd configuration files. # chown root /etc/xinetd.conf /etc/xinetd.d/*
Check the mode of the xinetd configuration files. Procedure: # ls -lL /etc/xinetd.conf # ls -lL /etc/xinetd.d If the mode of the file(s) is more permissive than 0640, this is a finding.
Change the mode of the xinetd configuration files. # chmod 0640 /etc/xinetd.conf /etc/xinetd.d/*
Check the ownership of the services file. Procedure: # ls -lL /etc/services If the services file is not owned by root or bin, this is a finding.
Change the ownership of the services file to root or bin. Procedure: # chown root /etc/services
Check the mode of the services file. Procedure: # ls -lL /etc/services If the services file has a mode more permissive than 0644, this is a finding.
Change the mode of the services file to 0644 or less permissive. Procedure: # chmod 0644 /etc/services
Check global initialization files for the presence of "mesg -n" or "mesg n". Procedure: # grep "mesg" /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc If no global initialization files contain "mesg -n" or "mesg n", this is a finding.
Edit /etc/profile or another global initialization script, and add the "mesg -n" command.
Look for the presence of a print service configuration file. Procedure: # find /etc -name hosts.lpd -print # find /etc -name Systems -print # find /etc -name printers.conf If none of the files are found, this check should be marked Not Applicable. Otherwise, examine the configuration file. Procedure: # more <print service file> Check for entries that contain a ‘+’ or ‘_’ character. If any are found, this is a finding. For the "cups" print service, verify remote host access is limited. # grep -i Listen /etc/cups/cupsd.conf The /etc/cups/cupsd.conf file must not contain a Listen *:<port> or equivalent line. If the network address of the "Listen" line is unrestricted. This is a finding. # grep -i "Allow From" /etc/cups/cupsd.conf The "Allow From" line within the "<Location />" element should limit access to the printers to @LOCAL and specific hosts. If the "Allow From" line contains "All" this is a finding.
Remove the '+' entries from the hosts.lpd (or equivalent) file. Configure cups to use only the localhost or specified remote hosts. Procedure: Modify the /etc/cups/cupsd.conf file to "Listen" only to the local machine or a known set of hosts (i.e., Listen localhost:631). Modify the /etc/cups/cupsd.conf file "<Location />" element to "Deny From All" and "Allow from 127.0.0.1" or allowed host addresses. Restart cups: # rccups restart
Check the ownership of the print service configuration file. Procedure: # find /etc -name hosts.lpd -print # find /etc -name Systems –print # find /etc –name printers.conf -print If no print service configuration file is found, this is not applicable. Check the ownership of the print service configuration file(s). # ls –lL <print service file> If the owner of the file is not root, this is a finding.
Change the owner of the /etc/hosts.lpd (or equivalent, such as /etc/lp/Systems) to root. Procedure: # chown root <print service file>
Locate any print service configuration file on the system. Consult vendor documentation for the name and location of print service configuration files. Procedure: # find /etc -name hosts.lpd -print # find /etc -name Systems –print # find /etc -name printers.conf -print Check the mode of the print service configuration file. # ls -lL <print service file> If no print service configuration file is found, this is not applicable. If the mode of the print service configuration file is more permissive than 0644, this is a finding.
Change the mode of the /etc/hosts.lpd file (or equivalent, such as /etc/lp/Systems) to 0644 or less permissive. Consult vendor documentation for the name and location of print service configuration files. Procedure: # chmod 0644 <print service file>
Check the ownership of the alias files. Procedure: for sendmail: # ls -lL /etc/aliases # ls -lL /etc/aliases.db If all the files are not owned by root, this is a finding. for postfix: Verify the location of the alias file. # postconf alias_maps This will return the location of the "aliases" file. # ls -lL <postfix aliases file> # ls -lL <postfix aliases.db file> If all the files are not owned by root, this is a finding.
Change the owner of the /etc/aliases file to root. Procedure: for sendmail: # chown root /etc/aliases # chown root /etc/aliases.db for postfix # chown root <postfix aliases file> # chown root <postfix aliases.db file>
Check the permissions of the alias file. Procedure: for sendmail: # ls -lL /etc/aliases /etc/aliases.db If an alias file has a mode more permissive than 0644, this is a finding. for postfix: Verify the location of the alias file. # postconf alias_maps This will return the location of the "aliases" file. # ls -lL <postfix aliases file> <postfix aliases.db file> If an alias file has a mode more permissive than 0644, this is a finding.
Change the mode of the alias files as needed to function. No higher than 0644. Procedure: for sendmail: # chmod 0644 /etc/aliases /etc/aliases.db for postfix: # chmod 0644 <postfix aliases file> <postfix aliases.db file>
Verify the ownership of files referenced within the sendmail aliases file. Procedure: # more /etc/aliases Examine the aliases file for any utilized directories or paths. # ls -lL <directory or file path> Check the owner for any paths referenced. Check if the file or parent directory is owned by root. If not, this is a finding.
Edit the /etc/aliases file (alternatively, /usr/lib/sendmail.cf). Locate the entries executing a program. They will appear similar to the following line: Aliasname: : /usr/local/bin/ls (or some other program name) Ensure root owns the programs and the directory(ies) they reside in by using the chown command to change owner to root. Procedure: # chown root <file or directory name>
If the “sendmail” package is not installed, this is not applicable. Examine the contents of the /etc/aliases file. Procedure: # more /etc/aliases Examine the aliases file for any utilized directories or paths. # ls -lL <file referenced from aliases> Check the permissions for any paths referenced. If any file referenced from the aliases file has a mode more permissive than 0755, this is a finding.
Use the chmod command to change the access permissions for files executed from the alias file. For example: # chmod 0755 filename.
If the “sendmail” package is not installed, this is not applicable. Check if the sendmail package is installed: # rpm –q sendmail If it is installed, the logging level must be set to level nine: Procedure: for sendmail: # grep "O L" /etc/mail/sendmail.cf OR # grep LogLevel /etc/mail/sendmail.cf If logging is set to less than nine, this is a finding. for Postfix: This rule is not applicable to postfix which does not use "log levels" in the same fashion as sendmail.
Edit the sendmail.conf file, locate the "O L" or "LogLevel" entry and change it to 9.
Check the syslog configuration file for mail.crit logging configuration. Procedure: # grep "mail\." /etc/rsyslog.conf If syslog is not configured to log critical sendmail messages ("mail.crit" or "mail.*"), this is a finding.
Edit the syslog configuration file and add a configuration line specifying an appropriate destination for "mail.crit" syslogs. For example: mail.* -/var/log/mail;RSYSLOG_TraditionalFileFormat
Locate any mail log files by checking the syslog configuration file. Procedure: # more /etc/rsyslog.conf The check procedure is the same for both sendmail and Postfix. Identify any log files configured for the "mail" service (excluding mail.none) at any severity level and check the ownership Procedure: # ls -lL <file location> If any mail log file is not owned by root, this is a finding.
Change the ownership of the sendmail log file. Procedure: The fix procedure is the same for both sendmail and Postfix. # chown root <sendmail log file>
Check the mode of the SMTP service log file. Procedure: # more /etc/rsyslog.conf Check the configuration to determine which log files contain logs for mail.crit, mail.debug, or *.crit. Procedure: # ls -lL <file location> The check procedure is the same for both sendmail and Postfix. Identify any log files configured for the "mail" service (excluding mail.none) at any severity level and check the permissions If the log file permissions are greater than 0644, this is a finding.
Change the mode of the SMTP service log file. Procedure: The fix procedure is the same for both sendmail and Postfix. # chmod 0644 <sendmail log file>
Check for the existence of the ftpusers file. Procedure: For gssftp: # ls -l /etc/ftpusers For vsftp: # ls -l /etc/vsftpd.ftpusers or # ls -l /etc/vsftpd/ftpusers If the appropriate ftpusers file for the running FTP service does not exist, this is a finding.
Create an ftpusers file appropriate for the running FTP service. For gssftp: Create an /etc/ftpusers file containing a list of accounts not authorized for FTP. For vsftp: Create an /etc/vfsftpd.ftpusers or /etc/vfsftpd/ftpusers (as appropriate) file containing a list of accounts not authorized for FTP.
Check the contents of the ftpusers file. For gssftp: # more /etc/ftpusers For vsftp: # more /etc/vsftpd.ftpusers /etc/vfsftpd/ftpusers If the system has accounts not allowed to use FTP and not listed in the ftpusers file, this is a finding.
For gssftp: Add accounts not allowed to use FTP to the /etc/ftpusers file. For vsftp: Add accounts not allowed to use FTP to the /etc/vfsftpd.ftpusers or /etc/vfsftpd/ftpusers file (as appropriate).
Check the ownership of the ftpusers file. Procedure: For gssftp: # ls -l /etc/ftpusers For vsftp: # ls -l /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers If the ftpusers file is not owned by root, this is a finding.
Change the owner of the ftpusers file to root. For gssftp: # chown root /etc/ftpusers For vsftp: # chown root /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers
Check the permissions of the ftpusers file. Procedure: For gssftp: # ls -l /etc/ftpusers For vsftp: # ls -l /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers If the ftpusers file has a mode more permissive than 0640, this is a finding.
Change the mode of the ftpusers file to 0640. Procedure: For gssftp: # chmod 0640 /etc/ftpusers For vsftp: # chmod 0640 /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers
Find if logging is applied to the ftp daemon. The procedure depends on the implementation of ftpd used by the system. Procedures: For vsftpd: If vsftpd is started by xinetd: #grep vsftpd /etc/xinetd.d/* This will indicate the xinetd.d startup file #grep server_args <vsftpd xinetd.d startup file> This will indicate the vsftpd config file used when starting through xinetd. If the line is missing then "/etc/vsftpd.conf", the default config file, is used. #grep xferlog_enable <vsftpd config file> If "xferlog_enable" is missing or is not set to "yes", this is a finding. If vsftp is not started by xinetd: #grep xferlog_enable /etc/vsftpd.conf If "xferlog_enable" is missing or is not set to "yes", this is a finding. For gssftp: Find if the -l option will be applied when xinetd starts gssftp # grep server-args /etc/xinetd.d/gssftp If the line is missing or does not contain at least one -l, this is a finding.
Enable logging by changing ftpd startup or config files. Procedure: The procedure depends on the implementation of ftpd used by the system. For vsftpd: Ensure the server settings in "/etc/vsftpd.conf" (or other configuration file specified by the vaftpd xinetd.d startup file) contains: xferlog_enable = yes For gssftp: If the "disable" server setting is missing or set to "no" in "/etc/xinetd.d/gssftp" then ensure the server settings in "/etc/xinetd.d/gssftp" contains: server_args = -l The -l option may be added up to three times. Each -l will provide increasing verbosity on the log. Refer to the main page for ftpd for more information. For both if started using xinetd: If the "disable" server setting is missing or set to "no" in the /etc/xinetd.d startup file then ensure the server settings contains: log_on_success += DURATION USERID This will log the startup and shutdown of the daemon. log_on_failure += HOST USERID
Attempt to log into this host with a user name of anonymous and a password of guest (also try the password of guest@mail.com). If the logon is successful and the use of anonymous ftp has not been documented and approved by the IAO, this is a finding. Procedure: # ftp localhost Name: anonymous 530 Guest login not allowed on this machine.
Configure the FTP service to not permit anonymous logins.
# grep server_args /etc/xinetd.d/tftp If the "-s" parameter is not specified, this is a finding.
Edit /etc/xinetd.d/tftp file and specify the "-s" parameter in server_args.
Check the mode of the TFTP daemon. Procedure: # grep "server " /etc/xinetd.d/tftp # ls -lL <in.tftpd binary> If the mode of the file is more permissive than 0755, this is a finding.
Change the mode of the TFTP daemon. Procedure: # chmod 0755 <in.tftpd binary>
Check the /etc/passwd file to determine if TFTP is configured properly. Procedure: Check if TFTP if used. # grep disable /etc/xinetd.d/tftp If the file does not exist or the returned line indicates "yes", then this is not a finding. Otherwise, if the returned line indicates "no" then TFTP is enabled and must use a dedicated "tftp" user. # grep user /etc/xinetd.d/tftp If the returned line indicates a user other than the dedicated "tftp" user, this is a finding. # grep tftp /etc/passwd If a "tftp" user account does not exist and TFTP is active, this is a finding. Check the user shell for the "tftp" user. If it is not /bin/false or equivalent, this is a finding. Check the home directory assigned to the "tftp" user. If no home directory is set, or the directory specified is not dedicated to the use of the TFTP service, this is a finding.
Configure TFTP to use a dedicated "tftp" user. Procedure: Create a dedicated "tftp" user account if none exists. Assign a non-login shell to the "tftp" user account, such as /bin/false. Assign a home directory to the "tftp" user account. Edit /etc/xinetd.d/tftp to have "tftp" as the value of the "user" parameter.
Check if the ‘xorg-x11’ package is installed: # rpm –q xorg-x11 If the xorg-x11 package is not installed this finding does not apply. Check for .Xauthority or .xauth files being utilized by looking for such files in the home directory of a user. Procedure: Verify Xwindows is used on the system. # egrep "^x:5.*X11" /etc/inittab If no line is returned the boot process does not start Xwindows. If Xwindows is not configured to run, this rule is not applicable. Look for xauthority files in user home directory. # cd ~someuser # ls -la|egrep "(\.Xauthority|\.xauth) " If the .Xauthority or .xauth (followed by apparently random characters) files do not exist, ask the SA if the user is using Xwindows. If the user is utilizing Xwindows and none of these files exist, this is a finding.
The X Windows server package should not be needed on a System z virtual OE. It can be removed to close this finding: # rpm –e xorg-x11 If X Windows is required for some reason, ensure that the X Windows host is configured to write .Xauthority files into user home directories. Edit the Xaccess file. Ensure the line that writes the .Xauthority file is uncommented.
Perform the following to determine if NIS is active on the system: # ps -ef | grep ypbind If NIS is found active on the system, this is a finding.
Disable the use of NIS. Use as a replacement NIS+ or LDAP.
Use pwck to verify home directory assignments are present. # pwck If any user is not assigned a home directory, this is a finding.
Assign a home directory to any user without one. This can be accomplished using ‘/sbin/yast2 users’ > Edit > Details to modify the home directory of an existing user. Alternatively, the following command may be used: # usermod -d </home/directory> <username>
Use pwck to verify assigned home directories exist. # pwck If any user's assigned home directory does not exist, this is a finding.
If a user has no home directory, determine why. If possible, delete accounts without a home directory. If the account is valid, then create the home directory using the appropriate system administration utility or manually. For example: # /sbin/yast2 users (<select user> > Edit > Details) OR # mkdir </home/directory> # for i in $(ls -A /etc/skel); do cp -rp /etc/skel/$i </home/directory>; done # chown -R <user>:<group> </home/directory> Document all changes.
Check the home directory mode of each user in /etc/passwd. Procedure: # cut -d: -f6 /etc/passwd|sort|uniq|xargs -n1 ls -ld If a user home directory's mode is more permissive than 0750, this is a finding. Note: Application directories are allowed and may need 0755 permissions (or greater) for correct operation.
Change the mode of user home directories to 0750 or less permissive. Procedure (example): # chmod 0750 <home directory> Note: Application directories are allowed and may need 0755 permissions (or greater) for correct operation.
Check the ownership of each user home directory listed in the /etc/passwd file. Procedure: # cut -d : -f 6 /etc/passwd | xargs -n1 ls -ld If any user home directory is not owned by the assigned user, this is a finding.
Change the owner of a user's home directory to its assigned user. Procedure: # chown <user> <home directory>
Check the group ownership for each user in the /etc/passwd file. Procedure: # cut -d : -f 6 /etc/passwd | xargs -n1 ls -ld If any user home directory is not group-owned by the assigned user's primary group, this is a finding. Home directories for application accounts requiring different group ownership must be documented using site-defined procedures.
Change the group-owner for user home directories to the primary group of the assigned user. Procedure: Find the primary group of the user (GID) which is the fourth field of the user entry in /etc/passwd. # chgrp <GID> <user home directory> Document all changes.
Check the ownership of local initialization files. Procedure: # ls –a /<users home directory> | grep “^\.” | awk '{if ((!($1=="."))&&(!($1==".."))) print}' | xargs ls -ld If local initialization files are not owned by the home directory's user, this is a finding.
Change the ownership of the startup and login files in the user’s directory to the user or root, as appropriate. Examine each user’s home directory and verify all filenames beginning with “.” are owned by the owner of the directory or root. If they are not, use the chown command to change the owner to the user and research the reasons why the owners were not assigned as required. Procedure: # chown username .filename Document all changes.
Check the modes of local initialization files. Procedure: # for HOMEDIR in $(cut -d: -f6 /etc/passwd); do find ${HOMEDIR} ! -fstype nfs -type f -name '\.*' \( -perm -0002 -o -perm -0020 \); done If local initialization files are more permissive than 0740 or the .dt directory is more permissive than 0755 or the .dtprofile file is more permissive than 0755, this is a finding.
Ensure user startup files have permissions of 0740 or more restrictive. Examine each user’s home directory and verify all file names beginning with “.” have access permissions of 0740 or more restrictive. If they do not, use the chmod command to correct the vulnerability. Procedure: # chmod 0740 .filename Note: The period is part of the file name and is required. OR # for HOMEDIR in $(cut -d: -f6 /etc/passwd); do FILES=$(find ${HOMEDIR} ! -fstype nfs -type f -name '\.*' \( -perm -0002 -o -perm -0020 \) ); for INIFILE in ${FILES}; do chmod 600 ${INIFILE}; done; done
Check run control script modes. – # ls -lL /etc/rc* /etc/init.d If any run control script has a mode more permissive than 0755, this is a finding.
Ensure all system startup files have mode 0755 or less permissive. Examine the "rc" files, and all files in the rc1.d (rc2.d, and so on) directories, and in the /etc/init.d directory to ensure they are not world-writable. If they are world-writable, use the chmod command to correct the vulnerability and research why they are world-writable. Procedure: # chmod 755 <startup file>
Verify run control scripts' library search paths. # grep -r PATH /etc/rc* /etc/init.d This variable is formatted as a colon-separated list of directories. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/), this is a relative path, this is a finding.
Edit the run control script and remove the relative path entry from the executable search path variable.
Check the permissions on the files or scripts executed from system startup scripts to see if they are world-writable. Procedure: # more <startup script> # ls -lL <script or executable referenced by startup script> Alternatively, obtain a list of all world-writable files on the system and check system startup scripts to determine if any are referenced. Procedure: # find / -perm -0002 -type f | grep –v ‘^/proc’ > wwlist If any system startup script executes any file or script that is world-writable, this is a finding.
Remove the world-writable permission from programs or scripts executed by run control scripts. Procedure: # chmod o-w <program or script executed from run control script>
Check the system for the existence of any .netrc files. Procedure: # find / -name .netrc If any .netrc file exists, this is a finding.
Remove the .netrc file(s). Procedure: # find / -name .netrc # rm <.netrc file>
For each user in the /etc/passwd file, check for the presence of files and directories within the user's home directory not owned by the home directory owner. Procedure: # find /<usershomedirectory> ! -fstype nfs ! -user <username> ! \( -name .bashrc -o -name .bash_login -o -name .bash_logout -o -name .bash_profile -o -name .cshrc -o -name .kshrc -o -name .login -o -name .logout -o -name .profile -o -name .tcshrc -o -name .env -o -name .dtprofile -o -name .dispatch -o -name .emacs -o -name .exrc \) -exec ls -ld {} \; If user home directories contain files or directories not owned by the home directory owner, this is a finding.
Change the ownership of files and directories in user home directories to the owner of the home directory. Procedure: # chown accountowner filename
For each user in the /etc/passwd file, check for files and directories with a mode more permissive than 0750. Procedure: # find /<usershomedirectory> ! -fstype nfs ! \( -name .bashrc -o -name .bash_login -o -name .bash_logout -o -name .bash_profile -o -name .cshrc -o -name .kshrc -o -name .login -o -name .logout -o -name .profile -o -name .tcshrc -o -name .env -o -name .dtprofile -o -name .dispatch -o -name .emacs -o -name .exrc \) \( -perm -0001 -o -perm -0002 -o -perm -0004 -o -perm -0020 -o -perm -2000 -o -perm -4000 \) -exec ls -ld {} \; If user home directories contain files or directories more permissive than 0750, this is a finding.
Change the mode of files and directories within user home directories to 0750. Procedure: # chmod 0750 filename Document all changes.
Verify /etc/shells exists. # ls -l /etc/shells If the file does not exist, this is a finding.
Create a /etc/shells file containing a list of valid system shells. Consult vendor documentation for an appropriate list of system shells. Procedure: # echo "/bin/bash" >> /etc/shells # echo "/bin/csh" >> /etc/shells (Repeat as necessary for other shells.)
Confirm the login shells referenced in the /etc/passwd file are listed in the /etc/shells file. Procedure: # for USHELL in `cut -d: -f7 /etc/passwd`; do if [ $(grep -c "${USHELL}" /etc/shells) == 0 ]; then echo "${USHELL} not in /etc/shells"; fi; done The /usr/bin/false, /bin/false, /dev/null, /sbin/nologin, /bin/sync, /sbin/halt, /sbin/shutdown, (and equivalents), and sdshell will be considered valid shells for use in the /etc/passwd file, but will not be listed in the /etc/shells file. If a shell referenced in /etc/passwd is not listed in the shells file, excluding the above mentioned shells, this is a finding.
Use the YaST > Security and Users > User and Group Management module to change the default shell of any account in error to an acceptable shell. OR Use the "chsh" utility or edit the /etc/passwd file and correct the error by changing the default shell of the account in error to an acceptable shell name contained in the /etc/shells file.
Indications of inactive accounts are those that have no entries in the last log. Check the date in the last log to verify it is within the last 35 days or the maximum number of days set by the site if more restrictive. If an inactive account is not disabled via an entry in the password field in the /etc/passwd or /etc/shadow (or equivalent), check the /etc/passwd file to check if the account has a valid shell. If an inactive account is found not disabled, this is a finding. Procedure: Obtain a list of all active(not locked) accounts: # for ACCT in $(cut -d: -f1 /etc/passwd) do if [ "$(passwd -S ${ACCT}| awk '{print $2}')" != "LK" ] then lastlog -u ${ACCT} | awk '{ if(NR>1) printf "%-23s %3s %2s %4s\n", $1, $4, $5, $8}' fi done Obtain a list of all accounts that have logged in during the past 35 days: # lastlog -t 35 | awk '{if(NR>1) printf "%-23s %3s %2s %4s\n", $1, $4, $5, $8}’ Compare the results of the two commands. Any account listed by the first command that is not also listed by the second command has been inactive for 35 days.
All inactive accounts that have not been documented as exceptions will have /bin/false or /sbin/nologin as the default shell in the /etc/passwd file and have the password locked. Examine the user accounts using the lastlog command. Note the date of last login for each account. If any (other than system and application accounts) exceed 35 days or the maximum number of days set by the site, not to exceed 35 days, then lock the account and place a shell field of /bin/false or /sbin/nologin in the passwd file entry for the account. Procedure: # passwd -l <inactive_account> # chsh -s /bin/false <inactive_account>
Check the ownership of the system shells. # cat /etc/shells | xargs -n1 ls -l If any shell is not owned by root or bin, this is a finding.
Change the ownership of the shell with incorrect ownership. # chown root <shell>
If /etc/shells exists, check the group ownership of each shell referenced. # cat /etc/shells | xargs -n1 ls -l Otherwise, check any shells found on the system. # find / -name "*sh" | xargs -n1 ls -l If a shell has a mode more permissive than 0755, this is a finding.
Change the mode of the shell. # chmod 0755 <shell>
Check the system for an automated job, or check with the SA, to determine if the system is checked for extraneous device files on a weekly basis. If no automated or manual process is in place, this is a finding.
Establish a weekly automated or manual process to create a list of device files on the system and determine if any files have been added, moved, or deleted since the last list was generated. A list of device files can be generated with this command: # find / -type b -o -type c > device-file-list
Find all world-writable device files existing anywhere on the system. Procedure: # find / -perm -2 -a \( -type b -o -type c \) > devicelist Check the permissions on the directories above subdirectories containing device files. If any of the device files or their parent directories are world-writable, excepting device files specifically intended to be world-writable such as /dev/null, this is a finding.
Remove the world-writable permission from the device file(s). Procedure: # chmod o-w <device file> Document all changes.
Check the system for world-writable device files. Procedure: # find / -perm -2 -a \( -type b -o -type c \) -exec ls -ld {} \; If any device file(s) used for backup are writable by users other than root, this is a finding.
Use the chmod command to remove the world-writable bit from the backup device files. Procedure: # chmod o-w <back device filename> Document all changes.
Check the owner of the exports file. Example: # ls -lL /etc/exports If the export configuration file is not owned by root, this is a finding.
Change the owner of the exports file to root. Example: # chown root /etc/exports
# ls -lL /etc/exports If the file has a mode more permissive than 0644, this is a finding.
# chmod 0644 /etc/exports
Check if the nfs-kernel-server package is installed. It contains the exportfs command as well as the nfsserver process itself. # rpm –q nfs-kernel-server If the package is not installed, this check does not apply. If it is installed, check for NFS exported file systems. Procedure: # cat /etc/exports For each file system displayed, check the ownership. # ls -lLa <exported file system path> If the files and directories are not owned by root, this is a finding.
Change the ownership of exported file systems not owned by root. Procedure: # chown root <path>
Check if the nfs-kernel-server package is installed. It contains the exportfs command as well as the nfsserver process itself. # rpm –q nfs-kernel-server If the package is not installed, this check does not apply. If it is installed, check if the 'anonuid' and 'anongid' options are set correctly for exported file systems. List exported filesystems: # exportfs -v Each of the exported file systems should include an entry for the 'anonuid=' and 'anongid=' options set to "-1" or an equivalent (60001, 65534, or 65535). If appropriate values for 'anonuid' or 'anongid' are not set, this is a finding.
Edit "/etc/exports" and set the "anonuid=-1" and "anongid=-1" options for exports lacking it. Re-export the filesystems.
Check if the nfs-kernel-server package is installed. It contains the exportfs command as well as the nfsserver process itself. # rpm –q nfs-kernel-server If the package is not installed, this check does not apply. If it is installed, check the permissions on exported NFS file systems. Procedure: # exportfs -v If the exported file systems do not contain the ‘rw’ or ‘ro’ options specifying a list of hosts or networks, this is a finding.
Edit /etc/exports and add ro and/or rw options (as appropriate) specifying a list of hosts or networks which are permitted access. Re-export the file systems.
List the exports. # cat /etc/exports If any export contains "no_root_squash" or does not contain "root_squash" or "all_squash", this is a finding.
Edit the "/etc/exports" file and add "root_squash" (or "all_squash") and remove "no_root_squash".
Check the system for NFS mounts not using the "nosuid" option. Procedure: # mount -v | grep " type nfs " | egrep -v "nosuid" If the mounted file systems do not have the "nosuid" option, this is a finding.
Edit "/etc/fstab" and add the "nosuid" option for all NFS file systems. Remount the NFS file systems to make the change take effect.
The tcp_wrappers package is provided with the SLES mainframe distribution. Other access control programs may be available but will need to be checked manually. Determine if tcp_wrappers (i.e. TCPd) is installed. # rpm -qa | grep tcpd If no package is listed, this is a finding.
Install and configure the tcp_wrappers(i.e. tcpd) package.
The tcp_wrappers package (i.e. tcpd) is provided with the SLES mainframe distribution. Other access control programs may be available but will need to be checked manually. Normally, tcpd logs to the mail facility in "/etc/syslog.conf". Determine if syslog is configured to log events by tcpd. Procedure: # more /etc/syslog.conf Look for entries similar to the following: mail.debug /var/adm/maillog mail.none /var/adm/maillog mail.* /var/log/mail authpriv.info /var/log/messages The above entries would indicate mail alerts are being logged. If no entries for mail exist, then tcpd is not logging this is a finding. If an alternate access control program is used and it does not provide logging of access attempts, this is a finding.
Configure the access restriction program to log every access attempt. Ensure the implementation instructions for tcp_wrappers (i.e. tcpd) are followed so system access attempts are recorded to the system log files. If an alternate application is used, it must support this function.
Check for the existence of the cron.allow and cron.deny files. # ls -lL /etc/cron.allow # ls -lL /etc/cron.deny If neither file exists, this is a finding.
Create /etc/cron.allow and/or /etc/cron.deny with appropriate content.
Check mode of the cron.allow file. Procedure: # ls -lL /etc/cron.allow If the file has a mode more permissive than 0600, this is a finding.
Change the mode of the cron.allow file to 0600. Procedure: # chmod 0600 /etc/cron.allow
List all cronjobs on the system. Procedure: # ls /var/spool/cron /var/spool/cron/tabs # ls /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls /etc/cron*|grep -v deny If cron jobs exist under any of the above directories, use the following command to search for programs executed by cron: # more <cron job file> Perform a long listing of each program file found in the cron file to determine if the file is group-writable or world-writable. # ls -la <cron program file> If cron executes group-writable or world-writable files, this is a finding.
Remove the world-writable and group-writable permissions from the cron program file(s) identified. # chmod go-w <cron program file>
List all cronjobs on the system. Procedure: # ls /var/spool/cron /var/spool/cron/tabs # ls /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls /etc/cron*|grep -v deny If cron jobs exist under any of the above directories, use the following command to search for programs executed by at: # more <cron job file> Perform a long listing of each directory containing program files found in the cron file to determine if the directory is world-writable. # ls -ld <cron program directory> If cron executes programs in world-writable directories, this is a finding.
Remove the world-writable permission from the cron program directories identified. Procedure: # chmod o-w <cron program directory>
Check the mode of the crontab files. # ls -lL /etc/crontab /var/spool/cron/ /var/spool/cron/tabs/ If any crontab file has a mode more permissive than 0600, this is a finding.
Change the mode of the crontab files. # chmod 0600 /var/spool/cron/* /etc/cron.d/* /etc/crontab # chmod 0600 /etc/crontab /var/spool/cron/* /var/spool/cron/tabs/*
Check the mode of the crontab directories. Procedure: # ls -ld /var/spool/cron /var/spool/cron/tabs ls -ld /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -ld /etc/cron*|grep -v deny If the mode of any of the crontab directories is more permissive than 0755, this is a finding.
Change the mode of the crontab directories. # chmod 0755 <crontab directory>
Check the owner of the crontab directories. Procedure: # ls -ld /var/spool/cron /var/spool/cron/tabs ls -ld /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -ld /etc/cron*|grep -v deny If the owner of any of the crontab directories is not root or bin, this is a finding.
Change the mode of the crontab directories. # chown root <crontab directory>
Check the group owner of cron and crontab directories. Procedure: # ls -ld /var/spool/cron /var/spool/cron/tabs ls -ld /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -ld /etc/cron*|grep -v deny If a directory is not group-owned by root, sys, bin, or cron, this is a finding.
Change the group owner of cron and crontab directories. # chgrp root <crontab directory>
By default, rsyslog includes configuration files found in the /etc/rsyslog.d directory. Check for the include directive” $IncludeConfig /etc/rsyslog.d/*.conf” in /etc/rsyslog.conf and then for the cron log configuration file. # grep rsyslog.d /etc/rsyslog.conf # grep cron /etc/rsyslog.d/*.conf OR # grep cron /etc/rsyslog.conf If cron logging is not configured, this is a finding. Check the configured cron log file found in the cron entry of /etc/syslog (normally /var/log/cron). # ls -lL /var/log/cron If this file does not exist, or is older than the last cron job, this is a finding.
Edit or create /etc/rsyslog.d/cron.conf and setup cron logging.
Check the mode of the cron log file. Procedure: Check the configured cron log file found in the cron entry of the rsyslog configuration (normally /var/log/cron). # grep cron /etc/rsyslog.conf /etc/rsyslog.d/*.conf # ls -lL /var/log/cron If the mode is more permissive than 0600, this is a finding.
Change the mode of the cron log file. # chmod 0600 /var/log/cron
If the “at” package is not installed, this is not applicable. Check for the existence of at.allow and at.deny files. # ls -lL /etc/at.allow # ls -lL /etc/at.deny If neither file exists, this is a finding.
Create at.allow and/or at.deny files containing appropriate lists of users to be allowed or denied access to the "at" daemon.
# more /etc/at.deny If the at.deny file exists and is empty, this is a finding.
Add appropriate users to the at.deny file, or remove the empty at.deny file if an at.allow file exists.
# more /etc/at.allow If default accounts (such as bin, sys, adm, and others) are listed in the at.allow file, this is a finding.
Remove the default accounts (such as bin, sys, adm, and others traditionally UID less than 500) from the at.allow file.
Check the mode of the at.allow file. # ls -lL /etc/at.allow If the at.allow file has a mode more permissive than 0600, this is a finding.
Change the mode of the at.allow file. # chmod 0600 /etc/at.allow
List the "at" jobs on the system. Procedure: # ls -la /var/spool/at /var/spool/atjobs For each "at" job file, determine which programs are executed. Procedure: # more <at job file> Check the each program executed by "at" for group- or world-writable permissions. Procedure: # ls -la <at program file> If "at" executes group or world-writable programs, this is a finding.
Remove group-write and world-write permissions from files executed by at jobs. Procedure: # chmod go-w <file>
List any "at" jobs on the system. Procedure: # ls /var/spool/at /var/spool/atjobs For each "at" job, determine which programs are executed by "at." Procedure: # more <at job file> Check the directory containing each program executed by "at" for world-writable permissions. Procedure: # ls -la <at program file directory> If "at" executes programs in world-writable directories, this is a finding.
Remove the world-writable permission from directories containing programs executed by "at". Procedure: # chmod o-w <at program directory>
Check the SNMP configuration for default passwords. Procedure: Examine the default install location /etc/snmp/snmpd.conf or: # find / -name snmpd.conf # more <snmpd.conf file> Identify any community names or user password configuration. If any community name or password is set to a default value such as "public", "private", "snmp-trap", or "password", or any value which does not meet DISA password requirements, this is a finding.
Change the default passwords. To change them, locate the file snmpd.conf. Edit the file. Locate the line system-group-read-community which has a default password of “public” and make the password something more secure and less guessable. Do the same for the lines reading system-group-write-community, read-community, write-community, trap and trap-community. Read the information in the file carefully. The trap is defining who to send traps to, for instance, by default. It is not a password, but the name of a host.
Check the mode of the SNMP daemon configuration file. Procedure: Examine the default install location /etc/snmp/snmpd.conf or: # find / -name snmpd.conf # ls -lL <snmpd.conf file> If the snmpd.conf file has a mode more permissive than 0600, this is a finding.
Change the mode of the SNMP daemon configuration file to 0600. Procedure: # chmod 0600 <snmpd.conf>
Check the modes for all Management Information Base (MIB) files on the system. Procedure: # find / -name *mib* -o -name *MIB* | xargs ls -lL Any file returned with a mode 0640 or less permissive is a finding.
Change the mode of MIB files to 0640. Procedure: # chmod 0640 <mib file>
Check the system for world-writable files. Procedure: # find / -perm -2 -a \( -type d -o -type f \) -exec ls -ld {} \; If any world-writable files are located, except those required for system operation such as /tmp and /dev/null, this is a finding.
Remove or change the mode for any world-writable file on the system not required to be world-writable. Procedure: # chmod o-w <file> Document all changes
The /etc/xinetd.conf file and each file in the /etc/xinetd.d directory file should be examined for the following: Procedure: log_type = SYSLOG authpriv log_on_success = HOST PID USERID EXIT log_on_failure = HOST USERID If xinetd is running and logging is not enabled, this is a finding.
Edit each file in the /etc/xinetd.d directory and the /etc/xinetd.conf file to contain: log_type = SYSLOG authpriv log_on_success = HOST PID USERID EXIT log_on_failure = HOST USERID The /etc/xinetd.conf file contains default values that will hold true for all services unless individually modified in the service's xinetd.d file.
# ps -ef | egrep "innd|nntpd" If an Internet Network News server is running, this is a finding.
Disable the INN server.
Check access configuration ownership: # ls -lL /etc/security/access.conf If this file exists and is not owned by root, this is a finding.
Follow the correct configuration parameters for access configuration file. Use the chown command to configure it properly. (for example: # chown root /etc/security/access.conf).
SWAT is a tool for configuring Samba and should only be found on a system with a requirement for Samba. If SWAT is used, it must be utilized with SSH to ensure a secure connection between the client and the server. Procedure: # grep -H "bin/swat" /etc/xinetd.d/*|cut -d: -f1 |xargs grep "only_from" If the value of the "only_from" line in the "xinetd.d" file which starts with "/usr/sbin/swat" does not contain "localhost" or the equivalent, this is a finding.
Disable SWAT or require that SWAT is only accessed via SSH. Procedure: If SWAT is required, but not at all times, disable it when it is not needed. Modify the /etc/xinetd.d file for "swat" to contain a "disable = yes" line. To access using SSH: Follow vendor configuration documentation to create an stunnel for SWAT.
Check the ownership of the /etc/samba/smb.conf file. Procedure: # ls -l /etc/samba/smb.conf If an smb.conf file is not owned by root, this is a finding.
Change the ownership of the smb.conf file. Procedure: # chown root smb.conf
Check the mode of the smb.conf file. Procedure: # ls -lL /etc/samba/smb.conf If the "smb.conf" has a mode more permissive than 0644, this is a finding.
Change the mode of the smb.conf file to 0644 or less permissive.
Check the ownership of the "smbpasswd" file. # ls -l /etc/samba/passdb.tdb /etc/samba/secrets.tdb If the "smbpasswd" file is not owned by root, this is a finding.
Use the chown command to configure the files maintained by smbpasswd. For instance: # chown root /etc/samba/passdb.tdb /etc/samba/secrets.tdb
Examine the "smb.conf" file. # more /etc/samba/smb.conf If the "hosts" option is not present to restrict access to a list of authorized hosts and networks, this is a finding.
Edit the "/etc/samba/smb.conf" file and set the "hosts" option to permit only authorized hosts to access Samba.
Check the minimum time period between password changes for each user account is 1 day. # cat /etc/shadow | cut -d ':' -f 4 | grep -v 1 If any results are returned, this is a finding.
Change the minimum time period between password changes for each user account to 1 day. # passwd -n 1 <user name>
Determine if root has logged in over an unencrypted network connection. First determine if root has logged in over a network. Procedure: # last | grep "^root " | egrep -v "reboot| |ttyS0" | more If root has logged in over the network, this is a finding.
Enable SSH on the system and authenticate with a userid/password that has “su” privileges to attain root access.
Determine if the SSH daemon is configured to permit root logins. Procedure: # grep -v "^#" /etc/ssh/sshd_config | grep -i permitrootlogin If the PermitRootLogin entry is not found or is not set to "no", this is a finding.
Edit the sshd_config file and set the PermitRootLogin option to "no".
Check access configuration group ownership: # ls -lL /etc/security/access.conf If this file exists and has a group-owner that is not a privileged user, this is a finding.
Use the chgrp command to ensure the group owner is root, sys, or bin. For example: # chgrp root /etc/security/access.conf
Check access configuration mode: # ls -lL /etc/security/access.conf If this file exists and has a mode more permissive than 0640, this is a finding.
Use the chmod command to set the permissions to 0640. (for example: # chmod 0640 /etc/security/access.conf
Check the group ownership of the "smb.conf" file. Procedure: # ls -lL /etc/samba/smb.conf If the "smb.conf" file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group owner of the smb.conf file. Procedure: # chgrp root smb.conf
Check "smbpasswd" ownership: # ls -lL /etc/samba/passdb.tdb /etc/samba/secrets.tdb If the "smbpasswd" file is not group-owned by root, this is a finding.
Use the chgrp command to ensure that the group owner of the smbpasswd file is root. For instance: # chgrp root /etc/samba/passdb.tdb /etc/samba/secrets.tdb
Check the mode of files maintained using "smbpasswd". Procedure: # ls -lL /etc/samba/passdb.tdb /etc/samba/secrets.tdb If a "smbpasswd" maintained file has a mode more permissive than 0600, this is a finding.
Change the mode of the files maintained through smbpasswd to 0600. Procedure: # chmod 0600 /etc/samba/passdb.tdb /etc/samba/secrets.tdb
Determine if roots shell executable resides on a dedicated file system. Procedure: Find the location of the root users shell # grep "^root" /etc/passwd|cut -d: -f7|cut -d/ -f2 The result is the top level directory under / where the shell resides (ie. usr) Check if it is on a dedicated file system. # grep /<top level directory> /etc/fstab If /<top level directory> is on a dedicated file system, this is a finding.
Change the root account's shell to one present on the / file system. Procedure: Edit /etc/passwd and change the shell for the root account to one present on the / file system (such as /bin/sh, assuming /bin is not on a separate file system). If the system does not store shell configuration in the /etc/passwd file, consult vendor documentation for the correct procedure for the system.
# pam-config -q --pwhistory If the result is not’ password: remember=5’ or higher, then this is a finding. # ls /etc/security/opasswd If /etc/security/opasswd does not exist, then this is a finding. # grep password /etc/pam.d/common-password| grep pam_pwhistory.so | grep remember If the "remember" option in /etc/pam.d/common-password is not 5 or greater, this is a finding.
Create the password history file. # touch /etc/security/opasswd # chown root:root /etc/security/opasswd # chmod 0600 /etc/security/opasswd Configure pam to use password history. # pam-config -a --pwhistory # pam-config -a --pwhistory-remember=5
Check local initialization files for any executed world-writable programs or scripts and scripts executing from world writable directories. Procedure: For each home directory on the system make a list of files referenced within any local initialization script. Show the mode for each file and its parent directory. # FILES=".bashrc .bash_login .bash_logout .bash_profile .cshrc .kshrc .login .logout .profile .tcshrc .env .dtprofile .dispatch .emacs .exrc"; # for HOMEDIR in `cut -d: -f6 /etc/passwd|sort|uniq`;do for INIFILE in $FILES;do REFLIST=`egrep " [\"~]?/" ${HOMEDIR}/${INIFILE} 2>/dev/null|sed "s/.*\([~ \"]\/[\.0-9A-Za-z_\/\-]*\).*/\1/"`;for REFFILE in $REFLIST;do FULLREF=`echo $REFFILE|sed "s:\~:${HOMEDIR}:g"|sed "s:^\s*::g"`;dirname $FULLREF|xargs stat -c "dir:%a:%n";stat -c "file:%:%n" $FULLREF;done;done; done|sort|uniq If any local initialization file executes a world-writable program or script or a script from a world-writable directory, this is a finding.
Remove the world-writable permission of files referenced by local initialization scripts, or remove the references to these files in the local initialization scripts.
Check run control scripts' ownership. # ls -lL /etc/rc* /etc/init.d Alternatively: # find /etc -name "[SK][0-9]*"|xargs stat -L -c %U:%n If any run control script is not owned by root or bin, this is a finding.
Change the ownership of the run control script(s) with incorrect ownership. # find /etc -name "[SK][0-9]*"|xargs stat -L -c %U:%n|egrep -v "^root:"|cut -d: -f2|xargs chown root
Check run control scripts' group ownership. Procedure: # ls -lL /etc/rc* /etc/init.d Alternatively: # find /etc -name "[SK][0-9]*"|xargs stat -L -c %G:%n|egrep -v "^(root|sys|bin|other):" If any run control script is not group-owned by root, sys, bin, or other system groups, this is a finding.
Change the group ownership of the run control script(s) with incorrect group ownership. Procedure: # chgrp root <run control script> # find /etc -name "[SK][0-9]*"|xargs stat -L -c %G:%n|egrep -v "^(root|sys|bin|other):"|cut -d: -f2|xargs chgrp root
Determine the programs executed by system start-up files. Determine the ownership of the executed programs. # cat /etc/rc*/* /etc/init.d/* | more # ls -l <executed program> Alternatively: # for FILE in `egrep -r "/" /etc/rc.* /etc/init.d|awk '/^.*[^\/][0-9A-Za-z_\/]*/{print $2}'|egrep "^/"|sort|uniq`;do if [ -e $FILE ]; then stat -L -c '%U:%n' $FILE;fi;done This provides a list of files referenced by initialization scripts and their associated UIDs. If any file is run by an initialization file and is not owned by root, sys, bin, or in rare cases, an application account, this is a finding.
Change the ownership of the file executed from system startup scripts to root, bin, sys, or other. # chown root <executed file>
Check /etc/zipl.conf permissions: # ls –lL /etc/zipl.conf If /etc/zipl.conf has a mode more permissive than 0600, then this is a finding.
Change the mode of the zipl.conf file to 0600. # chmod 0600 /etc/zipl.conf
Perform the following to check for unnecessary privileged accounts: # grep "^shutdown" /etc/passwd # grep "^halt" /etc/passwd # grep "^reboot" /etc/passwd If any unnecessary privileged accounts exist this is a finding.
Remove any special privilege accounts, such as shutdown and halt, from the /etc/passwd and /etc/shadow files using the "userdel" or "system-config-users" commands.
Check the system for unnecessary user accounts. Procedure: # more /etc/passwd If any unnecessary accounts are found, this is a finding.
Remove all unnecessary accounts from the /etc/passwd file before connecting a system to the network. Other accounts that are associated with a service not in use should also be removed.
SUSE ships the InternetNewsDaemon (innd) news server. The file corresponding to "/etc/news/hosts.nntp" is "/etc/news/incoming.conf". Check the permissions for "/etc/news/incoming.conf". # ls -lL /etc/news/incoming.conf If "/etc/news/incoming.conf" has a mode more permissive than 0600, this is a finding.
Change the mode of the "/etc/news/incoming.conf" file to 0600. # chmod 0600 /etc/news/incoming/conf
SUSE ships the InternetNewsDaemon (innd) news server. The file that corresponds to "/etc/news/hosts.nntp.nolimit" is "/etc/news/innfeed.conf". Check the permissions for "/etc/news/innfeed.conf". # ls -lL /etc/news/innfeed.conf If "/etc/news/innfeed.conf" has a mode more permissive than 0600, this is a finding.
Change the mode of "/etc/news/innfeed.conf" to 0600. # chmod 0600 /etc/news/infeed.conf
Check the permissions for "/etc/news/readers.conf". # ls -lL /etc/news/readers.conf If /etc/news/readers.conf has a mode more permissive than 0600, this is a finding.
Change the mode of the /etc/news/readers.conf file to 0600. # chmod 0600 /etc/news/readers.conf
Check "/etc/news/passwd.nntp" permissions: # ls -lL /etc/news/passwd.nntp If "/etc/news/passwd.nntp" has a mode more permissive than 0600, this is a finding.
Change the mode of the "/etc/news/passwd.nntp" file. # chmod 0600 /etc/news/passwd.nntp
Check the ownership of the files in "/etc/news". Procedure: # ls -al /etc/news If any files are not owned by root or news, this is a finding.
Change the ownership of the files in "/etc/news" to root or news. Procedure: # chown root /etc/news/*
Check "/etc/news" files group ownership: Procedure: # ls -al /etc/news If "/etc/news" files are not group-owned by root or news, this is a finding.
Change the group-owner of the files in "/etc/news" to root or news. Procedure: # chgrp root /etc/news/*
Locate the sshd_config file: # more /etc/ssh/sshd_config Examine the file. If the variables 'Protocol 2,1’ or ‘Protocol 1’ are defined on a line without a leading comment, this is a finding.
Edit the sshd_config file and set the "Protocol" setting to "2". Restart the SSH daemon. # /sbin/service sshd restart
Check /etc/securetty # more /etc/securetty If the file does not exist, or contains more than "console" or a single "tty" device this is a finding.
Create if needed and set the contents of /etc/securetty to a "console" or "tty" device. # echo console > /etc/securetty or # echo ttyS0 > /etc/securetty
Check if NTP running: # ps -ef | egrep "xntpd|ntpd" Check if "ntpd -qg" is scheduled to run: # grep "ntpd -qg" /var/spool/cron/* # grep "ntpd -qg" /var/spool/cron/tabs/* # grep "ntpd -qg" /etc/cron.d/* # grep "ntpd -qg" /etc/cron.daily/* # grep "ntpd -qg" /etc/cron.hourly/* # grep "ntpd -qg" /etc/cron.monthly/* # grep "ntpd -qg" /etc/cron.weekly/* If NTP is running or "ntpd -qg" is found: # more /etc/ntp.conf Confirm the timeservers and peers or multicast client (as applicable) are local or authoritative U.S. DoD sources appropriate for the level of classification which the network operates. If a non-local/non-authoritative time-server is used, this is a finding.
Use an authoritative time server operated by the U.S. government. Ensure all systems in the facility feed from one or more local time servers feed from the authoritative time server.
Logging should be enabled for those types of file systems not turning on logging by default. Procedure: # mount JFS, VXFS, HFS, XFS, reiserfs, EXT3 and EXT4 all turn logging on by default and will not be a finding. The ZFS file system uses other mechanisms to provide for file system consistency, and will not be a finding. For other file systems types, if the root file system does not support journaling this is a finding. If the ‘nolog’ option is set on the root file system that does support journaling, this is a finding.
Implement file system journaling for the root file system, or use a file system with other mechanisms to ensure file system consistency. If the root file system supports journaling, enable it. If the file system does not support journaling or another mechanism to ensure file system consistency, a migration to a different file system will be necessary.
Check the system for a running Samba server. Procedure: # ps -ef |grep smbd If the Samba server is running, ask the SA if the Samba server is operationally required. If it is not, this is a finding.
If there is no functional need for Samba and the daemon is running, disable the daemon by killing the process ID as noted from the output of ps -ef |grep smbd. The samba package should also be removed or not installed if there is no functional requirement. Procedure: rpm -qa |grep samba This will show if "samba" is installed. Packages that start with “yast2-samba” are NOT part of the Samba software suite. To remove: rpm -e samba SuSEconfig
Check /etc/sysctl.conf ownership. # ls -lL /etc/sysctl.conf If /etc/sysctl.conf is not owned by root, this is a finding.
Use the chown command to change the owner of /etc/sysctl.conf to root: # chown root /etc/sysctl.conf
Check /etc/sysctl.conf group ownership: # ls -lL /etc/sysctl.conf If /etc/sysctl.conf is not group-owned by root, this is a finding.
Use the chgrp command to change the group owner of /etc/sysctl.conf to root: # chgrp root /etc/sysctl.conf
Check /etc/sysctl.conf permissions: # ls -lL /etc/sysctl.conf If /etc/sysctl.conf has a mode more permissive than 0600, this is a finding.
Use the chmod command to change the mode of the /etc/sysctl.conf file. # chmod 0600 /etc/sysctl.conf
Determine if an NFS server is running on the system by: # ps -ef |grep nfsd If an NFS server is running, confirm it is not configured with the insecure_locks option by: # exportfs -v The example below would be a finding: /misc/export speedy.example.com(rw,insecure_locks)
Remove the "insecure_locks" option from all NFS exports on the system.
Ensure the pam_console.so module is not configured in any files in /etc/pam.d by: # cd /etc/pam.d # grep pam_console.so * Or # ls –la /etc/security/console.perms If either the pam_console.so entry or the file /etc/security/console.perms is found then this is a finding.
Ensure PAM is not configured to grant sole access of administrative privileges to the first user logged in at the console. Remove the console.perms file if it exists: # rm /etc/security/console.perms
Check for any crontab entries that rotate audit logs. Procedure: # crontab -l If such a cron job is found, this is not a finding. Otherwise, query the SA. If there is a process automatically rotating audit logs, this is not a finding. If the SA manually rotates audit logs, this is a finding, because if the SA is not there, it will not be accomplished. If the audit output is not archived daily, to tape or disk, this is a finding. This can be ascertained by looking at the audit log directory and, if more than one file is there, or if the file does not have today’s date, this is a finding.
Configure a cron job or other automated process to rotate the audit logs on a daily basis.
Check the mode of the cron.deny file. # ls -lL /etc/cron.deny If the cron.deny file does not exist this is not a finding. If the cron.deny file exists and the mode is more permissive than 0600, this is a finding.
Change the mode of the cron.deny file. # chmod 0600 /etc/cron.deny
Determine if there are any crontabs by viewing a long listing of the directory. If there are crontabs, examine them to determine what cron jobs exist. Check for any programs specifying an umask more permissive than 077: Procedure: # ls -lL /var/spool/cron /var/spool/cron/tabs # ls -lL /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -lL /etc/cron.*|grep -v deny # cat <crontab file> # grep umask <cron program> If there are no cron jobs present, this vulnerability is not applicable. If any cron job contains an umask more permissive than 077, this is a finding.
Edit cron script files and modify the umask to 077.
# ls -lL /etc/cron.allow If the cron.allow file is not owned by root, sys, or bin, this is a finding.
# chown root /etc/cron.allow
Check the mode of the "at" directory. Procedure: # ls -ld /var/spool/at /var/spool/atjobs If the directory mode is more permissive than 0755, this is a finding.
Change the mode of the "at" directory to 0755. Procedure: # chmod 0755 <at directory>
Check the ownership of the "at" directory: Procedure: # ls -ld /var/spool/atjobs If the directory is not owned by root, bin, daemon, or at, this is a finding.
Change the owner of the "atjobs" directory to root, bin, daemon or at. Procedure: # chown <root|bin|daemon|at> <"atjobs" directory>
Determine what "at" jobs exist on the system. Procedure: # ls /var/spool/at /var/spool/atjobs If there are no "at" jobs present, this is not applicable. Determine if any of the "at" jobs or any scripts referenced execute the "umask" command. Check for any umask setting more permissive than 077. # grep umask <at job or referenced script> If any "at" job or referenced script sets umask to a value more permissive than 077, this is a finding.
Edit "at" jobs or referenced scripts to remove "umask" commands that set umask to a value less restrictive than 077.
# ls -lL /etc/at.allow If the at.allow file is not owned by root, sys, or bin, this is a finding.
Change the owner of the at.allow file. # chown root /etc/at.allow
# ls -lL /etc/at.deny If the at.deny file is not owned by root, sys, or bin, this is a finding.
Change the owner of the at.deny file. # chown root /etc/at.deny
# ls -lL /usr/sbin/traceroute If the traceroute command is not owned by root, this is a finding.
Change the owner of the traceroute command to root. Example: # chown root /usr/sbin/traceroute
Check the group ownership of the traceroute file. Procedure: # ls -lL /usr/sbin/traceroute If the traceroute command is not group-owned by root, sys, bin, or system, this is a finding.
Change the group-owner of the traceroute command to root. Procedure: # chgrp root /usr/sbin/traceroute
# ls -lL /usr/sbin/traceroute If the traceroute command has a mode more permissive than 0700, this is a finding.
Change the mode of the traceroute command. # chmod 0700 /usr/sbin/traceroute
Interview the SA to determine if a site-defined policy exists which requires administrative accounts to use web browsers only for local service administration. If a site-defined policy does not exist this is a finding.
Enforce a site-defined policy requiring administrative accounts use web browsers only for local service administration.
To check for the version of either sendmail or Postfix being displayed in the greeting: # telnet localhost 25 If a version number is displayed, this is a finding.
Ensure sendmail or Postfix has been configured to mask the version information. Procedure for sendmail: Edit the /etc/mail/sendmail.mc file to mask the veresion number by editing the line with "dnl" as follows: define(`confSMTP_LOGIN_MSG', ` Mail Server Ready ; $b')dnl rebuild the sendmail.cf file. for Postfix: Examine the "smtpd_banner" line of /etc/postfix/main.conf and remove any "$mail_version" entry on it or comment the entire "smtpd_banner" line to use the default value which does not display the version information.
Determine if sendmail is installed # rpm -qa | grep -i sendmail This check only applies to systems that have the sendmail package installed. Check forwarding capability from sendmail. Procedure: grep "0 ForwardPath" /etc/mail/sendmail.cf If the entry contains a file path, this is a finding. Search for any .forward in users home directories on the system by: # for pwline in `cut -d: -f1,6 /etc/passwd`; do homedir=`echo ${pwline}|cut -d: -f2`;username=`echo ${pwline} | cut -d: -f1`;echo $username `stat -c %n $homedir/.forward 2>/dev/null`; done|egrep "\.forward" If any users have a .forward file in their home directory, this is a finding.
Disable forwarding for sendmail and remove .forward files from the system Procedure: Edit the /etc/mail/sendmail.mc file to change the ForwardPath entry to a null path by adding the line define(`confFORWARD_PATH`,`') rebuild the sendmail.cf file. Remove all .forward files on the system # find / -name .forward -delete
Check the shell for the anonymous FTP account. Procedure: # grep "^ftp" /etc/passwd This is a finding if the seventh field is empty (the entry ends with a ':') or if the seventh field does not contain one of the following: /bin/false /dev/null /usr/bin/false /bin/true /sbin/nologin
Configure anonymous FTP accounts to use a non-functional shell. The Yast ‘Security and Users’ > ‘User and Group Management’ module can be used to configure the account. Or if necessary, edit the /etc/passwd file to remove any functioning shells associated with the ftp account and replace them with non-functioning shells, such as /bin/false.
For vsftp: The FTP anonymous user is, by default, chrooted to the ftp users home directory as defined in the /etc/passwd file. This is integral to the server and may not be disabled.
There is no fix associated with this vulnerability.
Ask the SA if this is an NMS server. If it is an NMS server, then ask what other applications run on it. If there is anything other than network management software and DBMS software used only for the storage and inquiry of NMS data, this is a finding.
Ensure only authorized software is loaded on a designated NMS server. Authorized software is limited to the NMS software itself, a database management system for the NMS server if necessary, and network management software.
Check /etc/rsyslog.conf ownership: # ls –lL /etc/rsyslog* If any rsyslog configuration file is not owned by root, this is a finding.
Use the chown command to set the owner to root. # chown root <rsyslog configuration file>
Check /etc/rsyslog.conf group ownership. Procedure: # ls -lL /etc/rsyslog* If any rsyslog.conf file is not group owned by root, sys, bin, or system, this is a finding.
Change the group-owner of the /etc/rsyslog.conf file to root, bin, sys, or system. Procedure: # chgrp root <rsyslog configuration file>
Examine the rsyslog.conf file for any references to remote log hosts. # grep -v "^#" /etc/rsyslog* | grep '@' # grep -v "^#" /etc/rsyslog.d/* | grep '@' Destination locations beginning with an '@' represent log hosts. If the log host name is a local alias such as "loghost", consult the /etc/hosts or other name databases as necessary to obtain the canonical name or address for the log host. Determine if the host referenced is a log host documented using site-defined procedures. If an undocumented log host is referenced, this is a finding.
Remove or document the referenced undocumented log host.
Check the system for an IPv4 default route Procedure: # netstat -r |grep default If a default route is not defined, this is a finding.
Set a default gateway for IPv4.
If the system is a VM host and acts as a router solely for the benefit of its client systems, then this rule is not applicable. Ask the SA if the system is a designated router. If it is not, this is not applicable. Check the system for non-routing network services. Procedure: # netstat -a | grep -i listen # ps -ef If non-routing services, including Web servers, file servers, DNS servers, or applications servers, but excluding management services such as SSH and SNMP, are running on the system, this is a finding.
Ensure only authorized software is loaded on a designated router. Authorized software will be limited to the most current version of routing protocols and SSH for system administration purposes.
If the system does not use NIS or NIS+, this is not applicable. Check if NIS or NIS+ is implemented using UDP. Procedure: # rpcinfo -p | grep yp | grep udp If NIS or NIS+ is implemented using UDP, this is a finding.
Configure the system to not use UDP for NIS and NIS+. Consult vendor documentation for the required procedure.
Locate and examine all r-commands access control files. Procedure: # find / -name .rhosts # more /<directorylocation>/.rhosts # find / -name .shosts # more /<directorylocation>/.shosts # find / -name hosts.equiv # more /<directorylocation>/hosts.equiv # find / -name shosts.equiv # more /<directorylocation>/shosts.equiv If any .rhosts, .shosts, hosts.equiv, or shosts.equiv file contains other than host-user pairs, this is a finding.
If possible, remove the .rhosts, .shosts, hosts.equiv, and shosts.equiv files. If the files are required, remove any content from the files except for necessary host-user pairs.
Procedure: # ls -l /etc/hosts.equiv # ls -l /etc/ssh/shosts.equiv # find / -name .rhosts # ls -al <home directory>/.rhosts # find / -name .shosts # ls -al <home directory>/.shosts # find / -name .netrc # ls -al <home directory>/.netrc If the .rhosts, .shosts, hosts.equiv, or shosts.equiv files have permissions greater than 600, then this is a finding. If the /etc/hosts.equiv, or /etc/ssh/shosts.equiv files are not owned by root, this is a finding. Any .rhosts, .shosts and .netrc files outside of home directories have no meaning and are not subject to this rule If the ~/.rhosts or ~/.shosts are not owned by the owner of the home directory where they are immediately located or by root, this is a finding.
Ensure the permission for these files is set to 600 or more restrictive and their owner is root or the same as the owner of the home directory in which they reside. Procedure: # chmod 600 /etc/hosts.equiv # chmod 600 /etc/ssh/shosts.equiv # chown root /etc/hosts.equiv # chown root /etc/ssh/shosts.equiv # find / -name .rhosts # chmod 600 /<home directory>/.rhosts # chown <home directory owner> <home directory>/.rhosts # find / -name .shosts # chmod 600 <directory location>/.shosts # chown <home directory owner> <home directory>/.shosts # find / -name .netrc # chmod 600 <directory location>/.netrc # chown <home directory owner> <home directory>/.netrc
# ls -lL /etc/cron.deny If the cron.deny file is not owned by root, sys, or bin, this is a finding.
# chown root /etc/cron.deny
Check to see if rshd is configured to run on startup. Procedure: # grep disable /etc/xinetd.d/rsh If /etc/xinetd.d/rsh exists and rsh is found to be enabled, this is a finding.
Edit /etc/xinetd.d/rsh and set "disable=yes".
# grep disable /etc/xinetd.d/rexec If the service file exists and is not disabled, this is a finding.
Edit /etc/xinetd.d/rexec and set "disable=yes"
Determine the version of the SMTP service software. Procedure: #rpm -q sendmail SUSE sendmail 8.14.3-50.20.1is the latest required version. If SUSE sendmail is installed and the version is not at least8.14.3.-50.20.1, this is a finding. #rpm -q postfix SUSE postfix-2.5.6-5.8.1 is the latest required version. If postfix is installed and the version is not at least2.5.6-5.8.1, this is a finding.
Obtain and install a newer version of the SMTP service software (sendmail or Postfix) fromNovell.
Check for an enabled "debug" command provided by the SMTP service. Procedure: # telnet localhost 25 debug If the command does not return a 500 error code of "command unrecognized", this is a finding. The SLES mainframe distribution ships with sendmail Version 8.14.3.-50.20.1 which is not vulnerable. This should never be a finding.
Obtain and install a newer version of the SMTP service software (sendmail or Postfix) fromNovell.
Check the SMTP service for an active "decode" command. Procedure: # telnet localhost 25 decode If the command does not return a 500 error code of "command unrecognized", this is a finding.
Disable mail aliases for decode and uudecode. If the /etc/aliases or /usr/lib/aliases (mail alias) file contains entries for these programs, remove them or disable them by placing “#” at the beginning of the line, and then executing the new aliases command. For more information on mail aliases, refer to the man page for aliases. Disabled aliases would be similar to these examples: # decode: |/usr/bin/uudecode # uudecode: |/usr/bin/uuencode -d
This vulnerability is applicable only to sendmail. If Postfix is the SMTP service for the system this will never be a finding. Procedure: Determine if EXPN is disabled. # grep -v "^#" /etc/mail/sendmail.cf |grep -i PrivacyOptions If nothing is returned or the returned line does not contain "noexpn", this is a finding.
Rebuild /etc/mail/sendmail.cf with the "noexpn" Privacy Flag set. Procedure: Edit /etc/mail/sendmail.mc resetting the Privacy Flags to the default: define('confPRIVACYFLAGS', 'authwarnings,novrfy,noexpn,restrictqrun')dnl Rebuild the sendmail.cf file with: # make -C /etc/mail Restart the sendmail service. # service sendmail restart
Determine if VRFY is disabled. Procedure: for sendmail: # telnet localhost 25 vrfy root If the command does not return a 500 error code of "command unrecognized", this is a finding. or: # grep -v "^#" /etc/mail/sendmail.cf |grep -i vrfy Verify the VRFY command is disabled with an entry in the sendmail.cf file. The entry could be any one of "Opnovrfy", "novrfy", or "goaway", which could also have other options included, such as "noexpn". The "goaway" argument encompasses many things, such as "novrfy" and "noexpn". If no setting to disable VRFY is found, this is a finding. For Postfix: Check if the VRFY command has been disabled: # postconf disable_vrfy_command If the command output is not “disable_vrfy_command = yes”, this is a finding.
For sendmail: Add the "novrfy" flag to your sendmail in /etc/mail/sendmail.cf. Procedure: Edit the definition of "confPRIVACY_FLAGS" in /etc/mail/sendmail.mc to include "novrfy". Rebuild the sendmail.cf file with: # make -C /etc/mail Restart the sendmail service. # service sendmail restart for Postfix: Use the postconf utility to disable the VRFY command: # postconf -ev disable_vrfy_command=yes Restart the postfix service: # rcpostfix restart
Log into the sendmail server with telnet and test the "wiz" commmand" Procedure: # telnet localhost 25 Trying 127.0.0.1... Connected to locahost.localdomain (127.0.0.1). Escape character ... Once the telnet greeting is complete type: wiz If you do not get a "Command unrecognized: " message, this is a finding.
If the WIZ command exists on sendmail then the version of sendmail is archaic and should be replaced with the latest version fromNovell. If the WIZ command is enabled on sendmail, it should be disabled by adding this line to the sendmail.cf configuration file (note that it must be typed in uppercase): OW* For the change to take effect, kill the sendmail process, refreeze the sendmail.cf file, and restart the sendmail process.
Determine if the TFTP daemon is active. # chkconfig --list | grep tftp Or # chkconfig tftp If TFTP is found enabled and not documented using site-defined procedures, it is a finding.
Document or Disable the TFTP daemon. If the TFTP daemon is necessary on the system, document and justify its usage for approval from the IAO. If the TFTP daemon is not necessary on the system, turn it off. # chkconfig tftp off # service xinetd restart
# chkconfig uucp or: # chkconfig --list | grep uucp If UUCP is found enabled, this is a finding.
# chkconfig uucp off # service uucp stop # service xinetd restart
If Xwindows is not used on the system, this is not applicable. Check the output of the "xhost" command from an X terminal. Procedure: # xhost If the output reports access control is enabled (and possibly lists the hosts able to receive X window logins), this is not a finding. If the xhost command returns a line indicating access control is disabled, this is a finding. Note: It may be necessary to define the display if the command reports it cannot open the display. Procedure: $ DISPLAY=MachineName:0.0; export DISPLAY MachineName may be replaced with an Internet Protocol Address. Repeat the check procedure after setting the display.
If using an xhost-type authentication the "xhost -" command can be used to remove current trusted hosts and then selectively allow only trusted hosts to connect with "xhost +" commands. A cryptographically secure authentication, such as provided by the xauth program, is always preferred. Refer to your X11 server's documentation for further security information.
# grep disable /etc/xinetd.d/finger If the finger service is not disabled, this is a finding.
Edit /etc/xinetd.d/finger and set "disable=yes"
Use the command "ftp" to connect the system's FTP service. Attempt to log into this host with a user name of anonymous and a password of guest (also try the password of guest@mail.com). If the logon is not successful, this check is Not Applicable. Ask the SA if the system is located on a DMZ network. If the system is not located on a DMZ network, this is a finding.
Remove anonymous ftp capability or move the system to a DMZ network.
Check the version of the operating system. Example: # cat /etc/SuSE-release - OR – (if more detail is required) # sam --no-rpm-verify-md5 --spreport Vendor End-of-Support Information: SUSE Linux Enterprise Server 9: 31 Aug 2011 SUSE Linux Enterprise Server 10: 31 Jul 2013 SUSE Linux Enterprise Server 11: 31 Mar 2016 Check with the vendor for additional information. If the version installed is not supported, this is a finding.
Upgrade to a supported version of the operating system.
Determine if there is an automated job, scheduled to run weekly or more frequently, to run the file integrity tool to check for unauthorized additions to system libraries. The check can be done using Advanced Intrusion Detection Environment (AIDE) which is part of the SUSE Linux Enterprise Server (SLES) distribution. Other file integrity software may be used but must be checked manually. Procedure: Check the root crontab (crontab -l) and the global crontabs in /etc/crontab, /etc/cron.d/* for the presence of an "aide" job to run at least weekly, which should have asterisks (*) in columns 3, 4, and 5. Check the weekly cron directory (/etc/cron.weekly) for any script running "aide --check" or "aide -C" or simply "aide". If one does not exist, this is a finding.
Establish an automated job, scheduled to run weekly or more frequently, to run the file integrity tool to check for unauthorized system libraries or binaries, or unauthorized modification to authorized system libraries or binaries.
Check the UID assignments for all accounts. # awk -F: '$3 <= 499 {printf "%15s:%4s\n", $1, $3}' /etc/passwd | sort -n -t: -k2 Confirm all accounts with a UID of 499 and below are used by a system account. If a UID reserved for system accounts (0 - 499) is used by a non-system account, then this is a finding.
Change the UID numbers for non-system accounts with reserved UIDs (those less or equal to 499).
Check the system password length setting. Procedure: Check the password minlen option # grep pam_cracklib.so /etc/pam.d/ common-{auth,account,password,session} Confirm the minlen option is set to at least 15 as in the example below: password required pam_cracklib.so minlen=15 There may be other options on the line. If no such line is found, or the minlen is less than 15 this is a finding.
Edit /etc/pam.d/common-password and add or edit a pam_cracklib.so entry with a minlen parameter set equal to or greater than 15. NOTE: /etc/pam.d/common-password is normally a symbolic link that points to common-password-pc or common-password-local, a file to be ‘included’ by other pam configuration files.
Check the ucredit setting. # grep ucredit /etc/pam.d/common-password-pc If ucredit is not set to -1, this is a finding.
Edit /etc/pam.d/common-password-pc and set ucredit to -1.
Check the dcredit setting. Procedure: Check the password dcredit option # grep pam_cracklib.so /etc/pam.d/common-password-pc Confirm the dcredit option is set to -1 as in the example: password required pam_cracklib.so dcredit=-1 There may be other options on the line. If no such line is found, or the dcredit option is not -1 this is a finding.
Edit "/etc/pam.d/common-password-pc" to include the line: password required pam_cracklib.so dcredit=-1
Check the ocredit setting. Procedure: Check the password ocredit option # grep pam_cracklib.so /etc/pam.d/common-password-pc Confirm the ocredit option is set to -1 as in the example: password required pam_cracklib.so ocredit=-1 There may be other options on the line. If no such line is found, or the ocredit is not -1 this is a finding.
Edit "/etc/pam.d/common-password-pc" to include the line: password required pam_cracklib.so ocredit=-1
Check the system password maxrepeat setting. Procedure: Check the password maxrepeat option # grep pam_cracklib.so /etc/pam.d/common-password Confirm the maxrepeat option is set to 3 or less as in the example below: password required pam_cracklib.so maxrepeat=3 There may be other options on the line. If no such line is found, or the maxrepeat option is more than 3 this is a finding. A setting of zero disables this option. NOTE: This option was not available in SLES 11 until service pack 2(SP2).
Edit /etc/pam.d/common-password and set the maxrepeat option to a value of 3 or less on the pam_cracklib line.
Check the max days field (the 5th field) of /etc/shadow. # more /etc/shadow If the max days field is equal to 0 or greater than 60 for any user, this is a finding.
Set the max days field to 60 for all user accounts. # passwd -x 60 <user>
Ask the SA if there are any automated processing accounts on the system. If there are automated processing accounts on the system, ask the SA if the passwords for those automated accounts are changed at least once a year. If SA indicates passwords for automated processing accounts are not changed once per year, this is a finding.
Implement or establish procedures to change the passwords of automated processing accounts at least once per year.
Check if the root is used for direct logins. Procedure: # last root | grep -v reboot If any direct login records for root exist, this is a finding.
Enforce policy requiring all root account access is attained by first logging into a user account and then becoming root preferably through the use of "sudo" which provides traceability to the command level. If that is not workable then using "su" to access the root account will provide traceability to the login user.
Check the log files to determine if access to the root account is being logged. Procedure: Examine /etc/rsyslog.conf to confirm the location to which "auth" messages will be directed. The default rsyslog.conf uses /var/log/messages but, this needs to be confirmed. # grep @@ /etc/rsyslog.d/remote.conf If a line starting with "*.*" is returned then all rsyslog messages will be sent to system whose address appears after the "@@". In this case rsyslog may or may not be configured to also log "auth" messages locally. # grep auth /etc/rsyslog.conf If any lines are returned which do not start with "#" the "auth" messages will be sent to the indicated files or remote systems. Try to "su -" and enter an incorrect password. #more /var/log/messages Or #more /var/log/secure If there are no records indicating the authentication failure, this is a finding.
Troubleshoot the system logging configuration to provide for logging of root account login attempts. Procedure: Edit /etc/rsyslog.conf to make sure "auth.*" messages are directed to a file or remote system. Examine /etc/audit/audit.rules to ensure user authentication messages have not been specifically excluded. There remove any entries that correspond to: -a exclude,never -Fmsgtype=USER_START -a exclude,never -Fmsgtype=USER_LOGIN -a exclude,never -Fmsgtype=USER_AUTH -a exclude,never -Fmsgtype=USER_END -a exclude,never -Fmsgtype=USER_ACCT NOTE: The rsyslogd process is protected by an AppArmor profile. If the /var/log/secure file needs to be created, the AppArmor profile will need to be updated for the new log file to be used. The profile is stored in /etc/apparmor.d/sbin.rsyslogd and it can be updated manually or by using the YaST AppArmor profile editor. An entry like ‘/var/log/secure w,’ allows write access. A system restart is recommended after updating an AppArmor profile.
Check global initialization files permissions: # ls -l /etc/bash.bashrc # ls -l /etc/csh.cshrc # ls -l /etc/csh.login # ls -l /etc/environment # ls -l /etc/ksh.kshrc # ls -l /etc/profile # ls -l /etc/profile.d/* # ls -l /etc/zshrc If global initialization files are more permissive than 0644, this is a finding.
Change the mode of the global initialization file(s) to 0644. # chmod 0644 <global initialization file>
Check the ownership of global initialization files. Procedure: # ls -lL /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc This should show information for each file. Examine to ensure the owner is always root or: # ls /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc 2>/dev/null|xargs stat -L -c %U:%n|egrep -v "^root" This will show you only the owner and filename of files not owned by root. If any global initialization file is not owned by root, this is a finding.
Change the ownership of global initialization files with incorrect ownership. Procedure: # chown root <global initialization files> or: # ls /etc/bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc 2>/dev/null|xargs stat -L -c %U:%n|egrep -v "^root"|cut -d: -f2|xargs chown root will set the owner of all files not currently owned by root to root.
Check the group ownership of global initialization files. Procedure: # ls -lL /etc/bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc This should show information for each file. Examine to ensure the group is always root or: # ls -lL /etc/bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc 2>/dev/null|sed "s/^[^\/]*//"|xargs stat -L -c %G:%n|egrep -v "^(root|sys|bin|other):" will show you only the group and filename of files not owned by one of the approved groups. If any global initialization file is not group-owned by root, sys, bin, other, system, or the system default, this is a finding.
Change the group ownership of the global initialization file(s) with incorrect group ownership. Procedure: # chgrp root <global initialization file> or: # ls -lL /etc/bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc 2>/dev/null|sed "s/^[^\/]*//"|xargs stat -L -c %G:%n|egrep -v "^(root|sys|bin|other):"|cut -d: -f2|xargs chgrp root will set the group of all files not currently owned by an approved group to root.
Check skeleton files ownership. # ls -alL /etc/skel If a skeleton file is not owned by root or bin, this is a finding.
Change the ownership of skeleton files with incorrect mode: # chown root <skeleton file> or # ls -L /etc/skel| awk '{ print "/etc/skel/"$1 }' |xargs stat -L -c %U:%n|egrep -v "^(root|bin):"|cut -d: -f2|xargs chown root will change all files not owned by root or bin to root.
Check the global initialization files' executable search paths. Procedure: # grep PATH /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc This variable is formatted as a colon-separated list of directories. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/) this is a relative path, this is a finding.
Edit the global initialization file(s) with PATH variables containing relative paths. Edit the file and remove the relative path from the PATH variable.
Verify local initialization files have executable search paths containing only absolute paths or relative paths that have been documented by the ISSO. Procedure: NOTE: This must be done in the BASH shell. # cut -d: -f6 /etc/passwd |xargs -n1 -IDIR find DIR -name ".*" -type f -maxdepth 1 -exec grep -l PATH {} \; This variable is formatted as a colon-separated list of directories. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/), or has not been documented with the ISSO, this is a finding.
Edit the local initialization file and remove the relative path entry from the executable search path variable. If this is not feasible, justify and document the necessity of having the relative path for a specific application with the ISSO. Edit the local initialization file and remove any empty entry that is defined.
Check system configuration files for plus (+) entries. Procedure: # find / -name .rhosts # grep + /<directorylocation>/.rhosts # find / -name .shosts # grep + /<directorylocation>/.shosts # find / -name hosts.equiv # grep + /<directorylocation>/hosts.equiv # find / -name shosts.equiv # grep + /<directorylocation>/shosts.equiv # grep + /etc/passwd # grep + /etc/shadow # grep + /etc/group If the .rhosts, .shosts, hosts.equiv, shosts.equiv, /etc/passwd, /etc/shadow, and/or /etc/group files contain a plus (+) and do not define entries for NIS+ netgroups, this is a finding.
Edit the .rhosts, .shosts, hosts.equiv, shosts.equiv, /etc/passwd, /etc/shadow, and/or /etc/group files and remove entries containing a plus (+).
Check for the existence of the files. # find / -name .rhosts # find / -name .shosts # find / -name hosts.equiv # find / -name shosts.equiv If .rhosts, .shosts, hosts.equiv, or shosts.equiv are found and their use has not been documented and approved by the IAO, this is a finding.
Remove all the r-commands access control files. Procedure: # find / -name .rhosts -exec rm {} \; # find / -name .shosts -exec rm {} \; # find / -name hosts.equiv -exec rm {} \; # find / -name shosts.equiv -exec rm {} \;
Check the PAM configuration for rhosts_auth. Example: # grep rhosts_auth /etc/pam.d/* If a rhosts_auth entry is found, this is a finding.
Edit the file(s) in /etc/pam.d referencing the rhosts_auth module, and remove the references to the rhosts_auth module.
Check the group-ownership of public directories. Procedure: # find / -type d -perm -1002 -exec ls -ld {} \; If any public directory is not group-owned by root, sys, bin, or an application group, this is a finding.
Change the group-ownership of the public directory. Procedure: # chgrp root /tmp (Replace root with a different system group and/or /tmp with a different public directory as necessary.)
List all crontabs on the system. # ls -lL /var/spool/cron /var/spool/cron/tabs # ls -lL /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -lL /etc/cron*|grep -v deny If any crontab is not owned by root or the creating user, this is a finding
Change the crontab owner to root or the crontab creator. # chown root <crontab file> or # chown <user> <crontab file>
Check the cron.allow and cron.deny files for the system. # more /etc/cron.allow # more /etc/cron.deny If a default system account (such as bin, sys, adm, or others, traditionally UID less than 500) is listed in the cron.allow file, or not listed in the cron.deny file and if no cron.allow file exists, this is a finding.
Remove default system accounts (such as bin, sys, adm, or others, traditionally UID less than 500) from the cron.allow file if it exists, or add those accounts to the cron.deny file.
# ulimit -c If the above command does not return 0 and the enabling of core dumps has not been documented and approved by the IAO, this a finding.
Edit /etc/security/limits.conf and set a hard limit for "core" to 0 for all users.
Check the ownership of the kernel core dump data directory. # ls -ld /var/crash If the kernel core dump data directory is not owned by root, this is a finding.
Change the owner of the kernel core dump data directory to root. # chown root /var/crash
The stock kernel has support for non-executable program stacks compiled in by default. The kernel build options can be found in the /boot/config-<kernel version>-default file. Verify that the option was specified when the kernel was built: # grep –i CONFIG_S390_EXEC /boot/config-<kernel version>-default The value “CONFIG_S390_EXEC_PROTECT=y” should be returned. To activate this support, the “noexec=on” kernel parameter must be specified at boot time. The message: “Execute protection active, mvcos available” will be written in the boot log when this feature has been configured successfully. Check for the message with the following command: # grep –i “execute protect” /var/log/boot.msg If non-executable program stacks have not been configured, this is a finding. Verify "randomize_va_space" has not been changed from the default "1" setting. Procedure: #sysctl kernel.randomize_va_space If the return value is not: kernel.randomize_va_space = 1 this is a finding.
Edit the /etc/zipl.conf file and add “noexec=on” to the parameters line in the stanza for the kernel being used on the system. Run the ‘zipl’ command to update the boot loader configuration: # zipl A system restart is required to implement this change. Examine /etc/sysctl.conf for the "kernel.randomize_va_space" entry and if found remove it. The system default of "1" enables this module.
Verify the system does not accept source-routed IPv4 packets. Procedure: # grep [01] /proc/sys/net/ipv4/conf/*/accept_source_route|egrep "default|all" If all of the returned lines do not end with 0, this is a finding. Note: The same setting is used by Linux for both the local acceptance and forwarding of source-routed IPv4 packets.
Configure the system to not accept source-routed IPv4 packets. Edit /etc/sysctl.conf and add a setting for "net.ipv4.conf.all.accept_source_route=0" and "net.ipv4.conf.default.accept_source_route=0". Reload the sysctls. Procedure: # sysctl -p
Determine if the /home path is a separate filesystem. # grep "/home " /etc/fstab If no result is returned, /home is not on a separate filesystem this is a finding.
Migrate the /home (or equivalent) path onto a separate file system.
Check /etc/rsyslog.conf and verify the auth facility is logging both the notice and info level messages by: # grep “auth.notice” /etc/rsyslog.conf # grep “auth.info” /etc/rsyslog.conf or # grep 'auth.*' /etc/rsyslog.conf If auth.* is not found, and either auth.notice or auth.info is not found, this is a finding.
Edit /etc/rsyslog.conf and add local log destinations for auth.* or both auth.notice and auth.info.
# ps -ef |grep xinetd If xinetd is not running, this check is not a finding. # grep -v "^#" /etc/xinetd.conf # grep disable /etc/xinetd.d/* |grep no If no active services are found, and the inetd daemon is running, this is a finding.
# rcxinetd stop; insserv -r xinetd OR # service xinetd stop ; chkconfig xinetd off
Check if the sendmail package is installed: # rpm –q sendmail If sendmail is not installed, this check is not applicable. Check if Help is disabled. This rule is for “sendmail” only and not applicable to “Postfix”. Procedure: # telnet <host> 25 > help If the help command returns any sendmail version information, this is a finding.
To disable the SMTP HELP command, remove, rename or empty the /usr/lib/sendmail.d.helpfile file. # echo > /usr/lib/sendmail.d/helpfile
Perform the following to determine if unencrypted FTP is enabled: # chkconfig --list pure-ftpd # chkconfig --list gssftp # chkconfig --list vsftpd If any of these services are found, ask the SA if these services are encrypted. If they are not, this is a finding.
Disable the FTP daemons. Procedure: # chkconfig pure-ftpd off # chkconfig gssftp off # chkconfig vsftpd off
Check the umask setting for FTP users. Procedure: For gssftp: Assuming an anonymous ftp user has been defined with no user initialization script invoked to change the umask # ftp localhost Name: (localhost:root): anonymous Password: anything ftp>umask If the umask value returned is not 077, this is a finding. or: # grep "server_args" /etc/xinetd.d/gssftp The default umask for FTP is "023" if the server _args entry does not contain "-u 077" this is a finding. For vsftp: # grep "_mask" /etc/vsftpd/vsftpd.conf The default "local_umask" setting is 077. If this has been changed, or the "anon_umask" setting is not 077, this is a finding.
Edit the initialization files for the ftp user and set the umask to 077. Procedure: For gssftp: Modify the /etc/xinetd.d/gssftp file adding "-u 077" to the server_args entry. For vsftp: Modify the "/etc/vsftpd/vsftpd.conf" setting "local_umask" and "anon_umask" to 077.
Determine the owner of the SNMP configuration file. Procedure: Find the snmpd.conf file. The default install location is /etc/snmp/snmpd.conf but may be different depending on the SNMP agent installed. # find / -name snmpd.conf # ls -lL <snmpd.conf> If the snmpd.conf file is not owned by root, this is a finding.
Change the owner of the snmpd.conf file to root. Procedure: # chown root <snmpd.conf file>
Ask the SA if the loghost server is collecting data for hosts outside the local enclave. If it is, this is a finding.
Configure the hosts outside of the local enclave to not log to this system.
#ps -ef | grep syslogd If the '-r' option is present. This is a finding.
Edit the syslog startup script and remove the '-r' option to the rsyslogd command, if it is there. Command line options may also be provided by the RSYSLOGD_PARAMS variable in the /etc/sysconfig/syslog file. This variable may be accessed using the ‘System’ > ‘/etc/sysconfig Editor’ in YaST. It is found by expanding ‘+System’ and then ‘+Logging’. Restart the syslog service after making any change to the runtime options.
Check the TCP wrappers configuration files to determine if sshd is configured to use TCP wrappers. Procedure: # grep sshd /etc/hosts.deny # grep sshd /etc/hosts.allow If no entries are returned, the TCP wrappers are not configured for sshd, this is a finding.
Add appropriate IP restrictions for SSH to the /etc/hosts.deny and/or /etc/hosts.allow files.
Check if the system is configured for IPv4 forwarding. If the system is a VM host and acts as a router solely for the benefits of its client systems, then this rule is not applicable. Procedure: # cat /proc/sys/net/ipv4/ip_forward If the value is set to "1", IPv4 forwarding is enabled this is a finding.
Edit "/etc/sysctl.conf" and set net.ipv4.ip_forward to "0". Restart the system or run "sysctl -p" to make the change take effect.
If an IM client is installed, ask the SA if it has access to any public domain IM servers. If it does have access to public servers, this is a finding.
Uninstall the IM client from the system, or configure the client to only connect to DoD-approved IM services.
Ask the SA if any peer-to-peer file-sharing applications are installed. Some examples of these applications include: - Napster - Kazaa - ARES - Limewire - IRC Chat Relay - BitTorrent If any of these applications are installed, this is a finding.
Uninstall the peer-to-peer file sharing application(s) from the system.
Check the domain name for NIS maps. Procedure: # domainname If the name returned is simple to guess, such as the organization name, building or room name, etc., this is a finding.
Change the NIS domainname to a value difficult to guess. Consult vendor documentation for the required procedure.
For each security tool on the system, determine if the tool is configured to notify the IAO and SA of any detected security problem. If such notifications are not configured, this is a finding.
Configure the security tools on the system to notify the IAO and SA when any security issues are detected.
Check for the existence of the "/etc/hosts.allow" and "/etc/hosts.deny" files. Procedure: # ls -la /etc/hosts.allow # ls -la /etc/hosts.deny If either file does not exist, this is a finding. Check for the presence of a "default deny" entry. Procedure: # grep "ALL: ALL" /etc/hosts.deny If the "ALL: ALL" entry is not present the "/etc/hosts.deny" file, any TCP service from a host or network not matching other rules will be allowed access. If the entry is not in "/etc/hosts.deny", this is a finding.
Edit the "/etc/hosts.allow" and "/etc/hosts.deny" files to configure access restrictions.
Check /etc/securetty group ownership: # ls –lL /etc/securetty If /etc/securetty is not group owned by root, sys, or bin, then this is a finding.
Change the group-owner of /etc/securetty to root, sys, or bin. Example: # chgrp root /etc/securetty
Check /etc/securetty ownership. Procedure: # ls –lL /etc/securetty If /etc/securetty is not owned by root, this is a finding.
Change the owner of the /etc/securetty file to root. Procedure: # chown root /etc/securetty
Check /etc/securetty permissions. Procedure: # ls -lL /etc/securetty If /etc/securetty has a mode more permissive than 0600, this is a finding.
Change the mode of the /etc/securetty file to 0600. Procedure: # chmod 0600 /etc/securetty
Determine if any network analysis tools are installed. Procedure: # find / -name ethereal # find / -name wireshark # find / -name tshark # find / -name netcat # find / -name tcpdump # find / -name snoop If any network analysis tools are found, this is a finding.
Remove each network analysis tool binary from the system. Remove package items with a package manager, others remove the binary directly. Procedure: Find the binary file: # find / -name <Item to be removed> Find the package, if any, to which it belongs: # rpm -qf <binary file> Remove the package if it does not also include other software: # rpm -e <package name> # SuSEconfig If the item to be removed is not in a package, or the entire package cannot be removed because of other software it provides, remove the item's binary file. # rm <binary file>
Check for the existence of a virus scan tool to be executed daily in the cron file: # crontab -l With the assistance of the system administrator, ensure the virus definition signature files are not older than seven (7) days. If a virus scanner is not being run daily or the virus definitions are older than seven (7) days, this is a finding.
Install a virus scan tool. Ensure the virus signature definition files are no older than seven (7) days. Ensure the command line virus scan tool is run on a regular basis using a utility, such as cron.
Check the root crontab (crontab -l) and the global crontabs in /etc/crontab, /etc/cron.d/* for the presence of an "ntpd -qg" job to run at least daily, which should have asterisks (*) in columns 3, 4, and 5. Check the daily cron directory (/etc/cron.daily) for any script running "ntpd -qg". Check for a running NTP daemon. # ps ax | grep ntpd If none of the above checks are successful, this is a finding.
Enable the NTP daemon for continuous synchronization. # rcntp ; insserv ntp OR Add a daily or more frequent cronjob to perform synchronization using ntpdate.
Check the root crontab (crontab -l) and the global crontabs in /etc/crontab, /etc/cron.d/*, or scripts in the /etc/cron.daily directory for the presence of an "ntpd -qg" job. If the "ntpd -qg" command is not invoked with at least two external NTP servers listed, this is a finding. Check the NTP daemon configuration for at least two external servers. # grep ^server /etc/ntp.conf | egrep -v '(127.127.1.0|127.127.1.1)' If less than two servers or external reference clocks (127.127.x.x other than 127.127.1.0 or 127.127.1.1) are listed, this is a finding.
If using "ntpd -qg", add additional NTP servers to the cron job running "ntpd -qg". If using the NTP daemon, add an additional "server" line to /etc/ntp.conf for each additional NTP server.
Check the root crontab (crontab -l) and the global crontabs in /etc/crontab, /etc/cron.d/*, or scripts in the /etc/cron.daily directory for the presence of an "ntpd -qg" job. If the "ntpd -qg" command is invoked with NTP servers outside of the enclave, this is a finding. Check the NTP daemon configuration for NTP servers. # grep ^server /etc/ntp.conf | grep -v 127.127.1.1 If an NTP server is listed outside of the enclave, this is a finding.
If using "ntpd -qg", remove NTP servers external to the enclave from the cron job running "ntpd -qg". If using the NTP daemon, remove the "server" line from /etc/ntp.conf for each NTP server external to the enclave.
Check the ownership of the NTP configuration file. # ls -l /etc/ntp.conf If the owner is not root, this is a finding.
Change the owner of the NTP configuration file. # chown root /etc/ntp.conf
Check the group ownership of the NTP configuration file. Procedure: # ls -lL /etc/ntp.conf If the group owner is not root, bin, sys, or system, this is a finding.
Change the group-owner of the NTP configuration file. Procedure: # chgrp root /etc/ntp.conf
Check the mode for the NTP configuration file is not more permissive than 0640. # ls -l /etc/ntp.conf If the mode is more permissive than 0640, this is a finding.
Change the mode of the NTP configuration file to 0640 or more restrictive. # chmod 0640 /etc/ntp.conf
Check the NTP configuration file has no extended ACL. # ls -l /etc/ntp.conf If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the NTP configuration file. # setfacl --remove-all /etc/ntp.conf
Check for a default maxlogins line in the /etc/security/limits.conf and /etc/security/limits.d/* files. Procedure: #grep maxlogins /etc/security/limits.conf /etc/security/limits.d/* The default maxlimits should be set to a max of 10 or a documented site defined number: * - maxlogins 10 If no such line exists, this is a finding.
Add a "maxlogins" line such as "* hard maxlogins 10" to /etc/security/limits.conf or a file in /etc/security/limits.d. The enforced maximum should be defined by site requirements and policy.
Check that pam_lastlog is used and not silent, or that the SSH daemon is configured to display last login information. # grep pam_lastlog /etc/pam.d/sshd If pam_lastlog is present, and does not have the "silent" option, this is not a finding. # grep -i PrintLastLog /etc/ssh/sshd_config If PrintLastLog is not enabled in the configuration either explicitly or by default, this is a finding.
Implement pam_lastlog, or enable PrintLastLog in the SSH daemon. To enable pam_lastlog, add a line such as "session required pam_lastlog.so" to /etc/pam.d/sshd. To enable PrintLastLog in the SSH daemon, remove any lines disabling this option from /etc/ssh/sshd_config.
Verify no password hash in /etc/passwd or /etc/shadow begins with a character other than an underscore (_) or dollar sign ($). # cut -d ':' -f2 /etc/passwd # cut -d ':' -f2 /etc/shadow If any password hash is present that does not have an initial underscore (_) or dollar sign ($) character, this is a finding.
Change the passwords for all accounts using non-compliant password hashes. (This requires GEN000590 is already met.)
Check the /etc/default/passwd file for the CRYPT_FILES variable setting. Procedure: # grep -v '^#' /etc/default/passwd | grep -i crypt_files CRYPT_FILES must be set to SHA256 or SHA512. If it is not set, or it is set to some other value this is a finding.
Edit the /etc/default/passwd file and add or change the CRYPT_FILES variable setting so that it contains: CRYPT_FILES=sha256 OR CRYPT_FILES=sha512 In SLES 11 SP2 this option can also be configured with the YaST ‘Security and Users’ module. Run the ‘Security Center and Hardening’ application, then select ‘Password Settings’. Use the ‘Password Encryption Method’ drop-down to select either ‘SHA-256’ or ‘SHA-512’.
Check all password hashes in /etc/passwd or /etc/shadow begin with '$5$' or '$6$'. Procedure: # cut -d ':' -f2 /etc/passwd # cut -d ':' -f2 /etc/shadow Any password hashes present not beginning with '$5$' or '$6$', is a finding.
Change the passwords for all accounts using non-compliant password hashes. (This requires GEN000590 is already met.)
Check /etc/pam.d/common-password for lcredit setting. Procedure: Check the password lcredit option # grep pam_cracklib.so /etc/pam.d/common-password Confirm the lcredit option is set to -1 as in the example: password required pam_cracklib.so lcredit=-1 There may be other options on the line. If no such line is found, or the lcredit is not -1 this is a finding.
Edit "/etc/pam.d/common-password" to include the line: password required pam_cracklib.so lcredit=-1
Check /etc/pam.d/common-{auth,account,password,session} for a ‘difok’ parameter on the pam_cracklib.so line. Procedure: # grep difok /etc/pam.d/common-{auth,account,password,session} If difok is not present, or has a value less than 8, this is a finding. Check for common-password inclusions. # grep -c common-password /etc/pam.d/* If the common-password file is included anywhere # grep difok /etc/pam.d/common-password If common-password is included anywhere and difok is not present, or has a value less than 8, this is a finding. Ensure the passwd command uses the common-password settings. # grep common-password /etc/pam.d/passwd If a line "password include common-password" is not found then the password checks in common-password will not be applied to new passwords and this is a finding.
Edit /etc/pam.d/common-password and add or edit a pam_cracklib.so entry with a difok parameter set equal to or greater than 8.
Check /etc/pam.d/common-password for pam_cracklib configuration. # grep pam_cracklib /etc/pam.d/common-password* If pam_cracklib is not present, this is a finding. Ensure the passwd command uses the common-password settings. # grep common-password /etc/pam.d/passwd If a line "password include common-password" is not found then the password checks in common-password will not be applied to new passwords, this is a finding.
Edit /etc/pam.d/common-password and configure pam_cracklib by adding a line such as "password required pam_cracklib.so"
Check that /etc/pam.d/su and /etc/pam.d/su-l use pam_wheel. # grep pam_wheel /etc/pam.d/su /etc/pam.d/su-l If pam_wheel is not present, or is commented out, this is a finding.
Edit /etc/pam.d/su and /etc/pam.d/su-l Uncomment or add a line such as "auth required pam_wheel.so". If necessary, create a "wheel" group and add administrative users to the group.
Check the root account's home directory has no extended ACL. # grep "^root" /etc/passwd | awk -F":" ‘{print $6}’ # ls -ld <root home directory> If the permissions include a '+' the directory has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the root account's home directory. # setfacl --remove-all <root home directory>
Check the LD_LIBRARY_PATH environment variable is empty or not defined for the root user. # echo $LD_LIBRARY_PATH If a path list is returned, this is a finding.
Edit the root user initialization files and remove any definition of LD_LIBRARY_PATH.
Check the LD_PRELOAD environment variable is empty or not defined for the root user. # echo $LD_PRELOAD If a path list is returned, this is a finding.
Edit the root user initialization files and remove any definition of LD_PRELOAD.
Search the system for files without a valid group-owner. # find / -nogroup If any files are found, this is a finding.
Change the group-owner for each file without a valid group-owner. # chgrp a validgroup /tmp/a-file-without-a-valid-group-owner
Check that network services daemon files have no extended ACLs. # ls -la /usr/sbin If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /usr/sbin/*
Check all system command files have no extended ACLs. # ls -lL /etc /bin /usr/bin /usr/local/bin /sbin /usr/sbin /usr/local/sbin If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all [file with extended ACL]
Verify system log files have no extended ACLs. Procedure: # ls -lL /var/log If the permissions include a '+', the file has an extended ACL. If an extended ACL exists, verify with the SA if the ACL is required to support authorized software and provides the minimum necessary permissions. If an extended ACL exists providing access beyond the needs of authorized software, this is a finding.
Remove the extended ACL from the file. Procedure: # setfacl --remove-all [file with extended ACL]
Verify all manual page files have no extended ACLs. # ls -lL /usr/share/man /usr/share/man/man* /usr/share/info If the permissions include a '+', the file has an extended ACL this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /usr/share/man/* /usr/share/man/man* /usr/share/info/*
Verify system libraries have no extended ACLs. # ls -lL /usr/lib/* /usr/lib64/* /lib/* /lib64/* | grep "+ " If the permissions include a '+', the file has an extended ACL and has not been approved by the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /usr/lib/* /usr/lib64/* /lib/* /lib64/*
Verify NIS/NIS+/yp files have no extended ACLs. # ls -lL /var/yp/* If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /var/yp/*
Verify the /etc/resolv.conf file is owned by root. # ls -l /etc/resolv.conf If the file is not owned by root, this is a finding.
Change the owner of the /etc/resolv.conf file to root. # chown root /etc/resolv.conf
Check the group ownership of the resolv.conf file. Procedure: # ls -lL /etc/resolv.conf If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the /etc/resolv.conf file to root, bin, sys, or system. Procedure: # chgrp root /etc/resolv.conf
Check the mode of the /etc/resolv.conf file. # ls -l /etc/resolv.conf If the file mode is not 0644, this is a finding.
Change the mode of the /etc/resolv.conf file to 0644. # chmod 0644 /etc/resolv.conf
Verify /etc/resolv.conf has no extended ACL. # ls -l /etc/resolv.conf If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/resolv.conf
Verify the /etc/hosts file is owned by root. # ls -l /etc/hosts If the file is not owned by root, this is a finding.
Change the owner of the /etc/hosts file to root. # chown root /etc/hosts
Check the /etc/hosts file's group ownership. Procedure: # ls -lL /etc/hosts If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the /etc/hosts file to root, sys, bin, or system. Procedure: # chgrp root /etc/hosts
Check the mode of the /etc/hosts file. # ls -l /etc/hosts If the file mode is not 0644, this is a finding.
Change the mode of the /etc/hosts file to 0644. # chmod 0644 /etc/hosts
Verify /etc/hosts has no extended ACL. # ls -l /etc/hosts If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/hosts
Verify the /etc/nsswitch.conf file is owned by root. # ls -l /etc/nsswitch.conf If the file is not owned by root, this is a finding.
Change the owner of the /etc/nsswitch.conf file to root. # chown root /etc/nsswitch.conf
Check the group ownership of the nsswitch.conf file. Procedure: # ls -lL /etc/nsswitch.conf If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the /etc/nsswitch.conf file to root, bin, sys, or system. Procedure: # chgrp root /etc/nsswitch.conf
Check the mode of the /etc/nsswitch.conf file. # ls -l /etc/nsswitch.conf If the file mode is not 0644, this is a finding.
Change the mode of the /etc/nsswitch.conf file to 0644 or less permissive. # chmod 0644 /etc/nsswitch.conf
Verify /etc/nsswitch.conf has no extended ACL. # ls -l /etc/nsswitch.conf If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/nsswitch.conf
Determine if DNS is enabled on the system. # grep dns /etc/nsswitch.conf If no line is returned, or any returned line is commented out, the system does not use DNS, and this is not applicable. Determine the name servers used by the system. # grep nameserver /etc/resolv.conf If less than two lines are returned that are not commented out, this is a finding.
Edit /etc/resolv.conf and add additional "nameserver" lines until at least two are present.
Verify the /etc/passwd file is owned by root. # ls -l /etc/passwd If the file is not owned by root, this is a finding.
Change the owner of the /etc/passwd file to root. # chown root /etc/passwd
Check the group ownership of the passwd file. Procedure: # ls -lL /etc/passwd If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the /etc/passwd file to root, bin, sys, or system. Procedure: # chgrp root /etc/passwd
Verify /etc/passwd has no extended ACL. # ls -l /etc/passwd If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/passwd
Verify the /etc/group file is owned by root. # ls -l /etc/group If the file is not owned by root, this is a finding.
Change the owner of the /etc/group file to root. # chown root /etc/group
Check the group ownership of the /etc/group file. Procedure: # ls -lL /etc/group If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the /etc/group file. Procedure: # chgrp root /etc/group
Check the mode of the /etc/group file. # ls -l /etc/group If the file mode is more permissive than 0644, this is a finding.
Change the mode of the /etc/group file to 0644 or less permissive. # chmod 0644 /etc/group
Verify /etc/group has no extended ACL. # ls -l /etc/group If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/group
Check the ownership of the /etc/shadow file. Procedure: # ls -lL /etc/shadow If the file is not group-owned by root, bin, sys, or shadow, this is a finding.
Change the group-owner of the /etc/shadow file. Procedure: # chgrp root /etc/shadow
Verify /etc/shadow has no extended ACL. # ls -l /etc/shadow If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/shadow
Verify no password hashes are present in /etc/passwd. # cut -d : -f 2 /etc/passwd | egrep -v '^(x|\*)$' If any password hashes are returned, this is a finding.
Migrate /etc/passwd password hashes to /etc/shadow. # pwconv
Check the /etc/group file for password hashes. # cut -d : -f 2 /etc/group | egrep -v '^(x|!)$' If any password hashes are returned, this is a finding.
Edit /etc/group and change the password field to an exclamation point (!) to lock the group password.
Verify user home directories have no extended ACLs. # cut -d : -f 6 /etc/passwd | xargs -n1 ls -ld If the permissions include a '+', the file has an extended ACL this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all [user home directory with extended ACL]
Check the contents of user home directories for files group-owned by a group of which the home directory's owner is not a member. 1. List the user accounts. # cut -d : -f 1 /etc/passwd 2. For each user account, get a list of GIDs for files in the user's home directory. # find ~username -printf %G\\n | sort | uniq 3. Obtain the list of GIDs where the user is a member. # id -G username 4. Check the GID lists. If there are GIDs in the file list not present in the user list, this is a finding.
Change the group of a file not group-owned by a group of which the home directory's owner is a member. # chgrp <group with user as member> <file with bad group ownership> Document all changes.
Check the contents of user home directories for files with extended ACLs. # cut -d : -f 6 /etc/passwd | xargs -n1 -IDIR ls -alLR DIR If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <user file with extended ACL>
Verify run control scripts have no extended ACLs. # ls -lL /etc/rc* /etc/init.d If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <run control script with extended ACL>
Verify run control scripts' library search paths. # grep -r LD_LIBRARY_PATH /etc/rc* /etc/init.d This variable is formatted as a colon-separated list of directories. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/) this is a relative path, this is a finding.
Edit the run control script and remove the relative path entry from the library search path variable.
Verify run control scripts' library preload list. # grep -r LD_PRELOAD /etc/rc* /etc/init.d This variable is formatted as a colon-separated list of paths. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/) this is a relative path, this is a finding.
Edit the run control script and remove the relative path entry from the library preload variable.
Check global initialization files for extended ACLs: # ls -l /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc 2>/dev/null|grep "\+ " If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # ls -l /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc 2>/dev/null|grep "\+ "| awk '{ print $8}' xargs setfacl --remove-all
Check skeleton files for extended ACLs: # ls -alL /etc/skel. If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all [skeleton file with extended ACL] or: # ls -lL /etc/skel|grep "\+ "|awk ‘{print “/etc/skel/”$9}’|xargs setfacl --remove-all will remove all ACLs from the files.
Verify the skeleton files are group-owned by root, bin or sys. Procedure: # ls -alL /etc/skel If a skeleton file is not group-owned by root, bin or sys this is a finding.
Change the group-owner of the skeleton file to root, bin or sys. Procedure: # chgrp <group> /etc/skel/<skeleton file> or: # cd /etc/skel # ls -L /etc/skel|xargs stat -L -c %G:%n|egrep -v "^(root|bin|sys):"|cut -d: -f2|xargs chgrp root will change the group of all files not already in one of the approved groups to root.
Check the global initialization files' library search paths. Procedure: # grep LD_LIBRARY_PATH /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc This variable is formatted as a colon-separated list of directories. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/) this is a relative path, this is a finding.
Edit the global initialization file and remove the relative path entry from the library search path variable.
Check the global initialization files' library preload list. # grep -r LD_PRELOAD /etc/bash.bashrc /etc/csh.cshrc /etc/csh.login /etc/environment /etc/ksh.kshrc /etc/profile /etc/profile.d/* /etc/zshrc This variable is formatted as a colon-separated list of paths. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/) this is a relative path, this is a finding.
Edit the global initialization file and remove the relative path entry from the library preload variable.
Check user home directories for local initialization files group-owned by a group other than the user's primary group or root. Procedure: # ls –a /<users home directory> | grep “^\.” | awk '{if ((!($1=="."))&&(!($1==".."))) print}' | xargs ls –ld If any file is not group-owned by root or the user's primary GID, this is a finding.
Change the group-owner of the local initialization file to the user's primary group, or root. # chgrp <user's primary GID> <user's local initialization file> Procedure: for PWLINE in $(cut -d: -f4,6 /etc/passwd); do HOMEDIR=${PWLINE##*:}; GROUP=${PWLINE%%:*}; FILES=$(find ${HOMEDIR} ! -fstype nfs -type f -name '\.*'); for INIFILE in ${FILES}; do GID=$(stat -c %g ${INIFILE}); test "$GROUP" = "${GID}" || chgrp ${GROUP} ${INIFILE}; done; done
Check user home directories for local initialization files with extended ACLs. # for HOMEDIR in $(cut -d: -f6 /etc/passwd); do find ${HOMEDIR} -type f -name '\.*' | xargs ls -ld | grep '\+'; done If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <local initialization file with extended ACL>
Verify local initialization files have library search path containing only absolute paths. Procedure: # cut -d: -f6 /etc/passwd |xargs -n1 -IDIR find DIR -name ".*" -type f -maxdepth 1 -exec grep -H LD_LIBRARY_PATH {} \; This variable is formatted as a colon-separated list of directories. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/) this is a relative path, this is a finding.
Edit the local initialization file and remove the relative path entry from the library search path variable.
Verify local initialization files have library preload list containing only absolute paths. Procedure: # cut -d: -f6 /etc/passwd |xargs -n1 -IDIR find DIR -name ".*" -type f -maxdepth 1 -exec grep -H LD_PRELOAD {} \; This variable is formatted as a colon-separated list of paths. If there is an empty entry, such as a leading or trailing colon, or two consecutive colons, this is a finding. If an entry begins with a character other than a slash (/) this is a relative path, this is a finding.
Edit the local initialization file and remove the relative path entry from the library preload variable.
If /etc/shells exists, check the group ownership of each shell referenced. Procedure: # cat /etc/shells | xargs -n1 ls -l Otherwise, check any shells found on the system. Procedure: # find / -name "*sh" | xargs -n1 ls -l If a shell is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the shell to root, bin, sys, or system. Procedure: # chgrp root <shell>
If /etc/shells exists, check the permissions of each shell referenced. # cat /etc/shells | xargs -n1 ls -lL Otherwise, check any shells found on the system. # find / -name "*sh" | xargs -n1 ls -lL If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all [shell]
Check /etc/fstab and verify the "nodev" mount option is used on any filesystems mounted from removable media or network shares. If any filesystem mounted from removable media or network shares does not have this option, this is a finding.
Edit /etc/fstab and add the "nodev" option to any filesystems mounted from removable media or network shares.
Check the system audit log files for extended ACLs. Procedure: # grep "^log_file" /etc/audit/auditd.conf|sed s/^[^\/]*//|xargs ls -l If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the system audit file(s). # setfacl --remove-all [audit file]
Verify the audit tool executables are owned by root. # ls -l /sbin/auditctl /sbin/auditd /sbin/ausearch /sbin/aureport /sbin/autrace /sbin/audispd If any listed file is not owned by root, this is a finding.
Change the owner of the audit tool executable to root. # chown root [audit tool executable]
Verify the audit tool executables are group-owned by root, bin, sys, or system. Procedure: # ls -lL /sbin/auditctl /sbin/auditd /sbin/ausearch /sbin/aureport /sbin/autrace /sbin/audispd If any listed file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the audit tool executable to root, bin, sys, or system. Procedure: # chgrp root <audit tool executable>
Check the mode of audit tool executables. # ls -l /sbin/auditctl /sbin/auditd /sbin/ausearch /sbin/aureport /sbin/autrace /sbin/audispd If any listed file has a mode more permissive than 0750, this is a finding.
Change the mode of the audit tool executable to 0750, or less permissive. # chmod 0750 [audit tool executable]
Check the permissions of audit tool executables. # ls -l /sbin/auditctl /sbin/auditd /sbin/ausearch /sbin/aureport /sbin/autrace /sbin/audispd If the permissions include a '+' the file has an extended ACL, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all [audit file]
Verify the /etc/audit/auditd.conf has the disk_full_action and disk_error_action parameters set. Procedure: # grep disk_full_action /etc/audit/auditd.conf If the disk_full_action parameter is missing or set to "suspend" or "ignore" this is a finding. # grep disk_error_action /etc/audit/auditd.conf If the disk_error_action parameter is missing or set to "suspend" or "ignore" this is a finding.
Edit /etc/audit/auditd.conf and set the disk_full_action and/or disk_error_action parameters to a valid setting of "syslog", "exec", "single" or "halt", adding the parameters if necessary.
Check /etc/audit/auditd.conf for the space_left_action and action_mail_acct parameters. # egrep 'space_left_action|action_mail_acct' /etc/audit/auditd.conf If the space_left_action or the action_mail_acct parameters are set to blanks, this is a finding. If the space_left_action is set to "syslog" the system logs the event, this is not a finding. If the space_left_action is set to "exec" the system executes a designated script. If this script informs the SA of the event, this is not a finding. If the space_left_action parameter is missing, this is a finding. If the space_left_action parameter is set to "ignore" or "suspend" no logging would be performed after the event, this is a finding. If the space_left_action parameter is set to "single" or "halt" this effectively stops the system causing a Denial of Service, this is a finding. If the space_left_action is set to "email" and the action_mail_acct parameter is not set to the e-mail address of the system administrator, this is a finding. The action_mail_acct parameter, if missing, defaults to "root". Note that if the email address of the system administrator is on a remote system "sendmail" must be available.
Edit /etc/audit/auditd.conf and set the space_left_action parameter to a valid setting other than "ignore". If the space_left_action parameter is set to "email" set the action_mail_acct parameter to an e-mail address for the system administrator.
Determine if execution of the useradd and groupadd executable are audited. # auditctl -l | egrep '(useradd|groupadd)' If either useradd or groupadd are not listed with a permissions filter of at least 'x', this is a finding. Determine if /etc/passwd, /etc/shadow, /etc/group, and /etc/gshadow are audited for appending. # auditctl -l | egrep '(/etc/passwd|/etc/shadow|/etc/group|/etc/gshadow)' If any of these are not listed with a permissions filter of at least 'a', this is a finding.
Configure execute auditing of the useradd and groupadd executables. Add the following to audit.rules: -w /usr/sbin/useradd -p x -k useradd -w /usr/sbin/groupadd -p x -k groupadd Configure append auditing of the passwd, shadow, group, and gshadow files. Add the following to audit.rules: -w /etc/passwd -p a -k passwd -w /etc/shadow -p a -k shadow -w /etc/group -p a -k group -w /etc/gshadow -p a -k gshadow Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if execution of the usermod and groupmod executable are audited. # auditctl -l | egrep '(usermod|groupmod)' If either usermod or groupmod are not listed with a permissions filter of at least 'x', this is a finding. Determine if /etc/passwd, /etc/shadow, /etc/group, and /etc/gshadow are audited for writing. # auditctl -l | egrep '(/etc/passwd|/etc/shadow|/etc/group|/etc/gshadow)' If any of these are not listed with a permissions filter of at least 'w', this is a finding.
Configure execute auditing of the usermod and groupmod executables. Add the following to the audit.rules file: -w /usr/sbin/usermod -p x -k usermod -w /usr/sbin/groupmod -p x -k groupmod Configure append auditing of the passwd, shadow, group, and gshadow files. Add the following to the audit.rules file: -w /etc/passwd -p w -k passwd -w /etc/shadow -p w -k shadow -w /etc/group -p w -k group -w /etc/gshadow -p w -k gshadow Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if execution of the passwd executable is audited. # auditctl -l | grep /usr/bin/passwd If passwd is not listed with a permissions filter of at least 'x', this is a finding.
Configure execute auditing of the passwd executable. Add the following to the audit.rules file: -w /usr/sbin/passwd -p x -k passwd Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if execution of the userdel and groupdel executable are audited. # auditctl -l | egrep '(userdel|groupdel)' If either userdel or groupdel are not listed with a permissions filter of at least 'x', this is a finding.
Configure execute auditing of the userdel and groupdel executables. Add the following to the audit.rules file: -w /usr/sbin/userdel -p x -w /usr/sbin/groupdel -p x Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if the init_module and delete_module syscalls are audited. # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "init_module" If the result does not contain "-S init_module" ,this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Configure auditing of the init_module syscalls. Add the following to the "etc/audit/audit.rules" file: -a exit,always -S init_module Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the permissions of the cron.allow file. # ls -l /etc/cron.allow If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/cron.allow
Check the group ownership of the crontab files. Procedure: # ls -lL /var/spool/cron /var/spool/cron/tabs # ls -lL /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -lL /etc/cron*|grep -v deny If the group owner is not root or the crontab owner's primary group, this is a finding.
Change the group owner of the crontab file to root, cron, or the crontab's primary group. Procedure: # chgrp root [crontab file]
Check the permissions of the crontab files. Procedure: # ls -lL /var/spool/cron /var/spool/cron/tabs ls –lL /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -lL /etc/cron*|grep -v deny If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all [crontab file]
Check the permissions of the crontab directories. Procedure: # ls -ld /var/spool/cron /var/spool/cron/tabs ls -ld /etc/crontab /etc/cron.{d,daily,hourly,monthly,weekly} or # ls -ld /etc/cron*|grep -v deny If the permissions include a '+' the directory has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding
Remove the extended ACL from the directory. # setfacl --remove-all <crontab directory>
Check the permissions of the file. Procedure: Check the configured cron log file found in the cron entry of the rsyslog configuration (normally /var/log/cron). # grep cron /etc/rsyslog.conf /etc/rsyslog.d/*.conf # ls -lL /var/log/cron If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /var/log/cron
Check the permissions of the file. # ls -lL /etc/cron.deny If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/cron.deny
Check the permissions of the file. # ls -lL /etc/at.allow If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/at.allow
Check the group ownership of the file. Procedure: # ls -lL /etc/cron.allow If the file is not group-owned by root, bin, sys, or cron, this is a finding.
Change the group ownership of the file. Procedure: # chgrp root /etc/cron.allow
Check the permissions of the file. # ls -lL /etc/at.deny If the file has a mode more permissive than 0600, this is a finding.
Change the mode of the file. # chmod 0600 /etc/at.deny
Check the permissions of the file. # ls -lL /etc/at.deny If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/at.deny
Check the group ownership of the file. Procedure: # ls -lL /etc/cron.deny If the file is not group-owned by root, bin or sys this is a finding.
Change the group ownership of the file. # chgrp root /etc/cron.deny
Check the permissions of the directory. # ls -lLd /var/spool/at /var/spool/atjobs If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the directory. # setfacl --remove-all /var/spool/at /var/spool/atjobs
Check the group ownership of the directory. Procedure: # ls -ld /var/spool/atjobs If the file is not group-owned by root, bin, daemon, sys, or at, this is a finding.
Change the group ownership of the directory to root, bin, sys, daemon or cron. Procedure: # chgrp <root|bin|daemon|sys|at> <"atjobs" directory>
Check the group ownership of the file. Procedure: # ls -lL /etc/at.allow If the file is not group-owned by root, bin, sys, or cron, this is a finding.
Change the group ownership of the file. Procedure: # chgrp root /etc/at.allow
Check the group ownership of the file. Procedure: # ls -lL /etc/at.deny If the file is not group-owned by root, bin, sys, or cron, this is a finding.
Change the group ownership of the at.deny file to root, sys, bin, or cron. Procedure: # chgrp root /etc/at.deny
Verify a directory is defined for process core dumps. # cat /proc/sys/kernel/core_pattern If the parameter is not an absolute path (does not start with a slash [/]), this is a finding.
Edit /etc/sysctl.conf and set (adding if necessary) kernel.core_pattern to an absolute path ending with a file name prefix, such as "/var/core/core".
Procedure: Check the defined directory for process core dumps. # cat /proc/sys/kernel/core_pattern|xargs -n1 -IPATTERN dirname PATTERN Check the existence and ownership of the directory # ls -lLd <core file directory> If the directory does not exist or is not owned by root, this is a finding.
If the core file directory does not exist it must be created. # mkdir -p <core file directory> If necessary, change the owner of the core file directory. # chown root <core file directory>
Check the defined directory for process core dumps. Procedure: # cat /proc/sys/kernel/core_pattern Check the group ownership of the directory # ls -lLd <core file directory> If the directory is not group-owned by root, bin, sys, or system this is a finding.
Change the group-owner of the core file directory. # chgrp root <core file directory>
Procedure: Check the defined directory for process core dumps. # cat /proc/sys/kernel/core_pattern|xargs -n1 -IPATTERN dirname PATTERN Check the permissions of the directory. # ls -lLd <core file directory> If the has a mode more permissive than 0700, this is a finding.
Change the mode of the core file directory. # chmod 0700 <core file directory>
Check the defined directory for process core dumps. Procedure: Check the defined directory for process core dumps. # cat /proc/sys/kernel/core_pattern|xargs -n1 -IPATTERN dirname PATTERN Check the permissions of the directory. # ls -lLd <core file directory> If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <core file directory>
Check that the dumpconf service is not running. # /etc/init.d/dumpconf status If a status of “running" is returned, this is a finding.
Disable dumpconf. # /etc/init.d/dumpconf stop # insserv –r dumpconf
Determine the kernel core dump data directory and check its ownership. # ls -ld /var/crash If the directory is not group-owned by root, this is a finding.
Change the group-owner of the kernel core dump data directory. # chgrp root /var/crash
Determine the kernel core dump data directory and check its permissions. # ls -ld /var/crash If the directory has a mode more permissive than 0700, this is a finding.
Change the group-owner of the kernel core dump data directory. # chmod 0700 /var/crash
Determine the kernel core dump data directory and check its permissions. # ls -ld /var/crash If the permissions include a '+' the file has an extended ACL, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /var/crash
Check the system for user-controlled network interfaces. # grep -i '^USERCONTROL=' /etc/sysconfig/network/ifcfg* | grep -i yes If any results are returned with USERCONTROL set to yes, this is a finding.
Edit the configuration for the user-controlled interface and change the USERCONTROL=’yes’ value to ‘no’.
Verify the system does not respond to ICMP TIMESTAMP_REQUESTs Procedure: # iptables -L INPUT | grep "timestamp" This should return the following entries for "timestamp-reply" and "timestamp_request": DROP icmp -- anywhere anywhere icmp timestamp-request DROP icmp -- anywhere anywhere icmp timestamp-reply If either does not exist or does not "DROP" the message, this is a finding.
Configure the system to not respond to ICMP TIMESTAMP_REQUESTs. This is done by rejecting ICMP type 13 and 14 messages at the firewall. Procedure: 1. Check the SuSEfirewall2 configuration to see if custom rules are being used: # grep -v '^#' /etc/sysconfig/SuSEfirewall2 | grep FW_CUSTOMRULES If the command returns FW_CUSTOMRULES=”” then no custom rules are being used. In that case edit the /etc/sysconfig/SuSEfirewall2 file and use the vendor supplied file by setting FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom" 2. Edit the file defined by the FW_CUSTOMRULES variable and add these commands to append the INPUT chain: iptables -A INPUT -p ICMP --icmp-type timestamp-request -j DROP iptables -A INPUT -p ICMP --icmp-type timestamp-reply -j DROP Restart the firewall: # rcSuSEfirewall2 restart
Verify the system does not respond to ICMP ECHO_REQUESTs set to broadcast addresses. Procedure: # cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts If the result is not 1, this is a finding.
Configure the system to not respond to ICMP ECHO_REQUESTs sent to broadcast addresses. Edit /etc/sysctl.conf and add a setting for "net.ipv4.icmp_echo_ignore_broadcasts=1" and reload the sysctls. Procedure: # echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf # sysctl -p
Verify the system does not respond to ICMP TIMESTAMP_REQUESTs set to broadcast addresses. Procedure: # cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts If the result is not 1, this is a finding. Note: The same parameter controls both ICMP ECHO_REQUESTs and TIMESTAMP_REQUESTs.
Configure the system to not respond to ICMP TIMESTAMP_REQUESTs sent to broadcast addresses. Edit /etc/sysctl.conf and add a setting for "net.ipv4.icmp_echo_ignore_broadcasts=1" and reload the sysctls. Procedure: # echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf # sysctl -p
Check the reverse source route settings for the system: # sysctl net.ipv4.conf.all.accept_source_route # sysctl net.ipv4.conf.default.accept_source_route If either setting has a value other than zero, this is a finding.
Add the entries in /etc/sysctl.conf to disable reverse source routing: # printf "sysctl net.ipv4.conf.all.accept_source_route = 0\n" >> /etc/sysctl.conf # printf "sysctl net.ipv4.conf.default.accept_source_route = 0\n" >> /etc/sysctl.conf Activate the updated settings: # /sbin/sysctl -p /etc/sysctl.conf
Check the reverse source route settings for the system: # sysctl net.ipv4.conf.all.accept_source_route # sysctl net.ipv4.conf.default.accept_source_route If either setting has a value other than zero, this is a finding.
Add the entries in /etc/sysctl.conf to disable reverse source routing: # printf "sysctl net.ipv4.conf.all.accept_source_route = 0\n" >> /etc/sysctl.conf # printf "sysctl net.ipv4.conf.default.accept_source_route = 0\n" >> /etc/sysctl.conf Activate the updated settings: # /sbin/sysctl -p /etc/sysctl.conf
Verify the system does not accept source-routed IPv4 packets. Procedure: # grep [01] /proc/sys/net/ipv4/conf/*/accept_source_route|egrep "default|all" If all of the resulting lines do not end with "0", this is a finding.
Configure the system to not accept source-routed IPv4 packets. Edit /etc/sysctl.conf and add a setting for "net.ipv4.conf.all.accept_source_route=0" and "net.ipv4.conf.default.accept_source_route=0". Reload the sysctls. Procedure: # sysctl -p
Verify the system does not use proxy ARP. # grep [01] /proc/sys/net/ipv4/conf/*/proxy_arp|egrep "default|all" If all of the resulting lines do not end with "0", this is a finding.
Configure the system to not use proxy ARP. Edit /etc/sysctl.conf and add a setting for "net.ipv4.conf.all.proxy_arp=0" and "net.ipv4.conf.default.proxy_arp=0". # sysctl -p
Verify the system does not accept IPv4 ICMP redirect messages. # grep [01] /proc/sys/net/ipv4/conf/*/accept_redirects|egrep "default|all" If all of the resulting lines do not end with "0", this is a finding.
Configure the system to not accept IPv4 ICMP redirect messages. Edit /etc/sysctl.conf and add a setting for "net.ipv4.conf.all.accept_redirects=0" and "net.ipv4.conf.default.accept_redirects=0". # sysctl -p
Verify the system does not send IPv4 ICMP redirect messages. # grep [01] /proc/sys/net/ipv4/conf/*/send_redirects|egrep "default|all" If all of the resulting lines do not end with "0", this is a finding.
Configure the system to not send IPv4 ICMP redirect messages. Edit /etc/sysctl.conf and add a setting for "net.ipv4.conf.all.send_redirects=0" and "net.ipv4.conf.default.send_redirects=0". # sysctl -p
Verify the system logs martian packets. # grep [01] /proc/sys/net/ipv4/conf/*/log_martians|egrep "default|all" If all of the resulting lines do not end with "1", this is a finding.
Configure the system to log martian packets. Edit /etc/sysctl.conf and add a setting for "net.ipv4.conf.all.log_martians=1" and "net.ipv4.conf.default.log_martians=1". Reload the sysctls. Procedure: # sysctl -p
Verify the system configured to use TCP syncookies when experiencing a TCP SYN flood. # cat /proc/sys/net/ipv4/tcp_syncookies If the result is not "1", this is a finding.
Configure the system to use TCP syncookies when experiencing a TCP SYN flood. Edit /etc/sysctl.conf and add a setting for "net.ipv4.tcp_syncookies=1". # sysctl -p
Verify the system is not configured for bridging. # ls /proc/sys/net/bridge If the directory exists, this is a finding. # lsmod | grep '^bridge ' If any results are returned, this is a finding.
Configure the system to not use bridging. # rmmod bridge Edit /etc/modprobe.conf and add a line such as "install bridge /bin/false" to prevent the loading of the bridge module.
Verify local filesystems use journaling. # mount | grep '^/dev/' | egrep -v 'type (ext3|ext4|jfs|reiserfs|xfs|iso9660|udf)' If a mount is listed, this is a finding.
Convert local file systems to use journaling or another mechanism ensuring file system consistency.
Check the group ownership of the xinetd configuration files and directories. Procedure: # ls -alL /etc/xinetd.conf /etc/xinetd.d If a file or directory is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-owner of the xinetd configuration files and directories. Procedure: # chgrp -R root /etc/xinetd.conf /etc/xinetd.d
Check the permissions of the xinetd configuration files. Procedure: # ls -alL /etc/xinetd.conf If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/xinetd.conf
Check the permissions of the xinetd configuration directories. # ls -dlL /etc/xinetd.d If the mode of the directory is more permissive than 0755, this is a finding.
Change the mode of the directory. # chmod 0755 /etc/xinetd.d
Check the permissions of the xinetd configuration files and directories. # ls -alL /etc/xinetd.conf /etc/xinetd.d If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/xinetd.d
Check the group ownership of the services file. Procedure: # ls -lL /etc/services If the file is not group-owned by root, bin, sys, or system, this is a finding
Change the group-owner of the services file. Procedure: # chgrp root /etc/services
Check the permissions of the /etc/services file. # ls -lL /etc/services If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/services
Check the status of the portmap and/or rpcbind service. # rcportmap status # rcrpcbind status If the service is running, this is a finding.
Shutdown and disable the portmap and/or rpcbind service. # rcportmap stop; insserv –r portmap # rcrpcbind stop; insserv –r rpcbind
Check if the portmap and/or rpcbind packages are installed. # rpm –q portmap rpcbind If a package is found, this is a finding.
Remove the portmap and/or rpcbind packages. # rpm -e portmap rpcbind # SuSEconfig
Check if the rsh-server package is installed. Procedure: # rpm -qa | grep rsh-server If a package is found, this is a finding.
Remove the rsh-server package. Procedure: # rpm -e rsh-server #SuSEconfig
Check the rlogind configuration. # cat /etc/xinetd.d/rlogin If the file exists and does not contain "disable = yes" this is a finding.
Remove or disable the rlogin configuration and restart xinetd. # rm /etc/xinetd.d/rlogin ; service xinetd restart
Check if the rsh-server package is installed. Procedure: # rpm -qa | grep rsh-server If a package is found, this is a finding.
Remove the rsh-server package. Procedure: # rpm -e rsh-server # SuSEconfig
Check if the rsh-server package is installed. Procedure: # rpm -qa | grep rsh-server If a package is found, this is a finding.
Remove the rsh-server package. Procedure: # rpm -e rsh-server # SuSEconfig
Check the group ownership of the /etc/hosts.lpd(or equivalent) file. Procedure: # ls -lL /etc/hosts.lpd If the file is not group-owned by root, bin, sys, or system, this is a finding. Check the group ownership of the /etc/cups/printers.conf file. # ls -lL /etc/cups/printers.conf If the file is not group-owned by lp, this is a finding.
Change the group-owner of the hosts.lpd file. Procedure: # chgrp root /etc/hosts.lpd Change the group-owner of the printers.conf file. # chgrp lp /etc/cups/printers.conf
Check the permissions of the /etc/hosts.lpd (or equivalent) file. # find /etc -name hosts.lpd -print # find /etc -name Systems –print # find /etc -name printers.conf -print # ls -lL <print service file> If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <print service file>
Check the permissions of the /usr/sbin/traceroute file. # ls -lL /usr/sbin/traceroute If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /usr/sbin/traceroute
If the “sendmail” or “postfix” packages are not installed, this is not applicable. Check the group ownership of the alias files. Procedure: for sendmail: # ls -lL /etc/aliases If the file is not group-owned by root, this is a finding. # ls -lL /etc/aliases.db If the file is not group-owned by root, this is a finding. for postfix: Verify the location of the alias file. # postconf alias_maps This will return the location of the "aliases" file, by default "/etc/aliases". # ls -lL <postfix aliases file> If the file is not group-owned by root, this is a finding. # ls -lL <postfix aliases.db file> If the file is not group-owned by root, this is a finding.
Change the group-owner of the /etc/aliases file. Procedure: for sendmail: # chgrp root /etc/aliases # chgrp root /etc/aliases.db for postfix # chgrp root <postfix aliases file> # chgrp root <postfix aliases.db file>
Check the permissions of the alias file. Procedure: for sendmail: # ls -lL /etc/aliases /etc/aliases.db If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding. for postfix: Verify the location of the alias file. # postconf alias_maps This will return the location of the "aliases" file. # ls -lL <postfix aliases file> <postfix aliases.db file> If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended permissions from the alias files. Procedure: for sendmail: # setfacl --remove-all /etc/aliases /etc/aliases.db for postfix: # setfacl --remove-all <postfix aliases file> <postfix aliases.db file>
Examine the contents of the /etc/aliases file. Procedure: # more /etc/aliases Examine the aliases file for any utilized directories or paths. # ls -lL <file referenced from aliases> Check the permissions for any paths referenced. If the group owner of any file is not root, bin, sys, or system, this is a finding.
Change the group ownership of the file referenced from /etc/aliases. Procedure: # chgrp root <file referenced from aliases>
Examine the contents of the /etc/aliases file. Procedure: # more /etc/aliases Examine the aliases file for any utilized directories or paths. # ls -lL <file referenced from aliases> Check the permissions for any paths referenced. If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <file referenced from aliases>
# more /etc/rsyslog.conf Examine /etc/rsyslog.conf and determine the log file(s) receiving logs for "mail.crit", "mail.debug", mail.*, or "*.crit". Check the permissions on these log files. # ls -lL <log file> If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
This fix is applicable to both Postfix and sendmail servers. Remove the extended ACL from the file. # setfacl --remove-all <log file>
Check the group ownership of the ftpusers file. Procedure: # ls -lL /etc/ftpusers /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group owner of the ftpusers file. Procedure: # chgrp root /etc/ftpusers /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers
Check the permissions of the /etc/ftpusers file. # ls -lL /etc/ftpusers /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/ftpusers /etc/vsftpd.ftpusers /etc/vsftpd/ftpusers
Check the file permissions for the .Xauthority files. Procedure: # ls -la |egrep "(\.Xauthority|\.xauth)" If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all .Xauthority
Check the SNMP daemon is not configured to use the v1 or v2c security models. Procedure: Examine the default install location /etc/snmp/snmpd.conf or: # find / -name snmpd.conf # grep -E '(v1|v2c|community|com2sec)' <snmp.conf file> | grep -v '^#' If any configuration is found, this is a finding.
Edit /etc/snmp/snmpd.conf and remove references to the "v1", "v2c", "community", or "com2sec". Restart the SNMP service. # service snmpd restart
Verify the SNMP daemon uses SHA for SNMPv3 users. Procedure: Examine the default install location /etc/snmp/snmpd.conf or: # find / -name snmpd.conf # grep -v '^#' <snmpd.conf file> | grep -i createuser | grep -vi SHA If any line is present this is a finding.
Edit /etc/snmp/snmpd.conf and add the SHA keyword for any create user statement without one. Restart the SNMP service. # service snmpd restart
Verify the SNMP daemon uses AES for SNMPv3 users. Procedure: Examine the default install location /etc/snmp/snmpd.conf or: # find / -name snmpd.conf # grep -v '^#' <snmpd.conf file> | grep -i createuser | grep -vi AES If any line is present this is a finding.
Edit /etc/snmp/snmpd.conf and add the AES keyword for any create user statement without one. Restart the SNMP service. # service snmpd restart
Check the file permissions for the MIB files. # find / -name *mib* -o -name *MIB* | xargs ls -lL If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <mib file>
Check the group ownership of the SNMP configuration file. Procedure: Examine the default install location /etc/snmp/snmpd.conf or: # find / -name snmpd.conf # ls -lL <snmpd.conf> If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group ownership of the SNMP configuration file. Procedure: # chgrp root <snmpd.conf>
Check the permissions of the SNMP configuration file. Procedure: Examine the default install location /etc/snmp/snmpd.conf or: # find / -name snmpd.conf # ls -lL <snmpd.conf> If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <snmpd.conf file>
Check the permissions of the rsyslog configuration file(s). # ls -lL /etc/rsyslog.conf /etc/rsyslog.d If the mode of the file is more permissive than 0640, this is a finding.
Change the permissions of the rsyslog configuration file(s). # chmod 0640 /etc/rsyslog.conf # chmod 0640 /etc/rsyslog.d/*.conf
Check the permissions of the syslog configuration file. # ls -lL /etc/rsyslog.conf /etc/rsyslog.d/ If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all <syslog configuration file>
Check the syslog configuration file for remote syslog servers. # grep '@' /etc/rsyslog.conf /etc/rsyslog.d/*.conf | grep -v '^#' If no line is returned, this is a finding.
Edit the syslog configuration file and add an appropriate remote syslog server.
Check the SSH client configuration for allowed protocol versions. # grep -i protocol /etc/ssh/ssh_config | grep -v '^#' If the returned protocol configuration allows versions less than 2, this is a finding
Edit the /etc/ssh/ssh_config file and add or edit a "Protocol" configuration line not allowing versions less than 2.
Ask the SA to identify which interfaces on the system are designated for management traffic. If all interfaces on the system are authorized for management traffic, this is not applicable. Check the SSH daemon configuration for listening network addresses. # grep -i Listen /etc/ssh/sshd_config | grep -v '^#' If no configuration is returned, or if a returned 'Listen' configuration contains addresses not designated for management traffic, this is a finding.
Edit the SSH daemon configuration to specify listening network addresses designated for management traffic. Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH daemon configuration for allowed ciphers. # grep -i ciphers /etc/ssh/sshd_config | grep -v '^#' If no lines are returned, or the returned ciphers list contains any cipher not starting with "3des" or "aes", this is a finding.
Edit the SSH daemon configuration and remove any ciphers not starting with "3des" or "aes". If necessary, add a "Ciphers" line. Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH daemon configuration for allowed ciphers. # grep -i ciphers /etc/ssh/sshd_config | grep -v '^#' If no lines are returned, or the returned ciphers list contains any cipher ending with "cbc", this is a finding.
Edit the SSH daemon configuration and remove any ciphers ending with "cbc". If necessary, add a "Ciphers" line. Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH daemon configuration for allowed MACs. Procedure: # grep -i macs /etc/ssh/sshd_config | grep -v '^#' If no lines are returned, or the returned MACs list contains any MAC less than "hmac-sha1", this is a finding.
Edit the SSH daemon configuration and remove any MACs less than "hmac-sha1". If necessary, add a "MACs" line. Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH client configuration for allowed ciphers. # grep -i ciphers /etc/ssh/ssh_config | grep -v '^#' If no lines are returned, or the returned ciphers list contains any cipher not starting with "3des" or "aes", this is a finding.
Edit the SSH client configuration and remove any ciphers not starting with "3des" or "aes". If necessary, add a "Ciphers" line.
Check the SSH client configuration for allowed ciphers. # grep -i ciphers /etc/ssh/ssh_config | grep -v '^#' If no lines are returned, or the returned ciphers list contains any cipher ending with "cbc", this is a finding.
Edit the SSH client configuration and remove any ciphers ending with "cbc". If necessary, add a "Ciphers" line.
Check the SSH client configuration for allowed MACs. # grep -i macs /etc/ssh/ssh_config | grep -v '^#' If no lines are returned, or the returned MACs list contains any MAC less than "hmac-sha1", this is a finding.
Edit the SSH client configuration and remove any MACs less than "hmac-sha1". If necessary, add a "MACs" line.
There are two ways in which access to SSH may restrict users or groups. Check if /etc/pam.d/sshd is configured to require daemon style login control. # grep pam_access.so /etc/pam.d/sshd|grep "required"|grep "account"| grep -v '^#' If no lines are returned, sshd is not configured to use pam_access. Check the SSH daemon configuration for the AllowGroups setting. # egrep -i "AllowGroups|AllowUsers" /etc/ssh/sshd_config | grep -v '^#' If no lines are returned, sshd is not configured to limit access to users/groups. If sshd is not configured to limit access either through pam_access or the use "AllowUsers" or "Allowgroups", this is a finding.
Edit the SSH daemon configuration and add an "AllowGroups" or "AllowUsers" directive. specifying the groups and users allowed to have access. Restart the SSH daemon. # /sbin/service sshd restart Alternatively, modify the /etc/pam.d/sshd file to include the line account required pam_access.so accessfile=<path to access.conf for sshd> If the "accessfile" option is not specified the default "access.conf" file will be used. The "access.conf" file must contain the user restriction definitions.
Check the permissions for SSH public host key files. # ls -lL /etc/ssh/*key.pub If any file has a mode more permissive than 0644, this is a finding.
Change the permissions for the SSH public host key files. # chmod 0644 /etc/ssh/*key.pub
Check the permissions for SSH private host key files. # ls -lL /etc/ssh/*key If any file has a mode more permissive than 0600, this is a finding.
Change the permissions for the SSH private host key files. # chmod 0600 /etc/ssh/*key
Ask the SA if GSSAPI authentication is used for SSH authentication to the system. If so, this is not applicable. Check the SSH daemon configuration for the GSSAPIAuthentication setting. # grep -i GSSAPIAuthentication /etc/ssh/sshd_config | grep -v '^#' If no lines are returned, or the setting is set to "yes", this is a finding.
Edit the SSH daemon configuration and set (add if necessary) a "GSSAPIAuthentication" directive set to "no". Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH clients configuration for the GSSAPIAuthentication setting. # grep -i GSSAPIAuthentication /etc/ssh/ssh_config | grep -v '^#' If no lines are returned, or the setting is set to "yes", this is a finding.
Edit the SSH client configuration and set (add if necessary) a "GSSAPIAuthentication" directive set to "no".
Ask the SA if Kerberos authentication is used by the system. If it is, this is not applicable. Check the SSH daemon configuration for the KerberosAuthentication setting. # grep -i KerberosAuthentication /etc/ssh/sshd_config | grep -v '^#' If no lines are returned, or the setting is set to "yes", this is a finding.
Edit the SSH daemon configuration and set (add if necessary) the "KerberosAuthentication" directive set to "no". Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH daemon configuration for the MaxSessions setting. # grep -i MaxSessions /etc/ssh/sshd_config | grep -v '^#' If the setting is not present, or not set to "1", this is a finding.
Edit the SSH daemon configuration and add or edit the "MaxSessions" setting value to "1".
Check the SSH daemon configuration for the StrictModes setting. # grep -i StrictModes /etc/ssh/sshd_config | grep -v '^#' If the setting is not present, or not set to "yes", this is a finding.
Edit the /etc/ssh/sshd_config file and add or edit the "StrictModes" setting value to "yes". Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH daemon configuration for the UsePrivilegeSeparation setting. # grep -i UsePrivilegeSeparation /etc/ssh/sshd_config | grep -v '^#' If the setting is not present, or not set to "yes", this is a finding.
Edit the SSH daemon configuration and add or edit the "UsePrivilegeSeparation" setting value to "yes". Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH daemon configuration for the RhostsRSAAuthentication setting. # grep -i RhostsRSAAuthentication /etc/ssh/sshd_config | grep -v '^#' If the setting is set to "yes", this is a finding.
Edit the SSH daemon configuration and add or edit the "RhostsRSAAuthentication" setting value to "no". Restart the SSH daemon. # /sbin/service sshd restart
Check the SSH daemon configuration for the compression setting. # grep -i Compression /etc/ssh/sshd_config | egrep "no|delayed" If the setting is missing or is commented out, this is a finding. If the setting is present but is not set to "no" or "delayed", this is a finding.
Edit the SSH daemon configuration and add or edit the "Compression" setting value to "no" or "delayed". Restart the SSH daemon. # /sbin/service sshd restart
Verify the SSH daemon is configured for logon warning banners. Procedure: An exact match is required to have a valid warning banner. Check for the following login banner. 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.
Edit /etc/issue and the DoD login banner. DoD Login Banners: 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. Find the location of the banner file for sshd and examine the content: # grep -i banner /etc/ssh/sshd_config | grep -v '^#' # cat Edit the SSH daemon configuration and add or edit a "Banner" setting referencing a file containing a logon warning banner. Restart the SSH daemon. # /sbin/service sshd restart
Check for a default route for IPv6. If the system is a VM host and acts as a router solely for the benefit of its client systems, then this rule is not applicable. # ip -6 route list | grep default If the system uses IPv6, and no results are returned, this is a finding.
Add a default route for IPv6. Edit /etc/sysconfig/network/routes Restart the interface. # ifdown eth0; ifup eth0
Check if the system is configured for IPv6 forwarding. # grep [01] /proc/sys/net/ipv6/conf/*/forwarding|egrep "default|all" If the /proc/sys/net/ipv6/conf/*/forwarding entries do not exist because of compliance with GEN007720, this is not a finding. If all of the resulting lines do not end with 0, this is a finding.
Disable IPv6 forwarding. Edit /etc/sysctl.conf and add a setting for "net.ipv6.conf.all.forwarding=0" and "net.ipv6.conf.default.forwarding=0". Reload the sysctls. Procedure: # sysctl -p
Check the group ownership of the NFS export configuration file. Procedure: # ls -lL /etc/exports If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group ownership of the NFS export configuration file. Procedure: # chgrp root /etc/exports
Check the permissions of the NFS export configuration file. # ls -lL /etc/exports If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/exports
List the exports. # cat /etc/exports For each file system displayed, check the ownership. # ls -ldL <exported file system path> If the directory is not group-owned by root, bin, sys, or system, this is a finding.
Change the group owner of the export directory. # chgrp root <export>
Check the permissions of the Samba configuration file. # ls -lL /etc/samba/smb.conf If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/samba/smb.conf
Check the permissions of the Samba password files. Procedure: # ls -lL /etc/samba/passdb.tdb /etc/samba/secrets.tdb If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/samba/passdb.tdb /etc/samba/secrets.tdb
Check the security mode of the Samba configuration. # grep -i security /etc/samba/smb.conf If the security mode is "share", this is a finding.
Edit the "/etc/samba/smb.conf" file and change the "security" setting to "user" or another valid setting other than "share".
If the "samba-common" package is not installed, this is not applicable. Check the encryption setting of Samba. # grep -i 'encrypt passwords' /etc/samba/smb.conf If the setting is not present, or not set to 'yes', this is a finding.
Edit the "/etc/samba/smb.conf" file and change the "encrypt passwords" setting to "yes".
Check the access to shares for Samba. # grep -i 'guest ok' /etc/samba/smb.conf If the setting exists and is set to 'yes', this is a finding.
Edit the "/etc/samba/smb.conf" file and change the "guest ok" setting to "no".
Check the permissions of the file. # ls -lL /etc/news/incoming.conf If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/news/incoming.conf
Check the permissions for "/etc/news/hosts.nntp.nolimit". # ls -lL /etc/news/hosts.nntp.nolimit If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/news/hosts.nntp.nolimit
Check the permissions of the file. # ls -lL /etc/news/nnrp.access If the permissions include a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/news/nnrp.access
Check the permissions of the file. # ls -lL /etc/news/passwd.nntp If the mode includes a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/news/passwd.nntp
Check the root crontab (crontab -l) and the global crontabs in "/etc/crontab", "/etc/cron.d/*" for the presence of an rpm verification command such as: rpm -qVa | awk '$2!="c" {print $0}' If no such cron job is found, this is a finding. If the result of the cron job indicates packages which do not pass verification exist, this is a finding unless the changes were made due to another STIG entry.
Add a cron job to run an rpm verification command such as: rpm -qVa | awk '$2!="c" {print $0}' For packages which failed verification: If the package is not necessary for operations, remove it from the system. If the package is necessary for operations, re-install the package.
If using an Advanced Intrusion Detection Environment (AIDE), verify that the configuration contains the "ACL" option for all monitored files and directories. Procedure: Check for the default location /etc/aide/aide.conf or: # find / -name aide.conf # egrep "[+]?acl" <aide.conf file> If the option is not present. This is a finding. If using a different file integrity tool, check the configuration per tool documentation.
If using AIDE, edit the configuration and add the "ACL" option for all monitored files and directories. If using a different file integrity tool, configure ACL checking per the tool's documentation.
If using an Advanced Intrusion Detection Environment (AIDE), verify the configuration contains the "xattrs" option for all monitored files and directories. Procedure: Check for the default location /etc/aide/aide.conf or: # find / -name aide.conf # egrep "[+]?xattrs" <aide.conf file> If the option is not present. This is a finding. If using a different file integrity tool, check the configuration per tool documentation.
If using an Advanced Intrusion Detection Environment (AIDE), verify the configuration contains the "xattrs" option for all monitored files and directories. Procedure: Check for the default location /etc/aide/aide.conf or: # find / -name aide.conf # egrep "[+]?xattrs" <aide.conf file> If the option is not present. This is a finding. If using a different file integrity tool, check the configuration per tool documentation.
If using an Advanced Intrusion Detection Environment (AIDE), verify the configuration contains the "sha256" or "sha512" options for all monitored files and directories. Procedure: Check for the default location /etc/aide/aide.conf or: # find / -name aide.conf # egrep "[+]?(sha256|sha512)" <aide.conf file> If the option is not present. This is a finding. If one of these options is not present. This is a finding. If using a different file integrity tool, check the configuration per tool documentation.
If using AIDE, edit the configuration and add the "sha512" option for all monitored files and directories. If using a different file integrity tool, configure FIPS 140-2 approved cryptographic hashes per the tool's documentation.
Verify the SCTP protocol handler is prevented from dynamic loading. # grep 'install sctp' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep ‘/bin/true’ If no result is returned, this is a finding.
Prevent the SCTP protocol handler for dynamic loading. # echo "install sctp /bin/true" >> /etc/modprobe.conf.local
Verify the DCCP protocol handler is prevented from dynamic loading. # grep 'install dccp' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep ‘/bin/true’ If no result is returned, this is a finding. # grep 'install dccp_ipv4' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep /bin/true’ If no result is returned, this is a finding. # grep 'install dccp_ipv6' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep ‘bin/true’ If no result is returned, this is a finding.
Prevent the DCCP protocol handler for dynamic loading. # echo "install dccp /bin/true" >> /etc/modprobe.conf.local # echo "install dccp_ipv4 /bin/true" >> /etc/modprobe.conf.local # echo "install dccp_ipv6 /bin/true" >> /etc/modprobe.conf.local
If there is no UDP-Lite protocol handler available for the system, this is not applicable. Determine if the UDP-Lite protocol handler is prevented from dynamic loading. If it is not, this is a finding.
Configure the system to prevent the dynamic loading of the UDP-Lite protocol handler.
Check that the IPX protocol handler is prevented from dynamic loading. # grep 'install ipx' /etc/modprobe.conf /etc/modprbe.conf.local /etc/modprobe.d/* | grep ‘/bin/true’ If no result is returned, this is a finding.
Prevent the IPX protocol handler for dynamic loading. # echo "install ipx /bin/true" >> /etc/modprobe.conf.local
Verify the AppleTalk protocol handler is prevented from dynamic loading. # grep 'install appletalk' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep ‘/bin/true’ If no result is returned, this is a finding.
Prevent the AppleTalk protocol handler for dynamic loading. # echo "install appletalk /bin/true" >> /etc/modprobe.conf.local
Ask the SA if RDS is required by application software running on the system. If so, this is not applicable. Verify the RDS protocol handler is prevented from dynamic loading. # grep 'install rds' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep ‘/bin/true’ If no result is returned, this is a finding.
Prevent the RDS protocol handler for dynamic loading. # echo "install rds /bin/true" >> /etc/modprobe.conf.local
Verify the TIPC protocol handler is prevented from dynamic loading. # grep 'install tipc' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep ‘/bin/true’ If no result is returned, this is a finding.
Prevent the TIPC protocol handler for dynamic loading. # echo "install tipc /bin/true" >> /etc/modprobe.conf.local
Verify the Bluetooth protocol handler is prevented from dynamic loading. # grep 'install bluetooth' /etc/modprobe.conf /etc/modprobe.conf.local /etc/modprobe.d/* | grep ‘/bin/true’ If no result is returned, this is a finding.
Prevent the Bluetooth protocol handler for dynamic loading. # echo "install bluetooth /bin/true" >> /etc/modprobe.conf.local
Use the ifconfig command to determine if any network interface has an IPv6 address bound to it: # /sbin/ifconfig | grep inet6 If any lines are returned that indicate IPv6 is active and the system does not need IPv6, this is a finding.
Remove the capability to use IPv6 protocol handler. Procedure: Update the variable “IPV6_DISABLE” using YaST in the /etc/sysconfig editor under the ‘System’ > ‘Kernel’ tree. Setting this variable to “YES” deactivates IPv6 at boot time. Reboot the system to implement the change. NOTE: This change may affect other software product(s) that have their own IPv6 configuration settings.
If this system uses IPv6, this is not applicable. Verify the IPv6 protocol handler is prevented from dynamic loading. # /sbin/ifconfig | grep –i inet6 This command should not return any output. If any lines are returned that display IPv6 addresses associated with the TCP/IP stack, this is a finding.
Comment or remove any IPV6 specific entries in the /etc/hosts file. On a standard SLES system, those entries would be something like: # special IPv6 addresses # ::1 localhost ipv6-localhost ipv6-loopback # fe00::0 ipv6-localnet
Check the system for any active 6to4 tunnels without specific remote addresses. # ip tun list | grep "remote any" | grep "ipv6/ip" If any results are returned the "tunnel" is the first field. If any results are returned, this is a finding.
Disable the active 6to4 tunnel. # ip link set <tunnel> down Add this command to a startup script, or remove the configuration creating the tunnel.
Verify the Miredo service is not running. # ps ax | grep miredo | grep -v grep If the miredo process is running, this is a finding.
Edit startup scripts to prevent the service from running on startup.
Check for any IP tunnels. # ip tun list # ip -6 tun list If any tunnels are listed, this is a finding.
Remove the tunnels. # ip tun del <tunnel> Edit system startup scripts to prevent tunnel creation on startup.
Verify no interface is configured to use DHCP. # grep -i bootproto=dhcp /etc/sysconfig/network/ifcfg-* If any configuration is found, this is a finding.
Edit the /etc/sysconfig/network/ifcfg-* file(s) and change the "bootproto" setting to "static".
If the "dhcp-client" package is not installed, this is not applicable. Verify the DHCP client is configured to not send dynamic DNS updates. Procedure: # rpm –q dhcp-client If DHCP client is found then issue following command to determine if the DHCP client sends dynamic DNS updates: # grep do-forward-updates /etc/dhclient.conf If the DHCP client is installed and the configuration file is not present, or contains do-forward-updates = “true”, then this is a finding
Edit or add the "/etc/dhclient.conf" file and add or edit the "do-forward-updates" setting to false. Procedure: # echo "do-forward-updates false;" >> /etc/dhclient.conf
Verify the system is configured to ignore IPv6 ICMP redirect messages. # cat /proc/sys/net/ipv6/conf/all/accept_redirects If the /proc/sys/net/ipv6/conf/all/accept_redirects entry does not exist because of compliance with GEN007720, this is not a finding. If the returned value is not "0", this is a finding.
Configure the system to ignore IPv6 ICMP redirect messages. Edit "/etc/sysctl.conf" and add a settings for "net.ipv6.conf.default.accept_redirects=0" and "net.ipv6.conf.all.accept_redirects=0". Restart the system for the setting to take effect.
Reverse Path filtering for IPv6 is not implemented in SLES.
If the system uses IPv6 use an appropriate reverse-path filter for IPV6 network traffic.
Determine if the system is configured to forward IPv6 source-routed packets. Procedure: # sysctl net.ipv6.conf.all.forwarding # sysctl net.ipv6.conf.default.forwarding If any value of the entries is not = "0", this is a finding.
Configure the system to not forward IPv6 source-routed packets. Procedure: Edit the /etc/sysctl.conf file to include: net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.default.forwarding = 0 Reload the kernel parameters: # sysctl -p
The ability to control the acceptance of source-routed packets is not inherent to IPv6.
The ability to control the acceptance of source-routed packets is not inherent to IPv6.
Check if the system is using NSS LDAP. # grep -v '^#' /etc/nsswitch.conf | grep ldap If no lines are returned, this vulnerability is not applicable. Check if NSS LDAP is using TLS. # grep '^ssl start_tls' /etc/ldap.conf If no lines are returned, this is a finding. Check if NSS LDAP TLS is using only FIPS 140-2 approved cryptographic algorithms. # grep '^tls_ciphers' /etc/ldap.conf If the line is not present, or contains ciphers not approved by FIPS 140-2, this is a finding.
Edit "/etc/ldap.conf" and add a "ssl start_tls" and "tls_ciphers" options with only FIPS 140-2 approved ciphers.
Verify the source of the LDAP certificates Check if the system is using NSS LDAP. # grep -v '^#' /etc/nsswitch.conf | grep ldap If no lines are returned, this vulnerability is not applicable. Verify with the SA that the system is connected to the GIG. If the system part of a stand alone network which is not connected to the GIG this vulnerability is not applicable. Verify a certificate is used for client authentication to the server. # grep -i '^tls_cert' /etc/ldap.conf If no line is found, this is a finding. List the certificate issuer. # openssl x509 -text -in <cert> If the certificate is not issued by DoD PKI or a DoD-approved external PKI, this is a finding.
Edit "/etc/ldap.conf" and add or edit the 'tls_cert' setting to reference a file containing a client certificate issued by DoD PKI or a DoD-approved external PKI.
Check if the system is using NSS LDAP. # grep -v '^#' /etc/nsswitch.conf | grep ldap If no lines are returned, this vulnerability is not applicable. Verify a server certificate is required and verified by the NSS LDAP configuration. # grep -i '^tls_checkpeer' /etc/ldap.conf If no line is returned, or the value is not "yes", this is a finding.
Edit "/etc/ldap.conf" and add or set the "tls_checkpeer" setting to "yes".
Check if the system is using NSS LDAP. # grep -v '^#' /etc/nsswitch.conf | grep ldap If no lines are returned, this vulnerability is not applicable. Verify the NSS LDAP client is configured to check certificates against a certificate revocation list. # grep -i '^tls_crlcheck' /etc/ldap.conf If the setting does not exist, or the value is not "all", this is a finding.
Edit "/etc/ldap.conf" and add or set the "tls_crlcheck" setting to "all".
Check the permissions of the file. # ls -lL /etc/ldap.conf If the mode of the file is more permissive than 0644, this is a finding.
Change the permissions of the file. # chmod 0644 /etc/ldap.conf
Check the ownership of the file. # ls -lL /etc/ldap.conf If the file is not owned by root, this is a finding.
Change the owner of the file. # chown root /etc/ldap.conf
Check the group ownership of the file. Procedure: # ls -lL /etc/ldap.conf If the file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group owner of the file to root, bin, sys, or system. Procedure: # chgrp root /etc/ldap.conf
Check the permissions of the file. # ls -lL /etc/ldap.conf If the mode includes a '+', the file has an extended ACL. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the "/etc/ldap.conf" file. # setfacl --remove-all /etc/ldap.conf
Determine the certificate authority file and/or directory. # grep -i '^tls_cacert' /etc/ldap.conf For each file or directory returned, check the ownership. # ls -lLd <certpath> If the owner of any file or directory is not root, this is a finding.
Change the ownership of the file or directory. # chown root <certpath>
Determine the certificate authority file and/or directory. # grep -i '^tls_cacert' /etc/ldap.conf For each file or directory returned, check the group ownership. # ls -lLd <certpath> If the group-owner of any file or directory is not root, bin, sys, or system, this is a finding.
Change the group ownership of the file or directory. # chgrp root <certpath>
Determine the certificate authority file and/or directory. Procedure: # grep -i '^tls_cacert' /etc/ldap.conf For each file or directory returned, check the permissions. Procedure: # ls -lLd <certpath> If the mode of the file is more permissive than 0644 (or 0755 for directories), this is a finding.
Change the mode of the file or directory. File Procedure: # chmod 0644 <certpath> Directory Procedure: # chmod 0755 <certpath>
Determine the certificate authority file and/or directory. # grep -i '^tls_cacert' /etc/ldap.conf For each file or directory returned, check the permissions. # ls -lLd <certpath> If the mode of the file or directory contains a '+', an extended ACL is present. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the certificate file. Procedure: For each certificate file found remove all extended permissions # setfacl --remove-all <certpath>
Determine the certificate file. # grep -i '^tls_cert' /etc/ldap.conf Check the ownership. # ls -lL <certpath> If the owner of the file is not root, this is a finding.
Change the ownership of the file. # chown root <certpath>
Determine the certificate file. Procedure: # grep -i '^tls_cert' /etc/ldap.conf Check the group ownership. Procedure: # ls -lL <certpath> If the group owner of the file is not root, bin, sys, or system, this is a finding.
Change the group ownership of the file. Procedure: # chgrp root <certpath>
Identify the LDAP TLS Certificate file: # cat <ldap_config_file> | grep -i “^tls” TLSCACertificatePath <path> TLSCACertificateFile <filename> TLSCertificateFile <filename> For each TLSCACertificateFile and TLSCertificateFile defined in the configuration file, verify the file permissions: # ls -la <tls_certificate_file> If the mode of the file is more permissive than 0644, this is a finding.
Change the mode of the file: # chmod 0644 <certpath>
Determine the certificate file. # grep -i '^tls_cert' /etc/ldap.conf Check the permissions. # ls -lL <certpath> If the mode of the file contains a '+', an extended ACL is present. This is a finding.
Remove the extended ACL from the certificate file. Procedure: For each certificate file found remove all extended permissions. # setfacl --remove-all <certpath>
Determine the key file. # grep -i '^tls_key' /etc/ldap.conf Check the ownership. # ls -lL <keypath> If the owner of the file is not root, this is a finding.
Change the ownership of the file. # chown root <keypath>
Determine the key file. # grep -i '^tls_key' /etc/ldap.conf Check the group ownership. # ls -lL <keypath> If the group wner of the file is not root, this is a finding.
Change the group ownership of the file. # chgrp root <keypath>
Determine the key file. # grep -i '^tls_key' /etc/ldap.conf Check the permissions. # ls -lL <keypath> If the mode of the file is more permissive than 0600, this is a finding.
Change the mode of the file. # chmod 0600 <keypath>
Determine the key file. # grep -i '^tls_key' /etc/ldap.conf Check the permissions. # ls -lL <keypath> If the mode the file contains a '+', an extended ACL is present. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the key file. Procedure: For each key file found remove all extended permissions. # setfacl --remove-all <keypath>
Check if the autofs service is running. # rcautofs status OR # service autofs status If the service is running, this is a finding.
Stop and disable the autofs service. # rcautofs stop OR # service autofs stop # insserv –r autofs OR # chkconfig autofs off
Determine if the system is using a local firewall. # rcSuSEfirewall2 status If the service is not "running”, this is a finding.
Enable the system's local firewall. # rcSuSEfirewall2 start # insserv SuSEfirewall2_init # insserv SuSEfirewall2_setup
Check the firewall rules for a default deny rule. # iptables --list If there is no default deny rule, this is a finding.
Edit “ /etc/sysconfig/scripts/SuSEfirewall2-custom” and add a default deny rule. Restart the SuSEfirewall2 service # rcSuSEfirewall2 restart
Check the permissions of the file. # ls -lLd /etc/zipl.conf If the mode the file or directory contains a '+', an extended ACL is present. This is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/zipl.conf
Check the ownership of the file. # ls -lLd /etc/zipl.conf If the owner of the file is not root, this is a finding.
Change the ownership of the file. # chown root /etc/zipl.conf
Check the group ownership of the file. # ls -lLd /etc/zipl.conf If the group-owner of the file is not root, bin, sys, or system this is a finding.
Change the group ownership of the file. # chgrp root /etc/zipl.conf
Ensure that the suse-build-key package is installed and the build-key file exists: # rpm –ql suse-build-key # ls –l /usr/lib/rpm/gnupg/suse-build-key.gpg Ensure that the value of the CHECK_SIGNATURES variable is set to “yes” # grep –i check_signature /etc/sysconfig/security If the /usr/lib/rpm/gnupg/suse-build-key.gpg file does not exist or CHECK_SIGNATURES is not set to “yes”, this is a finding.
Install the suse-build-key package from the vendor repository # rpm –Uvh suse-build-key-<current version>.noarch.rpm && SuSEconfig Use the YaST System > “/etc/sysconfig Editor” module to set the value of the CHECK_SIGNATURES variable to “yes”. It can be found by expanding the plus signs for System > Security > PolicyKit
Check for the existence of a cron job called opensuse.org-online_update # find /etc/cron* -name opensuse* If a symlink or executable script is found, this is a finding.
Disable the Automatic Online Update option using YaST. # /sbin/yast2 online_update_configuration Uncheck the “Automatic Online Update” selection. Select “Finish” to exit If /etc/<cron directory>/opensuse.org-online_update still exists, remove it manually rm /etc/<cron directory>/opensuse.org-online_update
Check the permissions of the file. # ls -lLd /etc/security/access.conf If the permissions of the file or directory contains a '+', an extended ACL is present. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/security/access.conf
Check the permissions of the file. # ls -lLd /etc/sysctl.conf If the permissions of the file or directory contains a '+', an extended ACL is present. If the file has an extended ACL and it has not been documented with the IAO, this is a finding.
Remove the extended ACL from the file. # setfacl --remove-all /etc/sysctl.conf
Check for any running routing protocol daemons. If the system is a VM host and acts as a router solely for the benefits of its client systems, then this rule is not applicable. # ps ax | egrep '(ospf|route|bgp|zebra|quagga)' If any routing protocol daemons are listed, this is a finding.
Disable any routing protocol daemons.
Check the group ownership of the audit logs. Procedure: # (audit_log_file=$(grep "^log_file" /etc/audit/auditd.conf|sed s/^[^\/]*//) && if [ -f "${audit_log_file}" ] ; then printf "Log(s) found in "${audit_log_file%/*}":\n"; ls -l ${audit_log_file%/*}; else printf "audit log file(s) not found\n"; fi) If any audit log file is not group-owned by root, bin, sys, or system, this is a finding.
Change the group-ownership of the audit log file(s). Procedure: # chgrp root <audit log file>
FTP to the system. # ftp localhost Check for either of the following login banners based on the character limitations imposed by the system. An exact match is required. If one of these banners is not displayed, this is a finding. If the system does not run the FTP service, this is not applicable. DoD Login Banners: 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. OR I've read & consent to terms in IS user agreem't.
Provide the proper text for the DoD banner to be presented by the FTP server to the user. For vsftp: Examine the /etc/vsftp.conf file for the "banner_file" entry. (ie. banner_file = /etc/banner/vsftp) For gssftp: Examine the /etc/xinetd.d/gssftp file for the "banner" entry. (ie. banner = /etc/banner/gssftp) For both: Add the banner entry if one is not found. Modify or create the referenced banner file to contain one of the following DoD login banners (based on the character limitations imposed by the system). DoD Login Banners: 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. OR I've read & consent to terms in IS user agreem't.
Determine if the /var path is a separate filesystem. # grep "/var " /etc/fstab If no result is returned, /var is not on a separate filesystem this is a finding
Migrate the /var path onto a separate file system.
Determine if the /var/log/audit path is a separate filesystem. # grep "/var/log/audit " /etc/fstab If no result is returned, /var/log/audit is not on a separate filesystem this is a finding.
Migrate the /var/log/audit path onto a separate filesystem.
Determine if the /tmp path is a separate filesystem. # grep "/tmp " /etc/fstab If no result is returned, /tmp is not on a separate filesystem this is a finding.
Migrate the /tmp path onto a separate file system.
# cat /proc/sys/net/ipv4/tcp_max_syn_backlog If the result is not 1280 or greater, this is a finding.
Edit /etc/sysctl.conf and add a setting for "net.ipv4.tcp_max_syn_backlog=1280". Procedure: # echo "net.ipv4.tcp_max_syn_backlog=1280" >> /etc/sysctl.conf # sysctl -p
If the system uses sendmail, locate the sendmail.cf file. Procedure: # find / -name sendmail.cf Determine if sendmail only binds to loopback addresses by examining the “DaemonPortOptions” configuration options. Procedure: # grep -i “O DaemonPortOptions” </path/to/sendmail.cf> If there are uncommented DaemonPortOptions lines, and all such lines specify system loopback addresses, this is not a finding. Otherwise, determine if sendmail is configured to allow open relay operation. Procedure: # find / -name sendmail.mc # grep -i promiscuous_relay </path/to/sendmail.mc> If the promiscuous relay feature is enabled, this is a finding. If the system uses Postfix, locate the main.cf file. Procedure: # find / -name main.cf Determine if Postfix only binds to loopback addresses by examining the “inet_interfaces” line. Procedure: # grep inet_interfaces </path/to/main.cf> If “inet_interfaces” is set to “loopback-only” or contains only loopback addresses such as 127.0.0.1 and [::1], Postfix is not listening on external network interfaces, and this is not a finding. Otherwise, determine if Postfix is configured to restrict clients permitted to relay mail by examining the “smtpd_client_restrictions” line. Procedure: # grep smtpd_client_restrictions </path/to/main.cf> If the “smtpd_client_restrictions” line is missing, or does not contain “reject”, this is a finding. If the line contains “permit” before “reject”, this is a finding. If the system is using other SMTP software, consult the software’s documentation for procedures to verify mail relaying is restricted.
If the system uses sendmail, edit the sendmail.mc file and remove the "promiscuous_relay" configuration. Rebuild the sendmail.cf file from the modified sendmail.mc and restart the service. If the system does not need to receive mail from external hosts, add one or more DaemonPortOptions lines referencing system loopback addresses (such as "O DaemonPortOptions=Addr=127.0.0.1,Port=smtp,Name=MTA") and remove lines containing non-loopback addresses. Restart the service. If the system uses Postfix, edit the main.cf file and add or edit the "smtpd_client_restrictions" line to have contents "permit mynetworks, reject" or a similarly restrictive rule. If the system does not need to receive mail from external hosts, add or edit the "inet_interfaces" line to have contents "loopback-only" or a set of loopback addresses for the system. Restart the service. If the system is using other SMTP software, consult the software's documentation for procedures to restrict mail relaying.
Check the system for the 'ldd' executable. Procedure: # ls -lL /usr/bin/ldd If the file exists and has any execute permissions, this is a finding.
Remove the execute permissions from the 'ldd' executable. Procedure: # chmod a-x /usr/bin/ldd
Check for an ip6tables rule that drops inbound IPv6 ICMP ECHO_REQUESTs sent to the all-hosts multicast address. Procedure: # less /etc/sysconfig/scripts/SuSEfirewall2-custom Check for a rule in, or referenced by, the INPUT chain such as: ip6tables -A INPUT -p icmpv6 -d ff02::1 --icmpv6-type 128 -j DROP If such a rule does not exist, this is a finding.
Add an ip6tables rule that drops inbound IPv6 ICMP ECHO_REQUESTs sent to the all-hosts multicast address. Edit /etc/sysconfig/scripts/SuSEfirewall2-custom and add a rule in, or referenced by, the INPUT chain such as: ip6tables -A INPUT -p icmpv6 -d ff02::1 --icmpv6-type 128 -j DROP Reload the SuSEfirewall2 rules. Procedure: # rcSuSEfirewall2 restart
Verify the system is configured to forward all audit records to a remote server. If the system is not configured to provide this function, this is a finding. Procedure: Ensure the audit option for the kernel is enabled. # cat /proc/cmdline | tr ' ' '\n' | grep -i audit If the kernel does not have the "audit=1" option specified, this is a finding. Ensure the kernel auditing is active. # /sbin/auditctl -s | tr ' ' '\n' | egrep 'enabled|pid' When auditing is active, the “enabled” value is set to 1 and the “pid” value will be greater than 0. If the "enabled" setting is either missing or not set to "1", this is a finding. If the “pid” setting is 0, the audit daemon is not running and this is also a finding. Ensure the syslog plugin is active for the audit dispatch daemon. # grep "active" /etc/audisp/plugins.d/syslog.conf | grep -v "^#" If the "active" setting is either missing or not set to "yes", this is a finding. Ensure all audit records are fowarded to a remote server. # grep "\*.\*" /etc/syslog.conf |grep "@" | grep -v "^#" (for syslog) or: # grep "\*.\*" /etc/rsyslog.conf | grep "@" | grep -v "^#" (for rsyslog) If neither of these lines exist, it is a finding.
Configure the system to send audit records to a remote server. Procedure: These instructions assume a known remote audit server is available to this system. Add ‘audit=1’ to parameters line for the active kernel in the /etc/zipl.conf file. OR Add ‘audit=1’ as a line in the file referenced by the parmfile option for the active kernel in the /etc/zipl.conf file. An update to the boot configuration parameters requires a system restart to activate the change. Edit the "active" line in /etc/audisp/plugins.d/syslog.conf so it shows "active = yes". Modify /etc/rsyslog.conf to contain a line sending all audit records to a remote audit server. The server is specified by placing an "@" before the DNS name or IP address in the line. *.* @<remote audit server> Restart audit and syslog: # rcauditd restart # rcsyslog restart OR # service auditd restart # service syslog restart
Check for the "bindpw" option being used in the "/etc/ldap.conf" file. # grep bindpw /etc/ldap.conf If an uncommented "bindpw" option is returned then a cleartext password is in the file, this is a finding.
Edit the "/etc/ldap.conf" file to use anonymous binding by removing the "bindpw" option.
# chkconfig --list | grep telnet If an entry is returned and any run level is “on” telnet is running. If the telnet daemon is running, this is a finding.
Identify the telnet service running and disable it. Procedure # insserv –r telnetd If telnet is running as an xinetd service, edit the /etc/xinetd.d file and set “disable = yes” and then restart the xinetd service: # rcxinetd restart disable the telnet server: chkconfig telnet off verify the telnet daemon is no longer running: # ps -ef |grep telnet
Verify a system integrity baseline exists. The Advanced Intrusion Detection Environment (AIDE) is included in the distribution of SLES. Other host intrusion detection system (HIDS) software is available but must be checked manually. Procedure: # grep DB /etc/aide.conf If /etc/aide.conf does not exist AIDE has not been installed. Unless another HIDS is used on the system, this is a finding. Examine the response for "database". This indicates the location of the system integrity baseline database used as input to a comparison. # ls -la <DBDIR> If no "database" file as defined in /etc/aide.conf exists, a system integrity baseline has not been created.This is a finding. Examine /etc/aide.conf to ensure some form of cryptographic hash (ie. md5,rmd160,sha256) are used for files. In the default /etc/aide.conf the "NORMAL" or "LSPP" rules which are used for virtually all files DO include some form of cryptographic hash. If the site has defined rules to replace the functionality provided by the default "NORMAL" and "LSPP" rules but DOES NOT include cryptographic hashes, this is a finding. Otherwise, if any element used to define the "NORMAL" and "LSPP" rules has been modified resulting in cryptographic hashes not being used, this is a finding. If any other modification to the default /etc/aide.conf file have been made resulting in rules which do not include cryptographic hashes on appropriate files, this is a finding.
Use AIDE to create a file integrity baseline, including cryptographic hashes, for the system. Configure the /etc/aide.conf file to ensure some form of cryptographic hash (e.g., md5,rmd160,sha256) is used for files. In the default /etc/aide.conf the "NORMAL" or "LSPP" rules which are used for virtually all files DO include some form of cryptographic hash.
Verify a system integrity baseline is maintained. The baseline has been updated to be consistent with the latest approved system configuration changes. The Advanced Intrusion Detection Environment (AIDE) is included in the distribution of SLES. Other host intrusion detection system (HIDS) software is available but must be checked manually. Procedure: # grep DB /etc/aide.conf If /etc/aide.conf does not exist AIDE has not been installed. Unless another HIDS is used on the system, this is a finding. Examine the response for "database". This indicates the location of the system integrity baseline database used as input to a comparison. # ls -la <DB> If no "database" file as defined in /etc/aide.conf exists, a system integrity baseline has not been created. This is a finding. Ask the SA when the last approved system configuration changes occurred. If the modification date of the AIDE database is prior to the last approved configuration change, this is a finding.
Regularly rebuild the integrity baseline, including cryptographic hashes, for the system to be consistent with the latest approved system configuration. Procedure: After an approved modification to the system configuration has been made perform: # aide -u This will update the database.
Check the system for the unnecessary "news" accounts. Procedure: # rpm -q inn If the "inn" is installed the "news" user is necessary and this is not a finding. # grep ^news /etc/passwd If this account exists and "inn" is not installed, this is a finding.
Remove the "news" account from the /etc/passwd file before connecting a system to the network.
Check the system for the unnecessary "gopher" accounts. Procedure: # grep ^gopher /etc/passwd If this account exists, it is a finding.
Remove the "gopher" account from the /etc/passwd file before connecting a system to the network.
Check the system for the unnecessary "ftp" accounts. Procedure: # rpm -q vsftp If the "vsftp" ftp server is installed the "ftp" user is necessary and this is not a finding. # grep ^ftp /etc/passwd If this account exists and no ftp server is installed which requires it, this is a finding.
Remove the "ftp" account from the /etc/passwd file before connecting a system to the network.
Check that auditd is configured to audit failed file access attempts. There must be an audit rule for each of the access syscalls that logs all failed accesses (-F success=0) or there must both an "-F exit=-EPERM" and "-F exit=-EACCES" for each access syscall. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S open" | grep -e "-F success=0" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S open" | grep -e "-F exit=-EPERM" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S open" | grep -e "-F exit=-EACCES" If an "-S open" audit rule with "-F success" does not exist and no separate rules containing "-F exit=-EPERM" and "-F exit=-EACCES" for "open" exist, then this is a finding.
Edit the audit.rules file and add the following line(s) to enable auditing of failed attempts to access files and programs: either: -a exit,always -F arch=<ARCH> -S open -F success=0 or both: -a exit,always -F arch=<ARCH> -S open -F exit=-EPERM -a exit,always -F arch=<ARCH> -S open -F exit=-EACCES Restart the auditd service. # rcauditd restart OR # service auditd restart
Verify auditd is configured to audit failed file access attempts. There must be an audit rule for each of the access syscalls logging all failed accesses (-F success=0) or there must both an "-F exit=-EPERM" and "-F exit=-EACCES" for each access syscall. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S openat" | grep -e "-F success=0" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S openat" | grep -e "-F exit=-EPERM" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S openat" | grep -e "-F exit=-EACCES" If an "-S openat" audit rule with "-F success" does not exist and no separate rules containing "-F exit=-EPERM" and "-F exit=-EACCES" for "openat" exist, then this is a finding.
Edit the audit.rules file and add the following line(s) to enable auditing of failed attempts to access files and programs: either: -a exit,always -F arch=<ARCH> -S openat -F success=0 or both: -a exit,always -F arch=<ARCH> -S openat -F exit=-EPERM -a exit,always -F arch=<ARCH> -S openat -F exit=-EACCES Restart the auditd service. # rcauditd restart OR # service auditd restart
Verify auditd is configured to audit failed file access attempts. There must be an audit rule for each of the access syscalls logging all failed accesses (-F success=0) or there must both an "-F exit=-EPERM" and "-F exit=-EACCES" for each access syscall. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S truncate" | grep -e "-F success=0" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S truncate" | grep -e "-F exit=-EPERM" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S truncate" | grep -e "-F exit=-EACCES" If an "-S truncate" audit rule with "-F success" does not exist and no separate rules containing "-F exit=-EPERM" and "-F exit=-EACCES" for "truncate" exist, then this is a finding.
Edit the audit.rules file and add the following line(s) to enable auditing of failed attempts to access files and programs: either: -a exit,always -F arch=<ARCH> -S truncate -F success=0 or both: -a exit,always -F arch=<ARCH> -S truncate -F exit=-EPERM -a exit,always -F arch=<ARCH> -S truncate -F exit=-EACCES Restart the auditd service. # rcauditd restart OR # service auditd restart
Verify auditd is configured to audit failed file access attempts. There must be an audit rule for each of the access syscalls logging all failed accesses (-F success=0) or there must both an "-F exit=-EPERM" and "-F exit=-EACCES" for each access syscall. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S ftruncate" | grep -e "-F success=0" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S ftruncate" | grep -e "-F exit=-EPERM" # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -e "-S ftruncate" | grep -e "-F exit=-EACCES" If an "-S ftruncate" audit rule with "-F success" does not exist and no separate rules containing "-F exit=-EPERM" and "-F exit=-EACCES" for "ftruncate" exist, then this is a finding.
Edit the audit.rules file and add the following line(s) to enable auditing of failed attempts to access files and programs: either: -a exit,always -F arch=<ARCH> -S ftruncate -F success=0 or both: -a exit,always -F arch=<ARCH> -S ftruncate -F exit=-EPERM -a exit,always -F arch=<ARCH> -S ftruncate -F exit=-EACCES Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system audit configuration to determine if file and directory deletions are audited. # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "rmdir" If no results are returned, or the results do not contain "-S rmdir", this is a finding.
Edit the audit.rules file and add the following line to enable auditing of deletions: -a exit,always -S rmdir Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -i "audit.rules" If no results are returned, or the line does not start with "-w", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Add the following lines to the audit.rules file to enable auditing of administrative, privileged, and security actions: -w /etc/audit/audit.rules Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "adjtimex " If the result does not contain "-S adjtimex", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Add the following lines to the audit.rules file to enable auditing of administrative, privileged, and security actions: -a exit,always -F arch=<ARCH> -S adjtimex Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "settimeofday" If the result does not contain "-S settimeofday", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Add the following lines to the audit.rules file to enable auditing of administrative, privileged, and security actions: -a exit,always -F arch=<ARCH> -S settimeofday Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "clock_settime" If the result does not contain "-S clock_settime", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Add the following lines to the audit.rules file to enable auditing of administrative, privileged, and security actions: -a exit,always -F arch=<ARCH> -S clock_settime Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "sethostname" If the result does not contain "-S sethostname", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Add the following lines to the audit.rules file to enable auditing of administrative, privileged, and security actions: -a exit,always -F arch=<ARCH> -S sethostname Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " setdomainname " If the result does not contain "-S setdomainname ", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Add the following lines to the audit.rules file to enable auditing of administrative, privileged, and security actions: -a exit,always -F arch=<ARCH> -S setdomainname Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "sched_setparam" If the result does not contain "-S sched_setparam", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: A Real Time Operating System (RTOS) provides specialized system scheduling which causes an inordinate number of messages to be produced when the sched_setparam and set_setscheduler are audited. This not only may degrade the system speed to an unusable level but obscures any forensic information which may otherwise have been useful. Unless the operating system is a Red Hat 5 based RTOS (including MRG and AS5300) the following should also be present in /etc/audit/audit.rules -a exit,always -F arch=<ARCH> -S sched_setparam Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the auditing configuration of the system. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "sched_setscheduler" If the result does not contain "-S sched_setscheduler", this is a finding.
The "-F arch=<ARCH>"restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>"restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: A Real Time Operating System (RTOS) provides specialized system scheduling which causes an inordinate number of messages to be produced when the sched_setparam and set_setscheduler are audited. This not only may degrade the system speed to an unusable level but obscures any forensic information which may otherwise have been useful. Unless the operating system is a Red Hat 5 based RTOS (including MRG and AS5300) the following should also be present in /etc/audit/audit.rules -a exit,always -F arch=<ARCH> -S sched_setscheduler Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " fchmod " If "-S fchmod" is not in the result, this is a finding
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S fchmod Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " fchmodat " If "-S fchmodat" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S fchmodat Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " chown " If "-S chown" is not in the result, this is a finding. Additionally, the following rule is required in systems supporting the 32-bit syscall table (such as i686 and x86_64): # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " chown32 " If "-S chown32" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S chown Additionally, the following rule is required in systems supporting the 32-bit syscall table (such as i686 and x86_64): -a exit,always -F arch=<ARCH> -S chown32 Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " fchown " If "-S fchown" is not in the result, this is a finding. Additionally, the following rule is required in systems supporting the 32-bit syscall table (such as i686 and x86_64): # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " fchown32 " If "-S fchown32" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S fchown Additionally, the following rule is required in systems supporting the 32-bit syscall table (such as i686 and x86_64): -a exit,always -F arch=<ARCH> -S fchown32 Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " fchownat " If "-S fchownat" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S fchownat Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " lchown " If "-S lchown" is not in the result, this is a finding. Additionally, the following rule is required in systems supporting the 32-bit syscall table (such as i686 and x86_64): # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " lchown32 " If "-S lchown32" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S lchown Additionally, the following rule is required in systems supporting the 32-bit syscall table (such as i686 and x86_64): -a exit,always -F arch=<ARCH> -S lchown32 Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " setxattr " If "-S setxattr" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S setxattr Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " lsetxattr " If "-S lsetxattr" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S lsetxattr Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " fsetxattr " If "-S fsetxattr" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S fsetxattr Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " removexattr " If "-S removexattr" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S removexattr Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " lremovexattr " If "-S lremovexattr" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S lremovexattr Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the system's audit configuration. Procedure: # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i " fremovexattr " If "-S fremovexattr" is not in the result, this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Edit the audit.rules file and add the following lines to enable auditing of discretionary access control permissions modifications. -a exit,always -F arch=<ARCH> -S fremovexattr Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if the delete_module syscall is audited. # cat /etc/audit/audit.rules | grep -e "-a exit,always" | grep -i "delete_module" If the result does not contain "-S delete_module", this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Configure auditing of the delete_module syscalls. Add the following to the "/etc/audit/audit.rules" file: -a exit,always -S delete_module Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if /sbin/insmod is audited. # cat /etc/audit/audit.rules | grep "/sbin/insmod" If the result does not start with "-w" and contain "-p x", this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Configure auditing of the /sbin/insmod, files. Add the following to the "/etc/audit/audit.rules" file: -w /sbin/insmod -p x Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if the /sbin/modprobe file is audited. # cat /etc/audit/audit.rules | grep "/sbin/modprobe" If the result does not start with "-w" and contain "-p x" ,this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Configure auditing of the /sbin/modprobe file. Add the following to the "/etc/audit/audit.rules" file: -w /sbin/modprobe -p x Restart the auditd service. # rcauditd restart OR # service auditd restart
Determine if the /sbin/rmmod file is audited. # cat /etc/audit/audit.rules | grep "/sbin/rmmod" If the result does not start with "-w" and contain "-p x", this is a finding.
The "-F arch=<ARCH>" restriction is required on dual-architecture systems (such as x86_64). On dual-architecture systems, two separate rules must exist - one for each architecture supported. Use the generic architectures "b32" and "b64" for specifying these rules. On single architecture systems, the "-F arch=<ARCH>" restriction may be omitted, but if present must match either the architecture of the system or its corresponding generic architecture. The architecture of the system may be determined by running "uname -m". See the auditctl(8) manpage for additional details. Any restrictions (such as with "-F") beyond those provided in the example rules are not in strict compliance with this requirement, and are a finding unless justified and documented appropriately. The use of audit keys consistent with the provided example is encouraged to provide for uniform audit logs, however omitting the audit key or using an alternate audit key is not a finding. Procedure: Configure auditing of the /sbin/rmmod file. Add the following to the "/etc/audit/audit.rules" file: -w /sbin/rmmod -p x Restart the auditd service. # rcauditd restart OR # service auditd restart
Check the mode of scripts in cron job directories. ls -lL /etc/cron.{d,daily,hourly,monthly,weekly} If any cron script has a mode more permissive than 0700, this is a finding.
Change the mode of the cron scripts. # chmod go-rwx /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/* /etc/cron.weekly/*
Check the system for the unnecessary "games" accounts. Procedure: # grep ^games /etc/passwd If this account exists, it is a finding.
Remove the "games" account from the /etc/passwd file before connecting a system to the network.
Verify that common-{account,auth,password,session} settings are being applied. Procedure: Verify that local customization has occurred in the common-{account,auth,password,session}-pc file(s) by some method other than the use of the pam-config utility. The files "/etc/pam.d/common-{account,auth,password,session} -pc " are autogenerated by "pam-config". Any manual changes made to them will be lost the next time "pam-config" is run. Check to see if the system default for any of the symlinks pointing to the "/etc/pam.d/common-{account,auth,password,session} -pc" files have been changed. # ls -l /etc/pam.d/common-{account,auth,password,session} If the symlinks point to "/etc/pam.d/common-{account,auth,password,session}-pc" and manual updates have been made in these files, the updates can not be protected. This is a finding.
In the default distribution of SLES 11 "/etc/pam.d/common-{account,auth,password,session}" are symlinks to their respective "/etc/pam.d/common-{account,auth,password,session}-pc" files. These common-{account,auth,password,session}-pc files are autogenerated by the pam-config utility. When a site adds password requirements(for example), a new /etc/pam.d/common-password-local file must be created with only the additional requirements and an include for "common-password-pc". Then the symlink "/etc/pam.d/common-password" is modified to point to "/etc/pam.d/common-password-local". This way any changes made do not get lost when "/etc/pam.d/common-password-pc" is regenerated and each program's pam.d definition file need only have "include common-password" to assure the password requirements will be applied to it. Use the same technique for any of the common-{account,auth,password,session}-pc files that require local customization.
Check /etc/rsyslog.conf ownership: # ls –lL /etc/rsyslog* If any rsyslog configuration file is not owned by root, this is a finding.
Use the chown command to set the owner to root. # chown root <rsyslog configuration file>
Check /etc/rsyslog.conf group ownership. Procedure: # ls -lL /etc/rsyslog* If any rsyslog.conf file is not group owned by root, sys, bin, or system, this is a finding.
Change the group-owner of the /etc/rsyslog.conf file to root, bin, sys, or system. Procedure: # chgrp root <rsyslog configuration file>
This is N/A for systems that do not have wireless network adapters. Verify that there are no wireless interfaces configured on the system: # ifconfig -a eth0 Link encap:Ethernet HWaddr b8:ac:6f:65:31:e5 inet addr:192.168.2.100 Bcast:192.168.2.255 Mask:255.255.255.0 inet6 addr: fe80::baac:6fff:fe65:31e5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2697529 errors:0 dropped:0 overruns:0 frame:0 TX packets:2630541 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2159382827 (2.0 GiB) TX bytes:1389552776 (1.2 GiB) Interrupt:17 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:2849 errors:0 dropped:0 overruns:0 frame:0 TX packets:2849 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2778290 (2.6 MiB) TX bytes:2778290 (2.6 MiB) If a wireless interface is configured, it must be documented and approved by the local Authorizing Official. If a wireless interface is configured and has not been documented and approved, this is a finding.
Configure the system to disable all wireless network interfaces.