一、背景与痛点:为什么需要安全审计脚本?
在日常服务器运维中,安全团队常面临三大挑战:
- 人工巡检效率低下:手动检查账户、网络连接等需执行十余条命令
- 隐蔽威胁难发现:异常计划任务、伪装进程等易被忽略
- 合规压力:等保2.0等规范要求定期安全审计
为此,我们开发了这款开源的Linux安全自动化审计脚本,可实现:
- 5分钟内完成全维度安全检查
- 输出结构化风险报告
- 关键风险项自动标红预警
二、脚本核心功能架构
安全审计脚本 账户安全 登录审计 网络检测 进程分析 计划任务 特权账户 空密码账户 SSH暴力破解 异常端口 CPU占用TOP10 隐藏Cron任务
三、SSH安全检查脚本:包含了检查系统账户、登录、网络连接、进程和计划任务等安全项,并添加注释和格式输出:
bash
#!/bin/bash
# SSH安全审计脚本
# 功能:检查系统账户、登录、网络连接、进程和计划任务等安全项
echo -e "\n\033[34m============= 账户安全检查 =============\033[0m"
# 1. 检查新增异常账户
echo -e "\n\033[32m[1] 检查/etc/passwd中的异常账户:\033[0m"
cat /etc/passwd | awk -F: '{if($3>=500 && $3<65534 || $3==0) print $0}' | grep -v "^root"
# 2. 检查属组为0的非root账户
echo -e "\n\033[32m[2] 检查属组为0的非root账户:\033[0m"
awk -F: '$4==0 && $1!="root"{print $1}' /etc/passwd
# 3. 检查特权用户(uid为0)
echo -e "\n\033[32m[3] 检查特权用户(uid为0):\033[0m"
awk -F: '$3==0{print $1}' /etc/passwd
# 4. 检查可远程登录的账户
echo -e "\n\033[32m[4] 检查可远程登录的账户:\033[0m"
awk -F: '($2!="*" && $2!="!!"){print $1}' /etc/shadow
# 5. 检查有sudo权限的非root账户
echo -e "\n\033[32m[5] 检查有sudo权限的非root账户:\033[0m"
grep -v "^#\|^$\|^root" /etc/sudoers | grep "ALL=(ALL)"
echo -e "\n\033[34m============= 登录安全检查 =============\033[0m"
# 6. 检查最近成功登录的IP
echo -e "\n\033[32m[6] 最近成功登录的IP:\033[0m"
last | head -n 20
# 7. 检查登录失败的记录
echo -e "\n\033[32m[7] 最近登录失败的记录:\033[0m"
if [ -f /var/log/btmp ]; then
lastb | head -n 20
else
echo "登录失败日志(/var/log/btmp)不存在"
fi
echo -e "\n\033[34m============= 网络连接检查 =============\033[0m"
# 8. 检查当前网络连接
echo -e "\n\033[32m[8] 当前网络连接:\033[0m"
netstat -antp | grep -E 'ESTABLISHED|LISTEN'
# 9. 检查开放端口
echo -e "\n\033[32m[9] 当前开放端口:\033[0m"
netstat -tulnp
echo -e "\n\033[34m============= 进程检查 =============\033[0m"
# 10. 检查高CPU/内存进程
echo -e "\n\033[32m[10] 高CPU使用进程:\033[0m"
ps aux --sort=-pcpu | head -n 10
echo -e "\n\033[32m[11] 高内存使用进程:\033[0m"
ps aux --sort=-pmem | head -n 10
# 11. 检查长时间运行进程
echo -e "\n\033[32m[12] 长时间运行进程:\033[0m"
ps -eo pid,user,comm,etime | grep -E ' ([0-9]+-)?[0-9]{2}:[0-9]{2}:[0-9]{2}'
echo -e "\n\033[34m============= 计划任务检查 =============\033[0m"
# 12. 检查系统计划任务
echo -e "\n\033[32m[13] 系统cron任务:\033[0m"
cat /etc/crontab | grep -v "^#"
# 13. 检查用户计划任务
echo -e "\n\033[32m[14] 用户cron任务:\033[0m"
for user in $(cut -f1 -d: /etc/passwd); do crontab -l -u $user 2>/dev/null; done
# 14. 检查cron.d目录
echo -e "\n\033[32m[15] /etc/cron.d/目录内容:\033[0m"
ls -la /etc/cron.d/
echo -e "\n\033[34m============= 启动项检查 =============\033[0m"
# 15. 检查启动项
echo -e "\n\033[32m[16] /etc/init.d/目录内容:\033[0m"
ls -la /etc/init.d/
echo -e "\n\033[32m[17] /etc/rc.local内容:\033[0m"
cat /etc/rc.local | grep -v "^#"
echo -e "\n\033[32m[18] 检查系统服务:\033[0m"
if command -v systemctl >/dev/null; then
systemctl list-unit-files | grep enabled
else
chkconfig --list | grep ":on"
fi
echo -e "\n\033[34m============= 检查完成 =============\033[0m"
使用说明:
- 将上述脚本保存为
security_check.sh
- 给脚本执行权限:
chmod +x security_check.sh
- 执行脚本生成日志:
sh /usr/local/bin/security_check.sh > security_audit_$(date +%F).log
脚本特点:
- 按类别分组输出,颜色区分不同部分
- 每个检查项都有编号和标题
- 对关键信息进行过滤,减少干扰
- 自动检测系统类型使用合适的命令
- 对可能不存在的日志文件进行检查
注意事项:
- 部分命令需要root权限才能获取完整信息,建议使用sudo执行
- 某些系统可能没有lastb命令或/var/log/btmp文件
- 输出结果需要根据您的实际环境进行分析判断