Linux 編寫安全巡檢腳本 檢測/etc/passwd,/etc/shadow文件是否鎖定 檢測/etc/login.defs配置文件中密碼有效期設置是否得當 檢查所有用戶賬戶(非系統賬戶)中是否存在密碼永久有效問題(檢查/etc/shadow文件每一行中的密碼期限值) 檢查系統預設歷史命令記錄條 ...
Linux 編寫安全巡檢腳本
檢測/etc/passwd,/etc/shadow文件是否鎖定
檢測/etc/login.defs配置文件中密碼有效期設置是否得當
檢查所有用戶賬戶(非系統賬戶)中是否存在密碼永久有效問題(檢查/etc/shadow文件每一行中的密碼期限值)
檢查系統預設歷史命令記錄條數(/etc/profile)和管理員帳號的歷史命令條數(~/.bash_logout)是否存在安全隱患
檢查終端自動註銷功能是否啟用,自動註銷配置文件分為系統配置文件(/etc/profile)和各個用戶自己的配置文件(~/.bash_profile)
檢查系統預設管理員賬號是否為root(用戶ID、組ID為0)
檢查是否禁用重啟熱鍵Ctrl+Alt+Del功能
檢查su用戶切換認證功能是否啟用
檢查grub.conf文件中是否開啟加密功能“password --md5
檢查系統是否有足夠的磁碟空間
檢查開放的終端個數
系統弱口令檢測,調用john
埠掃描功能,調用nmap
###檢測/etc/passwd,/etc/shadow文件是否鎖定 lock=$(lsattr /etc/passwd /etc/shadow |grep i |wc -l) if [ $lock -ne 2 ] then echo "該系統中的賬戶和密碼配置文件沒有鎖定,存在安全隱患!" fi ###檢測/etc/login.defs配置文件中密碼有效期設置是否得當 day=$(grep "^PASS_MAX_DAYS" /etc/login.defs |awk '{print $2}') if [ $day -gt 30 ] then echo "/etc/login.defs該配置文件中賬戶有效期設置大於30天,存在安全隱患!" fi ###檢查所有用戶賬戶(非系統賬戶)中是否存在密碼永久有效問題(檢查/etc/shadow文件每一行中的密碼期限值) #1.首先在/etc/passwd文件中找到所有非系統帳號(uid>500和root賬戶),導入到一個文件 awk -F: '{if($3>=500|| $3==0) print $1}' /etc/passwd >account.txt #2.迴圈遍歷account.txt文件,過濾/etc/shadow中存在和account.txt文件一樣的賬戶 for i in $(cat account.txt) do grep "^$i" /etc/shadow |awk -F: '{if($5>30) print ""$1"" ":賬戶存在密碼有效期大於30天安全隱患!"}' done ###檢查系統預設歷史命令記錄條數(/etc/profile)和管理員帳號的歷史命令條數(~/.bash_logout)是否存在安全隱患 history_num=$(grep "^HISTSIZE" /etc/profile |awk -F= '{print $2}') num=$(grep "history -c" /root/.bash_logout |wc -l) if [ $history_num -gt 100 ]||[ $num -eq 0 ] then echo "該系統預設歷史記錄存在安全隱患!" fi ###檢查終端自動註銷功能是否啟用,自動註銷配置文件分為系統配置文件(/etc/profile)和各個用戶自己的配置文件(~/.bash_profile) #1.首先檢測系統配置文件/etc/profile是否有啟用終端自動註銷 #2.如何系統配置文件沒有啟用終端自動註銷,然後在迴圈檢查各個賬戶的配置文件是否啟用終端自動註銷功能 timeout=$(grep "^export TMOUT" /etc/profile) #-n是判斷一個變數是否是否有值 if [ ! -n "$timeout" ] then #得到位於/home目錄下用戶賬戶的個數,-w 統計單詞的個數 cd /home n=$(ls |wc -w) #把/home下的所有賬戶名導入到一個文件 ls >/root/user.txt for((i=1;i<=$n;i++)) do for j in $(cat /root/user.txt) do TMout=$(grep "^export TMOUT" /home/$j/.bash_profile) if [ ! -n "$TMout" ] then echo "賬戶$j沒有啟用終端自動註銷,存在安全隱患!" fi done break done fi ###檢查系統預設管理員賬號是否為root(用戶ID、組ID為0) awk -F: '{if($3 == 0 && $4 == 0 && $2="root") print "root是預設管理員!" }' /etc/passwd ###檢查/etc/passwd文件中是否存在多餘的超級用戶賬號(用戶ID、組ID為0) awk -F: '{if($3 == 0 && $1 != "root") print ""$1"賬戶具有管理員許可權" }' /etc/passwd ###檢查/etc/passwd文件中是否有可疑賬號(是否存在多餘的賬號) #1.事先備份一份/etc/passwd文件,然後添加帳號測試,把添加帳號之後/etc/passwd配置文件與之前備份的文件進行逐行逐個對比(每行中每個節點),存在異常,提示哪個帳號有問題 ###檢查是否禁用重啟熱鍵Ctrl+Alt+Del功能 start_shutdown=$(grep "^#start on control-alt-delete" /etc/init/control-alt-delete.conf) exec_shutdown=$(grep "^#exec /sbin/shutdown" /etc/init/control-alt-delete.conf) if [ ! -n "$start_shutdown" ]&&[ ! -n "$exec_shutdown" ] then echo "該系統沒有禁用重啟熱鍵,存在安全隱患!" fi ###檢查su用戶切換認證功能是否啟用 pam_wheel=$(grep "pam_wheel.so use_uid" /etc/pam.d/su) if [ ! -n "$pam_wheel" ] then echo "該系統沒有啟用su切換用戶認證,存在安全隱患!" else #NF 當前記錄中的欄位個數,就是有多少列 num_in_wheel=$(cat /etc/group |grep wheel |awk -F: '{print $4}'|awk -F "," '{print NF}') if [ $num_in_wheel -gt 2 ] then echo "太多用戶能切換到root,存在安全隱患!" fi fi ###檢查grub.conf文件中是否開啟加密功能“password --md5 passwd_grub=$(grep "password" /boot/grub/grub.conf) if [ ! -n "$passwd_grub" ] then echo "grub菜單沒有開啟加密功能,存在安全隱患!" fi ###檢查系統是否有足夠的磁碟空間 #該變數用於獲取磁碟的已使用空間的百分比值 Usedspace=$(df -hT | grep "/$" | awk '{print $6}' | awk -F% '{print $1}') if [ $Usedspace -gt 80] then echo "你的磁碟空間已不足,請清理磁碟!" else echo "你的磁碟空間很充足!已用空間為$Usedspace%" fi ###檢查開放的終端個數 tty_num=$(grep "^env ACTIVE_CONSOLES" /etc/init/start-ttys.conf|awk -F "-" '{print $2}'|awk -F "]" '{print $1}') echo "開放$tty_num個終端" ###系統弱口令檢測,調用john #通過find查找john是否存在,存在說明john已經安裝 exist_john=$(find / -name john) if [ ! -n "$exist_john" ] then #不存在,編譯安裝john tar zxvf /tmp/john-1.8.0.tar.gz -C /usr/src cd /usr/src/john-1.8.0/src echo "該系統沒有安裝john,正在安裝,請稍等......" make clean linux-x86-64 &>/dev/null echo "該系統已經安裝完john" cd /usr/src/john-1.8.0/run/ cp /etc/shadow /root #用自己的字典 --worldlist ./john --wordlist=/root/dict.txt /root/shadow else cd /usr/src/john-1.8.0/run/ cp /etc/shadow /root #用自己的字典 ./john --wordlist=/root/dict.txt /root/shadow fi ###埠掃描功能,調用nmap exist_nmap=$(find / -name nmap) if [ ! -n "$exist_nmap" ] then #不存在nmap則安裝,通過搭建本地yum倉庫安裝 mount /dev/sr0 /mnt &>/dev/null #搭建本地倉庫 cd /etc/yum.repos.d cat >>yuzly.repo<<OK [yuzly] name=yuzly baseurl=file:///mnt enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release OK #安裝nmap echo "該系統沒有安裝nmap,正在安裝nmap,請稍等....." yum -y install nmap &>/dev/null nmap -p 135,136,137,138,139,445,21,23,3389 192.168.133.130 else nmap -p 135,136,137,138,139,445,21,23,3389 192.168.133.130 fi
#檢測/etc/passwd文件中是否和root用戶的uid相同,或者是否同時存在兩個uid一樣的用戶 echo "帳號存在安全隱患,該賬戶為root賬戶:" awk -F: '{if($3 == 0 && $1 != "root") print $1 }' /etc/passwd #檢測/etc/passwd文件中,是否存在密碼占位符(x)被修改 echo "帳號存在安全隱患,該帳號存在密碼占位符(x)被修改!:" awk -F: '{if($2!="x" && $3>=500) print $1}' /etc/passwd #檢測賬戶是否存在未設密碼 #檢測哪些賬戶空口令(賬戶被鎖定) echo "賬戶沒有密碼!:" awk -F: '{if($2=="!!") print $1}' /etc/shadow #檢測那些賬戶是空密碼賬戶 echo "空密碼賬戶:" awk -F: '{if($2=="") print $1}' /etc/shadow #檢測失效時間 echo "以下賬戶密碼沒有失效時間:" awk -F: '{if($7=="") print $1}' /etc/shadow #檢測密碼是否永久有效 echo "下麵密碼是否永久有效,存在安全風險:" awk -F: '{if($5==99999) print $1}' /etc/shadow #檢測系統內置賬戶中以/bin/bash結尾的賬戶是否被鎖定 grep "/bin/bash$" /etc/passwd | awk -F: '{print $1}' >>account1.txt Name=$(cat account1.txt) cat /etc/shadow |grep "^$Name" |awk '{print $1}'>>account2.txt cat account2.txt | awk -F: '($2~/^!!/){print ""$1"" ":是以/bin/bash結尾已被鎖定的賬戶"}'