Shell 腳本分享之 history 命令加固

用戶管理是 Linux 基礎運維的必備工作,下面的腳本完成的功能是對系統用戶登錄權限、密碼規則、歷史命令、關鍵配置文件進行安全加固。腳本是在 CentOS7 環境下編寫的,如果系統版本不同可能需要稍加改動。

#!/bin/bash
# Linux自動化配置系統加固腳本
read -p "設置密碼最大使用天數:" A
sed -i "/^PASS_MAX_DAYS/c\PASS_MAX_DAYS ${A}" /etc/login.defs
read -p "密碼更改之間允許的最少天數" B
sed -i "/^PASS_MIN_DAYS/c\PASS_MIN_DAYS ${B}" /etc/login.defs
read -p "設置密碼最短長度:" C
sed -i "/^PASS_MIN_LEN/c\PASS_MIN_LEN ${C}" /etc/login.defs
read -p "設置密碼過期提前警告天數:" D
sed -i "/^PASS_WARN_AGE/c\PASS_WARN_AGE ${D}" /etc/login.defs
read -p "設置歷史命令保存條目:" E
sed -i "/^HISTSIZE/c\HISTSIZE=$E" /etc/profile
read -p "設置用戶無操作自動註銷時間(秒):" F
sed -i "/^HISTSIZE/a\TMOUT=$F" /etc/profile
# 設置密碼複雜度加固,新密碼必須同時包含數字、小寫字母、大寫字母、且新密碼不能和舊密碼相同
# difok=N 默認值爲10。這個參數設置允許的新、舊密碼相同字符的個數。
# retry=N 改密碼時,輸入密碼的次數,默認值是1
# dcredit=N 限制新密碼中至少有多少個數字。參數的值如果爲負數,例如dcredit=-2,則表示密碼中最少需要2位數字
# ucredit=N 限制新密碼中至少有多少個大寫字符。
# lcredit=N 限制新密碼中至少有多少個小寫字符。
# ocredit=N:定義用戶密碼中必須包含多少個特殊字符(除數字、字母之外)
# minlen=10實際上表示最小分數爲10,而不是簡單的最小長度爲10。密碼每有一個任意字符會有一分,另外,ucredit/lcredit/dcredit/ocredit默認值均爲1,表示密碼中四種字符的類別數,每多一種,就會得到額外的一分。
echo "設置新密碼複雜度加固:必須同時包含數字、小寫字母、大寫字母、且新密碼不能和舊密碼相同"
sed -i "/pam_pwquality.so/c\password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= difok=6 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1" /etc/pam.d/system-auth
echo "設置防暴力破解加固:輸入密碼錯誤次數超過3次,普通用戶鎖定120秒,root用戶鎖定300秒!"
n=$(grep -c "pam_tally2.so" /etc/pam.d/sshd)
if [ "$n" -eq 0 ]; then
    # deny=3 登錄拒絕三次
    # unlock_time=120 普通用戶鎖定後等待時間,120s
    # even_deny_root root用戶登錄失敗三次也會被鎖定
    # root_unlock_time=300 root用戶鎖定後等待時間,300s
    sed -i "/%PAM-1.0/a\auth        required        pam_tally2.so deny=3 unlock_time=120 even_deny_root root_unlock_time=300" /etc/pam.d/sshd
fi
n=$(grep -c "pam_wheel.so" /etc/pam.d/sshd)
echo "設置禁止root用戶遠程登錄"
sed -i "/PermitRootLogin/c\PermitRootLogin no" /etc/ssh/sshd_config
echo "設置只允許wheel組的用戶可以使用su命令切換到root用戶"
sed -i "/pam_wheel.so use_uid/c\auth           required        pam_wheel.so use_uid" /etc/pam.d/su
n=$(grep -c "SU_WHEEL_ONLY" /etc/login.defs)
if [ "$n" -eq 0 ]; then
    echo "SU_WHEEL_ONLY yes" >>/etc/login.defs
fi
# 重啓sshd,使配置生效
service sshd restart
echo "***********************************************"
echo "即將檢查系統中的賬戶"
echo "系統中有登錄權限的用戶有:"
awk -F: '($7=="/bin/bash") {print $1}' /etc/passwd
echo "***********************************************"
echo "系統中UID=0的用戶有:"
awk -F: '($3=="0") {print $1}' /etc/passwd
echo "***********************************************"
echo "請爲當前系統中UID大於等於1000且沒有密碼的用戶設置密碼:"
npass_user=($(awk -F: '($3>=1000) {print $1}' /etc/passwd))
for uname in "${npass_user[@]}"; do
    user=$(awk -F : -v auname="${uname}" '($1==auname)&&($2=="!!") {print $1}' /etc/shadow)
    if [ -n "${user}" ]; then
        read -p "是否爲${user}設置密碼,請輸入YES/NO:" npass_flag
        if [[ "${npass_flag}" = [Yy][Ee][Ss] ]]; then
            passwd "$user"
        fi
    fi
done
echo "即將對系統中重要文件進行鎖定,鎖定後將無法添加、刪除用戶和組"
read -p "警告:此腳本運行後將無法添加和刪除用戶和組,確定輸入Y,取消輸入N:" chattr_flag
case "${chattr_flag}" in
[Y,y])
    chattr +i /etc/passwd
    chattr +i /etc/group
    chattr +i /etc/shadow
    chattr +i /etc/gshadow
    echo "鎖定passwd、shadow、group、gshadow!"
    ;;
[N,n])
    chattr -i /etc/passwd
    chattr -i /etc/group
    chattr -i /etc/shadow
    chattr -i /etc/gshadow
    echo "未鎖定passwd、shadow、group、gshadow!"
    ;;
*) 
    echo "請輸入Y/y or N/n"
esac

各位如果對腳本語法、功能有疑問歡迎各位移步到公衆號後臺留言。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/wA4ii1eRkHRxfb3-7ciN9w