CentOS 7 的生命周期在 2024 年 6 月 30 日正式画上句号,这意味着大量仍跑在数据中心或云环境中的存量服务器将停止接收安全更新。把系统迁移到 Rocky Linux 或 AlmaLinux 固然是正解,但迁移窗口期的安全基线维护,以及迁移后的合规检查,不能只靠感觉。直接跑一次 Lynis 审计,拿到一个硬化的分数,然后把分数存下来,才是让安全状态可见的唯一手段。单次分数意义有限,只有把每次审计结果串成一条趋势线,才能看出系统是在变硬还是在劣化。
Lynis 是 CISOfy 开发的开源安全审计工具,不需要安装客户端,直接拷贝脚本就能跑。它检查的内容覆盖系统启动服务、内核参数、文件权限、软件包漏洞、认证机制、日志配置等数百项指标,最后给出一个 0 到 100 的硬化指数。这个指数不是绝对值,而是一个相对参考,关键看趋势。手动跑一次 Lynis 很简单,但要让它在 CentOS 上定期运行,并把分数抽出来画成图,需要一点工程化思维。
安装 Lynis 并跑通第一次审计CentOS 默认源里没有 Lynis,直接从官方 Git 仓库拉取是最干净的方式。执行以下命令把 Lynis 克隆到 /opt 下,这样不会污染系统目录,也方便后续脚本调用。
yum install git -y cd /opt git clone https://github.com/CISOfy/lynis.git
克隆完成后直接进目录执行审计。注意 Lynis 需要 root 权限才能做深度检查,否则很多内核参数和文件权限项会直接跳过,分数虚高没有参考价值。
cd /opt/lynis ./lynis audit system --quick
第一次跑建议去掉 --quick 参数,让 Lynis 做全量检查。跑完之后终端会打印出 Hardening index 分数,同时详细报告会以文本形式保存在 /var/log/lynis-report.dat 里。这个 dat 文件是后续自动提取分数的核心数据源。看一眼报告文件的最后几行,就能找到类似 hardening_index=67 这样的字段,这就是我们要抓取的原始数据。
用脚本自动提取硬化指数并打时间戳手动跑一次看分数很简单,但要做趋势图就必须把每次的分数和时间戳存进一个结构化文件。写一个极简的 shell 脚本,跑完 Lynis 后立刻从报告文件里把分数抠出来,追加到 CSV 文件里。脚本放在 /opt/lynis/run_audit.sh,内容如下。
#!/bin/bash DATE=$(date +%Y-%m-%d) cd /opt/lynis ./lynis audit system --quiet 2>/dev/null SCORE=$(grep -oP 'hardening_index=\K[0-9]+' /var/log/lynis-report.dat) echo "$DATE,$SCORE" >> /var/log/lynis-score-history.csv
这个脚本做了三件事:静默执行审计,用 grep 正则精确提取数字分数,把日期和分数以逗号分隔写入 CSV。注意 --quiet 参数会减少终端输出,适合无人值守运行。如果某些服务器上 hardening_index 字段名略有不同,可以先用 grep hardening /var/log/lynis-report.dat 确认一下实际字段名,再调整正则表达式。
配置 Cron 实现每周自动审计安全审计不需要每天跑,太频繁反而消耗资源且容易产生噪音。每周一次是比较合理的节奏,既能及时发现问题,又不会让趋势图波动过大。把脚本加入 root 用户的 crontab。
crontab -e # 添加下面一行,每周一凌晨 3 点执行 0 3 * * 1 /bin/bash /opt/lynis/run_audit.sh
这里有一个容易被忽略的坑:Lynis 每次运行会更新自己的数据库和签名,如果服务器处于离线环境或者有严格的出网限制,需要提前把 Lynis 的更新功能关掉,否则审计过程会因为网络超时卡住。在 lynis 目录下创建一个配置文件 custom.prf,加入 skip_updatetest=yes 即可。
把 CSV 数据变成可视化趋势图有了 CSV 文件,接下来要解决的是怎么把它变成人能一眼看懂的趋势图。不引入 Prometheus 和 Grafana 那套重型监控体系,直接用 Python 的 matplotlib 库就能在本地生成 PNG 图片,或者更进一步,用轻量的 Web 框架把图嵌入到一个内网页面里。
先安装 Python 3 和依赖库。CentOS 7 默认 Python 版本较低,建议通过 EPEL 安装 Python 3.6 以上版本。
yum install epel-release -y yum install python36 python36-pip -y pip3 install matplotlib pandas
然后写一个 Python 脚本 /opt/lynis/generate_trend.py,读取 CSV 文件并生成折线图。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
df = pd.read_csv('/var/log/lynis-score-history.csv', names=['date', 'score'])
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date')
plt.figure(figsize=(12, 5))
plt.plot(df['date'], df['score'], marker='o', linestyle='-', color='#2c7fb8', linewidth=2)
plt.axhline(y=70, color='orange', linestyle='--', label='Warning threshold (70)')
plt.axhline(y=90, color='green', linestyle='--', label='Target threshold (90)')
plt.xlabel('Date')
plt.ylabel('Hardening Index')
plt.title('Lynis Security Score Trend - CentOS')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('/var/log/lynis-score-trend.png', dpi=150)
这个脚本读取历史 CSV,按日期排序后画折线图,同时画了两条参考线:70 分是警戒线,低于这个分数说明系统存在较多中高风险项;90 分是目标线,达到这个水平说明系统硬化程度较高。每次生成的新图片会覆盖旧文件,可以在 Cron 里把生成图片的任务跟在审计脚本后面执行。
如果想让更多人看到这张图,最轻量的方式是用 Python 自带的 HTTP 服务器把图片目录暴露出来。在 /var/log 下启动一个简单的文件服务,注意绑定内网 IP 并加防火墙规则限制访问来源。
cd /var/log nohup python3 -m http.server 8080 --bind 192.168.1.100 &
之后内网用户直接访问 http://192.168.1.100:8080/lynis-score-trend.png 就能看到最新的趋势图。这种方式没有认证机制,仅适合纯内网且信任的环境。如果对安全性有要求,建议用 Nginx 做一层反向代理并加上 Basic Auth。
解读趋势图中的异常波动并辅助决策图有了,真正产生价值的是对趋势的解读。正常情况下,硬化指数应该是一条缓慢上升或者保持高位的平稳线。如果某周分数突然大幅下跌,通常意味着三件事之一:有人新装了带默认配置的软件包,比如装了个 MySQL 但没有运行 mysql_secure_installation;有人修改了文件权限或内核参数;系统更新引入了新的默认配置覆盖了之前的硬化设置。
反过来,如果分数长期在 60 分以下徘徊,说明系统存在大量基础性问题,比如 SELinux 处于 Permissive 模式、空密码账户存在、不必要的网络服务在监听。这时候 Lynis 报告里的 Suggestions 部分就是整改清单,按严重程度逐条处理即可。每处理完一批问题,手动跑一次审计,分数会立刻反映出来,趋势图上会形成一个明显的跃升拐点,这种正向反馈对推动安全整改非常有说服力。
还有一种情况值得警惕:分数突然跳高。这不一定代表系统变安全了,可能是 Lynis 的某些检查项因为权限问题被跳过了。遇到这种异常,要回去看 /var/log/lynis.log,检查是否有大量 skipped 或 warning 条目。
把 Lynis 审计嵌入安全运营的日常流程趋势图的价值在于长期积累。建议把 CSV 数据和趋势图纳入运维交接文档,每季度做一次安全回顾时,直接把趋势图拿出来讨论。如果团队在用类似 JumpServer 的堡垒机或者 Ansible 做自动化运维,完全可以把 Lynis 审计脚本集成到 Ansible Playbook 里,对所有 CentOS 节点批量执行,然后把各节点的分数汇总到一个集中的数据库中,用同一个图表模板生成多台机器的对比视图。
对于需要满足等保或内部合规要求的场景,Lynis 的报告本身就是一份很好的证据材料。把每周生成的 lynis-report.dat 和趋势图一起归档,审计时直接拿出来就能证明系统安全状态是持续受控的,而不是临时抱佛脚做的表面功夫。
CentOS 停止更新后,安全维护的责任完全落在运维团队自己身上。Lynis 不能替代入侵检测系统,也不能替代漏洞扫描器,但它能持续告诉你系统的基础安全配置有没有跑偏。把分数存下来、画成图、定期看,这件事的技术门槛极低,但能带来的安全可见性提升是立竿见影的。花一个小时把这条自动化流水线搭起来,未来几年你都会感谢自己做了这个决定。
