首页 / 帮助文档 / ubuntu服务器定时漏洞扫描运维配置

ubuntu服务器定时漏洞扫描运维配置

Ubuntu服务器不做定时漏洞扫描,等于把生产环境裸奔在公网上。很多运维以为系统装完、防火墙配好、补丁偶尔手动打一打就安全了,实际上CVE漏洞每天都在更新,一个没及时修复的高危漏洞就可能让整台机器沦陷。定时漏洞扫描的核心不是“扫一次看看”,而是把扫描、评估、修复、验证做成一套可以自动跑的闭环。下面直接讲在Ubuntu服务器上怎么把这套机制搭起来。

先选定扫描工具和扫描策略

Ubuntu服务器上最实用的组合是Lynis做系统级安全审计,加上debsecan或者unattended-upgrades配合检查已知CVE。Lynis适合做配置缺陷、权限问题、老旧软件包的深度检查,debsecan则直接对接Debian/Ubuntu的安全公告源,告诉你当前系统里哪些包存在已知漏洞。两者定位不同,建议同时使用。

安装Lynis很简单,Ubuntu 20.04及以后的版本可以直接从官方源安装,也可以从GitHub拉最新版。官方源版本稍旧但稳定,生产环境建议用源里的版本,减少供应链风险。

sudo apt update
sudo apt install lynis -y

debsecan同样在Ubuntu官方源里,安装后需要指定发行版代号,比如Ubuntu 22.04是jammy,20.04是focal。配置好后它会从安全源拉取漏洞数据库,和本地已安装包做比对。

sudo apt install debsecan -y
sudo debsecan --suite=jammy

如果只想看高危漏洞,可以加上--only-fixed参数,只列出已经有修复版本的漏洞,这样能直接指导补丁更新。

用Lynis做系统级定时审计

Lynis的扫描结果会输出到终端和日志文件,默认日志路径是/var/log/lynis.log,报告文件在/var/log/lynis-report.dat。手动跑一次完整审计的命令如下:

sudo lynis audit system --cronjob

--cronjob参数会让Lynis以非交互模式运行,适合放到计划任务里。扫描完成后,报告里会给出硬化指数、警告项、建议项。很多运维只盯着硬化指数看,其实更关键的是警告项里那些直接指向安全风险的内容,比如SSH允许root登录、防火墙规则缺失、内核参数不安全等。

要把Lynis做成定时任务,直接编辑crontab:

sudo crontab -e

加入一行,每周日凌晨3点执行一次完整审计,并把报告输出到独立目录:

0 3 * * 0 /usr/sbin/lynis audit system --cronjob > /var/log/lynis-weekly.log 2>&1

扫描完不代表结束,还需要把结果推送到你能看到的地方。可以在crontab里再追加一条命令,用mailx或者直接调用系统邮件服务把关键警告发到运维邮箱。如果没有配置邮件服务,也可以写个简单脚本,把lynis-report.dat里WARNING部分的条目提取出来,写入到本地文件或者通过企业微信、钉钉机器人推送。

用debsecan做CVE漏洞比对和补丁验证

debsecan的优势是直接告诉你哪个包有哪个CVE编号、严重程度如何、当前版本和修复版本分别是什么。比如输出里出现类似“CVE-2024-1234 linux-image-5.15.0-91-generic (high urgency)”,就说明内核包存在高危漏洞,需要立即升级。

把debsecan也放进定时任务,每天凌晨跑一次,只输出高危且已有修复的漏洞:

0 4 * * * /usr/bin/debsecan --suite=jammy --only-fixed --format=detail > /var/log/debsecan-daily.log 2>&1

光扫出来还不够,最好能自动触发修复。Ubuntu自带的unattended-upgrades可以自动安装安全更新,但它默认只处理安全源里的包,而且有时候会漏掉一些内核热补丁或者需要重启的服务。建议把debsecan的输出和unattended-upgrades结合起来:先让unattended-upgrades自动打安全补丁,再用debsecan验证是否还有未修复的高危漏洞。如果debsecan仍然报出高危项,说明自动更新没覆盖到,需要人工介入。

配置unattended-upgrades自动修复已知漏洞

Ubuntu服务器默认可能已经安装了unattended-upgrades,如果没有就手动装:

sudo apt install unattended-upgrades -y

然后编辑配置文件/etc/apt/apt.conf.d/50unattended-upgrades,把安全更新源打开。默认配置里Ubuntu的安全源是允许自动升级的,但需要确认下面几行没有被注释掉:

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}-security";
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
};

同时建议开启自动清理旧内核和自动重启。很多服务器因为长期不重启,内核更新后依然在跑旧内核,漏洞等于没修。在同一个配置文件里找到并修改:

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "05:00";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";

