基础安全加固脚本主要参考官方文档https://docs.openeuler.org/zh/
本脚本适用于 22.03 20.03版本,主要内容如下
1.禁止root远程登录,新建远程账户
2.禁止telent服务,关闭23高危端口。
3.配置登录超时退出,统一配置为300秒超时
4.配置不记录服务器历史命令
5.配置服务器用户密码90天过期
6.配置服务器用户密码复杂度
7.配置用户登录失败锁定
8.开启审计日志
9.配置日志转储
脚本内容如下
#!/bin/bash
# 安全配置检查
check_security_config() {
source /etc/profile
echo "一、### 安全配置检查 ###"
#检查是否禁用root远程登录
if grep "^PermitRootLogin no" /etc/ssh/sshd_config &> /dev/null; then
echo "- 1.禁用root远程登录:是"
else
echo "- 1.未配置禁用root远程登录"
useradd newuser
echo "xUwujinZHI@Wx123" | passwd --stdin newuser > /dev/null 2>&1
usermod -G wheel newuser
sed -i '/^#PermitRootLogin/s/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i '/^PermitRootLogin/s/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
if [ $? -eq 0 ];then
echo "-- 禁止root远程登录成功,业务用户为newuser"
else
echo "-- 禁止root远程登录失败,请检查配置"
exit 4
fi
fi
#检查是否禁用telnet服务
if systemctl status telnet.socket &> /dev/null; then
echo "- 2.未禁用telnet服务,执行禁用"
systemctl stop telnet.socket
systemctl disable telnet.socket
if [ $? -eq 0 ];then
echo "-- 禁用telnet服务成功"
else
echo "-- 禁用telnet服务失败,请检查配置"
exit 4
fi
else
echo "- 2.已禁用telnet服务"
fi
#检查是否配置登录超时
if env |grep TMOUT &> /dev/null; then
echo "- 3.配置登录超时锁定:是"
else
echo "- 3.配置登录超时锁定,进行配置"
echo "TMOUT=300" >> /etc/profile
if [ $? -eq 0 ];then
echo "-- 配置登录超时成功"
else
echo "-- 配置登录超时失败,请检查配置"
exit 4
fi
fi
#检查是否配置不记录历史命令
if env |grep "HISTSIZE=0" &> /dev/null; then
echo "- 4.配置不记录历史命:是"
else
echo "- 4.未配置不记录历史命,进行配置"
echo "export HISTSIZE=0" >> /etc/profile
if [ $? -eq 0 ];then
echo "-- 配置不记录历史命成功"
else
echo "-- 配置不记录历史命失败,请检查配置"
exit 4
fi
fi
#检查是否口令定期更换
if grep "^PASS_MAX_DAYS 90" /etc/login.defs &> /dev/null; then
echo "- 5.配置口令定期更换:是"
else
echo "- 5.未配置口令定期更换,进行配置"
sed -i 's/^\(PASS_MAX_DAYS\).*$/\1 90/' /etc/login.defs
if [ $? -eq 0 ];then
echo "-- 配置口令定期更换成功"
else
echo "-- 配置口令定期更换失败,请检查配置"
exit 4
fi
fi
#检查是否加固用户密码复杂度
if grep "pam_pwquality.so minlen=8" /etc/pam.d/system-auth &> /dev/null; then
echo "- 6.配置加固用户密码复杂度:是"
else
echo "- 6.未配置加固用户密码复杂度,进行配置"
echo "password requisite pam_pwquality.so minlen=8 minclass=3 enforce_for_root try_first_pass local_users_only retry=3 dcredit=0 ucredit=0 lcredit=0 ocredit=0" >> /etc/pam.d/system-auth
echo "password required pam_pwhistory.so use_authtok remember=5 enforce_for_root" >> /etc/pam.d/system-auth
if [ $? -eq 0 ];then
echo "-- 配置加固用户密码复杂度成功"
else
echo "-- 配置加固用户密码复杂度失败,请检查配置"
exit 4
fi
fi
#检查是否配置登录失败锁定
if grep "pam_faillock.so" /etc/pam.d/system-auth &> /dev/null; then
echo "- 7.配置登录失败锁定:是"
else
echo "- 7.未配置登录失败锁定,进行配置"
sed -i '/auth required pam_env.so/a\auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=300' /etc/pam.d/system-auth
if [ $? -eq 0 ];then
echo "-- 配置登录失败锁定成功"
else
echo "-- 配置登录失败锁定失败,请检查配置"
exit 4
fi
fi
#检查是否开启审计日志
if systemctl status auditd &> /dev/null; then
echo "- 8.开启审计日志:是"
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes
auditctl -w /etc/ssh -p wa -k ssh_changes
else
echo "- 8.未开启审计日志,配置开启"
yum -y install audit
systemctl enable auditd
systemctl start auditd
if [ $? -eq 0 ];then
echo "-- 配置开启审计日志成功"
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes
auditctl -w /etc/ssh -p wa -k ssh_changes
else
echo "-- 配置开启审计日志失败,请检查配置"
exit 4
fi
fi
#检查是否配置日志转储
if grep "rotate 26" /etc/logrotate.conf&> /dev/null; then
echo "- 9.配置日志转储:是"
else
echo "- 9.未配置日志转储,配置开启"
sed -i "s#rotate 4#rotate 26#g" /etc/logrotate.conf
service rsyslog restart
if [ $? -eq 0 ];then
echo "-- 配置日志转储成功"
cat >/var/log/log_bak.sh<<EOF
#!/bin/bash
# 备份目录
backup_dir="/var/log/backups"
# 日志文件名
system_log_file="/var/log/messages"
audit_log_file="/var/log/audit/audit.log"
# 日期格式
date_fmt=\$(date +%Y-%m-%d_%H-%M-%S)
# 创建备份目录
mkdir -p "\$backup_dir"
# 备份系统日志增量
rsync -av --delete --exclude '*.gz' "\$system_log_file" "\$backup_dir/messages_\$date_fmt.log"
# 备份审计日志增量
rsync -av --delete --exclude '*.gz' "\$audit_log_file" "\$backup_dir/audit_\$date_fmt.log"
# 压缩增量备份文件
find "\$backup_dir" -type f -name "*.log" -mtime +1 -exec gzip {} \;
# 删除 6 个月前的备份
find "\$backup_dir" -type f -name "*.log.gz" -mtime +180 -delete
EOF
chmod +x /var/log/log_bak.sh
crontab -l >cron.tmp
echo "0 2 * * * /var/log/log_bak.sh" >>cron.tmp
crontab cron.tmp
rm -rf cron.tmp
else
echo "-- 配置日志转储日志失败,请检查配置"
exit 4
fi
fi
#检查是否启用防火墙服务
if systemctl status firewalld &> /dev/null; then
echo "- 10.启用防火墙服务:是"
else
echo "- 10.启用防火墙服务:否,建议启用防火墙并手动配置放行端口和限制源"
fi
#检查是否启用selinux服务
#if getenforce | grep Enforcing &> /dev/null; then
# echo "- 启用selinux服务:是"
#else
# echo "- 启用selinux服务:否(建议启用)"
#fi
}
# 系统资源检查
check_system_resource() {
echo "二、### 系统资源检查 ###"
echo "- 1.CPU使用率"
mpstat 1 3
echo "- 2.内存使用率"
free -g
echo "- 3.磁盘使用率"
df -h
}
#本地网络检查
check_local_network() {
echo "三、### 本地网络连接检查 ###"
echo "- 1.开放端口列表"
netstat -tulpn | awk '{print $4}' | cut -d: -f2 | sort | uniq
echo "- 2.外部连接数"
netstat -an | grep ESTABLISHED | wc -l
echo "- 3.外部连接IP和数量"
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
}
# 输出报告到word
generate_doc_report() {
report_date=$(date +%Y%m%d)
read -p "请输入IP地址: " ipaddress
host_ip=$ipaddress
mkdir -p /var/log/security_check/
#host_ip=$(ip addr show eth0 | grep "inet" | head -1 | awk '{print $2}' | cut -d '/' -f1)
echo "### 生成doc报告 ###"
cat > /var/log/security_check/security_check_${host_ip}_${report_date}.log <<EOF
${host_ip}_安全巡检报告
检查日期: ${report_date}
服务器IP: ${host_ip}
$(check_security_config)
$(check_system_resource)
$(check_local_network)
EOF
}
# 主函数
main() {
generate_doc_report
}
main
echo "巡检日志请在目录/var/log/security_check/ 中查找"