十分钟拿到一台机器的安全快照
轻量巡检的思路是用一段只读脚本,把最容易出问题的六类信息一次采全:UID 为 0 的账号、监听端口、SUID 文件数量、运行中服务数量、防火墙状态、审计规则条数。输出就是一份基线快照,用来做纵向对比(同一台机器不同时间)和横向对比(同角色机器之间)。单次数字本身说明不了太多,能看出异常的是变化:SUID 文件数量突然增加、监听端口多了几个、审计规则从几十条变成 0,这些都是明确的信号。
基本信息
| 加固项 | 主机安全快速体检 |
|---|---|
| 适用平台 | Linux(脚本只用系统自带命令) |
| 权限要求 | root(读进程、审计与权限信息需要) |
| 达标判据 | 输出即基线快照,可对比、可归档 |
| 采集项 | 特权账号、监听端口、SUID、服务、防火墙、审计规则 |
典型使用场景
- 批量巡检时快速采集每台机器的基础信息
- 安全事件初筛:先看六个指标有没有明显漂移
- 新接手环境的第一轮摸底
- 变更前后各跑一次,作为影响对比依据
- 纳入自动化任务,按周生成并归档
巡检脚本骨架(只读)
巡检脚本骨架(只读)
{
echo '== UID0 =='; awk -F: '$3==0{print $1}' /etc/passwd
echo '== LISTEN =='; ss -tulnp | awk 'NR>1{print $1,$5}' | sort -u | head -20
echo '== SUID-COUNT =='; find / -xdev -perm -4000 -type f 2>/dev/null | wc -l
echo '== RUNNING-SVC =='; systemctl list-units --type=service --state=running --no-pager | wc -l
echo '== FIREWALL =='; systemctl is-active firewalld 2>/dev/null || ufw status 2>/dev/null | head -1
echo '== AUDIT-RULES =='; auditctl -l 2>/dev/null | wc -l
} | tee /tmp/baseline-$(date +%F).txt把快照用起来
把快照用起来
ls -l /tmp/baseline-*.txt # 确认历史快照都在
diff /tmp/baseline-2026-09-01.txt /tmp/baseline-2026-10-01.txt # 两次快照做差异对比
find / -xdev -perm -4000 -type f 2>/dev/null > /tmp/suid-$(date +%F).txt # SUID 明细单独留档
# 归档建议:把快照转存到日志目录或集中存储,避免落在 /tmp 被清理掉六个指标的异常信号
| 指标 | 正常表现 | 异常信号 |
|---|---|---|
| UID 0 账号 | 通常只有 root | 出现第二个特权账号,需立即核查来源 |
| 监听端口 | 与业务清单一一致 | 新增未登记端口,尤其是数据库与远程管理类 |
| SUID 文件数 | 相对稳定 | 数量突增,可能是提权工具或被植入后门 |
| 运行中服务数 | 相对稳定 | 明显增加说明有新软件或新组件上线 |
| 防火墙状态 | active | inactive 说明边界控制失效 |
| 审计规则条数 | 大于 0 且稳定 | 变成 0 说明规则被清空或审计失效 |
脚本务必保持只读:带修复动作的“一键加固”脚本上生产前必须在测试机完整演练并准备回滚方案。核查类脚本一旦顺手改配置,就同时具备了故障与风险的双重属性——既可能中断业务,也会让后续对比失去意义(因为你无法判断变化来自环境还是脚本)。
计数类指标要建历史曲线:单次数字看不出好坏,只有趋势才有判断力。另外注意 tee 的输出位置——落在 /tmp 的快照会被清理,应转存到日志归档或集中存储,否则需要对比时才发现历史数据已经没了。