这样每天凌晨5点如果更新了需要重启的服务或内核,系统会自动重启。生产环境如果担心重启影响业务,可以把重启时间调到业务低峰期,或者先只在测试机上启用自动重启,生产机改成手动重启。

把扫描结果结构化输出,方便长期跟踪

定时扫描产生的日志如果只是堆在/var/log里,时间长了根本没人看。建议做一个简单的汇总脚本,每天把Lynis和debsecan的关键结果提取出来,生成一份纯文本或者HTML报告,存到指定目录,同时清理超过30天的旧报告。

下面是一个简单的bash脚本示例,放在/usr/local/bin/security-scan-report.sh:

#!/bin/bash
DATE=$(date +%Y%m%d)
REPORT_DIR=/var/reports/security
mkdir -p $REPORT_DIR

# 运行debsecan高危漏洞扫描
debsecan --suite=jammy --only-fixed --format=detail > $REPORT_DIR/debsecan-$DATE.txt

# 运行Lynis审计
lynis audit system --cronjob > $REPORT_DIR/lynis-$DATE.log 2>&1

# 提取Lynis警告项
grep -A 5 "Warnings" /var/log/lynis-report.dat > $REPORT_DIR/lynis-warnings-$DATE.txt

# 清理30天前的报告
find $REPORT_DIR -type f -mtime +30 -delete

给脚本执行权限,然后加入crontab,每天凌晨4点30分执行:

sudo chmod +x /usr/local/bin/security-scan-report.sh
30 4 * * * /usr/local/bin/security-scan-report.sh

这样每天都会在/var/reports/security目录下生成带日期的报告文件,运维只需要定期查看最新的报告即可。如果团队里有监控系统,还可以把报告目录接入文件采集,或者把关键指标推送到监控平台。

针对常见高危项的加固建议

定时扫描只是发现问题,真正降低风险的是把常见高危项提前加固掉。Lynis扫描结果里反复出现的几类问题,建议直接在生产环境基线里修掉。比如SSH配置,禁止root直接登录、禁止空密码、限制登录用户组,这些在/etc/ssh/sshd_config里改:

PermitRootLogin no
PasswordAuthentication yes
PermitEmptyPasswords no
AllowGroups sshusers

防火墙方面,Ubuntu默认的ufw一定要启用,并且只开放业务需要的端口。不要因为用了云厂商的安全组就忽略主机防火墙,双重防护在入侵场景下能多一层阻断。

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

内核参数方面,Lynis经常提示开启ASLR、禁止IP转发、开启SYN cookie保护等。可以在/etc/sysctl.d/99-security.conf里统一配置:

kernel.randomize_va_space = 2
net.ipv4.ip_forward = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

然后执行sudo sysctl --system让配置生效。这些加固项做完后,Lynis的警告数量会明显下降,后续定时扫描的重点就能集中在新增漏洞和配置漂移上。

扫描频率和业务低峰期的平衡

定时扫描的频率不是越高越好。Lynis完整审计会读取大量系统文件、检查所有已安装包,对磁盘IO和CPU有一定消耗。生产环境建议每周一次完整审计,每天只跑debsecan这种轻量级CVE比对。如果服务器负载本身就很高,可以把Lynis的扫描时间放在周末凌晨,避开业务高峰。debsecan因为只是比对包版本和漏洞数据库,开销极小,每天跑一次完全没问题。

另外要注意时区和crontab的执行时间。Ubuntu服务器如果时区设置不对,计划任务可能在你以为的白天执行。先确认系统时区:

timedatectl

如果不是本地时区,用sudo timedatectl set-timezone Asia/Shanghai这类命令调整。扫描时间统一按服务器本地时间计算,避免混淆。

把漏洞修复纳入变更管理流程

定时扫描发现的高危漏洞,修复动作本身也是一种变更。生产环境不能扫出来就直接自动升级所有包,尤其是数据库、中间件这类核心组件,升级可能引入兼容性问题。建议把漏洞分成三类处理:第一类是内核和基础库的高危漏洞,走unattended-upgrades自动修复;第二类是业务依赖的组件漏洞,先在测试环境验证再安排生产变更窗口;第三类是配置类问题,比如权限过宽、服务暴露,这类不需要重启服务,可以当天直接修复。

每周的安全扫描报告出来后,运维团队应该有一个固定的评审动作,确认哪些漏洞已修复、哪些在排期、哪些是误报。长期坚持下来,服务器的漏洞暴露窗口会大幅缩短,安全基线也会越来越稳定。

Ubuntu服务器定时漏洞扫描运维配置的核心,就是把Lynis和debsecan嵌入到crontab里自动跑,用unattended-upgrades兜底自动修复,再用报告脚本把结果结构化输出。这套机制不依赖额外商业软件,全部用Ubuntu官方源里的工具就能完成,适合大多数中小型生产环境直接落地。