每日自动化安全巡检脚本住宅Linux服务器
为什么住宅Linux服务器也需要每日安全巡检
很多住在公寓或家里的朋友,喜欢用一台旧电脑或树莓派跑 Linux 服务器,用来挂博客、存文件或者跑服务。
但住宅服务器暴露在公网后,经常会被扫描和试探。每日自动化安全巡检脚本能帮你每天定期检查登录日志、开放端口、可疑进程和系统更新,异常时直接推送通知。
这套方案不需要你懂多深的安全知识,跟着流程走就能搭好。
动手前的准备工作
确认你的服务器已经安装了以下基础工具(大部分发行版自带):
- bash(默认 Shell)
- cron(定时任务管理)
- mailx 或 msmtp(可选,用于发送邮件报告)
- lsof 和 netstat(查看端口和连接)
- fail2ban(可选检测暴力破解)
如果缺某个工具,用包管理器安装,例如 Debian/Ubuntu 执行:
sudo apt update
sudo apt install cron mailutils lsof net-tools
一步步搭建巡检脚本
创建一个脚本文件 /usr/local/bin/security_check.sh:
sudo nano /usr/local/bin/security_check.sh
粘贴以下内容(根据你的实际需求可以增减检查项):
#!/bin/bash
REPORT="/var/log/security_daily_report.txt"
SERVER_NAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "======== $SERVER_NAME 每日安全巡检报告 $DATE ========" > $REPORT
# 1. 检查最近10条登录失败的记录
echo "" >> $REPORT
echo "## 最近登录失败记录(前10条)" >> $REPORT
sudo lastb | head -10 >> $REPORT 2>/dev/null || echo "无登录失败记录" >> $REPORT
# 2. 检查当前监听端口(IPv4)
echo "" >> $REPORT
echo "## 当前监听端口 (TCP/UDP)" >> $REPORT
sudo netstat -tulpn4 | grep LISTEN >> $REPORT 2>/dev/null || echo "无监听端口" >> $REPORT
# 3. 检查CPU/内存/磁盘使用
echo "" >> $REPORT
echo "## 系统负载与磁盘" >> $REPORT
uptime >> $REPORT
df -h / | tail -1 >> $REPORT
free -h >> $REPORT
# 4. 检查是否需要更新(Debian/Ubuntu)
echo "" >> $REPORT
echo "## 可更新软件包数量" >> $REPORT
sudo apt list --upgradable 2>/dev/null | grep -v "列出" | wc -l >> $REPORT
# 5. 检查可疑进程(占用过高CPU的进程)
echo "" >> $REPORT
echo "## CPU占用最高的5个进程" >> $REPORT
ps aux --sort=-%cpu | head -6 >> $REPORT
echo "" >> $REPORT
echo "报告生成时间: $DATE" >> $REPORT
保存后赋予执行权限:
sudo chmod +x /usr/local/bin/security_check.sh
先手动跑一次,确认没有报错:
sudo /usr/local/bin/security_check.sh
cat /var/log/security_daily_report.txt
如果想让结果发送到邮箱,在脚本末尾加入:
mail -s "$SERVER_NAME 每日安全巡检报告" your_email@example.com < $REPORT
容易踩的坑
- cron环境变量不足:脚本里用到的命令(如 netstat、apt)默认不在cron的PATH里,脚本中一定要写绝对路径,或者开头加入
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin。 - sudo权限问题:cron任务如果用普通用户执行,脚本内有
sudo会提示密码,可以用visudo给该用户添加免密执行权限,比如:username ALL=(ALL) NOPASSWD: /usr/local/bin/security_check.sh。 - 日志文件权限:
/var/log/security_daily_report.txt需要普通用户可写,或者使用sudo写入。建议脚本内部用sudo tee或直接使用>>时先创建好文件并授权。 - mail命令未配置:如果没安装邮件传输代理,发邮件部分会报错。可以先注释掉,只保留本地日志。
设置cron定时任务
crontab -e 添加一行,例如每天早上8点执行:
0 8 * * * /usr/local/bin/security_check.sh
如果希望输出日志到文件以便查看cron是否执行成功,可改为:
0 8 * * * /usr/local/bin/security_check.sh >> /var/log/cron_security.log 2>&1
保存后检查cron服务状态:
sudo systemctl status cron
确认脚本正常运行
等几分钟后,查看日志是否生成:
ls -l /var/log/security_daily_report.txt
cat /var/log/security_daily_report.txt
也可以手动触发一次,用 sudo /usr/local/bin/security_check.sh 验证。
如果你想测试cron任务是否真的跑了,可以临时改成一个更近的时间(比如每分钟一次),等一分钟后再看日志。记得测试完改回正常频率。
高频问题解答
Q:脚本执行后报告里没有内容,只有空行?
A:很可能脚本里的命令需要root权限,但cron里执行的环境没有sudo免密。检查visudo配置,或者直接在cron里使用 * * * * * root /usr/local/bin/security_check.sh(需写入 /etc/crontab)。
Q:我怎么收到邮件报告?
A:安装 postfix 或 msmtp 并配置好发信后,脚本里保留 mail 命令即可。如果不熟悉邮件配置,建议先只用本地文件,后续再优化。
Q:我想增加检查项目,比如fail2ban状态或者Docker容器状态,怎么改?
A:在脚本相应位置加入类似 sudo fail2ban-client status sshd >> $REPORT 的命令即可,注意命令的路径和权限。
如果你正在处理每日自动化安全巡检脚本住宅Linux服务器,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。