服务器基线扫描工具,一键检测安全风险:服务器基线扫描工具
服务器基线扫描的核心目的,是用一套固定标准快速找出账号、端口、权限、补丁这些容易被忽略的风险点。
本文面向零基础运维,用开源工具 Lynis 加一个自写脚本,带你在 Linux 上完成一次可复现的一键检测,并知道结果怎么看、问题怎么修。
扫描前先确认环境和权限
动手之前先明确两点:扫描对象是谁,用什么身份执行。
- 适用系统:主流 Linux 发行版(CentOS、Ubuntu、Debian 等),以下命令在 root 或具备 sudo 权限的账号下执行。
- 检查范围:本地系统配置层面,不涉及网络层漏扫(端口外部探测是另一类工具)。
- 关键原则:基线扫描只读不改,先看清楚现状再决定是否加固,避免误改生产配置。
登录服务器,确认系统版本和包管理器,方便后续安装:
cat /etc/os-release
# Ubuntu/Debian 用 apt,CentOS/RHEL 用 yum 或 dnf
安装 Lynis 并跑第一次扫描
Lynis 是一款成熟的开源主机安全审计工具,能自动检查数百个基线项,适合做日常体检。
Ubuntu/Debian 安装:
sudo apt update
sudo apt install -y lynis
CentOS/RHEL 如果仓库里没有,用官方脚本安装:
# 建议先查看脚本内容再执行
curl -fsSL https://cisofy.com/files/lynis-3.x.tar.gz -o lynis.tar.gz
tar -xzf lynis.tar.gz
cd lynis
sudo ./lynis audit system
扫描结束后,重点看结果文件里的建议条目。扫描不会自动改配置,只输出问题和加固建议,修复与否由你决定。
用脚本补齐你关心的检查项
Lynis 覆盖面广,但有些团队关心的项(比如特定账号、特定端口)需要自己补。
下面这个脚本把常见基线项串成一次执行,保存为 baseline_check.sh:
#!/bin/bash
echo "===== 基线扫描开始 $(date) ====="
# 1. UID 为 0 的账号(应为 root 一个)
echo "[1] UID=0 账号:"
awk -F: '$3==0 {print $1}' /etc/passwd
# 2. 空密码账号
echo "[2] 空密码账号:"
awk -F: '$2=="" {print $1}' /etc/shadow 2>/dev/null || echo "需 root 权限读取 /etc/shadow"
# 3. 监听端口
echo "[3] 监听中的端口:"
ss -tulnp 2>/dev/null || netstat -tulnp
# 4. SSH 关键配置
echo "[4] SSH 配置:"
grep -Ei '^(PermitRootLogin|PasswordAuthentication|Port)' /etc/ssh/sshd_config
# 5. 可写权限异常的敏感文件
echo "[5] 全局可写文件(前 20 个):"
find /etc /bin /sbin -type f -perm -0002 2>/dev/null | head -20
echo "===== 扫描结束 ====="
赋权并执行:
chmod +x baseline_check.sh
sudo ./baseline_check.sh > baseline_report.txt 2>&1
cat baseline_report.txt
把输出重定向到文件,方便留档和对比。建议每次加固前后各跑一次,用差异判断修复是否生效。
结果怎么看,哪些优先处理
扫描结果里项目很多,不必全部立刻处理。
按风险高低排优先级:
- 高危优先:UID 为 0 的多余账号、空密码账号、SSH 允许 root 直接登录且允许密码认证、全局可写的系统目录文件。
- 中危关注:开放了非必要监听端口、SSH 使用默认 22 端口且暴露公网。
- 低危记录:日志轮转、审计策略等不影响即时安全但建议补齐的项。
一条可独立判断的结论:只要出现非预期的 UID=0 账号或空密码账号,就应视为高风险,先禁用或删除再继续其他加固。
常见坑和修复示例
几个新手最容易踩的点:
- 直接改
sshd_config后没重启服务,以为没生效。改完执行sshd -t校验语法,再用systemctl restart sshd重启。 - 关闭密码登录前没确认密钥可用,把自己锁在服务器外。先测试密钥登录成功,再关密码认证。
- 用
find /全盘扫描可写文件,耗时且刷屏,应限定/etc /bin /sbin等目录。 - 把扫描脚本输出的账号名直接删除,误删系统账号。处理前用
id 账号名确认用途。
SSH 加固参考配置:
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
改完务必先 sshd -t 验证,再重启服务。
验证加固是否真正生效
修复后再次执行扫描,对比前后结果:
sudo ./baseline_check.sh > baseline_after.txt
# 对比差异
diff baseline_report.txt baseline_after.txt
再看关键项是否已符合预期:
awk -F: '$3==0 {print $1}' /etc/passwd只应输出 root。grep PasswordAuthentication /etc/ssh/sshd_config应显示no。ss -tulnp中不应再有计划外的监听端口。
判断标准很直接:同一检查项在加固后的输出里消失或变成预期值,才算真正修复。
几个常见疑问
扫描会不会影响线上业务?
Lynis 和上述脚本都是只读检查,不改配置、不重启服务,正常情况不影响业务;
但扫描期间会产生一定磁盘和 CPU 开销,建议避开业务高峰。
多久扫一次比较合适?
建议至少每月一次,并在每次系统变更、开放新端口或新增账号后补扫一次,便于发现配置漂移。
Lynis 的分数重要吗?
分数可作为趋势参考,不必只盯分数。
更应关注高危项是否清零,以及每次扫描结果的差异。
只有一台服务器也值得做吗?
值得。
基线扫描的价值在于把安全标准固定下来,机器越少越容易漏掉手工检查,脚本化后反而更省心。
安全基线不是一次性任务,把扫描脚本加入定时任务或发布流程,才能持续发现风险。