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),否则bjobsrc≠0;execution.max_workers不建议 > 8(受目标端 sshdMaxStartups约束,超限是连接被拒,不是变慢);- 改完配置不必动实现体;改实现体(
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同步,请勿在站点侧修改)