Anolis 8.2版本操作系统安全加固

此脚本暂未作操作系统判断,请根据系统实际情况自行进行修改  略有缺陷 欢迎大佬指正错误

执行过程中会配置禁止root远程登录 请确保有普通账户, 如果没有普通账户存在脚本会自动创建apprun账号 密码存储于:/tmp/apprun_password.txt文件中 请及时保存 该新建账户有su权限

#版本:1.0
#日期:2024-10-17
#描述:
#此脚本针对BigCloud Enterprise Linux 8.2 版本
#用于增强系统安全性,主要执行以下操作
#1	检查是否限制root远程登录
#2	检查登录提示-是否更改telnet警告Banner
#3	检查登录提示-是否设置ssh警告Banner
#4	检查系统口令长度及构成字符要求
#5	检查是否开启反向路径过滤
#6	检查系统是否不存开发编译及网络嗅探类工具
#7	检查登录提示-是否设置登录成功后警告Banner
#8	检查是否设置登录超时
#9	检查是否配置ntp
#10	检查是否开启命令及登录失败记录
#11	检查口令重复次数限制
#12	检查是否设置使用SSH V2版本进行远程登录
#13	检查是否按角色进行帐号管理
#14	检查是否禁止icmp重定向
#15	检查用户缺省UMASK
#16	检查是否按用户分配账号责任到人
#17	检查是否可以对日志大小进行配置
#18	检查口令生存周期要求
#19	检查SSH是否使用业界认可的加密算法
#20	检查是否设置限制su命令用户组
##脚本暂无回退机制,生产环境请审慎使用,建议在测试环境或镜像重生环境测试无误后再用
#注意: 请在管理员权限的用户下运行此脚本。
#此脚本无法配置检查口令锁定策略和检查是否设置重复登录失败后锁定时间限制这两项
#原因是 bclinux内置没有pam_tally2.so 请不要盲目添加!!!!!!!

#检查系统是否不存开发编译及网络嗅探类工具 项目有些问题 有大佬知道是怎么回事的话麻烦给帮忙解下惑哈~~~

#!/bin/bash

clear
export LANG="en_US.UTF-8"
date_time=$(date +%Y%m%d-%H%M%S)
OLD_IFS=$IFS
IFS=$' '

# 定义颜色变量(如果需要)
color_Y="\e[33m"
color_0="\e[0m"
color_R="\e[31m"
color_G="\e[32m"


#判断是否root用户
if [ $(id -u) != "0" ] ; then
    echo -e "\n"
    echo -e `date +%Y-%m-%d_%H:%M:%S` $color_R"ERROR"$color_0 "当前用户为普通用户,必须使用root用户运行,脚本退出. . ."
    sleep 0.25
    echo -e "\n"
    exit
