跳转至

RUNBOOK — SELinux / firewalld 期望态管理(selinux-firewall-20261003)

面向接手日常运维与值班的人:本工程把 19 台受管主机的 SELinux / firewalld 收敛到统一期望态, 并提供只读复核、漂移检测与回滚。拿着本文即可完成日常检查与故障处置。

1. 服务概览

项 内容
干什么用的 把内网 19 台主机的 SELinux 保持 permissive、firewalld 保持停止+禁用;提供幂等收敛与回滚
组件 main.py(入口)、deployer.py(编排)、utils/state_probe.py(状态探测与三态判定)、utils/config_validate.py(配置校验)
依赖 本机 root 免密 ssh;共享库 ~/py_public_modules(经 .venv 的 py_public_modules.pth 挂载)
不依赖 不开任何常驻服务;无网络端口;不写目标机业务配置
异常时业务影响 无。本工程只在被调用时运行;期望态失效的后果是"回答排查问题时又遇到 SELinux 拒绝 / 端口被挡"
重要性 中(影响排障效率与后续业务放行,不影响既有业务运行)

期望态:SELinux 运行 Permissive、/etc/selinux/config 为 SELINUX=permissive(原 disabled 保持不动); firewalld inactive + disabled。

2. 接入与凭据

  • 执行位置:本机(192.168.31.249),cd /home/rain/Documents/k8s_ins/selinux-firewall-20261003。
  • 目标主机:见 config/selinux-firewall.yaml 的 nodes 段(19 台)。
  • 凭据:root 免密密钥,无需口令;工程不存任何口令。若某主机改走口令,凭据只放 ~/.secrets/(600), 取用方式 set -a; . "$HOME/.secrets/prod.env"; set +a,禁止 cat 该文件。
  • Python 环境:工程自带 .venv(Python 3.12,paramiko==5.0.0 + PyYAML==6.0.2)。

3. 日常速查表

cd /home/rain/Documents/k8s_ins/selinux-firewall-20261003

.venv/bin/python main.py precheck     # 只读预检查:配置校验 + 19 台状态探测 + 作业占用
.venv/bin/python main.py verify       # 只读:期望态复核(0 达标 / 1 未达标)
.venv/bin/python main.py drift        # 只读:漂移检测(0 无漂移 / 1 有漂移 / 2 检测失败)
.venv/bin/python main.py deploy --dry-run   # 预演,零改动
.venv/bin/python main.py deploy       # 收敛到期望态(幂等)
.venv/bin/python main.py rollback     # 按 pre-state.json 回滚到变更前
tail -50 logs/selinux-firewall.log    # 最近一次执行的详细日志

4. 日常操作

状态检查(不依赖本工程,最直接)

for ip in 10 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31; do
  timeout 12 ssh -n -o BatchMode=yes root@192.168.31.$ip \
    'printf "%s SEL=%s FW=%s/%s\n" "$(hostname)" "$(getenforce)" \
       "$(systemctl is-active firewalld)" "$(systemctl is-enabled firewalld)"' &
done; wait

预期:每行 SEL=Permissive(lsf 5 台 + hpc 为 Disabled)且 FW=inactive/disabled。

新增主机纳管:在 config/selinux-firewall.yaml 的 nodes 段追加一行 → main.py precheck 确认可探测 → main.py deploy。

单台试点:main.py deploy --limit 192.168.31.30(不存在的 IP 会被过滤,注意用真实 IP)。

日志:logs/selinux-firewall.log(全量,含每台每步命令与返回);控制台默认 INFO。

5. 配置管理

  • 唯一真源:config/selinux-firewall.yaml。改动点:target(期望态)、execution(批次与超时)、 precheck(调度器地址与 LSF 路径)、nodes(主机清单)。
  • 生效方式:无需重启任何东西,下一次命令调用即读取新配置。
  • 易错点:
  • precheck.lsf_envdir 必须是 /data/nfs/lsf/lsf/conf(不是 10.1/conf),否则 bjobs rc≠0;
  • execution.max_workers 不建议 > 8(受目标端 sshd MaxStartups 约束,超限是连接被拒,不是变慢);
  • 改完配置不必动实现体;改实现体(deployer.py / utils/)后跑一次 main.py precheck 回归。

6. 备份与恢复

  • 备份位置:本地 backup/<hostname>/(selinux-config、firewall-state.txt、pre-state.json), 远端 /root/selinux-fw-backup/<时间戳>/;台账 backup/README.md。
  • 手工备份:见 docs/SOP.md 第 5 章步骤 2(带时间戳,远端 + 本地各一份)。
  • 恢复步骤:
  • main.py rollback(自动按 pre-state.json 判定该恢复 SELinux 配置、运行模式或 firewalld);
  • 按第 4 节状态检查复核;
  • 若仅需恢复 firewalld:ssh root@<ip> 'systemctl enable --now firewalld'(配置未删,放行规则自动回来)。
  • 演练记录:2026-10-03 首轮变更后 .25(failed 残留态)触发一次增量重跑,验证了幂等与达标判定路径。

