能做,但需明确比对项和基线依据;将等保条款映射为具体检查点,封装为函数返回0/1,过滤注释空行,提取数值比较阈值,适配发行版差异,输出制表符分隔结构化结果。

用 shell 脚本比对等保基线配置项是否合规
直接结论:能做,但必须明确「比对什么」和「依据哪条基线」。等保 2.0 基线(如《GB/T 22239-2019》)本身不提供可执行代码,需先将条款映射为具体系统检查点,比如 /etc/passwd 中空密码用户、sshd_config 的 PermitRootLogin 值、ulimit -n 最小值等。脚本本质是批量执行检查命令 + 判断输出是否匹配预期值。
实操建议:
- 每条检查项单独封装为函数,返回 0(合规)或 1(不合规),避免单点失败中断全量扫描
- 用
grep -v '^#' | grep -v '^$'过滤配置文件注释和空行,防止误判 - 对数值类检查(如密码最长使用天数
MAX_DAYS)用awk '/^PASS_MAX_DAYS/{print $2}' /etc/login.defs提取后与阈值比较,别直接grep PASS_MAX_DAYS /etc/login.defs后硬匹配字符串 - 注意权限问题:部分检查需 root 权限(如读取
/etc/shadow),脚本开头加[ $(id -u) -ne 0 ] && { echo "请用 root 运行"; exit 1; }
处理 Linux 发行版差异导致的路径/命令不兼容
CentOS/RHEL 和 Ubuntu/Debian 对同一基线项的实现位置不同,比如 SSH 配置:RHEL 系在 /etc/ssh/sshd_config,Ubuntu 可能额外加载 /etc/ssh/sshd_config.d/*.conf;又如日志审计,RHEL 用 auditd,Ubuntu 20.04+ 默认启用 rsyslog + systemd-journald 双通道。硬编码路径会直接漏检。
实操建议:
- 用
lsb_release -is或cat /etc/os-release | grep ^ID=判定发行版,分支处理逻辑 - SSH 检查不要只读主配置,加一句
find /etc/ssh/sshd_config.d/ -name "*.conf" -exec grep -l "PermitRootLogin" {} \;扫描碎片化配置 - 服务状态检查统一用
systemctl is-active --quiet <service_name></service_name>,比service <service_name> status</service_name>兼容性更好 - 避免依赖
sestatus(仅 RHEL/CentOS 默认装),SELinux 相关项先command -v sestatus >/dev/null || { echo "SELinux 工具未安装,跳过相关检查"; continue; }
让脚本输出可被人工复核或导入 Excel 的结构化结果
运维或等保测评人员需要清晰知道“哪条没过、为什么没过、当前值是多少”,而不是只看到 FAIL。纯文本日志难筛选,CSV 又容易因字段含换行/逗号崩格式。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
实操建议:
- 每行输出固定 4 字段,用制表符
\t分隔:检查项ID\t描述\t当前值\t合规状态,例如:SEC-SSH-01\t禁止root远程登录\tyes\tFAIL - 当前值字段若含多行(如
ls -l /etc/cron.*结果),先用tr '\n' ';' | sed 's/;$//'折成一行 - 最后用
awk -F'\t' '$4=="FAIL"{print}' output.tsv快速提取不合规项,方便追加整改备注 - 别在脚本里写
echo "✅ 合规"这类 emoji,某些终端或日志收集系统会乱码,用OK/FAIL最稳妥
绕过交互式命令和不可控环境变量干扰检查结果
有些命令在非交互终端下行为异常:比如 passwd -S 在无 TTY 时可能卡住;sudo 默认拒绝非 tty 输入;甚至 read 语句会让脚本挂起。另外,$PATH 被修改、alias 覆盖原命令也会导致检查失效。
实操建议:
- 所有命令显式指定绝对路径:
/usr/bin/find、/bin/grep、/usr/sbin/sshd,避免 alias 或 PATH 污染 - 禁用交互:
export DEBIAN_FRONTEND=noninteractive(Debian/Ubuntu)、export LC_ALL=C统一 locale,防止中文提示干扰正则匹配 - 对用户密码策略检查,不用
chage -l(需指定用户名),改用getent shadow | awk -F: '$2!~/^\*|!/ {print $1,$5}'批量提取最大密码有效期 - 用
timeout 5s command || echo "超时"包裹可能卡死的命令(如网络相关检查),避免脚本假死
真正难的不是写几百行检查逻辑,而是把每一条等保条款准确翻译成可验证的 shell 表达式——比如“应启用安全审计功能”,不能只查 auditd 是否运行,还得确认 /etc/audit/rules.d/*.rules 里有至少一条 -w 规则,且 auditctl -l | wc -l 输出大于 0。漏掉任一环节,自查报告就失去效力。










