반응형
리눅스 취약점 진단 스크립트
진단 기준
- 주요정보통신기반시설 취약점 분석·평가 기준
- [시행 2013. 8. 8.] [미래창조과학부고시 제2013-37호, 2013. 8. 8., 일부개정]
스크립트 테스트 환경
- CentOS 6.10 x86_64
진단 방법 및 항목
- 주요정보통신기반시설 기술적 취약점 분석평가 가이드 문서 참고
- [U01] ~ [U43] 항목 코드 진단
출처 : https://github.com/newbieh4cker/centos_vuln_check_script
#!/bin/sh
# Coded by N3wbieH4cker
# bob3rdnewbie.tistory.com
# check priv
if [ "$EUID" -ne 0 ]
then echo "root 권한으로 스크립트를 실행하여 주십시오."
exit
fi
alias ls=ls
CF=`hostname`"_scan_result_"`date +%F__%T`.txt
echo > $CF 2>&1
echo "**********************************************************************"
echo "* 리눅스 취약점 진단 스크립트 *"
echo "**********************************************************************"
echo "* 항목에 따라 시간이 다른 항목에 비하여 다소 오래 걸릴수 있습니다 *"
echo "* 스캔 보고서는 hostname_scan_result_시각.txt 파일로 저장 됩니다 *"
echo "* 기준은 [주요 정보통신 기반 시설 취약점 분석,평가기준] 문서입니다 *"
echo "**********************************************************************"
echo ""
sleep 3
echo "**********************************************************************" >> $CF 2>&1
echo "* 리눅스 스크립트 *" >> $CF 2>&1
echo "**********************************************************************" >> $CF 2>&1
echo "" >> $CF 2>&1
echo "############################# 시작 시간 ##############################"
date
echo "############################# 시작 시간 ##############################" >> $CF 2>&1
date >> $CF 2>&1
echo "============================ 시스템 정보 ===========================" >> $CF 2>&1
echo >> $CF 2>&1
echo "1. 시스템 기본 정보" >> $CF 2>&1
echo " 운영체제 : " `head -n 1 /etc/centos-release` >> $CF 2>&1
echo " 호스트 이름 : " `uname -n` >> $CF 2>&1
echo " 커널 버전 : " `uname -r` >> $CF 2>&1
echo >> $CF 2>&1
echo "2. 네트워크 정보" >> $CF 2>&1
ifconfig -a >> $CF 2>&1
echo >> $CF 2>&1
echo
echo
echo >> $CF 2>&1
echo >> $CF 2>&1
echo "************************** 취약점 체크 시작 **************************"
echo
echo "************************** 취약점 체크 시작 **************************" >> $CF 2>&1
echo >> $CF 2>&1
echo >> $CF 2>&1
echo "============================== 계정 관리 ============================="
echo "============================== 계정 관리 =============================" >> $CF 2>&1
echo "01. root 계정 원격 접속 제한"
echo "01. root 계정 원격 접속 제한" >> $CF 2>&1
if [ -z "`grep pts\? /etc/securetty`" ]
then
echo " ==> [안전] 콘솔 로그인만 가능합니다" >> $CF 2>&1
else
echo " ==> [취약] 콘솔 로그인 이외의 로그인이 가능합니다" >> $CF 2>&1
fi
echo >> $CF 2>&1
echo
echo "02. 패스워드 복합성 설정(및 정책)"
echo "02. 패스워드 복합성 설정(및 정책)" >> $CF 2>&1
echo " ==> 알고리즘 : `authconfig --test | grep hashing | awk '{print $5}'`" >> $CF 2>&1
echo " ==> 최대 사용 기간 : `cat /etc/login.defs | grep PASS_MAX_DAYS | awk '{print $2}' | sed '1d'`일" >> $CF 2>&1
echo " ==> 최소 사용 시간 : `cat /etc/login.defs | grep PASS_MIN_DAYS | awk '{print $2}' | sed '1d'`일" >> $CF 2>&1
echo " ==> 최소 길이 : `cat /etc/login.defs | grep PASS_MIN_LEN | awk '{print $2}' | sed '1d'`글자" >> $CF 2>&1
echo " ==> 기간 만료 경고 기간(일) : `cat /etc/login.defs | grep PASS_WARN_AGE | awk '{print $2}' | sed '1d'`일" >> $CF 2>&1
echo " ==> 권장 정책 : 영문,숫자,특수문자를 조합하여 2종류 조합 시 10자리 이상, 3종류 이상 조합 시 8자리 이상(공공기간 9자리 이상)" >> $CF 2>&1
echo >> $CF 2>&1
echo
echo "03. 계정 잠금 (임계값) 설정"
echo "03. 계정 잠금 (임계값) 설정" >> $CF 2>&1
TI=`grep deny= /etc/pam.d/password-auth | awk '{print $5}' | awk -F = '{print $2}'`
if [ "`grep deny= /etc/pam.d/password-auth`" ]
then
echo " ==> [현재] "$TI"번 로그인 실패시 계정이 잠김니다" >> $CF 2>&1
else
echo " ==> [취약] 계정 잠금 정책이 설정되어 있지 않습니다" >> $CF 2>&1
echo " ==> [권장] 로그인 5회 이상 실패시 계정 잠" >> $CF 2>&1
fi
echo >> $CF 2>&1
echo
echo "04. 패스워드 파일 보호"
echo "04. 패스워드 파일 보호" >> $CF 2>&1
if [ "`cat /etc/passwd | grep "root" | awk -F: '{print $2}' | sed -n '1p'`" = x ]
then
if test -r /etc/shadow
then
echo " ==> [안전] Shadow 패스워드 시스템을 사용중입니다" >> $CF 2>&1
else
echo " ==> [취약] Passwd 패스워드 시스템을 사용중입니다" > $CF 2>&1
fi
fi
echo >> $CF 2>&1
echo " 04-1. /etc/passwd" >> $CF 2>&1
PP=`ls -l /etc/passwd | awk {'print $1'}`
PO=`ls -l /etc/passwd | awk {'print $3'}`
PG=`ls -l /etc/passwd | awk {'print $4'}`
if [ $PP = -r--r--r--. ]
then
echo " ==> [안전] 권한 : " $PP >> $CF 2>&1
else
if [ $PP = -rw-r--r--. ]
then
echo " ==> [안전] 권한 : " $PP >> $CF 2>&1
else
echo " ==> [취약] 권한 : " $PP >> $CF 2>&1
fi
fi
if [ $PO = root ]
then
echo " ==> [안전] 소유자 : " $PO >> $CF 2>&1
else
echo " ==> [취약] 소유자 : " $PO >> $CF 2>&1
fi
if [ $PG = root ]
then
echo " ==> [안전] 그룹 : " $PO >> $CF 2>&1
else
echo " ==> [취약] 그룹 : " $PO >> $CF 2>&1
fi
echo >> $CF 2>&1
echo " 04-2. /etc/shadow" >> $CF 2>&1
if test `ls -l /etc/shadow | awk {'print $1'} ` = -r--------.
then
echo " ==> [안전] 권한 : "`ls -l /etc/shadow | awk {'print $1'}` >> $CF 2>&1
else
if test `ls -l /etc/shadow | awk {'print $1'} ` = ----------.
then
echo " ==> [안전] 권한 : "`ls -l /etc/shadow | awk {'print $1'}` >> $CF 2>&1
else
echo " ==> [취약] 권한 : "`ls -l /etc/shadow | awk {'print $1'}` >> $CF 2>&1
fi
fi
if test `ls -l /etc/shadow | awk {'print $3'}` = root
then
echo " ==> [안전] 소유자 : " `ls -l /etc/shadow | awk {'print $3'}` >> $CF 2>&1
else
echo " ==> [취약] 소유자 : " `ls -l /etc/shadow | awk {'print $3'}` >> $CF 2>&1
fi
if test `ls -l /etc/shadow | awk {'print $4'} ` = root
then
echo " ==> [안전] 그룹 : "`ls -l /etc/shadow | awk {'print $4'}` >> $CF 2>&1
else
echo " ==> [취약] 그룹 : "`ls -l /etc/shadow | awk {'print $4'}` >> $CF 2>&1
fi
echo >> $CF 2>&1
echo >> $CF 2>&1
echo
echo
echo "======================= 파일 및 디렉터리 관리 ========================"
echo "======================= 파일 및 디렉터리 관리=========================" >> $CF 2>&1
echo "05. root홈, 패스 디렉터리 권한 및 패스 설정"
echo "05. root홈, 패스 디렉터리 권한 및 패스 설정" >> $CF 2>&1
echo " root 홈 디렉터리 : " `cat /etc/passwd | grep root | sed -n '1p' | awk -F: '{print $6}'` >> $CF 2>&1
GRDP=`cat /etc/passwd | grep root | sed -n '1p' | awk -F: '{print$6}' | ls -l /../ | awk '{print $1$9}' | grep root | awk -F. '{print $1}'`
RDP=dr-xr-x---
if test $GRDP=$RDP
then
echo " ==> [안전] root 홈 디렉터리 권한 : " $GRDP >> $CF 2>&1
else
echo " ==> [취약] root 홈 권한 : " $GRDP >> $CF 2>&1
fi
echo " PATH 디렉터리 : " `env | grep PATH | awk -F= '{print $2}'` >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "06. 파일 및 디렉터리 소유자 설정"
echo "06. 파일 및 디렉터리 소유자 설정" >> $CF 2>&1
if test -f `find / \( -nouser -o -nogroup \) -xdev -ls 2>/dev/null`
then
echo " ==> [안전] 소유자 혹은 그룹이 없는 파일 및 디렉터리가 존재하지 않습니다" >> $CF 2>&1
else
echo " ==> [취약] 소유자 혹은 그룹이 없는 파일 및 디렉터리가 존재합니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "07. /etc/passwd 파일 소유자 및 권한 설정"
echo "07. /etc/passwd 파일 소유자 및 권한 설정" >> $CF 2>&1
echo " 04-01 항목 참고" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "08. /etc/shadow 파일 소유자 및 권한 설정"
echo "08. /etc/shadow 파일 소유자 및 권한 설정" >> $CF 2>&1
echo " 04-02 항목 참고" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "09. /etc/hosts 파일 소유자 및 권한 설정"
echo "09. /etc/hosts 파일 소유자 및 권한 설정" >> $CF 2>&1
HO=`ls -l /etc/hosts | awk '{print $3}'`
HP=`ls -l /etc/hosts | awk '{print $1}'`
if [ $HO = root ]
then
echo " ==> [안전] hosts 파일 소유자 : " $HO >> $CF 2>&1
else
echo " ==> [취약] hosts 파일 소유자 : " $HO >> $CF 2>&1
fi
if [ $HP = -rw-------. ]
then
echo " ==> [안전] hosts 파일 권한 : " $HP >> $CF 2>&1
else
echo " ==> [취약] hosts 파일 권한 : " $HP >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "10. /etc/(x)inetd.conf 파일 소유자 및 권한 설정"
echo "10. /etc/(x)inetd.conf 파일 소유자 및 권한 설정" >> $CF 2>&1
if test -f /etc/inetd.conf
then
echo " [OOOO] inetd.conf 파일이 존재합니다" >> $CF 2>&1
IO=`ls -l /etc/inetd.conf | awk '{print $3}'`
IP=`ls -l /etc/inetd.conf | awk '{print $1}'`
if [ $IO = root ]
then
echo " ==> [안전] inetd.conf 파일 소유자 : " $IO >> $CF 2>&1
else
echo " ==> [취약] inetd.conf 파일 소유자 : " $IO >> $CF 2>&1
fi
if [ $IP = -rw-------. ]
then
echo " ==> [안전] inetd.conf 파일 권한 : " $IP >> $CF 2>&1
else
echo " ==> [취약] inetd.conf 파일 권한 : " $IP >> $CF 2>&1
fi
else
echo " [XXXX] inetd.conf 파일이 존재하지 않습니다" >> $CF 2>&1
echo >> $CF 2>&1
fi
if test -f /etc/xinetd.conf
then
echo " [OOOO] xinetd.conf 파일이 존재합니다" >> $CF 2>&1
XO=`ls -l /etc/xinetd.conf | awk '{print $3}'`
XP=`ls -l /etc/xinetd.conf | awk '{print $1}'`
if [ $XO = root ]
then
echo " ==> [안전] xinetd.conf 파일 소유자 : " $XO >> $CF 2>&1
else
echo " ==> [취약] xinetd.conf 파일 소유자 : " $XO >> $CF 2>&1
fi
if [ $XP = -rw-------. ]
then
echo " ==> [안전] xinetd.conf 파일 권한 : " $XP >> $CF 2>&1
else
echo " ==> [취약] xinetd.conf 파일 권한 : " $XP >> $CF 2>&1
fi
else
echo " [XXXX] xinetd.conf 파일이 존재하지 않습니다" >> $CF 2>&1
echo >> $CF 2>&1
fi
if [ -d "/etc/xinetd.d" ]
then
echo " [OOOO] /etc/xinetd.d/ 폴더가 존재합니다" >> $CF 2>&1
FP=`ls -l /etc/xinetd.d/ | awk '{print $1, $9}' | sed -n '1!p' | grep -v "^-rw-r--r--"`
FO=`ls -l /etc/xinetd.d/ | awk '{print $3, $9}' | sed -n '1!p' | grep -v "^root"`
if [ "$FP" ]
then
echo " ==> [취약] 권한이 잘못 설정된 파일 있습니다. " >> $CF 2>&1
echo " > " $ FP
else
echo " ==> [안전] 해당 폴더에 서비스 파일이 존재하지 않거나, 모든 파일이 올바른 권한으로 설정되어 있습니다." >> $CF 2>&1
fi
if [ "$FO" ]
then
echo " ==> [취약] 소유자 잘못 설정된 파일 있습니다. " >> $CF 2>&1
echo " > " $ FO
else
echo " ==> [안전] 해당 폴더에 서비스 파일이 존재하지 않거나, 모든 파일이 올바른 소유자로 설정되어 있습니다." >> $CF 2>&1
fi
else
echo " [XXXX] /etc/xinetd.d 폴더가 존재하지 않습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "11. /etc/(r)syslog.conf 파일 소유자 및 권한 설정"
echo "11. /etc/(r)syslog.conf 파일 소유자 및 권한 설정" >> $CF 2>&1
if test -f /etc/syslog.conf
then
echo " [OOOO] syslog.conf 파일이 존재합니다" >> $CF 2>&1
IO=`ls -l /etc/syslog.conf | awk '{print $3}'`
IP=`ls -l /etc/syslog.conf | awk '{print $1}'`
if [ $IO = root ]
then
echo " ==> [안전] syslog.conf 파일 소유자 : " $IO >> $CF 2>&1
else
echo " ==> [취약] syslog.conf 파일 소유자 : " $IO >> $CF 2>&1
fi
if [ $IP = -rw-r--r--. ]
then
echo " ==> [안전] syslog.conf 파일 권한 : " $IP >> $CF 2>&1
else
echo " ==> [취약] syslog.conf 파일 권한 : " $IP >> $CF 2>&1
fi
else
echo " [XXXX] syslog.conf 파일이 존재하지 않습니다" >> $CF 2>&1
echo >> $CF 2>&1
fi
if test -f /etc/rsyslog.conf
then
echo " [OOOO] rsyslog.conf 파일이 존재합니다" >> $CF 2>&1
XO=`ls -l /etc/rsyslog.conf | awk '{print $3}'`
XP=`ls -l /etc/rsyslog.conf | awk '{print $1}'`
if [ $XO = root ]
then
echo " ==> [안전] rsyslog.conf 파일 소유자 : " $XO >> $CF 2>&1
else
echo " ==> [취약] rsyslog.conf 파일 소유자 : " $XO >> $CF 2>&1
fi
if [ $XP = -rw-r--r--. ]
then
echo " ==> [안전] rsyslog.conf 파일 권한 : " $XP >> $CF 2>&1
else
echo " ==> [취약] rsyslog.conf 파일 권한 : " $XP >> $CF 2>&1
fi
else
echo " [XXXX] rsyslog.conf 파일이 존재하지 않습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "12. /etc/services 파일 소유자 및 권한 설정"
echo "12. /etc/services 파일 소유자 및 권한 설정" >> $CF 2>&1
SO=`ls -l /etc/services | awk '{print $3}'`
SP=`ls -l /etc/services | awk '{print $1}'`
if [ $SO = root ]
then
echo " ==> [안전] services 파일 소유자 : " $SO >> $CF 2>&1
else
echo " ==> [취약] services 파일 소유자 : " $SO >> $CF 2>&1
fi
if [ $SP = -rw-r--r--. ]
then
echo " ==> [안전] services 파일 권한 : " $SP >> $CF 2>&1
else
echo " ==> [취약] services 파일 권한 : " $SP >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "13. SetUID, SetGID, Sticky Bit 설정 파일 검사"
echo "13. SetUID, SetGID, Sticky Bit 설정 파일 검사" >> $CF 2>&1
SF="13-1.SetUID.txt"
SG="13-2.SetGID.txt"
SB="13-3.Sticky_Bit.txt"
find / -user root -perm -4000 2>/dev/null > $SF
find / -user root -perm -2000 2>/dev/null > $SG
find / -user root -perm -1000 2>/dev/null > $SB
echo " 스캔 후 생성된 13-1, 13-2, 13-3.txt 파일을 참고하여 파일을 검사" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "14. 사용자, 시스템 시작파일 및 환경파일 소유자 및 권한 설정"
echo "14. 사용자, 시스템 시작파일 및 환경파일 소유자 및 권한 설정" >> $CF 2>&1
echo " 서버 환경마다 파일들이 다르기 때문에 이를 스크립트로 체크할 경우 오탐 발생이 높음" >> $CF 2>&1
echo " 따라서 수동적인 체크가 필요" >> $CF 2>&1
echo " ==> [권장] 체크 후, 해당 파일이 root와 소유자만이 w 권한이 있도록 설정" >> $CF 2>&1
echo " 수동적인 체크 후, 해당 파일이 root와 소유자 이외에도 w 권한이 있다면 [취약]하다고 판단할 수 있음" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "15. world writable 파일 점검"
echo "15. world writable 파일 점검" >> $CF 2>&1
WW="15-1.World_Writable.txt"
find / -perm -2 -ls 2>/dev/null | awk {'print $3, $11'} > $WW
echo " 생성된 15-1.World_Writable.txt 및 보고서 파일 참조" >> $CF 2>&1
echo " 이 또한 서버 환경마다 다르기 때문에 수동적인 체크가 필요함" >> $CF 2>&1
echo " 다만 기본적으로 시스템에 설치되는 world writable 파일 자체가 상당히 많기 때문에, " >> $CF 2>&1
echo " 15-1.World_Writable.txt 목록(혹시 모를 악의적인 파일 포함)과 기본적으로 생성되는 world writable 파일 간의 비교가 필요함" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "16. /dev에 존재하지 않는 device 파일 점검"
echo "16. /dev에 존재하지 않는 device 파일 점검" >> $CF 2>&1
DF="16-1.Device_file.txt"
find /dev -type f -exec ls -l {} \; > $DF
echo " 생성된 16-1.Device_file.txt 및 보고서 파일 참조" >> $CF 2>&1
echo " 마찬가지로 서버의 환경마다 다르기 때문에 수동적인 체크가 필요함" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "17. $HOME/.rhosts, hosts.equiv 사용 금지"
echo "17. $HOME/.rhosts, hosts.equiv 사용 금지" >> $CF 2>&1
if test -f `ls -l $HOME/.rhosts 2>/dev/null`
then
if test -f `ls -l hosts.equiv 2>/dev/null`
then
echo " ==> [안전] 해당 서비스가 활성화 되어 있지 않습니다" >> $CF 2>&1
else
echo " ==> [취약] 해당 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
else
echo " ==> [취약] 해당 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "18. 접속 IP 및 포트 제한"
echo "18. 접속 IP 및 포트 제한" >> $CF 2>&1
AL="18-1.hosts.allow.txt"
AD="18-2.hosts.deny.txt"
cat /etc/hosts.allow 2>/dev/null > $AL
cat /etc/hosts.deny > $AD
echo " 생성된 18-1.hosts.allow.txt, 18-2.hosts.deny.txt 참조" >> $CF 2>&1
echo " allow는 서버에 접속을 허용할 IP 목록 및 서비스가 들어있음" >> $CF 2>&1
echo " deny는 서버에 접속을 거부할 IP 목록 및 서비스가 들어있음" >> $CF 2>&1
echo " 일반적으로 deny 파일의 우선순위가 높음" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "============================= 서비스 관리 ============================"
echo "============================= 서비스 관리 ============================" >> $CF 2>&1
echo "19. Finger 서비스 비활성화"
echo "19. Finger 서비스 비활성화" >> $CF 2>&1
if test -f /etc/xinetd.d/finger
then
if [ "`cat /etc/xinetd.d/finger | grep disable | awk '{print $3}'`" = yes ]
then
echo " ==> [안전] finger 서비스가 설치되어 있으나 비활성화 되어 있습니다" >> $CF 2>&1
else
echo " ==> [취약] finger 서비스가 설치되어 있고, 활성화 되어 있습니다" >> $CF 2>&1
fi
else
echo " ==> [안전] finger 서비스가 설치되어 있지 않습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "20. Anonymous FTP 비활성화"
echo "20. Anonymous FTP 비활성화" >> $CF 2>&1
if test -f /etc/vsftpd/vsftpd.conf
then
if [ "`cat /etc/vsftpd/vsftpd.conf | grep anonymous_enable | awk -F= '{print $2}'`" = NO ]
then
echo " ==> [안전] FTP에 익명 접속이 불가능합니다" >> $CF 2>&1
else
echo " ==> [취약] FTP에 익명 접속이 가능합니다" >> $CF 2>&1
fi
else
echo " [XXXX] FTP 서비스가 설치되어 있지 않습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "21. r 계열 서비스 비활성화"
echo "21. r 계열 서비스 비활성화" >> $CF 2>&1
echo " 스크립트 상의 진단은 rlogin만 진행" >> $CF 2>&1
echo " 기타 r 계열 서비스 목록은 21-1. r_services.txt 에서 확인" >> $CF 2>&1
if test -f /etc/xinetd.d/rlogin
then
if [ "`cat /etc/xinetd.d/rlogin | grep disable | awk '{print $3}'`" = yes ]
then
echo " ==> [안전] rlogin 서비스가 설치되어 있으나 비활성화 되어 있습니다" >> $CF 2>&1
else
echo " ==> [취약] rlogin 서비스가 설치되어 있고, 활성화 되어 있습니다" >> $CF 2>&1
fi
else
echo " ==> [안전] rlogin 서비스가 설치되어 있지 않습니다" >> $CF 2>&1
fi
RS="21-1.r_services.txt"
ls /etc/xinetd.d/r* 2>/dev/null > $RS
echo
echo >> $CF 2>&1
echo "22. cron 파일 소유자 및 권한 설정"
echo "22. cron 파일 소유자 및 권한 설정" >> $CF 2>&1
if test -f /etc/cron.allow
then
echo " [OOOO] cron.allow 파일이 존재합니다" >> $CF 2>&1
CO=`ls -l /etc/cron.allow | awk '{print $3}'`
CP=`ls -l /etc/cron.allow | awk '{print $1}'`
if [ $CO = root ]
then
echo " ==> [안전] cron.allow 파일 소유자 : " $CO >> $CF 2>&1
else
echo " ==> [취약] cron.allow 파일 소유자 : " $CO >> $CF 2>&1
fi
if [ $CP = -rw-------. ]
then
echo " ==> [안전] cron.allow 파일 권한 : " $CP >> $CF 2>&1
else
if [ $CP = -rw-r--r--. ]
then
echo " ==> [안전] cron.allow 파일 권한 : " $CP >> $CF 2>&1
else
echo " ==> [취약] cron.allow 파일 권한 : " $CP >> $CF 2>&1
fi
fi
else
echo " [XXXX] cron.allow 파일이 존재하지 않습니다" >> $CF 2>&1
echo >> $CF 2>&1
fi
if test -f /etc/cron.deny
then
echo " [OOOO] cron.deny 파일이 존재합니다" >> $CF 2>&1
CO=`ls -l /etc/cron.deny | awk '{print $3}'`
CP=`ls -l /etc/cron.deny | awk '{print $1}'`
if [ $CO = root ]
then
echo " ==> [안전] cron.deny 파일 소유자 : " $CO >> $CF 2>&1
else
echo " ==> [취약] cron.deny 파일 소유자 : " $CO >> $CF 2>&1
fi
if [ $CP = -rw-------. ]
then
echo " ==> [안전] cron.deny 파일 권한 : " $CP >> $CF 2>&1
else
if [ $CP = -rw-r--r--. ]
then
echo " ==> [안전] cron.deny 파일 권한 : " $CP >> $CF 2>&1
else
echo " ==> [취약] cron.deny 파일 권한 : " $CP >> $CF 2>&1
fi
fi
else
echo " [XXXX] cron.deny 파일이 존재하지 않습니다" >> $CF 2>&1
echo >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "23. DoS 공격에 취약한 서비스 비활성화"
echo "23. DoS 공격에 취약한 서비스 비활성화" >> $CF 2>&1
echo " DoS 공격에 취약하다고 알려진 서비스들은 (echo, discard, daytime, chargen) 등이 있음" >> $CF 2>&1
ET=`cat /etc/xinetd.d/echo 2>/dev/null | grep disable | grep no`
DT=`cat /etc/xinetd.d/discard 2>/dev/null | grep disable | grep no`
TT=`cat /etc/xinetd.d/daytime 2>/dev/null | grep disable | grep no`
CT=`cat /etc/xinetd.d/chargen 2>/dev/null | grep disable | grep no`
if [[ -z $ET ]]
then
echo " ==> [안전] echo 서비스가 설치되어 있지 않거나 비활성화 되어 있습니다." >> $CF 2>&1
else
echo " ==> [취약] echo 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
if [[ -z $DT ]]
then
echo " ==> [안전] discard 서비스가 설치되어 있지 않거나 비활성화 되어 있습니다." >> $CF 2>&1
else
echo " ==> [취약] discard 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
if [[ -z $TT ]]
then
echo " ==> [안전] daytime 서비스가 설치되어 있지 않거나 비활성화 되어 있습니다." >> $CF 2>&1
else
echo " ==> [취약] daytime 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
if [[ -z $CT ]]
then
echo " ==> [안전] chargen 서비스가 설치되어 있지 않거나 비활성화 되어 있습니다." >> $CF 2>&1
else
echo " ==> [취약] chargen 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "24. NFS 서비스 비활성화"
echo "24. NFS 서비스 비활성화" >> $CF 2>&1
NC=`ps -ef | egrep "nfs|statd|lockd" | sed '$d' | grep -v kblock`
if [ $NC ]
then
echo " ==> [취약] NFS 서비스가 동작 중입니다." >> $CF 2>&1
echo " > " $NC
else
echo " ==> [안전] NFS 서비스가 동작 중이지 않습니다." >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "25. NFS 접근통제"
echo "25. NFS 접근통제" >> $CF 2>&1
echo " 24번 항목에서 NFS를 비활성화 하는 것을 권장하지만 사용해야 할 경우에는 적절한 접근통제가 필요함" >> $CF 2>&1
echo " 이 경우 관리자(=root)가 NFS 서비스를 설치하면서 공유 디렉터리를 임의로 지정하기 때문에 스크립트로 체크가 불가능" >> $CF 2>&1
echo " ==> [권장] 해당 공유 디렉터리의 권한이 적절한지 수동으로 체크" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "26. automountd 제거"
echo "26. automountd 제거" >> $CF 2>&1
AM=`ps -ef | grep 'automount\|autofs' | sed '$d'`
if [ $AM ]
then
echo " ==> [취약] NFS 서비스가 동작 중입니다." >> $CF 2>&1
echo " > " $AM
else
echo " ==> [안전] NFS 서비스가 동작 중이지 않습니다." >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "27. RPC 서비스 확인"
echo "27. RPC 서비스 확인" >> $CF 2>&1
echo " 다음과 같은 서비스를 제한 (단, 플랫폼에 따라 서비스 명이 다소 다를 수 있음)" >> $CF 2>&1
echo " {sadmin, rpc.*, rquotad, shell. login. exec, talk, time, discard, chargen}" >> $CF 2>&1
echo " {printer, uucp, echo, daytime, dtscpt, finger}" >> $CF 2>&1
echo >> $CF 2>&1
echo " ==> [권장] 위싀 서비스들을 중지하거나, 최신 버전의 패치 적용" >> $CF 2>&1
echo " 위의 서비스들을 중지하거나, 최신 버전의 패치를 적용했을 경우 [안전] 하다고 판단" >> $CF 2>&1
echo " 위의 서비스들을 사용하거나, 최신 버전의 패치를 적용하지 않았을 경우 [취약] 하다고 판단" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "28. NIS, NIS+ 점검"
echo "28. NIS, NIS+ 점검" >> $CF 2>&1
echo " 관리자의 수동적인 점검이 필요함" >> $CF 2>&1
echo " ==> [권장] NIS 보다 데이터 인증이 강화된 NIS+ 사용" >> $CF 2>&1
echo " 점검 후 NIS 보다 데이터 인증이 강화된 NIS+ 사용한다면 [안전] 하다고 판단" >> $CF 2>&1
echo " 점검 후 기본적인 NIS를 사용한다면 [취약] 하다고 판단" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "29. tftp, talk 서비스 비활성화"
echo "29. tftp, talk 서비스 비활성화" >> $CF 2>&1
TP=`cat /etc/xinetd.d/tftp 2>/dev/null | grep disable | grep no`
TK=`cat /etc/xinetd.d/talk 2>/dev/null | grep disable | grep no`
if [[ -z $TP ]]
then
echo " ==> [안전] tftp 서비스가 설치되어 있지 않거나 비활성화 되어 있습니다." >> $CF 2>&1
else
echo " ==> [취약] tftp 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
if [[ -z $TK ]]
then
echo " ==> [안전] talk 서비스가 설치되어 있지 않거나 비활성화 되어 있습니다." >> $CF 2>&1
else
echo " ==> [취약] talk 서비스가 활성화 되어 있습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "30. Sendmail 버전 점검"
echo "30. Sendmail 버전 점검" >> $CF 2>&1
SI=`yum list installed | grep sendmail | awk '{print $1}'`
if [ $SI ]
then
SV=`echo \$Z | /usr/lib/sendmail -bt -d0 | sed -n '1p' | awk '{print $2}'`
echo " [OOOO] 설치된 sendmail의 버전은 $SV 입니다" >> $CF 2>&1
echo " ==> [권장] 최신 버전의 설치 및 업그레이드를 위해 sendmail 데몬의 중지가 필요하기 때문에 적절한 시간대에 수행해야 함" >> $CF 2>&1
else
echo " [XXXX] sendmail이 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "31. 스팸 메일 릴레이 제한"
echo "31. 스팸 메일 릴레이 제한" >> $CF 2>&1
if [ $SI ]
then
SP=`ls -l /etc/mail/access | awk '{print $1}'`
if [ $SP ]
then
SP=`ls -l /etc/mail/access | awk '{print $1}'`
echo " ==> [안전] 스팸 메일 관련 설정 사항이 저장된 파일이 존재합니다" >> $CF 2>&1
echo " ==> [진행] 해당 파일을 DB화 시켜 sendmail 데몬에 인식시키는 작업을 수행합니다" >> $CF 2>&1
makemap hash /etc/mail/access < /etc/mail/access
echo " ==> [완료] 작업을 완료하였습니다" >> $CF 2>&1
else
echo " ==> [취약] 스팸 메일 관련 설정 사항이 명시 된 파일이 존재하지 않습니다" >> $CF 2>&1
fi
else
echo " [XXXX] sendmail이 설치되어 있지 않습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "32. 일반사용자의 Sendmail 실행 방지"
echo "32. 일반사용자의 Sendmail 실행 방지" >> $CF 2>&1
if [ $SI ]
then
SV=`cat /etc/mail/sendmail.cf | grep PrivacyOptions | awk -F= '{print $2}'`
if [ $SV = authwarnings,novrfy,noexpn,restrictqrun ]
then
echo " ==> [안전] 일반사용자의 sendmail 실행 방지가 설정되어 있습니다" >> $CF 2>&1
else
echo " ==> [취약] 일반사용자의 sendmail 실행 방지가 설정되어 있지 않습니다" >> $CF 2>&1
fi
else
echo " [XXXX] sendmail이 설치되어 있지 않습니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "33. DNS 보안 버전 패치"
echo "33. DNS 보안 버전 패치" >> $CF 2>&1
DS=`dig +short @168.126.63.1 porttest.dns-oarc.net TXT | awk -Fis '{print $2}' | awk -F: {'print $1'} | sed '1d' | awk '{print $1}'`
if [ $DS=GOOD -o GREAT ]
then
echo " ==> [안전] DNS 보안 패치가 최신 버전입니다" >> $CF 2>&1
else
echo " ==> [취약] DNS 보안 패치가 구 버전입니다" >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "34. DNS Zone Transfer 설정"
echo "34. DNS Zone Transfer 설정" >> $CF 2>&1
echo " Primary Name Server에는 Zone Transfer를 허용하는 서버를 지정" >> $CF 2>&1
echo " Secondary Server 에는 Zone Transfer를 허용하지 않아야 함" >> $CF 2>&1
echo >> $CF 2>&1
echo " ==> [권장] DNS Zone Transfer를 허가된 사용자에게만 허용해야 함" >> $CF 2>&1
echo " DNS Zone Transfer를 모든 사용자에게 허용했을 경우 [취약] 하다고 판단" >> $CF 2>&1
echo
echo >> $CF 2>&1
echo "35. Apache 디렉터리 리스팅 제거"
echo "35. Apache 디렉터리 리스팅 제거" >> $CF 2>&1
AI=`yum list installed 2>/dev/null | grep httpd | awk '{print $1}'`
if [ "$AI" ]
then
GV=`cat /etc/httpd/conf/httpd.conf | grep Options | sed -n '1p'`
if [[ $GV == *Indexes* ]]
then
echo " ==> [취약] 디렉터리 리스팅이 설정되어 있습니다" >> $CF 2>&1
else
echo " ==> [안전] 디렉터리 리스팅이 설정되어 있지 않습니다" >> $CF 2>&1
fi
else
echo " [XXXX] Apache 서비스가 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "36. Apache 웹 프로세스 권한 제한"
echo "36. Apache 웹 프로세스 권한 제한" >> $CF 2>&1
if [ "$AI" ]
then
UP=`cat /etc/httpd/conf/httpd.conf | grep User | sed -n '3p' | awk '{print $2}'`
GP=`cat /etc/httpd/conf/httpd.conf | grep Group | sed -n '3p' | awk '{print $2}'`
if [ "$UP" != root ]
then
echo " ==> [안전] 현재 설정된 웹 프로세스 User 권한 :" $UP >> $CF 2>&1
else
echo " ==> [취약] 현재 설정된 웹 프로세스 User 권한 :" $UP >> $CF 2>&1
fi
if [ "$GP" != root ]
then
echo " ==> [안전] 현재 설정된 웹 프로세스 Group 권한 :" $GP >> $CF 2>&1
else
echo " ==> [취약] 현재 설정된 웹 프로세스 Group 권한 :" $GP >> $CF 2>&1
fi
else
echo " [XXXX] Apache 서비스가 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "37. Apache 상위 디렉터리 접근 금지"
echo "37. Apache 상위 디렉터리 접근 금지" >> $CF 2>&1
if [ "$AI" ]
then
GC=`cat /etc/httpd/conf/httpd.conf | grep AllowOverride | sed -n '1p' | awk '{print $2}'`
if [ $GC = AuthConfig ]
then
echo " ==> [안전] 디렉터리별 사용자 인증이 설정되어 있습니다" >> $CF 2>&1
echo >> $CF 2>&1
echo " 사용자 인증이 필요한 디렉터리에 다음의 지시자들이 포함된 .htaccess 파일 생성" >> $CF 2>&1
echo " ***************************************************************" >> $CF 2>&1
echo " * 지시자 * 설명 **" >> $CF 2>&1
echo " ***************************************************************" >> $CF 2>&1
echo " * AuthType * 인증 형태 (Baisc / Digest) *" >> $CF 2>&1
echo " * AuthName * 인증 영역 (웹 브라우저의 인증창에 표시) *" >> $CF 2>&1
echo " * AuthUserFile * 사용자 패스워드 파일의 위치 *" >> $CF 2>&1
echo " * AuthGroupFile * 그룹 파일의 위치 (옵션) *" >> $CF 2>&1
echo " * Require * 접근을 허용할 사용자 / 그룹 정의 *" >> $CF 2>&1
echo " ***************************************************************" >> $CF 2>&1
echo " ***************************************************************" >> $CF 2>&1
echo " .htaccess 파일의 예제는 다음과 같음" >> $CF 2>&1
echo " ***************************************" >> $CF 2>&1
echo " # vi .htaccess" >> $CF 2>&1
echo " AuthType Basic" >> $CF 2>&1
echo " AuthName \"Welcome to AnonSE Server\"" >> $CF 2>&1
echo " AuthUserFile /etc/shadow" >> $CF 2>&1
echo " Require valid-user " >> $CF 2>&1
echo " ***************************************" >> $CF 2>&1
else
echo " ==> [취약] 디렉터리별 사용자 인증이 설정되어 있지 않습니다" >> $CF 2>&1
fi
else
echo " [XXXX] Apache 서비스가 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "38. Apache 불필요한 파일 제거"
echo "38. Apache 불필요한 파일 제거" >> $CF 2>&1
if [ "$AI" ]
then
echo " ==> [권장] 웹 서버를 정기적으로 검사하여 불필요한 파일을 제거" >> $CF 2>&1
else
echo " [XXXX] Apache 서비스가 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "39. Apache 링크 사용 금지"
echo "39. Apache 링크 사용 금지" >> $CF 2>&1
if [ "$AI" ]
then
GV=`cat /etc/httpd/conf/httpd.conf | grep Options | sed -n '1p'`
if [[ $GV == *FollowSymLinks* ]]
then
echo " ==> [취약] Apache 상에서 심볼릭 링크 사용이 설정되어 있습니다" >> $CF 2>&1
else
echo " ==> [안전] Apache 상에서 심볼릭 링크 사용이 설정되어 있지 않습니다" >> $CF 2>&1
fi
else
echo " [XXXX] Apache 서비스가 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "40. Apache 파일 업로드 및 다운로드 제한"
echo "40. Apache 파일 업로드 및 다운로드 제한" >> $CF 2>&1
if [ "$AI" ]
then
US=`cat /etc/php.ini 2>/dev/null | grep post_max_size | awk '{print $3}'`
DS=`cat /etc/httpd/conf/httpd.conf 2>/dev/null | grep LimitRequestBody`
if [ $US ]
then
echo " ==> [안전] 업로드 가능한 파일의 최대 용량 : "$US >> $CF 2>&1
else
echo " ==> [취약] 업로드 가능한 파일의 최대 용량 : 제한없음" >> $CF 2>&1
fi
if [ $DS ]
then
echo " ==> [안전] 다운로드 가능한 파일의 최대 용량 : "$DS >> $CF 2>&1
else
echo " ==> [취약] 다운로드 가능한 파일의 최대 용량 : 제한없음" >> $CF 2>&1
fi
else
echo " [XXXX] Apache 서비스가 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo >> $CF 2>&1
echo "41. Apache 웹 서비스 영역 분리"
echo "41. Apache 웹 서비스 영역 분리" >> $CF 2>&1
if [ "$AI" ]
then
DR=`cat /etc/httpd/conf/httpd.conf | grep DocumentRoot | sed -n '2p' | awk '{print $2}'`
DD="/var/www/html"
if [ $DR=$DD ]
then
echo " ==> [취약] DocumentRoot에 설정된 디렉터리 : $DR" >> $CF 2>&1
else
echo " ==> [안전] DocumentRoot에 설정된 디렉터리 : $DR" >> $CF 2>&1
fi
else
echo " [XXXX] Apache 서비스가 설치되어 있지 않습니다 " >> $CF 2>&1
fi
echo
echo
echo >> $CF 2>&1
echo >> $CF 2>&1
echo "============================== 패치 관리 ============================="
echo "============================== 패치 관리 =============================" >> $CF 2>&1
echo "42. 최신 보안패치 및 벤더 권고사항 적용"
echo "42. 최신 보안패치 및 벤더 권고사항 적용" >> $CF 2>&1
echo " ==> [권장] 'yum update (-y)' 명령어를 사용하여 설치된 패키지의 최신 패치를 설치" >> $CF 2>&1
echo
echo
echo >> $CF 2>&1
echo >> $CF 2>&1
echo "============================== 로그 관리 ============================="
echo "============================== 로그 관리 =============================" >> $CF 2>&1
echo "43. 로그의 정기적 검토 및 보고"
echo "43. 로그의 정기적 검토 및 보고" >> $CF 2>&1
echo " ==> [권장] 로그 기록에 대해 정기적 검토, 분석, 이에 대한 리포트 작성 및 보고" >> $CF 2>&1
echo
echo
echo >> $CF 2>&1
echo >> $CF 2>&1
echo "************************** 취약점 체크 종료 **************************"
echo "************************** 취약점 체크 종료 **************************" >> $CF 2>&1
반응형
'보안이슈' 카테고리의 다른 글
XSS 취약점을 방어하기 위해 콘텐츠 보안 정책(CSP) 적용 (1) | 2024.09.27 |
---|---|
Linux 용 멀웨어(Malware) 스캐너 도구 (0) | 2020.09.23 |
letsencrypt ssl 발급, 추가, 삭제 (0) | 2019.07.24 |
LINUX MALWARE DETECT (0) | 2019.01.22 |
Let’s encrypt 설치 및 운용(CentOS) (0) | 2018.12.11 |
댓글