7. 监控与告警

  • 本工程无常驻监控对象,风险体现在"期望态漂移"。
  • 漂移发现方式:定期(建议每周)跑 main.py drift,退出码非 0 即需处理。
  • 关联影响面:9100(node-exporter)在 firewalld 关闭后无来源限制,若后续重新启用 firewalld, 须同步补放行 9100(原 rich rule 仅允许 k8s 四节点,清单见 backup/<host>/firewall-state.txt)。

8. 故障处置

场景 1:deploy 报某台"未达期望态"

症状:后置校验输出 以下主机未达期望态:<ip>。 诊断

timeout 15 ssh -n -o BatchMode=yes root@<ip> \
  'systemctl is-active firewalld; systemctl is-enabled firewalld; systemctl is-failed firewalld; getenforce'

处置:若为 failed → systemctl reset-failed firewalld(实现体已含此步,重跑 deploy 即可); 若 Enforcing 未变 → 检查是否有其他安全模块(sestatus)。 验证:main.py drift 返回 无漂移。

场景 2:precheck 报 unknown 并中止

症状:以下主机状态探测失败(unknown),按规范一律中止。 诊断:timeout 6 ssh -n -o BatchMode=yes root@<ip> 'echo ok' 判连通性;再单跑探测命令看是否返回空。 处置:连通性问题先修网络/密钥;若命令不可用(如 firewalld 未安装且 unit 不存在属正常形态, 不应报 unknown),检查 utils/state_probe.py 的判定取值域。 验证:main.py precheck 通过且 探测失败 0。

场景 3:bjobs / squeue 作业查询失败

症状:日志出现 Slurm 作业查询失败 或 LSF 作业查询失败。 诊断

timeout 20 ssh -n -o BatchMode=yes root@192.168.31.23 \
  'export LSF_ENVDIR=/data/nfs/lsf/lsf/conf; export LSF_SERVERDIR=/data/nfs/lsf/lsf/10.1/linux2.6-glibc2.3-x86_64/bin; \
   $LSF_SERVERDIR/bhosts'
timeout 10 ssh -n -o BatchMode=yes root@192.168.31.16 'squeue -h | wc -l'

处置:LSF 报 initenv_:fopen(/etc/lsf.conf) failed → LSF_ENVDIR 配错,见第 5 章易错点; 主控未起(lim/mbatchd 不在)→ 属调度器侧故障,另案处理。 验证:precheck 日志中作业检查无 warning。

场景 4:误改了不该动的主机,需立即恢复

处置:main.py rollback(全量)或对单台执行 docs/SOP.md 第 7 章命令; 关键:若该主机原则是 Enforcing 且未被改成 disabled,setenforce 1 立即恢复,无需重启、无需 relabel。

9. 安全与权限

  • 执行身份为 root(改 /etc/selinux/config、停服务均需 root)。
  • 工程不含任何凭据;密钥在 ~/.ssh/,口令类凭据在 ~/.secrets/(600)。
  • 变更属"放宽安全限制"类:SELinux 由 Enforcing 降为 Permissive、firewalld 全停。 该决定基于环境为全内网;若将来引入公网入站面(如新开 frp 隧道、对外暴露端口), 须重新评估并优先只对新暴露主机恢复强制模式。

10. 容量与性能

  • 无容量问题:只读探测 19 台约 1~3s;全量变更实测 8.5s(4 批,批内并发 4)。
  • 已知瓶颈:无。唯一注意点是 max_workers 与目标端 MaxStartups 的关系(见第 5 章)。
  • 扩展:主机数增加只需扩 nodes 段,批次会自动重排。

11. 附录

  • 术语:enforcing=强制拦截,permissive=只记录不拦截,disabled=完全不加载(回改需 relabel)。
  • 相关文档:docs/SOP.md(本次变更全过程)、../docs/HANDOFF.md(项目当前状态)、 ../docs/BASELINE.md(环境事实)、../docs/PROJECT-MAP.md(工程路由)。
  • 修订记录:2026-10-03 首版(变更实施同日)。

来源:/home/rain/Documents/k8s_ins/selinux-firewall-20261003/docs/RUNBOOK.md | 最后更新:2026-10-03 00:47(由 build/sync.py 同步,请勿在站点侧修改)