答案是:提供一个模块化、只读、适配多发行版的 Bash 安全基线检查脚本,覆盖账号认证、文件权限、服务网络、日志审计、内核加固五大安全域,每项含可验证命令和明确状态判定(PASS/FAIL/WARN/MANUAL/N/A),输出彩色终端结果+时间戳文本报告+可选JSON,纯 Bash 实现,离线可用。

直接写一个可执行、可落地、不改系统又能看清风险的 Bash 脚本,比堆砌文档或套用模板更实用。核心是:只读检查、结果明确、覆盖高频风险项、适配主流发行版(RHEL/CentOS/Rocky/Alma、Ubuntu/Debian)。
一、脚本结构要清晰,按安全域组织检查项
把检查逻辑拆成模块,每类问题独立函数,便于维护和增删。常见分组包括:
- 账号与认证:空密码账户、UID=0非root用户、root远程登录状态、密码策略参数
- 文件权限与敏感配置:/etc/passwd /etc/shadow /etc/group 权限、全局可写文件、SSH 配置文件权限
- 服务与网络:监听端口、非必要服务(telnet/ftp/rlogin)、ICMP 重定向开关、防火墙启用状态
- 日志与审计:rsyslog/auditd 运行状态、关键日志文件权限、/etc/passwd 修改审计规则是否生效
- 内核加固:IP 转发、源路由、SYN cookies、execshield 等关键 sysctl 参数
二、每项检查必须带“证据命令”和状态判定逻辑
不能只写“检查密码有效期”,而要给出具体怎么查、怎么判。例如:
检查 PASS_MAX_DAYS 是否 ≤90:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
pass_max_days=$(awk '/^PASS_MAX_DAYS/ {print $2}' /etc/login.defs 2>/dev/null)
if [[ -z "$pass_max_days" ]] || [[ "$pass_max_days" -gt 90 ]]; then
echo "FAIL: PASS_MAX_DAYS is $pass_max_days (should be ≤90)"
else
echo "PASS: PASS_MAX_DAYS = $pass_max_days"
fi
这样输出自带依据,人工复核时直接复制命令就能验证,避免“脚本说FAIL,但不知道为啥”。
三、状态定义统一,不模糊
用标准状态码降低沟通成本,脚本末尾自动统计:
- PASS:完全符合基线要求
- FAIL:明确不符合,需立即整改(如空密码、PermitRootLogin yes)
- WARN:存在潜在风险但未达高危(如密码最短天数为0、SSH密钥权限为644)
- MANUAL:需人工确认(如物理访问控制、组织流程类)
- N/A:当前系统不适用(如检查 RHEL 特有服务但在 Ubuntu 上运行)
四、输出要能直接用于汇报和归档
一次运行,同时生成两份结果:
- 终端实时显示带颜色的状态(绿色PASS、红色FAIL),方便快速扫读
- 自动生成时间戳报告:
baseline_report_$(date +%Y%m%d_%H%M%S).txt,含完整命令输出和上下文 - 可选 JSON 格式输出(便于后续接入 Zabbix 或 CMDB 做趋势分析)
不依赖外部库,纯 Bash + 标准 Linux 工具(awk、grep、ss、stat、sysctl),离线环境也能跑。

















