接手一台Debian服务器,无论是物理机、云主机还是容器,第一件让人心里没底的事就是不知道它现在到底安不安全。不是那种“可能被入侵了”的模糊担忧,而是有没有一个明确、可执行的标准,能让我每天花几分钟,把关键部位全部摸查一遍。这就是每日安全巡检的意义:不是等告警响了才去救火,而是主动把隐患按死在萌芽里。
用户登录异常快速排查巡检的第一步永远是看谁进来了。别只看/var/log/auth.log,那个文件在攻击频繁时会被刷得飞快。更有效的做法是锁定几个硬指标。先查当前登录用户,用w命令看谁在线、从哪个IP来、在干什么。然后重点查失败登录记录,命令是lastb -n 50,这能直接列出最近50次失败的登录尝试。如果看到某个IP在短时间内有几十次root尝试,不用犹豫,这就是在撞库。
再深入一层,检查是否有异常的用户账户被创建或提权。直接查看/etc/passwd里UID为0的用户,正常情况下只有root。命令awk -F: '($3 == 0) {print}' /etc/passwd会列出所有超级用户。同时检查/etc/sudoers和/etc/sudoers.d/目录下的文件,确认没有不明用户被授予sudo权限。很多人忽略了服务账户,攻击者有时会创建一个看似无害的账户名,但赋予了sudo权限,这种隐蔽性极高。
网络连接与监听端口审计端口监听是木马后门最喜欢的藏身之处。用ss -tlnp查看所有TCP监听端口,注意State列是LISTEN的条目。关键不是看你知道的服务,而是那些你不知道的。一个典型的可疑迹象是某个高端口在监听,但进程名显示为一个系统进程,这可能是进程名伪装。更细的排查是用netstat -tunap配合grep过滤ESTABLISHED状态的外部连接,看有没有连接到陌生IP的会话。
iptables规则也是巡检重点。攻击者有时会插入隐蔽的放行规则,让自己能随时回来。用iptables -L -n -v查看所有规则,注意那些没有注释的、目标为ACCEPT的规则,特别是针对非标准端口的。如果服务器上安装了Docker,还要额外检查Docker自动创建的iptables规则是否被篡改,因为Docker会修改FORWARD链,这是常被利用的攻击面。
关键文件完整性校验文件完整性监控不是非得装Tripwire或AIDE才能做,日常巡检可以用更轻量的方式。对/etc/passwd、/etc/shadow、/etc/group、/etc/sudoers这些核心文件,用stat命令查看修改时间。如果shadow文件在凌晨三点被修改过,而你没有任何夜间维护操作,这就是严重信号。更可靠的做法是定期用md5sum或sha256sum对关键目录生成基线指纹,巡检时比对。
特别要检查的是/usr/bin、/usr/sbin、/bin、/sbin这些二进制目录下近期被修改的文件。命令find /usr/bin -type f -mtime -1能找出过去24小时内变动过的文件。系统命令被替换是典型的rootkit行为,比如ps、netstat、ls这些常用工具被换成带后门的版本。如果怀疑被替换,可以用debsums工具校验已安装包的完整性,debsums -c会列出所有校验失败的文件。
crontab和系统定时任务也是重点。检查/var/spool/cron/crontabs/下所有用户的定时任务,以及/etc/crontab、/etc/cron.d/、/etc/cron.daily/等目录。攻击者常在这些地方埋下定期执行的下载器脚本,维持持久化访问。一个常见的恶意cron条目会包含curl或wget指向某个短链接,然后管道给bash执行。
进程与资源异常检测只看ps aux的进程列表容易漏掉那些做了隐藏的进程。更有效的方法是交叉比对。先用ps aux列出所有进程,再用ls -la /proc/*/exe 2>/dev/null查看所有进程的可执行文件路径。如果发现某个进程在ps列表里存在,但/proc下对应的目录已经没了,或者exe链接指向一个已被删除的文件,这就是典型的进程隐藏手法。另外,检查/proc下是否存在大量数字目录,但ps里看不到对应PID,也是可疑迹象。
CPU和内存占用异常也值得关注。用top -b -n 1取快照,筛选出CPU或内存占用超过50%的进程。特别留意那些进程名看起来像系统进程但占用资源极高的,比如一个名为httpd的进程占了90% CPU,但你的Web服务根本没开,这就是挖矿木马的典型特征。很多挖矿程序会伪装成常见服务名,但资源消耗会暴露它们。
检查加载的内核模块,用lsmod命令。Rootkit经常以内核模块形式注入,lsmod列表里出现不明模块就要高度警惕。如果模块名看起来随机或带有混淆特征,基本可以确定是恶意内核模块。
自动化巡检脚本实现手动执行上述检查项太耗时,而且容易遗漏。下面给出一个可以直接部署的自动化脚本,把核心巡检逻辑整合在一起,输出格式化的巡检报告。
#!/bin/bash
# Debian每日安全巡检脚本
# 输出带时间戳的巡检报告
REPORT="/var/log/daily_sec_check_$(date +%Y%m%d).log"
echo "========== Debian安全巡检报告 $(date) ==========" > $REPORT
# 1. 异常登录检查
echo -e "\n[1] 当前登录用户:" >> $REPORT
w -h >> $REPORT 2>&1
echo -e "\n[2] 最近50次失败登录:" >> $REPORT
lastb -n 50 >> $REPORT 2>&1
echo -e "\n[3] UID为0的用户:" >> $REPORT
awk -F: '($3 == 0) {print $1}' /etc/passwd >> $REPORT
# 2. 网络连接审计
echo -e "\n[4] 所有TCP监听端口:" >> $REPORT
ss -tlnp >> $REPORT 2>&1
echo -e "\n[5] 已建立的对外连接:" >> $REPORT
ss -tnp state established >> $REPORT 2>&1
# 3. 关键文件检查
echo -e "\n[6] 核心文件修改时间:" >> $REPORT
for f in /etc/passwd /etc/shadow /etc/sudoers /etc/group; do
echo "$f: $(stat -c %y $f)" >> $REPORT
done
echo -e "\n[7] 24小时内变动的系统二进制文件:" >> $REPORT
find /usr/bin /usr/sbin /bin /sbin -type f -mtime -1 >> $REPORT 2>&1
echo -e "\n[8] 所有用户crontab:" >> $REPORT
for user in $(cut -f1 -d: /etc/passwd); do
crontab -l -u $user >> $REPORT 2>&1
done
# 4. 进程与资源
echo -e "\n[9] CPU占用Top10进程:" >> $REPORT
ps aux --sort=-%cpu | head -11 >> $REPORT
echo -e "\n[10] 内存占用Top10进程:" >> $REPORT
ps aux --sort=-%mem | head -11 >> $REPORT
echo -e "\n[11] 已加载内核模块:" >> $REPORT
lsmod >> $REPORT
# 5. 包完整性校验(可选,较耗时)
echo -e "\n[12] 已安装包完整性检查(快速模式):" >> $REPORT
debsums -c 2>&1 | head -20 >> $REPORT
echo -e "\n========== 巡检结束 ==========" >> $REPORT
把这个脚本保存为/etc/cron.daily/sec_check,赋予执行权限chmod +x /etc/cron.daily/sec_check,它就会每天自动运行并生成报告到/var/log/目录下。报告文件名包含日期,方便归档和回溯。如果想通过邮件接收报告,可以在脚本末尾加一行mail -s "Daily Security Report" your@email.com < $REPORT。
脚本增强:告警与联动基础脚本只是生成报告,更实用的做法是加入告警逻辑。比如当失败登录次数超过阈值时自动触发通知,或者发现可疑内核模块时立即发送告警。可以在脚本里加入条件判断,配合简单的计数逻辑。
# 失败登录告警(同一IP超过10次)
FAIL_IP=$(lastb | awk '{print $3}' | sort | uniq -c | sort -rn | awk '$1 > 10 {print $2}')
if [ -n "$FAIL_IP" ]; then
echo "警告:以下IP失败登录超过10次: $FAIL_IP" >> $REPORT
fi
# 可疑内核模块检测(非标准模块名)
KNOWN_MODS="ext4|dm_mod|usb_storage|..." # 根据实际情况补充
UNKNOWN_MOD=$(lsmod | awk '{print $1}' | grep -vE "Module|$KNOWN_MODS")
if [ -n "$UNKNOWN_MOD" ]; then
echo "警告:发现未知内核模块: $UNKNOWN_MOD" >> $REPORT
fi
这种轻量级的告警机制不会给系统带来额外负担,但能让你在第一时间注意到异常。对于生产环境,还可以把报告推送到企业微信或钉钉机器人,实现移动端即时通知。
日志集中与长期分析单机巡检只能看到当前快照,真正有威胁的攻击往往是跨时间维度的。建议把每天的巡检报告集中存储,可以用rsync同步到一台日志服务器,或者直接写入集中式日志平台。有了历史数据,就能做趋势分析,比如某台服务器的失败登录次数突然从每天几十次飙升到几千次,这种突变比绝对值更有指示意义。
对于有条件的场景,可以引入auditd来记录更细粒度的系统调用。在Debian上安装auditd后,配置规则监控/etc/shadow的写入、sudo执行等敏感操作。然后让巡检脚本读取audit日志中的关键事件,作为补充数据源。这样即使攻击者删除了auth.log,audit日志仍然保留了证据。
常见误报与处理巡检脚本跑起来后,你会遇到一些看似可疑实则正常的现象。比如debsums校验失败不一定代表被入侵,可能是包升级后配置文件被合法修改。需要区分哪些是预期内的变更,哪些是真正的异常。建议在系统刚部署完、确认干净的时候,先跑一次完整的debsums校验并保存结果作为基线,后续的变更就有了参照。
另一个常见误报是lastb命令显示的失败登录。如果服务器暴露了SSH端口,每天有大量扫描尝试是正常的。关键不是有没有失败登录,而是有没有成功的异常登录,以及失败登录的集中度。把告警阈值设在合理的水平,避免告警疲劳。
内核模块方面,有些硬件驱动或虚拟化模块的名称看起来可能陌生,比如virtio相关模块在云主机上是正常的。需要根据实际环境建立白名单,而不是看到不认识的模块就报警。
这套巡检方法的核心价值在于把安全从“感觉”变成“数据”。每天花五分钟看一遍报告,或者让脚本自动对比关键指标,你就能在攻击者站稳脚跟之前发现痕迹。对于维护多台Debian服务器的运维人员来说,把巡检脚本标准化部署到所有节点,统一收集报告,安全管理就不再是盲人摸象。