fi

    echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 $color_C"即将进行服务器初始化基线升级操作"$color_0
    echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 $color_C"请复制一个连接窗口以备不时之需,或自行配置Telnet服务预留另一个远程连接通道。"$color_0
    echo -en `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 $color_C"脚本即将开始,如暂不进行基线合规加固请在倒计时结束前按Ctrl+C终止脚本,倒计时: "$color_0
    count=6
    tput sc
    while true
    do
        if [ $count -ge 1 ] ; then
            let count--
            sleep 1
            tput rc
            tput ed
            echo -en $color_R"$count "$color_0
        else
            break
        fi
    done
    echo -e ""

    echo -e ""


# 设定日期格式
backup_date=$(date +%y%m%d)

# 输出开始信息
echo -e "$(date +%Y-%m-%d_%H:%M:%S) ${color_Y}INFO${color_0} 正在检查用户缺省UMASK..."
sleep 0.25

# 备份 /etc/profile
profile_backup="/etc/profile_$backup_date"
cp /etc/profile "$profile_backup"
echo "已备份 /etc/profile 到 $profile_backup"
sleep 0.25

# 修改 /etc/profile
if ! grep -q 'umask 027' /etc/profile; then
    sed -i 's/umask\s\+[0-9]\{3\}/umask 027/' /etc/profile
    echo "已修改所有 umask 为 027 在 /etc/profile"
    sleep 0.25
else
    echo "已存在 'umask 027' 在 /etc/profile"
    sleep 0.25
fi

# 备份 /etc/bashrc
bashrc_backup="/etc/bashrc_$backup_date"
cp /etc/bashrc "$bashrc_backup"
echo "已备份 /etc/bashrc 到 $bashrc_backup"
sleep 0.25

# 修改 /etc/bashrc
if grep -q 'umask' /etc/bashrc; then
    if grep -q 'umask\s*027' /etc/bashrc; then
        echo "已存在 umask 027 在 /etc/bashrc,未作任何修改"
        sleep 0.25
    else
    # 使用 sed 修改所有 umask 的行
        sed -i 's/umask\s\+[0-9]\{3\}/umask 027/' /etc/bashrc
        echo "已修改所有 umask 为 027 在 /etc/bashrc"
        sleep 0.25
    fi
else
    echo "未找到 umask 设置,在 /etc/bashrc 中添加 umask 027"
    echo 'umask 027' >> /etc/bashrc
    sleep 0.25
fi

# 备份 /etc/login.defs
login_defs_backup="/etc/login.defs_$backup_date"
cp /etc/login.defs "$login_defs_backup"
echo "已备份 /etc/login.defs 到 $login_defs_backup"

# 修改 /etc/login.defs
if ! grep -q 'UMASK\s\+027' /etc/login.defs; then
    sed -i 's/UMASK\s\+077/UMASK\t027/' /etc/login.defs
    echo "已修改 UMASK 为 027 在 /etc/login.defs"
    sleep 0.25
else
    echo "已存在 UMASK 为 027 在 /etc/login.defs"
    sleep 0.25
fi
# 输出完成信息
echo -e "$(date +%Y-%m-%d_%H:%M:%S) ${color_G}检查用户缺省UMASK已完成${color_0}"
sleep 0.5
echo -e ""


echo -e "$(date +%Y-%m-%d_%H:%M:%S) ${color_Y}INFO${color_0} 正在检查 /home/ 目录下是否有 UID 大于等于 1000 的新用户..."
sleep 0.25

# 定义密码存储文件路径
PASSWORD_FILE="/tmp/apprun_password.txt"

# 检查 /home 下是否存在 UID 大于等于 1000 的用户
if getent passwd | awk -F: '{ if ($3 >= 1000 && $6 ~ /^\/home/) print $1 }' | grep -q .; then
    echo "在 /home 目录下发现了 UID 大于等于 1000 的用户,无需创建 apprun 用户。"
else
    # 创建 apprun 用户
    echo "未找到符合条件的用户,正在创建 apprun 用户..."
    sudo useradd -m apprun

    # 生成随机密码
    PASSWORD=$(openssl rand -base64 12)

    # 设置密码
    echo "apprun:$PASSWORD" | sudo chpasswd
    sudo usermod -aG wheel apprun

    # 将密码存储到指定文件
    echo "apprun:$PASSWORD" > "$PASSWORD_FILE"
    sleep 0.25
    chmod 600 "$PASSWORD_FILE"  # 只允许用户读取

    # 输出生成的密码存储位置
    echo -e "${color_R}成功创建用户 apprun,密码已存储在: $PASSWORD_FILE 请记录后及时删除文件${color_0}"
    sleep 0.25
fi

echo -e "$(date +%Y-%m-%d_%H:%M:%S) ${color_G}是否配置新用户检查完成。${color_0}"
    sleep 0.5   
    echo -e ""


echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "正在检查是否限制root远程登录。。。"
	sleep 0.25

# 获取当前日期
backup_date=$(date +%y%m%d)
backup_file="/etc/ssh/sshd_config_$backup_date"

# 检查备份文件是否存在
if [ ! -f "$backup_file" ]; then
    # 进行备份
    cp -p /etc/ssh/sshd_config "$backup_file"
    echo "备份文件已创建: $backup_file"  
		sleep 0.25
fi

# 检查是否限制 root 登录
if grep -q '^PermitRootLogin no' /etc/ssh/sshd_config; then
    echo "root 登录已被限制,未做任何修改。"  
		sleep 0.25
else
    # 修改配置文件限制 root 登录
    sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
    echo "已修改配置文件以限制 root 远程登录。"  
		sleep 0.25
    # 重启 sshd 服务
    systemctl restart sshd
    echo "sshd 服务正在重启。" 
	sleep 0.5	
fi
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"限制root用户远程登录检查完成"$color_0   
    sleep 0.5   
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "正在检查登录提示-是否更改telnet警告Banner。。。"
    echo " Authorized users only. All activity may be monitored and reported " > /etc/issue
    echo "/etc/issue 文件已更新。"
    sleep 0.25
    echo " Authorized users only. All activity may be monitored and reported " > /etc/issue.net
    echo "/etc/issue.net 文件已更新。"
    sleep 0.25
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"是否更改telnet警告Banner检查完成"$color_0
    sleep 0.5
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "正在检查登录提示-是否设置ssh警告Banner。。。"
#定义banner文件和配置文件路径
 BANNER_FILE="/etc/sshbanner"
 SSHD_CONFIG="/etc/ssh/sshd_config"
 BANNER_LINE="Banner /etc/sshbanner"

#检查/etc/ssh/sshd_config中是否有 Banner /etc/sshbanner
    if grep -q "^Banner /etc/sshbanner" "$SSHD_CONFIG"; then
	echo "SSH Banner 已配置,无需更改。"
	sleep 0.25
    else
	echo "未找到 SSH Banner 配置。正在创建 SSH Banner 文件。。。"
	sleep 0.25
	#创建ssh banner文件
	touch "$BANNER_FILE"
	chown bin:bin "$BANNER_FILE"
	chmod 644 "$BANNER_FILE"
	echo " Authorized users only. All activity may be monitored and reported " > "$BANNER_FILE"

	#修改/etc/ssh/sshd_config文件
	if grep -q "^#Banner none" "$SSHD_CONFIG"; then
	    sed -i "/^#Banner none/a $BANNER_LINE" "$SSHD_CONFIG"
	    echo "已在 /etc/ssh/sshd_config 中添加 SSH Banner 配置。"
	    sleep 0.25
	else 
	    echo "未找到 #Banner none 行,尝试在文件末尾添加 SSH Banner 配置。"
            echo "$BANNER_LINE" >> "$SSHD_CONFIG"
	    sleep 0.25
	fi
	#重启sshd服务
	systemctl restart sshd
	sleep 0.25
	echo "sshd 服务已重启"
    fi
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"是否设置ssh警告Banner检查完成"$color_0
    sleep 0.5
    echo -e ""

































echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查系统口令长度及构成字符要求. . ."
	sleep 0.25 
# 配置文件路径
CONFIG_FILE="/etc/security/pwquality.conf"

# 检查文件是否存在
if [[ ! -f "$CONFIG_FILE" ]]; then
    echo "文件 $CONFIG_FILE 不存在。 脚本退出" >> "$LOG_ERROR"
    exit 1
fi

# 定义期望的配置项
declare -A EXPECTED_CONFIG=(
    ["minlen"]="8"
    ["lcredit"]="-1"
    ["ucredit"]="-1"
    ["dcredit"]="-1"
    ["ocredit"]="-1"
    ["enforce_for_root"]="1"  # 1 表示启用,0 表示禁用
)

# 修改标志
MODIFIED=false

# 检查每个配置项
for key in "${!EXPECTED_CONFIG[@]}"; do
    value=$(grep -E "^\s*$key\s*=\s*" "$CONFIG_FILE" | awk -F= '{print $2}' | xargs)
    
    if [[ "$value" != "${EXPECTED_CONFIG[$key]}" ]]; then
        echo "配置项 $key 的值不正确: 期望 ${EXPECTED_CONFIG[$key]},实际 $value"  
		sleep 0.25
        
        # 修改配置
        if [[ -n "$value" ]]; then
            # 找到并替换现有配置 
            sed -i "s/^\s*$key\s*=.*/$key = ${EXPECTED_CONFIG[$key]}/" "$CONFIG_FILE"  
        else
            # 添加新配置
            echo "$key = ${EXPECTED_CONFIG[$key]}" | sudo tee -a "$CONFIG_FILE" > /dev/null
        fi
        
        MODIFIED=true
        echo "已修改配置项 $key 为 ${EXPECTED_CONFIG[$key]}" 
		sleep 0.25		
    else 
        echo "配置项 $key 正确: $value"  
		sleep 0.25
    fi
done
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"系统口令长度及构成字符要求检查完成"$color_0
    sleep 0.5
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否禁止icmp重定向。。。"

# 备份 sysctl.conf 文件
backup_file="/etc/sysctl.conf_bak"

if [ ! -f "$backup_file" ]; then
    cp -p /etc/sysctl.conf "$backup_file"
    echo "备份文件已创建: $backup_file"
    sleep 0.25
else
    echo "备份文件已存在: $backup_file,未进行备份。"
    sleep 0.25
fi

# 要添加的配置
config_line="net.ipv4.conf.all.accept_redirects=0"

# 检查 sysctl.conf 文件中是否已经包含该配置
if grep -qF "$config_line" /etc/sysctl.conf; then
    echo "配置已存在: $config_line,未作任何修改。"
    sleep 0.25
else
    # 添加配置到文件中
    echo "$config_line" >> /etc/sysctl.conf
    sysctl -w net.ipv4.conf.all.accept_redirects=0
    echo "已添加配置: $config_line"
    sleep 0.25
fi

# 使得配置生效
sysctl -p >  /dev/null
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"是否禁止icmp重定向检查完成"$color_0

    sleep 0.5
    echo -e ""


echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否开启反向路径过滤。。。"
    sleep 0.25
# 定义要检查的参数
RP_FILTER_ALL="net.ipv4.conf.all.rp_filter"
RP_FILTER_DEFAULT="net.ipv4.conf.default.rp_filter"

# 获取当前值
CURRENT_ALL=$(sysctl -n $RP_FILTER_ALL)
CURRENT_DEFAULT=$(sysctl -n $RP_FILTER_DEFAULT)

# 检查并修改 net.ipv4.conf.all.rp_filter
if [ "$CURRENT_ALL" -ne 1 ]; then
    echo "$RP_FILTER_ALL 的当前值为 $CURRENT_ALL,正在修改为 1..."
    sleep 0.25
    sysctl -w $RP_FILTER_ALL=1
    echo "$RP_FILTER_ALL 已修改为 1"
else
    echo "$RP_FILTER_ALL 的当前值为 $CURRENT_ALL,无需修改。"
        sleep 0.25
fi

# 检查并修改 net.ipv4.conf.default.rp_filter
if [ "$CURRENT_DEFAULT" -ne 1 ]; then
    echo "$RP_FILTER_DEFAULT 的当前值为 $CURRENT_DEFAULT,正在修改为 1..."
    sysctl -w $RP_FILTER_DEFAULT=1
        sleep 0.25
    echo "$RP_FILTER_DEFAULT 已修改为 1"
else
    echo "$RP_FILTER_DEFAULT 的当前值为 $CURRENT_DEFAULT,无需修改。"
        sleep 0.25
fi

# 为确保设置在重启后依然生效,可以将配置写入 /etc/sysctl.conf
if ! grep -q "^$RP_FILTER_ALL = 1" /etc/sysctl.conf; then
    echo "$RP_FILTER_ALL = 1" >> /etc/sysctl.conf
    echo "已将 $RP_FILTER_ALL = 1 添加到 /etc/sysctl.conf"
        sleep 0.25
fi

if ! grep -q "^$RP_FILTER_DEFAULT = 1" /etc/sysctl.conf; then
    echo "$RP_FILTER_DEFAULT = 1" >> /etc/sysctl.conf
    echo "已将 $RP_FILTER_DEFAULT = 1 添加到 /etc/sysctl.conf"
        sleep 0.25
fi

# 重新加载 sysctl 配置
sysctl -p > /dev/null 2>&1


echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"是否开启反向路径过滤检查完成"$color_0   
    sleep 0.5
    echo -e ""


echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查系统是否不存开发编译及网络嗅探类工具。。。"
sleep 0.25

# 定义要检查的不合规工具列表
TOOLS_PATTERN="\btcpdump\b|\bgdb\b|\bstrace\b|\bdexdump\b|\bcpp\b|\bgcc\b|\bwireshark\b|\bethereal\b"

# 查找工具并存储结果
RESULT=$(rpm -qa | egrep -E "$TOOLS_PATTERN")

# 计算找到的工具数量
TOOL_COUNT=$(yum list installed | grep -E "$TOOLS_PATTERN" | wc -l)

echo "result=$TOOL_COUNT"
sleep 0.25

if [ $TOOL_COUNT -gt 0 ]; then
    echo "发现以下不合规工具:"
    echo "$RESULT"
    sleep 0.25

    # 提示用户确认卸载
    read -p "您确定要卸载这些不合规工具吗?(y/n): " CONFIRM
    if [[ $CONFIRM == [yY] ]]; then
        # 使用 yum 卸载不合规工具
        for TOOL in $(echo "$RESULT" | awk '{print $1}'); do
            echo "正在卸载 $TOOL ..."
	    sleep 0.25
            yum remove -y "$TOOL" &> /dev/null
			if [ $? -eq 0 ]; then
                echo "$TOOL 卸载成功。"
            else
                echo "$TOOL 卸载失败,请检查该包是否存在或是否有足够权限。"
            fi
        done
        echo "卸载完成。"
	sleep 0.25
    else
        echo "操作已取消。"
	sleep 0.25
    fi
else
    echo "没有发现不合规工具,该项目合规。"
    sleep 0.25
fi


echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"系统是否不存开发编译及网络嗅探类工具检查完成"$color_0   
    sleep 0.5
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查登录提示-是否设置登录成功后警告Banner。。。"
# 定义期望的文件内容
EXPECTED_CONTENT="Authorized users only. All activity may be monitored and reported"

# 检查 /etc/motd 文件是否存在
if [ -f /etc/motd ]; then
    # 如果文件存在,检查内容是否符合要求
    CURRENT_CONTENT=$(cat /etc/motd)
    if [ "$CURRENT_CONTENT" == "$EXPECTED_CONTENT" ]; then
        echo "/etc/motd 内容符合要求,无需修改。"
	sleep 0.25
    else
        echo "/etc/motd 内容不符合要求,正在覆盖..."
        echo "$EXPECTED_CONTENT" > /etc/motd
	sleep 0.25
        echo "/etc/motd 已成功更新。"
	sleep 0.25
    fi
else
    # 如果文件不存在,创建它并写入内容
    echo "文件 /etc/motd 不存在,正在创建..."
    sleep 0.25
    echo "$EXPECTED_CONTENT" > /etc/motd
    echo "/etc/motd 已成功创建。"
    sleep 0.25
fi
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"系登录提示-是否设置登录成功后警告Banner检查完成"$color_0 
    sleep 0.5
    echo -e ""
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否设置登录超时。。。"
	sleep 0.25
# 日期格式
date_suffix=$(date +%y%m%d)

# 备份文件名
profile_backup="/etc/profile_$date_suffix"
cshrc_backup="/etc/csh.cshrc_$date_suffix"

# 要添加的内容
profile_content='TMOUT=1800'
export_content='export TMOUT'
cshrc_content='set autologout=1800'

# 检查并备份 /etc/profile
if [ ! -f "$profile_backup" ]; then
    cp -p /etc/profile "$profile_backup"
    echo "已备份 /etc/profile 到 $profile_backup"  
		sleep 0.25
fi

# 检查 /etc/profile 是否已有内容
if ! grep -qF "$profile_content" /etc/profile; then
    echo "$profile_content" >> /etc/profile
    echo "已在 /etc/profile 中添加 'TMOUT=1800'" 
	sleep 0.25	
fi

if ! grep -qF "$export_content" /etc/profile; then
    echo "$export_content" >> /etc/profile
    echo "已在 /etc/profile 中添加 'export TMOUT'"  
	sleep 0.25
fi

# 检查并备份 /etc/csh.cshrc
if [ ! -f "$cshrc_backup" ]; then
    cp -p /etc/csh.cshrc "$cshrc_backup"
    echo "已备份 /etc/csh.cshrc 到 $cshrc_backup"	
	sleep 0.25
fi

# 检查 /etc/csh.cshrc 是否已有内容
if ! grep -qF "$cshrc_content" /etc/csh.cshrc; then
    echo "$cshrc_content" >> /etc/csh.cshrc
    echo "已在 /etc/csh.cshrc 中添加 'set autologout=1800'"  
	sleep 0.25
fi

# 清理变量
unset date_suffix profile_backup cshrc_backup profile_content export_content cshrc_content
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"登录超时配置检查完成"$color_0   
    sleep 0.5   
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查口令锁定策略。。。"
sleep 0.25

# 获取当前日期
backup_date=$(date +%y%m%d)
backup_file="/etc/pam.d/system-auth_$backup_date"

# 检查备份文件是否存在
if [ ! -f "$backup_file" ]; then
    # 进行备份
    cp -p /etc/pam.d/system-auth "$backup_file"
    echo "备份文件已创建: $backup_file"
    sleep 0.25
else
    echo "备份文件已存在: $backup_file,未进行备份。"
    sleep 0.25
fi

# 定义要添加的内容
pam_faillock_line='auth        required      pam_faillock.so deny=6 onerr=fail no_magic_root unlock_time=120'
pam_faillock_account_line='account     required      pam_faillock.so'

# 检查是否存在 pam_faillock 的行
if grep -qF "$pam_faillock_line" /etc/pam.d/system-auth; then
    echo "/etc/pam.d/system-auth 中已包含相应配置,未做任何修改。"
    sleep 0.25
else
    # 如果没有找到 pam_faillock 的行,查找 pam_env 的行并添加新配置
    if grep -qF "auth        required      pam_env.so" /etc/pam.d/system-auth; then
        sed -i "/auth        required      pam_env.so/a $pam_faillock_line" /etc/pam.d/system-auth
        echo "在 auth required pam_env.so 行的下一行添加了相应配置。"
        sleep 0.25
    else
        echo "未找到需要添加配置的相关行。"
        sleep 0.25
    fi
fi
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"口令锁定策略检查完成"$color_0   
    sleep 0.5
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否开启命令及登录失败记录。。。"
	sleep 0.25	 

# 配置文件路径
LOGIN_DEFS="/etc/login.defs"

# 检查 LASTLOG_ENAB
if grep -qE '^\s*LASTLOG_ENAB\s*yes' "$LOGIN_DEFS"; then
    echo "LASTLOG_ENAB 已设置为 yes."  
	sleep 0.25		
else 
    echo "LASTLOG_ENAB 未设置为 yes,正在添加..."  
	sleep 0.25		
    echo 'LASTLOG_ENAB yes' | sudo tee -a "$LOGIN_DEFS" > /dev/null
fi

# 检查 FAILLOG_ENAB
if grep -qE '^\s*FAILLOG_ENAB\s*yes' "$LOGIN_DEFS"; then
    echo "FAILLOG_ENAB 已设置为 yes."
	sleep 0.25		
else
    echo "FAILLOG_ENAB 未设置为 yes,正在添加..."  
	sleep 0.25	
    echo 'FAILLOG_ENAB yes' | sudo tee -a "$LOGIN_DEFS" > /dev/null
fi

# 移除重复的配置项
sudo awk '!seen[$0]++' "$LOGIN_DEFS" > /tmp/login.defs && sudo mv /tmp/login.defs "$LOGIN_DEFS"
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"是否开启命令及登录失败记录检查完成"$color_0   
    sleep 0.5   
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否设置口令重复次数限制。。。"
sleep 0.25
# 日期后缀
date_suffix=$(date +%y%m%d)

# 1. 备份 /etc/pam.d/system-auth
backup_file="/etc/pam.d/system-auth_$date_suffix"
if [ ! -f "$backup_file" ]; then
    cp -p /etc/pam.d/system-auth "$backup_file"
    echo "已备份 /etc/pam.d/system-auth 到 $backup_file"   
	sleep 0.25
else
    echo "备份文件 $backup_file 已存在,跳过备份步骤。"   
	sleep 0.25
fi

# 2. 创建文件 /etc/security/opasswd 并设置权限
passwd_file="/etc/security/opasswd"
if [ ! -f "$passwd_file" ]; then
    touch "$passwd_file"
    chown root:root "$passwd_file"
    chmod 600 "$passwd_file"
    echo "已创建 $passwd_file 并设置权限为 600"   
	sleep 0.25
else
    echo "文件 $passwd_file 已存在,跳过创建步骤。"   
	sleep 0.25
fi

# 3. 修改策略设置
pam_file="/etc/pam.d/system-auth"
if grep -q "password    sufficient    pam_unix.so" "$pam_file"; then
    # 检查是否已经包含 remember=5
    if ! grep -q "remember=5" "$pam_file"; then
        # 使用 sed 添加 remember=5
        sed -i '/password    sufficient    pam_unix.so/s/$/ remember=5/' "$pam_file"
        echo "已在 $pam_file 中添加 'remember=5'"    
		sleep 0.25
    else
        echo "'remember=5' 已存在于 $pam_file,跳过添加步骤。"    
		sleep 0.25
    fi
else
    echo "未找到 'password sufficient pam_unix.so' 行,跳过修改步骤。"  
	sleep 0.25
fi
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"口令重复次数限制检查完成"$color_0   
    sleep 0.5   
    echo -e ""
 


echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否使用SSH V2版本进行远程登录。。。"

SSHSTATUS=`ps -ef|grep -i sshd|grep -v grep|wc -l`
if [ x"$SSHSTATUS" != "x0" ];then

      if [[ `grep "^Protocol" /etc/ssh/sshd_config|awk '{print $2}'` != 2 ]];then
	      echo "未使用SSH V2版本进行远程登录,正在修改配置"
	      sleep 0.25
	      echo "Protocol 2" >> /etc/ssh/sshd_config 
	      echo "配置修改完成 正在重启sshd服务"
	      sleep 0.25
	      systemctl restart sshd 


      else  echo "使用SSH V2版本进行远程登录,无需修改" ;

      fi;

 else echo "The ssh service of device is not running,check result:true";

 fi
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"是否使用SSH V2版本进行远程登录检查完成"$color_0  
    sleep 0.5
    echo -e ""

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否可以对日志大小进行配置。。。"
	sleep 0.25
# 要添加的内容
logrotate_line='size 10M'
logrotate_file='/etc/logrotate.d/warn'

# 检查文件是否存在
if [ -f "$logrotate_file" ]; then
    # 检查并修改 /etc/logrotate.d/syslog
    if ! grep -qF "$logrotate_line" "$logrotate_file"; then
        echo "$logrotate_line" >> "$logrotate_file"
        echo "已在 $logrotate_file 中添加 'size 10M'。"  
			sleep 0.25
    else
        echo "$logrotate_file 中已包含 'size 10M',未做任何修改。"  
			sleep 0.25
    fi
else
    # 如果文件不存在,创建文件并添加内容
    echo "$logrotate_line" > "$logrotate_file"
    echo "文件不存在,已创建 $logrotate_file 并添加 'size 10M'。"  
		sleep 0.25
fi
echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"日志大小配置检查完成"$color_0   
    sleep 0.5   
    echo -e ""




echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查是否设置口令生存周期要求。。。"
sleep 0.25

# 日期后缀
date_suffix=$(date +%y%m%d)

# 备份文件路径
backup_file="/etc/login.defs_$(date +%y%m%d)"

# 1. 备份 /etc/login.defs
if [ ! -f "$backup_file" ]; then
    cp -p /etc/login.defs "$backup_file"
    echo "已备份 /etc/login.defs 到 $backup_file"  
	sleep 0.25
else
    echo "备份文件 $backup_file 已存在,跳过备份步骤。"  
	sleep 0.25
fi

# 2. 检查当前设置
pass_max_days=$(grep '^PASS_MAX_DAYS' /etc/login.defs | awk '{print $2}')
pass_min_days=$(grep '^PASS_MIN_DAYS' /etc/login.defs | awk '{print $2}')
pass_warn_age=$(grep '^PASS_WARN_AGE' /etc/login.defs | awk '{print $2}')

# 3. 判断是否符合标准
if [[ "$pass_max_days" -eq 180 && "$pass_min_days" -eq 5 && "$pass_warn_age" -eq 5 ]]; then
    echo "当前密码策略符合标准,无需修改。"  
	sleep 0.25
else
    echo "当前密码策略不符合标准,正在进行修改..."  
	sleep 0.25
    
    # 创建带日期后缀的备份
    cp /etc/login.defs /etc/login.defs_"$date_suffix"

    # 修改策略设置
    sed -i 's/PASS_MAX_DAYS\t[0-9]*/PASS_MAX_DAYS\t180/' /etc/login.defs
    sed -i 's/PASS_MIN_DAYS.*/PASS_MIN_DAYS    5/' /etc/login.defs
    sed -i 's/PASS_WARN_AGE.*/PASS_WARN_AGE    5/' /etc/login.defs

    echo "已更新 /etc/login.defs 中的密码策略设置。"  
	sleep 0.25
	
fi
echo -e `date +%Y-%m-%d_%H:%M:%S` "$color_G""口令生存周期要求检查完成""$color_0"   


# 设定日期格式
backup_date=$(date +%y%m%d)


# 输出开始信息
echo -e "$(date +%Y-%m-%d_%H:%M:%S) $color_Y INFO $color_0 正在检查SSH是否使用业界认可的加密算法..."

# 设定备份文件路径
sshd_config_backup="/etc/ssh/sshd_config_$backup_date"

# 检查备份文件是否已存在
if [ ! -f "$sshd_config_backup" ]; then
    # 备份 sshd_config
    cp -R /etc/ssh/sshd_config "$sshd_config_backup"
    echo "已备份 /etc/ssh/sshd_config 到 $sshd_config_backup"
else
    echo "备份文件 $sshd_config_backup 已存在,跳过备份。"
fi

# 定义要添加的内容
content=(
    "Ciphers aes128-ctr,aes192-ctr,aes256-ctr"
    "KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521"
    "MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com,hmac-sha1"
)

# 查找插入位置
insert_line=$(grep -n "#RekeyLimit default none" /etc/ssh/sshd_config | cut -d: -f1)
if [ -z "$insert_line" ]; then
    echo -e "$(date +%Y-%m-%d_%H:%M:%S) $color_Y 找不到插入位置,操作结束.$color_0"
    exit 1
fi

# 标志变量,判断是否进行了插入操作
any_inserted=false

# 检查内容是否已存在,并插入新内容
echo -e "$(date +%Y-%m-%d_%H:%M:%S) $color_Y 正在插入配置...$color_0"
for line in "${content[@]}"; do
    if grep -qF "$line" /etc/ssh/sshd_config; then
        echo "发现配置:'$line' 已存在,跳过添加。"
    else
        echo "配置:'$line' 不存在,可以添加。"
        sed -i "$((insert_line + 1))i $line" /etc/ssh/sshd_config
        insert_line=$((insert_line + 1))  # 更新插入行号
        any_inserted=true
        echo "已添加配置:'$line'"
    fi
done

# 如果有新内容被添加
if $any_inserted; then
    echo -e "$(date +%Y-%m-%d_%H:%M:%S) $color_G 所有新配置已成功添加。$color_0"
else
    echo -e "$(date +%Y-%m-%d_%H:%M:%S) $color_Y 没有新的配置需要插入.$color_0"
fi

# 检测配置文件是否有问题
if sshd -t -f /etc/ssh/sshd_config; then
    echo "配置文件检查通过,正在重启 SSH 服务..."
    systemctl restart sshd
    echo -e "$(date +%Y-%m-%d_%H:%M:%S) $color_G SSH 服务已重启,配置修改成功$color_0"
else
    echo -e "$(date +%Y-%m-%d_%H:%M:%S) $color_Y 配置文件有问题,请检查$color_0"
    exit 1
fi

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"SSH是否使用业界认可的加密算法检查完成"$color_0   

    sleep 0.5   
    echo -e ""



echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始是否设置限制su命令用户组。。。"
sleep 0.25
# 定义要检查和添加的内容
line1="auth            sufficient      pam_rootok.so"
line2="auth            required        pam_wheel.so use_uid"

# 文件路径
pam_su_file="/etc/pam.d/su"
backup_file="${pam_su_file}.bak"

# 检查备份文件是否存在
if [ ! -f "$backup_file" ]; then
    # 备份原文件
    cp "$pam_su_file" "$backup_file"
    echo "备份文件已创建:$backup_file"
    sleep 0.25
fi

# 检查文件中是否包含所需的两行
contains_line1=$(grep -Fxq "$line1" "$pam_su_file"; echo $?)
contains_line2=$(grep -Fxq "$line2" "$pam_su_file"; echo $?)

# 定义标志变量
need_to_add_line1=false
need_to_add_line2=false

# 检查每一行是否存在
if [ $contains_line1 -ne 0 ]; then
    need_to_add_line1=true
    echo "缺少行: $line1"
    sleep 0.25
fi

if [ $contains_line2 -ne 0 ]; then
    need_to_add_line2=true
    echo "缺少行: $line2"
    sleep 0.25
fi

# 如果至少有一行需要添加
if $need_to_add_line1 || $need_to_add_line2; then
    # 找到要插入的行的位置
    insert_line=$(grep -n "pam_env.so" "$pam_su_file" | cut -d: -f1)
    
    if [ -z "$insert_line" ]; then
        echo "无法找到插入位置,操作结束。"
	sleep 0.25
        exit 1
    fi

    # 根据需要添加的行插入内容
    if $need_to_add_line1; then
        sed -i "$((insert_line + 1))i $line1" "$pam_su_file"
        echo "已添加配置行:$line1"
	sleep 0.25
    fi

    if $need_to_add_line2; then
        sed -i "$((insert_line + 2))i $line2" "$pam_su_file"
        echo "已添加配置行:$line2"
	sleep 0.25
    fi
else
    echo "两个配置行都存在,无需添加。"
    sleep 0.25
fi

if [ "$(sed -n '5p' "$pam_su_file")" == "auth		sufficient	pam_rootok.so" ]; then
    # 注释掉第五行
    sed -i '5s/^/#/' "$pam_su_file"
    echo "第五行已注释掉:auth		sufficient	pam_rootok.so"
else
    echo "第五行不是指定内容,不做操作。"
    sleep 0.25
fi

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"是否设置限制su命令用户组检查完成"$color_0   

echo -e `date +%Y-%m-%d_%H:%M:%S` "$color_C""所有检查已经执行完毕,脚本执行结束""$color_0"

PS: 下面这块内容建议单独制定一个脚本出来 因为放在前面的脚本中执行不生效 暂时我也没有找到更好的解决方案 只能分开执行。

echo -e `date +%Y-%m-%d_%H:%M:%S` $color_Y"INFO"$color_0 "开始检查系统是否不存开发编译及网络嗅探类工具。。。"
sleep 0.25

# 定义要检查的不合规工具列表
TOOLS_PATTERN="\btcpdump\b|\bgdb\b|\bstrace\b|\bdexdump\b|\bcpp\b|\bgcc\b|\bwireshark\b|\bethereal\b"

# 查找工具并存储结果
RESULT=$(rpm -qa | egrep -E "$TOOLS_PATTERN")

# 计算找到的工具数量
TOOL_COUNT=$(yum list installed | grep -E "$TOOLS_PATTERN" | wc -l)

echo "result=$TOOL_COUNT"
sleep 0.25

if [ $TOOL_COUNT -gt 0 ]; then
    echo "发现以下不合规工具:"
    echo "$RESULT"
    sleep 0.25

    # 提示用户确认卸载
    read -p "您确定要卸载这些不合规工具吗?(y/n): " CONFIRM
    if [[ $CONFIRM == [yY] ]]; then
        # 使用 yum 卸载不合规工具
        for TOOL in $(echo "$RESULT" | awk '{print $1}'); do
            echo "正在卸载 $TOOL ..."
	    sleep 0.25
            yum remove -y "$TOOL" &> /dev/null
			if [ $? -eq 0 ]; then
                echo "$TOOL 卸载成功。"
            else
                echo "$TOOL 卸载失败,请检查该包是否存在或是否有足够权限。"
            fi
        done
        echo "卸载完成。"
	sleep 0.25
    else
        echo "操作已取消。"
	sleep 0.25
    fi
else
    echo "没有发现不合规工具,该项目合规。"
    sleep 0.25
fi


echo -e `date +%Y-%m-%d_%H:%M:%S` $color_G"系统是否不存开发编译及网络嗅探类工具检查完成"$color_0   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值