# 受控自动修复 自动修复必须建立在已完成取证、用户明确批准具体修复项、且 SSH key 和带外控制台可用的前提上。默认只生成计划,不修改远端。 ## 支持的入口 ```bash # 只读计划 bash /scripts/remediate.sh user@host --plan --fix ssh-perms --fix fail2ban --ignore-ip 203.0.113.10/32 # 应用单项低风险修复 bash /scripts/remediate.sh user@host \ --apply --fix ssh-perms --confirm 'APPLY user@host' # 应用 Fail2ban;必须提供维护来源白名单 bash /scripts/remediate.sh user@host \ --apply --fix fail2ban --ignore-ip 203.0.113.10/32 \ --confirm 'APPLY user@host' # 使用脚本输出的 BACKUP_ID 回滚 bash /scripts/remediate.sh user@host \ --rollback 20261010T120000Z --confirm 'ROLLBACK 20261010T120000Z' ``` 脚本使用现有 SSH key、BatchMode 和 host-key 默认校验,不接受密码参数,不使用 `sshpass`,不自动安装系统包。 ## 修复边界 ### 可以自动执行(仍需 `--apply`) - `ssh-perms`:只修正当前 SSH 用户的 `~/.ssh` 为 `0700`、`authorized_keys` 为 `0600`,不改 key 内容和 owner。 - `fail2ban`:在独立的 `jail.d/host-sec-check.local` 写入 sshd jail;先备份、测试配置,再对已运行的服务 reload 并验证 jail。不自动启动或启用服务。 ### 只生成计划,不由脚本执行 - SSH 端口、root 登录、密码认证、MFA、转发策略。 - UFW/nftables/firewalld 规则和云安全组。 - Docker/k8s 端口绑定、特权、socket/宿主机挂载。 - 删除或隔离恶意文件、容器、镜像、服务和 `/etc/ld.so.preload`。 - 重启、密钥/token 轮换和系统包安装。 ## 备份与回滚 应用前在远端创建 `/var/backups/host-sec-check//`,保存受影响文件和权限元数据。Fail2ban 文件恢复、SSH 权限恢复和本次新建文件删除都只针对该备份 manifest 中的精确路径。 如果应用中途失败,报告已完成项、备份目录和回滚命令;不能把“备份已创建”当成“回滚已成功”。回滚后仍需重新检查 SSH、Fail2ban 和业务状态。 ## Agent 行为 1. 先跑 `--plan`,把修复项、影响、备份目录和验证方式列给用户。 2. 用户只批准某些项时,只传对应的 `--fix`,不能顺手扩大范围。 3. 应用后读取脚本输出,逐项确认 `[已修复]`、验证结果和未执行项。 4. SSH/防火墙/业务中断风险出现时停在计划阶段,转为人工确认,不用脚本猜测或重试。