Alternative is to use a client PowerSC (apply the right security level)
% pscxpert -f /etc/security/aixpert/custom/CISv1.xml CIS Security Benchmark for AIX 7.1 % pscxpert -f /etc/security/aixpert/custom/CISv2_Lev1.xml CIS Security Benchmark for AIX 7.2 % pscxpert -f /etc/security/aixpert/custom/CISv2_Lev2.xml CIS Security Benchmark for AIX 7.2 % pscxpert -f /etc/security/aixpert/custom/GDPRv1.xml General Data Protection Regulation (GDPR)
This script 'll only list if compliant or not
root@aix /root# cat scripts/cis.sh
#!/usr/bin/ksh93 #@(#) Check security # This script doesn't modify something to your system, just list what is right and wrong # Print in red all commands to modify your settings # Print in green all parameters that need no change, following by Pass # Version 1.0 06-2023 EIF (compliance CIS for AIX) # Version 1.1 08-2024 EIF (compliance CIS for AIX) dir=`dirname $0` if [ -f $dir/.env ] then . $dir/.env else path_script=$dir export sn=`basename $0 | cut -d. -f1` export logpath=/tmp export logname=$logpath/$sn.log fi DATE=$(date "+%Y%m%d%H%M%S") LINUX_SED=/opt/freeware/bin/sed LINUX_STAT=/opt/freeware/bin/stat LINUX_SORT=/opt/freeware/bin/sort MONTH=$(date '+%m') DAY=$(date '+%d') HEADER="$(date '+%H:%M:%S');$(hostname -s);NA;NA;1.0.0;#scap_org.cisecurity_comp_1.0.0_CIS_IBM_AIX_7_2_Benchmark-xccdf;CIS AIX;NA;Level 1 - Server;Level_1_-_Server;rule" FOOTER=";" cisoutput=$(echo "$logpath/$(hostname -s)-CIS_AIX_7_Benchmark-$(date '+%Y%m%dT%H%M%SZ').csv") list_files=$logpath/list_files.txt outputcis=$logpath/CIS_AIX7.2_v1.0.0 output=$logname prefix=sec_files_out_ outputdir=$logpath/${prefix}${DATE} mkdir $outputdir tempo=$logpath/tmp_cis # Result RESP_OK='Pass' RESP_NOK='Fail' RESP_MANUAL='Manual' RESP_UNKN='Unknown' # Cleanup find $logpath -type d -name "${prefix}*" -ctime +5 -exec rm -r {} \; 2>/dev/null #----------------------------------------- print_output() { # args header=$1 ruleno=$2 descr=$(echo "$3") result=$4 echo "$ruleno;$descr;$result" | sed 's/\|/\ /g' } #----------------------------------------- check_section_2_1() { # args head=h1 rule="2.1" desc="Collect system configuration regularly" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') file1=/var/log/syslog/inventory.log val=0 val1=$(ls $file1 > /dev/null 2>&1; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=$RESP_NOK val1=$(cat /etc/syslog.conf | grep "local1.info" | grep -q "$file1"; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=$RESP_NOK val1=$(cat /etc/syslog.conf | sed '/^$/d' | grep -v '^#' | grep "^local1.info" | awk '{print $2}' | grep -q "\@"; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=$RESP_NOK val1=$(crontab -l | grep -v '^#' | grep "lsconf" | grep -q "logger"; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=$RESP_NOK else res=$RESP_OK fi fi fi else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_2_7() { # args head=h1 rule="2.7" desc="Remove Unused Symbolic Links" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') find -L / \( -fstype jfs -o -fstype jfs2 \) -type l -ls 2>/dev/null | cut -d'/' -f2- | sed 's/^/\//' | sed 's/\->/;/' | sed 's/\ ;/;/' | sed 's/;\ /;/' > $tempo.1 cat /dev/null > $tempo for line in $(cat $tempo.1 | sed 's/\ /|/g') do word1=$(echo $line | cut -d';' -f1 | sed 's/\|/\ /g') word2=$(echo $line | cut -d';' -f2 | sed 's/\|/\ /g') val=$(echo $word2 | grep -c '^/') if [[ "$val" -eq "1" ]] then if [ ! -e $word2 ] then echo $word1 >> $tempo fi else dir1=$(echo $word1 | rev | cut -d'/' -f2- | rev) word3=$(echo "$dir1/$word2") if [ ! -e $word3 ] then echo $word1 >> $tempo fi fi done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi cp $tempo /tmp/link.txt print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_3() { # args head=h1 rule="3.3" desc="Ensure default user umask is 027 or more restrictive" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a umask | grep -q 'umask=27';echo $?) if [ "$val" != "0" ] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_4() { # args head=h1 rule="3.4" desc="Remove group write permission from default groups - exceptions must be in TSD and audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type f -perm -g+w -ls | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=$RESP_OK else res=$RESP_MANUAL echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_5() { # args head=h1 rule="3.5" desc="Application Data with requirement for world writable directories" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type d -perm -o+w ! -perm -1000 -ls | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=$RESP_OK else res=$RESP_MANUAL echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_6() { # args head=h1 rule="3.6" desc="Ensure there are no world writable files - exceptions must be in TSD and audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type f -perm -o+w | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=$RESP_OK else res=$RESP_MANUAL echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_7() { # args head=h1 rule="3.7" desc="Ensure there are no 'staff' writable files - exceptions must be in TSD and audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type f -perm -g+w -group staff | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=$RESP_OK else res=$RESP_MANUAL echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_8() { # args head=h1 rule="3.8" desc="Ensure all files and directories are owned by a user (uid) and assigned to a group (gid)" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) \( -type d -o -type f \) \( -nouser -o -nogroup \) -ls | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=$RESP_OK else res=$RESP_NOK echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_1_3_1() { # args head=h1 rule="4.1.3.1" desc="autoconf6" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cat /etc/rc.tcpip | grep '^start ' | grep -q "autoconf6";echo $?) if [ "$val" -eq "0" ] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_1_3_2() { # args head=h1 rule="4.1.3.2" desc="ndpd-host" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cat /etc/rc.tcpip | grep '^start ' | grep -q "ndpd-host";echo $?) if [ "$val" -eq "0" ] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_1_3_3() { # args head=h1 rule="4.1.3.3" desc="ndpd-router" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cat /etc/rc.tcpip | grep '^start ' | grep -q "ndpd-router";echo $?) if [ "$val" -eq "0" ] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_2_18() { # args head=h1 rule="4.2.18" desc="ip6forwarding" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(no -o ip6forwarding | sed 's/\ //g' | grep -q 'ip6forwarding=0'; echo $?) if [ "$val" -eq "0" ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_3_1() { # args head=h1 rule="4.3.1" desc="Ensure that IP Security is available" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lsdev -Cc ipsec 2>/dev/null | grep Available | wc -l | awk '{print $1}') if [ "$val" == "2" ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_3_2() { # args head=h1 rule="4.3.2" desc="Ensure loopback traffic is blocked on external interfaces" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val1=$(lsfilt -v 4 -O 2>/dev/null | grep 127.0.0.0 | wc -l | awk '{print $1}') val2=$(lsfilt -v 6 -O 2>/dev/null | grep ::1 | wc -l | awk '{print $1}') (( val = val1 + val2 )) if [ "$val" == "2" ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_3_3() { # args head=h1 rule="4.3.3" desc="Ensure that IPsec filters are active" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val1=$(lsfilt -v4 -O -a 2>/dev/null | grep -q inactive | awk '{print $1}') val2=$(lsfilt -v6 -O -a 2>/dev/null | grep -q inactive | awk '{print $1}') (( val = val1 + val2 )) if [ "$val" == "0" ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_1_7() { # args head=h1 rule="4.5.1.7" desc="CDE - screensaver lock" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /etc/dt/config/*/sys.resources ] then val=$(egrep "dtsession\*saverTimeout:|dtsession\*lockTimeout:" /etc/dt/config/*/sys.resources | rev | cut -d' ' -f1 | rev | awk '{print $1}' | sort -u) if [ "$val" == "10" ] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_2_1() { # args head=h1 rule="4.5.2.1" desc="FTPD: Disable root access to ftpd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep -q "root" /etc/ftpusers 2>/dev/null; echo $?) if [ "$val" -ne "0" ] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_2_2() { # args head=h1 rule="4.5.2.2" desc="FTPD: Display acceptable usage policy during login" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') # If ftp is disable, doesn't check val=$(grep -c "^ftp[[:blank:]]" /etc/inetd.conf) if [[ $val -gt 0 ]] then val=$(lslpp -Lc | grep "bos.msg.en_US.net.tcp.client" | wc -l | awk '{print $1}') if [ "$val" == "0" ] then res=$RESP_NOK else if [ `lslpp -L "bos.msg.en_US.net.tcp.client" >/dev/null && print $(dspcat /usr/lib/nls/msg/en_US/ftpd.cat 1 9) | grep -q "Authorized"; echo $?` -ne "0" ] then res=$RESP_NOK else res=$RESP_OK fi fi else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_2_3() { # args head=h1 rule="4.5.2.3" desc="FTPD: Prevent world access and group write to files" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') # If ftp is disable, doesn't check val=$(grep -c "^ftp[[:blank:]]" /etc/inetd.conf) if [[ $val -gt 0 ]] then val=$(grep "^ftp[[:blank:]]" /etc/inetd.conf |awk '{print $6, $7, $8, $9, $10}' | grep -c "027") if [ "$val" == "1" ] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_1() { # args head=h1 rule="4.5.3.1" desc="OpenSSH: Minimum version is 8.1" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val1=$(sshd -i </dev/null | cut -d'_' -f 2) val=$(echo "$val1 8.1" | awk '{print ($1 >= $2)}') if [[ "$val" -eq "1" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_4() { # args head=h1 rule="4.5.3.4" desc="sshd_config: Restrict users and groups allowed access via OpenSSH" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(/usr/bin/egrep -c "^(AllowUsers|AllowGroups|DenyUsers|DenyGroups)[[:blank:]]" /etc/ssh/sshd_config) if [[ "$val" -gt "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_5() { # args head=h1 rule="4.5.3.5" desc="sshd_config: PermitRootLogin is 'prohibit-password' or 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(/usr/bin/egrep "^PermitRootLogin" /etc/ssh/sshd_config | cut -d' ' -f2- | egrep -c "prohibit-password|no|forced-commands-only") if [[ "$val" -eq "0" ]] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_6() { # args head=h1 rule="4.5.3.6" desc="sshd_config: Banner exists and message contains 'Only authorized users allowed'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^Banner[[:blank:]]" /etc/ssh/sshd_config | grep -c '/etc/ssh/ssh_banner') if [ "$val" == "1" ] then val=$(grep -c 'Unauthorized' /etc/ssh/ssh_banner) if [ "$val" == "1" ] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_7() { # args head=h1 rule="4.5.3.7" desc="sshd_config: HostbasedAuthentication is 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^HostbasedAuthentication[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "no" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_8() { # args head=h1 rule="4.5.3.8" desc="sshd_config: IgnoreRhosts is 'yes' or 'shosts-only'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^IgnoreRhosts[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "yes" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_9() { # args head=h1 rule="4.5.3.9" desc="sshd_config: PermitEmptyPasswords is 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^PermitEmptyPasswords[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "no" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_10() { # args head=h1 rule="4.5.3.10" desc="sshd_config: LogLevel is 'INFO' or 'VERBOSE'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^LogLevel[[:blank:]]" /etc/ssh/sshd_config | egrep -c "INFO|VERBOSE") if [[ "$val" -eq "0" ]] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_11() { # args head=h1 rule="4.5.3.11" desc="sshd_config: sftp-server arguments include '-u 027 -f AUTH -l INFO'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cat /etc/ssh/sshd_config | tr '\t' ' ' | tr -s ' ' | grep "^Subsystem[[:blank:]]sftp" | grep sftp-server | grep -c "027") if [[ "$val" -eq "0" ]] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_12() { # args head=h1 rule="4.5.3.12" desc="sshd_config: MaxAuthTries is '4'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(sshd -T | grep maxauthtries | rev | awk '{print $1}' | rev) if [ "$val" -gt "4" ] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_13() { # args head=h1 rule="4.5.3.13" desc="sshd_config: PermitUserEnvironment is 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^PermitUserEnvironment[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "no" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_14() { # args head=h1 rule="4.5.3.14" desc="sshd_config: Use Conditional exception(s)." res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(/usr/bin/egrep -cp "^Match " /etc/ssh/sshd_config) if [[ "$val" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_15() { # args head=h1 rule="4.5.3.15" desc="sshd_config, ssh_config: KexAlgorithms" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep '^kexalgorithms' | tr ',' '\n' | egrep -c "diffie-hellman-group1-sha1|diffie-hellman-group14-sha1|diffie-hellman-group-exchange-sha1") if [[ "$val" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_16() { # args head=h1 rule="4.5.3.16" desc="sshd_config, ssh_config: Ciphers" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') cat > $tempo << EOF aes128-ctr,aes192-ctr,aes256-ctr,chacha20-poly1305@openssh.com,aes128-gcm@openssh.com,aes256-gcm@openssh.com EOF cat $tempo | tr ',' '\n' | sort -u > $tempo.1 sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep ciphers | cut -d' ' -f2- | tr ',' '\n' | sort -u > $tempo val=$(sdiff -sw 80 $tempo $tempo.1 | wc -l | awk '{print $1}') if [[ "$val" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_17() { # args head=h1 rule="4.5.3.17" desc="sshd_config, ssh_config: MACs - Message Authtification Codes" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') # List of Weak algorithms cat > $tempo << EOF hmac-md5,hmac-md5-96,hmac-ripemd160,hmac-sha1,hmac-sha1-96,umac-64@openssh.com,umac-128@openssh.com,hmac-md5-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha1-96-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com EOF cat $tempo | tr ',' '\n' | sort -u > $tempo.1 sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep macs | cut -d' ' -f2- | tr ',' ' \n' | sort -u | sed 's/$/;/g' > $tempo val=0 for mac in $(cat $tempo.1) do val1=$(grep -c "^${mac};" $tempo) (( val = val + val1 )) done if [[ "$val" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_18() { # args head=h1 rule="4.5.3.18" desc="sshd_config, ssh_config: ReKeyLimit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep rekeylimit | cut -d' ' -f2- | tr -s ' ' | tr ' ' '\n' | sort -u | tail -1) if [[ "$val" != "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_6_5() { # args head=h1 rule="4.6.5" desc="Unattended terminal session timeout is 900 seconds (or less)" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(echo `egrep -c "TMOUT|TIMEOUT" /etc/profile` `readonly | /usr/bin/egrep -c -e "TMOUT|TIMEOUT"` | tr ' ' '\n' | sed '/^$/d' | sort | tail -1) if [[ "$val" -gt "2" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_1() { # args head=h1 rule="4.7.1.1" desc="Home directory must exist" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=0 for home in $(lsuser -R files -a home ALL | awk '{print $2}' | sed 's/home=//' | sort -u) do val1=$(ls -d $home > /dev/null 2>&1; echo $?) (( val = val + val1 )) done if [[ "$val" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_2() { # args head=h1 rule="4.7.1.2" desc="Home directory must be owned by account, or special account" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -R files -a id home account_locked ALL | while read name ids homes locks rest do uid=$(echo ${ids} | cut -f2 -d =) home=$(echo ${homes} | cut -f2 -d =) locked=$(echo ${locks} | cut -f2 -d =) if [[ ${home} == "/dev/null" || ${locked} == "true" ]]; then continue elif [[ ! -d ${home} ]]; then /usr/bin/printf "%-32s does not exist; Recommend Lock Account [%s]\n" ${home} ${name} continue else /usr/bin/perl -e '$user=$ARGV[0]; $hd=$ARGV[1]; $uid=$ARGV[2]; $huid=((stat $hd)[4]); if ($huid != $uid && $huid != 0) { exit(1); # triggers command after OR (||) }' ${name} ${home} ${uid} || \ /usr/bin/printf "Recommend Lock Account: %s does not own %s\n" ${name} ${home} fi done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_3() { # args head=h1 rule="4.7.1.3" desc="Home directory: write access restricted to 'owner'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -R files -a id home ALL | while read name ids homes rest do uid_check=$(echo ${ids} | cut -f2 -d =) if [[ ${uid_check} -ge 200 ]] then home=$(echo ${homes} | cut -f2 -d =) if [[ ${home} == "/dev/null" ]] then continue else if [[ ! -d ${home} ]] then /usr/bin/printf "%-32s does not exist; recommend to lock account named [%s]\n" ${home} ${name} else if [[ ${home} != "/" && ${home} != "/dev/null" ]] then /usr/bin/perl -e '$f=$ARGV[0]; $m=(stat $f)[2]; \ printf("Recommend chmod on: %s: to remove group or world write mode\n", $f) if $m & 022; \ printf("Recommend remove ACL on: %s\n ", $f) if $m & 0200000000; \ exit($m & 0200000022)' ${home} || (ls -led ${home} && (aclget ${home} | grep -ip Enabled)) fi fi fi fi done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_4() { # args head=h1 rule="4.7.1.4" desc="AUDIT subsystem: /audit and /etc/security/audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /audit ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /audit) if [[ "$val" == "root:audit:2750:/audit:" ]] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/security/audit) if [[ "$val" == "root:audit:2750:/etc/security/audit:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_5() { # args head=h1 rule="4.7.1.5" desc="SECURITY Subsystems: /etc/security" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') EXCLUDE="security/(aixpert|audit|ice)" find /etc/security -type d | \ /usr/bin/egrep -v ${EXCLUDE} | \ /usr/bin/sort | xargs ls -led | \ /usr/bin/awk '{print $1 " " $3 " " $4 " " $9}' | \ /usr/bin/grep -v drwxr-s---- > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_6() { # args head=h1 rule="4.7.1.6" desc="/var/adm/ras" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%F:%a:%n:" /var/adm/ras/* | grep -v '^directory:' | cut -d':' -f2- | cut -c3- | grep -c -v '^0:') if [[ "$val" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_7() { # args head=h1 rule="4.7.1.7" desc="/var/adm/sa" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/sa) if [[ "$val" == "adm:adm:755:/var/adm/sa:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_8() { # args head=h1 rule="4.7.1.8" desc="/var/spool/cron/crontabs" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/spool/cron/crontabs) if [[ "$val" == "root:cron:770:/var/spool/cron/crontabs:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_9() { # args head=h1 rule="4.7.1.9" desc="Ensure all directories in root PATH deny write access to all" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') echo "/:${PATH}" | tr ':' '\n' | grep "^/" | sort -u | while read DIR do DIR=${DIR:-$(pwd)} while [[ -d ${DIR} ]] do [[ "$(ls -ld ${DIR})" = @(d???????w? *) ]] && print " WARNING ${DIR} is world writable" [[ "$(ls -ld ${DIR})" = @(d????w???? *) ]] && print " WARNING ${DIR} is group writable" [[ "$(ls -ld ${DIR} |awk '{print $3}')" != @(root|bin) ]] && print " WARNING ${DIR} is not owned by root or bin" DIR=${DIR%/*} done done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_10() { # args head=h1 rule="4.7.1.10" desc="Ensure root user has a dedicated home directory" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lsuser -a home root | awk '{print $2}') if [[ "$val" == "home=/root" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_11() { # args head=h1 rule="4.7.1.11" desc="/etc/security/audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/security/audit) if [[ "$val" == "root:audit:750:/etc/security/audit:" || "$val" == "root:audit:2750:/etc/security/audit:" ]] then val=$($LINUX_STAT -c "%a:%n:" /etc/security/audit/* | grep -c -v '^640:') if [[ "$val" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_2() { # args head=h1 rule="4.7.2.2" desc="Verify Trust of suid, sgid, acl, and trusted-bit files and programs" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') find / \( -fstype jfs -o -fstype jfs2 \) \( -perm -04000 -o -perm -02000 \) -type f -ls > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_MANUAL fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_3() { # args head=h1 rule="4.7.2.3" desc="crontab entries - owned by userid" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') crontab -l |egrep -v '^#' |awk '{print $6}' |grep "^/" |sort -u | while read DIR do DIR=${DIR:-$(pwd)} while [[ -a ${DIR} ]] do [[ "$(ls -ld ${DIR})" = @(????????w? *) ]] && print " WARNING ${DIR} is world writable" [[ "$(ls -ld ${DIR})" = @(?????w???? *) ]] && print " WARNING ${DIR} is group writable" [[ "$(ls -ld ${DIR} |awk '{print $3}')" != @(root|bin) ]] && print " WARNING ${DIR} is not owned by root or bin" DIR=${DIR%/*} done done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_4() { # args head=h1 rule="4.7.2.4" desc="Home directory configuration files" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -R files -a home ALL | cut -f2 -d= | egrep -v "^/$|/etc|/bin|/var|/usr|/usr/sys" |while read homedir do if [[ -d ${homedir} ]] then #echo "Listing all user confguration files in '${homedir}'" ls -a ${homedir} | egrep "^\.[a-z]" | while read file do if [[ -f "${homedir}/${file}" ]] then val=$(ls -l "${homedir}/${file}" | cut -c5- | awk '{print $1}' | grep -c w) if [[ "$val" -ne "0" ]] then echo "${homedir}/${file} write permissions g or o" fi fi done else echo "ERROR - no home directory for '${homedir}'" fi done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_5() { # args head=h1 rule="4.7.2.5" desc="/smit.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') file1=$(lsuser -a home root | awk '{print $2}' | sed 's/home=//' | sed 's/$/\/smit.log/') val=$($LINUX_STAT -c "%U:%G:%a:%n:" $file1) if [[ "$val" == "root:system:640:$file1:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_6() { # args head=h1 rule="4.7.2.6" desc="/etc/group" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/group) if [[ "$val" == "root:security:644:/etc/group:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_7() { # args head=h1 rule="4.7.2.7" desc="/etc/inetd.conf" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/inetd.conf) if [[ "$val" == "root:system:644:/etc/inetd.conf:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_8() { # args head=h1 rule="4.7.2.8" desc="/etc/motd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/motd) if [[ "$val" == "bin:bin:644:/etc/motd:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_9() { # args head=h1 rule="4.7.2.9" desc="/etc/passwd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/passwd) if [[ "$val" == "root:security:644:/etc/passwd:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_10() { # args head=h1 rule="4.7.2.10" desc="/etc/ssh/ssh_config" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/ssh/ssh_config) if [[ "$val" == "root:system:644:/etc/ssh/ssh_config:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_11() { # args head=h1 rule="4.7.2.11" desc="/etc/ssh/sshd_config" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/ssh/sshd_config) if [[ "$val" == "root:system:644:/etc/ssh/sshd_config:" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_12() { # args head=h1 rule="4.7.2.12" desc="/var/adm/cron/at.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /var/adm/cron/at.allow ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/cron/at.allow) if [[ "$val" == "root:sys:400:/var/adm/cron/at.allow:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_13() { # args head=h1 rule="4.7.2.13" desc="/var/adm/cron/cron.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /var/adm/cron/cron.allow ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/cron/cron.allow) if [[ "$val" == "root:sys:400:/var/adm/cron/cron.allow:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_14() { # args head=h1 rule="4.7.2.14" desc="/var/ct/RMstart.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/ct/RMstart.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/ct/RMstart.log) if [[ "$val" == "root:system:640:/var/ct/RMstart.log:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_15() { # args head=h1 rule="4.7.2.15" desc="/var/adm/cron/log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/adm/cron/log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/cron/log) if [[ "$val" == "bin:cron:660:/var/adm/cron/log:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_16() { # args head=h1 rule="4.7.2.16" desc="/var/tmp/dpid2.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/tmp/dpid2.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/tmp/dpid2.log) if [[ "$val" == "root:system:640:/var/tmp/dpid2.log:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_17() { # args head=h1 rule="4.7.2.17" desc="/var/tmp/hostmibd.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/tmp/hostmibd.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/tmp/hostmibd.log) if [[ "$val" == "root:system:640:/var/tmp/hostmibd.log:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_18() { # args head=h1 rule="4.7.2.18" desc="/var/tmp/snmpd.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/tmp/snmpd.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/tmp/snmpd.log) if [[ "$val" == "root:system:640:/var/tmp/snmpd.log:" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_9() { # args head=h1 rule="4.9" desc="Ensure root access is controlled" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -a login rlogin su sugroups root | tr '=' ' ' | read user a1 login a2 rlogin a3 su a4 sugroups [[ ${su} != "false" && ${sugroups} == "ALL" ]] && echo "failed : ${a3}==${su}, ${a4}==${sugroups}" > $tempo [[ ${login} == "true" || ${rlogin} == "true" ]] && echo "failed : ${a1}==${login}, ${a2}==${rlogin}" >> $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_10() { # args head=h1 rule="4.10" desc="Disable core dumps" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') rc1=$(lssec -f /etc/security/limits -s default -a core -a core_hard | sed 's/\ /;/g' | sed 's/$/;/' | grep -q 'default;core=0;core_hard=0;'; echo $?) rc2=$(lsattr -El sys0 -a fullcore | sed 's/\ /;/g' | sed 's/$/;/' | grep -q 'fullcore;false;Enable;full;CORE;dump;True;'; echo $?) (( rc = rc1 + rc2 )) if [[ "$rc" == "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_11() { # args head=h1 rule="4.11" desc="Remove current working directory from default /etc/environment PATH" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^PATH=" /etc/environment |awk '/((:[ \t]*:)|(:[ \t]*$)|(^[\t]*:)|(^.:)|(:.$)|(:.:))/') if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_12() { # args head=h1 rule="4.12" desc="Lock historical users" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') ACCOUNTS=daemon,bin,sys,adm,uucp,nobody,lpd,lp,invscout,ipsec,nuucp,sshd for usr in $(echo $ACCOUNTS | sed 's/,/\ /g') do lsuser -a account_locked $usr 2>/dev/null done | grep -v 'account_locked=true' > $tempo if [ -s $tempo ] then res=$RESP_NOK else res=$RESP_OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_13() { # args head=h1 rule="4.13" desc="Remove current working directory from root's PATH" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(su - root -c "echo ${PATH}" |awk '/((:[ \t]*:)|(:[ \t]*$)|(^[\t]*:)|(^.:)|(:.$)|(:.:))/') if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_14() { # args head=h1 rule="4.14" desc="Configuration: /etc/motd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') res="TODO" if [ -e /audit ] then val=$(cat /etc/motd | grep -c 'PROPER AUTHORIZATION') if [[ "$val" == "1" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_1_1() { # args head=h1 rule="5.1.1.1" desc="histexpire" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a histexpire | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;histexpire=52;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_1_2() { # args head=h1 rule="5.1.1.2" desc="histsize" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a histsize | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;histsize=0;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_1_3() { # args head=h1 rule="5.1.1.3" desc="minage" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minage | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minage=1;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_2() { # args head=h1 rule="5.1.2" desc="All accounts must have a hashed password" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') egrep -p "password = +$" /etc/security/passwd | grep ":" | awk -F: '{ print $1 } ' | while read user rest do print "Locking account ${user} due to blank password" done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_3() { # args head=h1 rule="5.1.3" desc="All usernames and UIDs must be unique" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cut -d: -f 3 /etc/passwd | sort -n | uniq -d;cut -d: -f 1 /etc/passwd | sort | uniq -d) if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_4() { # args head=h1 rule="5.1.4" desc="All group names and GIDs must be unique" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cut -d: -f 3 /etc/group | sort -n | uniq -d;cut -d: -f 1 /etc/group | sort | uniq -d) if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_5() { # args head=h1 rule="5.1.5" desc="Establish and Maintain an Inventory of Administrator accounts" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val="" lsuser -R files -a admin ALL | grep 'admin=true' | sed 's/\ /;/g' | cut -d';' -f1 | sort > $tempo echo "adm,bin,daemon,invscout,ipsec,lp,lpd,nobody,nuucp,root,smmsp,snapp,sshd,sys,uucp" | tr ',' '\n' | sort > $tempo.1 val=$(sdiff -s $tempo $tempo.1 | grep '<' | awk '{print $1}' | tr '\n' ',' | sed 's/,//g') if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_MANUAL fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_6() { # args head=h1 rule="5.1.6" desc="Establish and Maintain an Inventory of User Accounts" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lsuser -R files -a admin ALL | grep 'admin=false' | awk '{print $1}' | sort | tr '\n' ',' | sed 's/,$//') res=$RESP_MANUAL print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_1() { # args head=h1 rule="5.2.1" desc="Ensure new passwords are controlled by password attributes (disable NOCHECK)" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep NOCHECK /etc/security/passwd) if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_2() { # args head=h1 rule="5.2.2" desc="pwd_algorithm" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/login.cfg -s usw -a pwd_algorithm | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "usw;pwd_algorithm=ssha512;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_3() { # args head=h1 rule="5.2.3" desc="Ensure passwords are not hashed using 'crypt'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') grep 'password[[:blank:]]= .............$' /etc/security/passwd | while read pass equals cryptedhash do user=$(grep -p $cryptedhash /etc/security/passwd | egrep '[a-zA-z0-9]+:$' | sed -e s/:$//) print ${user}: needs to update passwd done > $tempo if [ ! -s $tempo ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_4() { # args head=h1 rule="5.2.4" desc="Ensure password policy is enforced for all users" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep NOCHECK /etc/security/passwd) if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_5() { # args head=h1 rule="5.2.5" desc="minlen" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minlen | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minlen=14;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_6() { # args head=h1 rule="5.2.6" desc="mindiff" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a mindiff | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;mindiff=4;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_7() { # args head=h1 rule="5.2.7" desc="minalpha" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minalpha | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minalpha=3;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_8() { # args head=h1 rule="5.2.8" desc="minother" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minother | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minother=3;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_9() { # args head=h1 rule="5.2.9" desc="maxrepeats" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a maxrepeats | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;maxrepeats=4;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_10() { # args head=h1 rule="5.2.10" desc="mindigit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a mindigit | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;mindigit=1;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_11() { # args head=h1 rule="5.2.11" desc="minloweralpha" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minloweralpha | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minloweralpha=1;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_12() { # args head=h1 rule="5.2.12" desc="minupperalpha" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minupperalpha | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minupperalpha=1;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_13() { # args head=h1 rule="5.2.13" desc="minspecialchar" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minspecialchar | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minspecialchar=1;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_1() { # args head=h1 rule="5.3.1" desc="adm" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=adm val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_2() { # args head=h1 rule="5.3.2" desc="bin" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=bin val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_3() { # args head=h1 rule="5.3.3" desc="daemon" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=daemon val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_4() { # args head=h1 rule="5.3.4" desc="guest" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=guest val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_5() { # args head=h1 rule="5.3.5" desc="lpd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=ldp val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_6() { # args head=h1 rule="5.3.6" desc="nobody" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=nobody val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_7() { # args head=h1 rule="5.3.7" desc="nuucp" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=nuucp val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_8() { # args head=h1 rule="5.3.8" desc="sys" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=sys val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_9() { # args head=h1 rule="5.3.9" desc="uucp" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=uucp val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_10() { # args head=h1 rule="5.3.10" desc="Ensure System Accounts cannot access system using ftp." res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssrc -ls inetd | grep -c ftpd) if [[ "$val" -eq "0" ]] then res=$RESP_OK else if [ -e /etc/ftpusers ] then rc=0 lsuser -R files -a id ALL | sed 's/id=//' | while read usr uid do if [[ "$uid" -lt "200" ]] then rc1=$(cat /etc/ftpusers | sed 's/$/;/' | grep -q "^${usr};"; echo $?) (( rc = rc + rc1 )) fi done if [[ "$rc" == "0" ]] then res=$RESP_OK else res=$RESP_NOK fi else res=$RESP_NOK fi fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_6() { # args head=h1 rule="5.6" desc="maxage" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a maxage | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;maxage=13;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_7() { # args head=h1 rule="5.7" desc="maxexpired" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a maxexpired | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;maxexpired=4;" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_3_1() { # args head=h1 rule="6.3.1" desc="Privilege escalation: sudo" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') #min version: 1.9.5p2 val=$(sudo --version | grep -vi sudoers | grep version | rev | awk '{print $1}' | rev | sed 's/p/\./') val1=$(echo $val | cut -d'.' -f1) val2=$(echo $val | cut -d'.' -f2) val3=$(echo $val | cut -d'.' -f3) val4=$(echo $val | cut -d'.' -f4) if [[ "$val1" -lt "1" ]] then rc=1 else if [[ "$val1" -gt "1" ]] then rc=0 else if [[ "$val2" -lt "9" ]] then rc=1 else if [[ "$val2" -gt "9" ]] then rc=0 else if [[ "$val3" -lt "5" ]] then rc=1 else if [[ "$val3" -ge "5" ]] then rc=0 else rc=1 fi fi fi fi fi fi rc2=$(visudo -c > /dev/null 2>&1; echo $?) (( rc1 = rc + rc2 )) if [[ "$rc1" -eq "0" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_3_2() { # args head=h1 rule="6.3.2" desc="Ensure sudo logging is active" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep -Ei '^\s*Defaults\s+logfile=\S+' /etc/sudoers /etc/sudoers.d/*) if [[ "$val" == "" ]] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_4() { # args head=h1 rule="6.4" desc="Adding authorized users in at.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -s /var/adm/cron/at.allow ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_6() { # args head=h1 rule="6.6" desc="Adding authorised users in cron.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -s /var/adm/cron/cron.allow ] then res=$RESP_OK else res=$RESP_NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_7_1() { # args head=h1 rule="7.1" desc="Use FLRT regularly" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') res=$RESP_MANUAL print_output $head $rule $desc1 $res } #----------------------------------------- # MAIN #----------------------------------------- main () { check_section_2_1 check_section_2_7 check_section_3_3 check_section_3_4 check_section_3_5 check_section_3_6 check_section_3_7 check_section_3_8 check_section_4_1_3_1 check_section_4_1_3_2 check_section_4_1_3_3 check_section_4_2_18 check_section_4_3_1 check_section_4_3_2 check_section_4_3_3 check_section_4_5_1_7 check_section_4_5_2_1 check_section_4_5_2_2 check_section_4_5_2_3 check_section_4_5_3_1 check_section_4_5_3_4 check_section_4_5_3_5 check_section_4_5_3_6 check_section_4_5_3_7 check_section_4_5_3_8 check_section_4_5_3_9 check_section_4_5_3_10 check_section_4_5_3_11 check_section_4_5_3_12 check_section_4_5_3_13 check_section_4_5_3_14 check_section_4_5_3_15 check_section_4_5_3_16 check_section_4_5_3_17 check_section_4_5_3_18 check_section_4_6_5 check_section_4_7_1_1 check_section_4_7_1_2 check_section_4_7_1_3 check_section_4_7_1_4 check_section_4_7_1_5 check_section_4_7_1_6 check_section_4_7_1_7 check_section_4_7_1_8 check_section_4_7_1_9 check_section_4_7_1_10 check_section_4_7_1_11 check_section_4_7_2_2 check_section_4_7_2_3 check_section_4_7_2_4 check_section_4_7_2_5 check_section_4_7_2_6 check_section_4_7_2_7 check_section_4_7_2_8 check_section_4_7_2_9 check_section_4_7_2_10 check_section_4_7_2_11 #check_section_4_7_2_12 check_section_4_7_2_13 check_section_4_7_2_14 check_section_4_7_2_15 check_section_4_7_2_16 check_section_4_7_2_17 check_section_4_7_2_18 check_section_4_9 check_section_4_10 check_section_4_11 check_section_4_12 check_section_4_13 check_section_4_14 check_section_5_1_1_1 check_section_5_1_1_2 check_section_5_1_1_3 check_section_5_1_2 check_section_5_1_3 check_section_5_1_4 check_section_5_1_5 check_section_5_1_6 check_section_5_2_1 check_section_5_2_2 check_section_5_2_3 check_section_5_2_4 check_section_5_2_5 check_section_5_2_6 check_section_5_2_7 check_section_5_2_8 check_section_5_2_9 check_section_5_2_10 check_section_5_2_11 check_section_5_2_12 check_section_5_2_13 check_section_5_3_1 check_section_5_3_2 check_section_5_3_3 check_section_5_3_4 check_section_5_3_5 check_section_5_3_6 check_section_5_3_7 check_section_5_3_8 check_section_5_3_9 check_section_5_3_10 check_section_5_6 check_section_5_7 check_section_6_3_1 check_section_6_3_2 check_section_6_4 check_section_6_6 check_section_7_1 } main | tee $cisoutput cat $cisoutput | sed "s/^/$HEADER/" | sed 's/^/\//' | sed "s/^/$DAY/" | sed 's/^/\//' | sed "s/^/$MONTH/" | sed "s/$/$FOOTER/" > ${cisoutput}.1 cat ${cisoutput}.1 | sed 's/^/"/' | sed 's/;/","/g' | sed 's/$/"/' > ${cisoutput}
root@aix /root# cat scripts/cis.sh
#!/usr/bin/ksh93 #@(#) Check security # This script doesn't modify something to your system, just list what is right and wrong # Print in red all commands to modify your settings # Print in green all parameters that need no change, following by OK # Version 1.0 06-2023 EIF (compliance CIS for AIX) dir=`dirname $0` if [ -f $dir/.env ] then . $dir/.env else path_script=$dir export sn=`basename $0 | cut -d. -f1` export logpath=/tmp export logname=$logpath/$sn.log fi DATE=$(date "+%Y%m%d%H%M%S") LINUX_SED=/opt/freeware/bin/sed LINUX_STAT=/opt/freeware/bin/stat LINUX_SORT=/opt/freeware/bin/sort list_files=$logpath/list_files.txt outputcis=$logpath/CIS_AIX7.2_v1.0.0 output=$logname prefix=sec_files_out_ outputdir=$logpath/${prefix}${DATE} mkdir $outputdir tempo=$logpath/tmp_cis # Cleanup find $logpath -type d -name "${prefix}*" -ctime +5 -exec rm -r {} \; 2>/dev/null #----------------------------------------- print_output() { # args header=$1 ruleno=$2 descr=$(echo "$3") result=$4 echo "$ruleno;$descr;$result" | sed 's/\|/\ /g' } #----------------------------------------- check_section_2_1() { # args head=h1 rule="2.1" desc="Collect system configuration regularly" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') file1=/var/log/syslog/inventory.log val=0 val1=$(ls $file1 > /dev/null 2>&1; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=NOK val1=$(cat /etc/syslog.conf | grep "local1.info" | grep -q "$file1"; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=NOK val1=$(cat /etc/syslog.conf | sed '/^$/d' | grep -v '^#' | grep "^local1.info" | awk '{print $2}' | grep -q "\@"; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=NOK val1=$(crontab -l | grep -v '^#' | grep "lsconf" | grep -q "logger"; echo $?) (( val = val + val1 )) if [ "$val" != "0" ] then res=NOK else res=OK fi fi fi else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_2_7() { # args head=h1 rule="2.7" desc="Remove Unused Symbolic Links" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') find -L / \( -fstype jfs -o -fstype jfs2 \) -type l -ls 2>/dev/null | cut -d'/' -f2- | sed 's/^/\//' | sed 's/\->/;/' | sed 's/\ ;/;/' | sed 's/;\ /;/' > $tempo.1 cat /dev/null > $tempo for line in $(cat $tempo.1 | sed 's/\ /|/g') do word1=$(echo $line | cut -d';' -f1 | sed 's/\|/\ /g') word2=$(echo $line | cut -d';' -f2 | sed 's/\|/\ /g') val=$(echo $word2 | grep -c '^/') if [[ "$val" -eq "1" ]] then if [ ! -e $word2 ] then echo $word1 >> $tempo fi else dir1=$(echo $word1 | rev | cut -d'/' -f2- | rev) word3=$(echo "$dir1/$word2") if [ ! -e $word3 ] then echo $word1 >> $tempo fi fi done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi #cp $tempo /root/link.txt print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_3() { # args head=h1 rule="3.3" desc="Ensure default user umask is 027 or more restrictive" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a umask | grep -q 'umask=27';echo $?) if [ "$val" != "0" ] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_4() { # args head=h1 rule="3.4" desc="Remove group write permission from default groups - exceptions must be in TSD and audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type f -perm -g+w -ls | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=OK else res=Manual echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_5() { # args head=h1 rule="3.5" desc="Application Data with requirement for world writable directories" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type d -perm -o+w ! -perm -1000 -ls | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=OK else res=NOK echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_6() { # args head=h1 rule="3.6" desc="Ensure there are no world writable files - exceptions must be in TSD and audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type f -perm -o+w | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=OK else res=NOK echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_7() { # args head=h1 rule="3.7" desc="Ensure there are no 'staff' writable files - exceptions must be in TSD and audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) -type f -perm -g+w -group staff | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=OK else res=NOK echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_3_8() { # args head=h1 rule="3.8" desc="Ensure all files and directories are owned by a user (uid) and assigned to a group (gid)" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(find / \( -fstype jfs -o -fstype jfs2 \) \( -type d -o -type f \) \( -nouser -o -nogroup \) -ls | wc -l | awk '{print $1}') if [[ "$val" == "0" ]] then res=OK else res=NOK echo "$rule;$desc1;val=$val" >> $logname fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_1_3_1() { # args head=h1 rule="4.1.3.1" desc="autoconf6" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cat /etc/rc.tcpip | grep '^start ' | grep -q "autoconf6";echo $?) if [ "$val" -eq "0" ] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_1_3_2() { # args head=h1 rule="4.1.3.2" desc="ndpd-host" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cat /etc/rc.tcpip | grep '^start ' | grep -q "ndpd-host";echo $?) if [ "$val" -eq "0" ] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_1_3_3() { # args head=h1 rule="4.1.3.3" desc="ndpd-router" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cat /etc/rc.tcpip | grep '^start ' | grep -q "ndpd-router";echo $?) if [ "$val" -eq "0" ] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_2_18() { # args head=h1 rule="4.2.18" desc="ip6forwarding" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(no -o ip6forwarding | sed 's/\ //g' | grep -q 'ip6forwarding=0'; echo $?) if [ "$val" -eq "0" ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_3_1() { # args head=h1 rule="4.3.1" desc="Ensure that IP Security is available" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lsdev -Cc ipsec 2>/dev/null | grep Available | wc -l | awk '{print $1}') if [ "$val" == "2" ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_3_2() { # args head=h1 rule="4.3.2" desc="Ensure loopback traffic is blocked on external interfaces" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val1=$(lsfilt -v 4 -O 2>/dev/null | grep 127.0.0.0 | wc -l | awk '{print $1}') val2=$(lsfilt -v 6 -O 2>/dev/null | grep ::1 | wc -l | awk '{print $1}') (( val = val1 + val2 )) if [ "$val" == "2" ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_3_3() { # args head=h1 rule="4.3.3" desc="Ensure that IPsec filters are active" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val1=$(lsfilt -v4 -O -a 2>/dev/null | grep -q inactive | awk '{print $1}') val2=$(lsfilt -v6 -O -a 2>/dev/null | grep -q inactive | awk '{print $1}') (( val = val1 + val2 )) if [ "$val" == "0" ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_1_7() { # args head=h1 rule="4.5.1.7" desc="CDE - screensaver lock" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /etc/dt/config/*/sys.resources ] then val=$(egrep "dtsession\*saverTimeout:|dtsession\*lockTimeout:" /etc/dt/config/*/sys.resources | rev | cut -d' ' -f1 | rev | awk '{print $1}' | sort -u) if [ "$val" == "10" ] then res=OK else res=NOK fi else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_2_1() { # args head=h1 rule="4.5.2.1" desc="FTPD: Disable root access to ftpd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep -q "root" /etc/ftpusers 2>/dev/null; echo $?) if [ "$val" -ne "0" ] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_2_2() { # args head=h1 rule="4.5.2.2" desc="FTPD: Display acceptable usage policy during login" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') # If ftp is disable, doesn't check val=$(grep -c "^ftp[[:blank:]]" /etc/inetd.conf) if [[ $val -gt 0 ]] then val=$(lslpp -Lc | grep "bos.msg.en_US.net.tcp.client" | wc -l | awk '{print $1}') if [ "$val" == "0" ] then res=NOK else if [ `lslpp -L "bos.msg.en_US.net.tcp.client" >/dev/null && print $(dspcat /usr/lib/nls/msg/en_US/ftpd.cat 1 9) | grep -q "Authorized"; echo $?` -ne "0" ] then res=NOK else res=OK fi fi else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_2_3() { # args head=h1 rule="4.5.2.3" desc="FTPD: Prevent world access and group write to files" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') # If ftp is disable, doesn't check val=$(grep -c "^ftp[[:blank:]]" /etc/inetd.conf) if [[ $val -gt 0 ]] then val=$(grep "^ftp[[:blank:]]" /etc/inetd.conf |awk '{print $6, $7, $8, $9, $10}' | grep -c "027") if [ "$val" == "1" ] then res=OK else res=NOK fi else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_1() { # args head=h1 rule="4.5.3.1" desc="OpenSSH: Minimum version is 8.1" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val1=$(sshd -i </dev/null | cut -d'_' -f 2) val=$(echo "$val1 8.1" | awk '{print ($1 >= $2)}') if [[ "$val" -eq "1" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_4() { # args head=h1 rule="4.5.3.4" desc="sshd_config: Restrict users and groups allowed access via OpenSSH" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(/usr/bin/egrep -c "^(AllowUsers|AllowGroups|DenyUsers|DenyGroups)[[:blank:]]" /etc/ssh/sshd_config) if [[ "$val" -gt "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_5() { # args head=h1 rule="4.5.3.5" desc="sshd_config: PermitRootLogin is 'prohibit-password' or 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(/usr/bin/egrep "^PermitRootLogin" /etc/ssh/sshd_config | cut -d' ' -f2- | egrep -c "prohibit-password|no|forced-commands-only") if [[ "$val" -eq "0" ]] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_6() { # args head=h1 rule="4.5.3.6" desc="sshd_config: Banner exists and message contains 'Only authorized users allowed'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^Banner[[:blank:]]" /etc/ssh/sshd_config | grep -c '/etc/ssh/ssh_banner') if [ "$val" == "1" ] then val=$(grep -c 'Unauthorized' /etc/ssh/ssh_banner) if [ "$val" == "1" ] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_7() { # args head=h1 rule="4.5.3.7" desc="sshd_config: HostbasedAuthentication is 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^HostbasedAuthentication[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "no" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_8() { # args head=h1 rule="4.5.3.8" desc="sshd_config: IgnoreRhosts is 'yes' or 'shosts-only'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^IgnoreRhosts[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "yes" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_9() { # args head=h1 rule="4.5.3.9" desc="sshd_config: PermitEmptyPasswords is 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^PermitEmptyPasswords[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "no" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_10() { # args head=h1 rule="4.5.3.10" desc="sshd_config: LogLevel is 'INFO' or 'VERBOSE'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^LogLevel[[:blank:]]" /etc/ssh/sshd_config | egrep -c "INFO|VERBOSE") if [[ "$val" -eq "0" ]] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_11() { # args head=h1 rule="4.5.3.11" desc="sshd_config: sftp-server arguments include '-u 027 -f AUTH -l INFO'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^Subsystem[[:blank:]]sftp" /etc/ssh/sshd_config | grep sftp-server | grep -c "027") if [[ "$val" -eq "0" ]] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_12() { # args head=h1 rule="4.5.3.12" desc="sshd_config: MaxAuthTries is '4'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(sshd -T | grep maxauthtries | rev | awk '{print $1}' | rev) if [ "$val" -gt "4" ] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_13() { # args head=h1 rule="4.5.3.13" desc="sshd_config: PermitUserEnvironment is 'no'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^PermitUserEnvironment[[:blank:]]" /etc/ssh/sshd_config | rev | cut -d' ' -f1 | rev) if [[ "$val" == "no" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_14() { # args head=h1 rule="4.5.3.14" desc="sshd_config: Use Conditional exception(s)." res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(/usr/bin/egrep -cp "^Match " /etc/ssh/sshd_config) if [[ "$val" -eq "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_15() { # args head=h1 rule="4.5.3.15" desc="sshd_config, ssh_config: KexAlgorithms" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep '^kexalgorithms' | tr ',' '\n' | egrep -c "diffie-hellman-group1-sha1|diffie-hellman-group14-sha1|diffie-hellman-group-exchange-sha1") if [[ "$val" -eq "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_16() { # args head=h1 rule="4.5.3.16" desc="sshd_config, ssh_config: Ciphers" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') cat > $tempo << EOF aes128-ctr,aes192-ctr,aes256-ctr,chacha20-poly1305@openssh.com,aes128-gcm@openssh.com,aes256-gcm@openssh.com EOF cat $tempo | tr ',' '\n' | sort -u > $tempo.1 sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep ciphers | cut -d' ' -f2- | tr ',' '\n' | sort -u > $tempo val=$(sdiff -sw 80 $tempo $tempo.1 | wc -l | awk '{print $1}') if [[ "$val" -eq "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_17() { # args head=h1 rule="4.5.3.17" desc="sshd_config, ssh_config: MACs - Message Authtification Codes" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') # List of Weak algorithms cat > $tempo << EOF hmac-md5,hmac-md5-96,hmac-ripemd160,hmac-sha1,hmac-sha1-96,umac-64@openssh.com,umac-128@openssh.com,hmac-md5-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha1-96-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com EOF cat $tempo | tr ',' '\n' | sort -u > $tempo.1 sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep macs | cut -d' ' -f2- | tr ',' ' \n' | sort -u | sed 's/$/;/g' > $tempo val=0 for mac in $(cat $tempo.1) do val1=$(grep -c "^${mac};" $tempo) (( val = val + val1 )) done if [[ "$val" -eq "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_5_3_18() { # args head=h1 rule="4.5.3.18" desc="sshd_config, ssh_config: ReKeyLimit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | grep -v '^#' | awk '{print $1}')" | grep rekeylimit | cut -d' ' -f2- | tr -s ' ' | tr ' ' '\n' | sort -u | tail -1) if [[ "$val" != "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_6_5() { # args head=h1 rule="4.6.5" desc="Unattended terminal session timeout is 900 seconds (or less)" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(echo `egrep -c "TMOUT|TIMEOUT" /etc/profile` `readonly | /usr/bin/egrep -c -e "TMOUT|TIMEOUT"` | tr ' ' '\n' | sed '/^$/d' | sort | tail -1) if [[ "$val" -gt "2" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_1() { # args head=h1 rule="4.7.1.1" desc="Home directory must exist" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=0 for home in $(lsuser -R files -a home ALL | awk '{print $2}' | sed 's/home=//' | sort -u) do val1=$(ls -d $home > /dev/null 2>&1; echo $?) (( val = val + val1 )) done if [[ "$val" -eq "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_2() { # args head=h1 rule="4.7.1.2" desc="Home directory must be owned by account, or special account" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -R files -a id home account_locked ALL | while read name ids homes locks rest do uid=$(echo ${ids} | cut -f2 -d =) home=$(echo ${homes} | cut -f2 -d =) locked=$(echo ${locks} | cut -f2 -d =) if [[ ${home} == "/dev/null" || ${locked} == "true" ]]; then continue elif [[ ! -d ${home} ]]; then /usr/bin/printf "%-32s does not exist; Recommend Lock Account [%s]\n" ${home} ${name} continue else /usr/bin/perl -e '$user=$ARGV[0]; $hd=$ARGV[1]; $uid=$ARGV[2]; $huid=((stat $hd)[4]); if ($huid != $uid && $huid != 0) { exit(1); # triggers command after OR (||) }' ${name} ${home} ${uid} || \ /usr/bin/printf "Recommend Lock Account: %s does not own %s\n" ${name} ${home} fi done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_3() { # args head=h1 rule="4.7.1.3" desc="Home directory: write access restricted to 'owner'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -R files -a id home ALL | while read name ids homes rest do uid_check=$(echo ${ids} | cut -f2 -d =) if [[ ${uid_check} -ge 200 ]] then home=$(echo ${homes} | cut -f2 -d =) if [[ ${home} == "/dev/null" ]] then continue else if [[ ! -d ${home} ]] then /usr/bin/printf "%-32s does not exist; recommend to lock account named [%s]\n" ${home} ${name} else if [[ ${home} != "/" && ${home} != "/dev/null" ]] then /usr/bin/perl -e '$f=$ARGV[0]; $m=(stat $f)[2]; \ printf("Recommend chmod on: %s: to remove group or world write mode\n", $f) if $m & 022; \ printf("Recommend remove ACL on: %s\n ", $f) if $m & 0200000000; \ exit($m & 0200000022)' ${home} || (ls -led ${home} && (aclget ${home} | grep -ip Enabled)) fi fi fi fi done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_4() { # args head=h1 rule="4.7.1.4" desc="AUDIT subsystem: /audit and /etc/security/audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /audit ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /audit) if [[ "$val" == "root:audit:2750:/audit:" ]] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/security/audit) if [[ "$val" == "root:audit:2750:/etc/security/audit:" ]] then res=OK else res=NOK fi else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_5() { # args head=h1 rule="4.7.1.5" desc="SECURITY Subsystems: /etc/security" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') EXCLUDE="security/(aixpert|audit|ice)" find /etc/security -type d | \ /usr/bin/egrep -v ${EXCLUDE} | \ /usr/bin/sort | xargs ls -led | \ /usr/bin/awk '{print $1 " " $3 " " $4 " " $9}' | \ /usr/bin/grep -v drwxr-s---- > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_6() { # args head=h1 rule="4.7.1.6" desc="/var/adm/ras" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%F:%a:%n:" /var/adm/ras/* | grep -v '^directory:' | cut -d':' -f2- | cut -c3- | grep -c -v '^0:') if [[ "$val" -eq "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_7() { # args head=h1 rule="4.7.1.7" desc="/var/adm/sa" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/sa) if [[ "$val" == "adm:adm:755:/var/adm/sa:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_8() { # args head=h1 rule="4.7.1.8" desc="/var/spool/cron/crontabs" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/spool/cron/crontabs) if [[ "$val" == "root:cron:770:/var/spool/cron/crontabs:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_9() { # args head=h1 rule="4.7.1.9" desc="Ensure all directories in root PATH deny write access to all" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') echo "/:${PATH}" | tr ':' '\n' | grep "^/" | sort -u | while read DIR do DIR=${DIR:-$(pwd)} while [[ -d ${DIR} ]] do [[ "$(ls -ld ${DIR})" = @(d???????w? *) ]] && print " WARNING ${DIR} is world writable" [[ "$(ls -ld ${DIR})" = @(d????w???? *) ]] && print " WARNING ${DIR} is group writable" [[ "$(ls -ld ${DIR} |awk '{print $3}')" != @(root|bin) ]] && print " WARNING ${DIR} is not owned by root or bin" DIR=${DIR%/*} done done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_10() { # args head=h1 rule="4.7.1.10" desc="Ensure root user has a dedicated home directory" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lsuser -a home root | awk '{print $2}') if [[ "$val" == "home=/root" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_1_11() { # args head=h1 rule="4.7.1.11" desc="/etc/security/audit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/security/audit) if [[ "$val" == "root:audit:750:/etc/security/audit:" || "$val" == "root:audit:2750:/etc/security/audit:" ]] then val=$($LINUX_STAT -c "%a:%n:" /etc/security/audit/* | grep -c -v '^640:') if [[ "$val" -eq "0" ]] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_2() { # args head=h1 rule="4.7.2.2" desc="Verify Trust of suid, sgid, acl, and trusted-bit files and programs" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') find / \( -fstype jfs -o -fstype jfs2 \) \( -perm -04000 -o -perm -02000 \) -type f -ls > $tempo if [ ! -s $tempo ] then res=OK else res=Manual fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_3() { # args head=h1 rule="4.7.2.3" desc="crontab entries - owned by userid" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') crontab -l |egrep -v '^#' |awk '{print $6}' |grep "^/" |sort -u | while read DIR do DIR=${DIR:-$(pwd)} while [[ -a ${DIR} ]] do [[ "$(ls -ld ${DIR})" = @(????????w? *) ]] && print " WARNING ${DIR} is world writable" [[ "$(ls -ld ${DIR})" = @(?????w???? *) ]] && print " WARNING ${DIR} is group writable" [[ "$(ls -ld ${DIR} |awk '{print $3}')" != @(root|bin) ]] && print " WARNING ${DIR} is not owned by root or bin" DIR=${DIR%/*} done done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_4() { # args head=h1 rule="4.7.2.4" desc="Home directory configuration files" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -R files -a home ALL | cut -f2 -d= | egrep -v "^/$|/etc|/bin|/var|/usr|/usr/sys" |while read homedir do if [[ -d ${homedir} ]] then #echo "Listing all user confguration files in '${homedir}'" ls -a ${homedir} | egrep "^\.[a-z]" | while read file do if [[ -f "${homedir}/${file}" ]] then val=$(ls -l "${homedir}/${file}" | cut -c5- | awk '{print $1}' | grep -c w) if [[ "$val" -ne "0" ]] then echo "${homedir}/${file} write permissions g or o" fi fi done else echo "ERROR - no home directory for '${homedir}'" fi done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_5() { # args head=h1 rule="4.7.2.5" desc="/smit.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') file1=$(lsuser -a home root | awk '{print $2}' | sed 's/home=//' | sed 's/$/\/smit.log/') val=$($LINUX_STAT -c "%U:%G:%a:%n:" $file1) if [[ "$val" == "root:system:640:$file1:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_6() { # args head=h1 rule="4.7.2.6" desc="/etc/group" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/group) if [[ "$val" == "root:security:644:/etc/group:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_7() { # args head=h1 rule="4.7.2.7" desc="/etc/inetd.conf" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/inetd.conf) if [[ "$val" == "root:system:644:/etc/inetd.conf:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_8() { # args head=h1 rule="4.7.2.8" desc="/etc/motd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/motd) if [[ "$val" == "bin:bin:644:/etc/motd:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_9() { # args head=h1 rule="4.7.2.9" desc="/etc/passwd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/passwd) if [[ "$val" == "root:security:644:/etc/passwd:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_10() { # args head=h1 rule="4.7.2.10" desc="/etc/ssh/ssh_config" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/ssh/ssh_config) if [[ "$val" == "root:system:644:/etc/ssh/ssh_config:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_11() { # args head=h1 rule="4.7.2.11" desc="/etc/ssh/sshd_config" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$($LINUX_STAT -c "%U:%G:%a:%n:" /etc/ssh/sshd_config) if [[ "$val" == "root:system:644:/etc/ssh/sshd_config:" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_12() { # args head=h1 rule="4.7.2.12" desc="/var/adm/cron/at.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /var/adm/cron/at.allow ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/cron/at.allow) if [[ "$val" == "root:sys:400:/var/adm/cron/at.allow:" ]] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_13() { # args head=h1 rule="4.7.2.13" desc="/var/adm/cron/cron.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e /var/adm/cron/cron.allow ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/cron/cron.allow) if [[ "$val" == "root:sys:400:/var/adm/cron/cron.allow:" ]] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_14() { # args head=h1 rule="4.7.2.14" desc="/var/ct/RMstart.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/ct/RMstart.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/ct/RMstart.log) if [[ "$val" == "root:system:640:/var/ct/RMstart.log:" ]] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_15() { # args head=h1 rule="4.7.2.15" desc="/var/adm/cron/log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/adm/cron/log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/adm/cron/log) if [[ "$val" == "bin:cron:660:/var/adm/cron/log:" ]] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_16() { # args head=h1 rule="4.7.2.16" desc="/var/tmp/dpid2.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/tmp/dpid2.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/tmp/dpid2.log) if [[ "$val" == "root:system:640:/var/tmp/dpid2.log:" ]] then res=OK else res=NOK fi else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_17() { # args head=h1 rule="4.7.2.17" desc="/var/tmp/hostmibd.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/tmp/hostmibd.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/tmp/hostmibd.log) if [[ "$val" == "root:system:640:/var/tmp/hostmibd.log:" ]] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_7_2_18() { # args head=h1 rule="4.7.2.18" desc="/var/tmp/snmpd.log" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -e "/var/tmp/snmpd.log" ] then val=$($LINUX_STAT -c "%U:%G:%a:%n:" /var/tmp/snmpd.log) if [[ "$val" == "root:system:640:/var/tmp/snmpd.log:" ]] then res=OK else res=NOK fi else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_9() { # args head=h1 rule="4.9" desc="Ensure root access is controlled" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') lsuser -a login rlogin su sugroups root | tr '=' ' ' | read user a1 login a2 rlogin a3 su a4 sugroups [[ ${su} != "false" && ${sugroups} == "ALL" ]] && echo "failed : ${a3}==${su}, ${a4}==${sugroups}" > $tempo [[ ${login} == "true" || ${rlogin} == "true" ]] && echo "failed : ${a1}==${login}, ${a2}==${rlogin}" >> $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_10() { # args head=h1 rule="4.10" desc="Disable core dumps" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') rc1=$(lssec -f /etc/security/limits -s default -a core -a core_hard | sed 's/\ /;/g' | sed 's/$/;/' | grep -q 'default;core=0;core_hard=0;'; echo $?) rc2=$(lsattr -El sys0 -a fullcore | sed 's/\ /;/g' | sed 's/$/;/' | grep -q 'fullcore;false;Enable;full;CORE;dump;True;'; echo $?) (( rc = rc1 + rc2 )) if [[ "$rc" == "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_11() { # args head=h1 rule="4.11" desc="Remove current working directory from default /etc/environment PATH" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep "^PATH=" /etc/environment |awk '/((:[ \t]*:)|(:[ \t]*$)|(^[\t]*:)|(^.:)|(:.$)|(:.:))/') if [[ "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_12() { # args head=h1 rule="4.12" desc="Lock historical users" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') ACCOUNTS=daemon,bin,sys,adm,uucp,nobody,lpd,lp,invscout,ipsec,nuucp,sshd for usr in $(echo $ACCOUNTS | sed 's/,/\ /g') do lsuser -a account_locked $usr 2>/dev/null done | grep -v 'account_locked=true' > $tempo if [ -s $tempo ] then res=NOK else res=OK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_13() { # args head=h1 rule="4.13" desc="Remove current working directory from root's PATH" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(su - root -c "echo ${PATH}" |awk '/((:[ \t]*:)|(:[ \t]*$)|(^[\t]*:)|(^.:)|(:.$)|(:.:))/') if [[ "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_4_14() { # args head=h1 rule="4.14" desc="Configuration: /etc/motd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') res="TODO" if [ -e /audit ] then val=$(cat /etc/motd | grep -c 'PROPER AUTHORIZATION') if [[ "$val" == "1" ]] then res=OK else res=NOK fi else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_1_1() { # args head=h1 rule="5.1.1.1" desc="histexpire" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a histexpire | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;histexpire=52;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_1_2() { # args head=h1 rule="5.1.1.2" desc="histsize" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a histsize | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;histsize=0;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_1_3() { # args head=h1 rule="5.1.1.3" desc="minage" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minage | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minage=1;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_2() { # args head=h1 rule="5.1.2" desc="All accounts must have a hashed password" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') egrep -p "password = +$" /etc/security/passwd | grep ":" | awk -F: '{ print $1 } ' | while read user rest do print "Locking account ${user} due to blank password" done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_3() { # args head=h1 rule="5.1.3" desc="All usernames and UIDs must be unique" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cut -d: -f 3 /etc/passwd | sort -n | uniq -d;cut -d: -f 1 /etc/passwd | sort | uniq -d) if [[ "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_4() { # args head=h1 rule="5.1.4" desc="All group names and GIDs must be unique" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(cut -d: -f 3 /etc/group | sort -n | uniq -d;cut -d: -f 1 /etc/group | sort | uniq -d) if [[ "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_5() { # args head=h1 rule="5.1.5" desc="Establish and Maintain an Inventory of Administrator accounts" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') res="TODO" print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_1_6() { # args head=h1 rule="5.1.6" desc="Establish and Maintain an Inventory of User Accounts" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') res="TODO" print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_1() { # args head=h1 rule="5.2.1" desc="Ensure new passwords are controlled by password attributes (disable NOCHECK)" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep NOCHECK /etc/security/passwd) if [[ "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_2() { # args head=h1 rule="5.2.2" desc="pwd_algorithm" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/login.cfg -s usw -a pwd_algorithm | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "usw;pwd_algorithm=ssha512;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_3() { # args head=h1 rule="5.2.3" desc="Ensure passwords are not hashed using 'crypt'" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') grep 'password[[:blank:]]= .............$' /etc/security/passwd | while read pass equals cryptedhash do user=$(grep -p $cryptedhash /etc/security/passwd | egrep '[a-zA-z0-9]+:$' | sed -e s/:$//) print ${user}: needs to update passwd done > $tempo if [ ! -s $tempo ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_4() { # args head=h1 rule="5.2.4" desc="Ensure password policy is enforced for all users" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep NOCHECK /etc/security/passwd) if [[ "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_5() { # args head=h1 rule="5.2.5" desc="minlen" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minlen | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minlen=14;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_6() { # args head=h1 rule="5.2.6" desc="mindiff" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a mindiff | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;mindiff=4;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_7() { # args head=h1 rule="5.2.7" desc="minalpha" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minalpha | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minalpha=3;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_8() { # args head=h1 rule="5.2.8" desc="minother" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minother | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minother=3;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_9() { # args head=h1 rule="5.2.9" desc="maxrepeats" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a maxrepeats | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;maxrepeats=4;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_10() { # args head=h1 rule="5.2.10" desc="mindigit" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a mindigit | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;mindigit=1;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_11() { # args head=h1 rule="5.2.11" desc="minloweralpha" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minloweralpha | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minloweralpha=1;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_12() { # args head=h1 rule="5.2.12" desc="minupperalpha" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minupperalpha | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minupperalpha=1;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_2_13() { # args head=h1 rule="5.2.13" desc="minspecialchar" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a minspecialchar | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;minspecialchar=1;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_1() { # args head=h1 rule="5.3.1" desc="adm" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=adm val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_2() { # args head=h1 rule="5.3.2" desc="bin" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=bin val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_3() { # args head=h1 rule="5.3.3" desc="daemon" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=daemon val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_4() { # args head=h1 rule="5.3.4" desc="guest" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=guest val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_5() { # args head=h1 rule="5.3.5" desc="lpd" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=ldp val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_6() { # args head=h1 rule="5.3.6" desc="nobody" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=nobody val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_7() { # args head=h1 rule="5.3.7" desc="nuucp" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=nuucp val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_8() { # args head=h1 rule="5.3.8" desc="sys" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=sys val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_9() { # args head=h1 rule="5.3.9" desc="uucp" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') usr=uucp val=$(lsuser -a account_locked login rlogin $usr 2>/dev/null | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "$usr;account_locked=true;login=false;rlogin=false;" || "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_3_10() { # args head=h1 rule="5.3.10" desc="Ensure System Accounts cannot access system using ftp." res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssrc -ls inetd | grep -c ftpd) if [[ "$val" -eq "0" ]] then res=OK else if [ -e /etc/ftpusers ] then rc=0 lsuser -R files -a id ALL | sed 's/id=//' | while read usr uid do if [[ "$uid" -lt "200" ]] then rc1=$(cat /etc/ftpusers | sed 's/$/;/' | grep -q "^${usr};"; echo $?) (( rc = rc + rc1 )) fi done if [[ "$rc" == "0" ]] then res=OK else res=NOK fi else res=NOK fi fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_6() { # args head=h1 rule="5.6" desc="maxage" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a maxage | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;maxage=13;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_5_7() { # args head=h1 rule="5.7" desc="maxexpired" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(lssec -f /etc/security/user -s default -a maxexpired | sed 's/\ /;/g' | sed 's/$/;/') if [[ "$val" == "default;maxexpired=4;" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_3_1() { # args head=h1 rule="6.3.1" desc="Privilege escalation: sudo" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') #min version: 1.9.5p2 val=$(sudo --version | grep -vi sudoers | grep version | rev | awk '{print $1}' | rev | sed 's/p/\./') val1=$(echo $val | cut -d'.' -f1) val2=$(echo $val | cut -d'.' -f2) val3=$(echo $val | cut -d'.' -f3) val4=$(echo $val | cut -d'.' -f4) if [[ "$val1" -lt "1" ]] then rc=1 else if [[ "$val1" -gt "1" ]] then rc=0 else if [[ "$val2" -lt "9" ]] then rc=1 else if [[ "$val2" -gt "9" ]] then rc=0 else if [[ "$val3" -lt "5" ]] then rc=1 else if [[ "$val3" -ge "5" ]] then rc=0 else rc=1 fi fi fi fi fi fi rc2=$(visudo -c > /dev/null 2>&1; echo $?) (( rc1 = rc + rc2 )) if [[ "$rc1" -eq "0" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_3_2() { # args head=h1 rule="6.3.2" desc="Ensure sudo logging is active" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') val=$(grep -Ei '^\s*Defaults\s+logfile=\S+' /etc/sudoers /etc/sudoers.d/*) if [[ "$val" == "" ]] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_4() { # args head=h1 rule="6.4" desc="Adding authorized users in at.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -s /var/adm/cron/at.allow ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_6_6() { # args head=h1 rule="6.6" desc="Adding authorised users in cron.allow" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') if [ -s /var/adm/cron/cron.allow ] then res=OK else res=NOK fi print_output $head $rule $desc1 $res } #----------------------------------------- check_section_7_1() { # args head=h1 rule="7.1" desc="Use FLRT regularly" res="" desc1=$(echo $desc | tr -s ' ' | sed 's/\ /|/g') res="Manual" print_output $head $rule $desc1 $res } check_section_2_1 check_section_2_7 check_section_3_3 check_section_3_4 #check_section_3_5 #check_section_3_6 #check_section_3_7 #check_section_3_8 check_section_4_1_3_1 check_section_4_1_3_2 check_section_4_1_3_3 check_section_4_2_18 check_section_4_3_1 check_section_4_3_2 check_section_4_3_3 check_section_4_5_1_7 check_section_4_5_2_1 check_section_4_5_2_2 check_section_4_5_2_3 check_section_4_5_3_1 check_section_4_5_3_4 check_section_4_5_3_5 check_section_4_5_3_6 check_section_4_5_3_7 check_section_4_5_3_8 check_section_4_5_3_9 check_section_4_5_3_10 check_section_4_5_3_11 check_section_4_5_3_12 check_section_4_5_3_13 check_section_4_5_3_14 check_section_4_5_3_15 check_section_4_5_3_16 check_section_4_5_3_17 check_section_4_5_3_18 check_section_4_6_5 check_section_4_7_1_1 check_section_4_7_1_2 check_section_4_7_1_3 check_section_4_7_1_4 check_section_4_7_1_5 check_section_4_7_1_6 check_section_4_7_1_7 check_section_4_7_1_8 check_section_4_7_1_9 check_section_4_7_1_10 check_section_4_7_1_11 check_section_4_7_2_2 check_section_4_7_2_3 check_section_4_7_2_4 check_section_4_7_2_5 check_section_4_7_2_6 check_section_4_7_2_7 check_section_4_7_2_8 check_section_4_7_2_9 check_section_4_7_2_10 check_section_4_7_2_11 #check_section_4_7_2_12 check_section_4_7_2_13 check_section_4_7_2_14 check_section_4_7_2_15 check_section_4_7_2_16 check_section_4_7_2_17 check_section_4_7_2_18 check_section_4_9 check_section_4_10 check_section_4_11 check_section_4_12 check_section_4_13 check_section_4_14 check_section_5_1_1_1 check_section_5_1_1_2 check_section_5_1_1_3 check_section_5_1_2 check_section_5_1_3 check_section_5_1_4 check_section_5_1_5 check_section_5_1_6 check_section_5_2_1 check_section_5_2_2 check_section_5_2_3 check_section_5_2_4 check_section_5_2_5 check_section_5_2_6 check_section_5_2_7 check_section_5_2_8 check_section_5_2_9 check_section_5_2_10 check_section_5_2_11 check_section_5_2_12 check_section_5_2_13 check_section_5_3_1 check_section_5_3_2 check_section_5_3_3 check_section_5_3_4 check_section_5_3_5 check_section_5_3_6 check_section_5_3_7 check_section_5_3_8 check_section_5_3_9 check_section_5_3_10 check_section_5_6 check_section_5_7 check_section_6_3_1 check_section_6_3_2 check_section_6_4 check_section_6_6 check_section_7_1