如何通过 Ansible 批量配置 Linux 主机 SSH 禁止 root 远程登录

文章导读
通过 Ansible 批量禁止 Linux 主机 SSH root 远程登录,最推荐的做法是使用 lineinfile 模块修改目标主机的 /etc/ssh/sshd_config 文件,将 PermitRootLogin 参数设置为 no,并在确认拥有其他 sudo 权限账户后重启 sshd 服务。此操作适用于所有标准 Linux 发行版,主要风险在于配置错误或服务重启后可能导致管理员无法远程连
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
A A

通过 Ansible 批量禁止 Linux 主机 SSH root 远程登录,最推荐的做法是使用 lineinfile 模块修改目标主机的 /etc/ssh/sshd_config 文件,将 PermitRootLogin 参数设置为 no,并在确认拥有其他 sudo 权限账户后重启 sshd 服务。此操作适用于所有标准 Linux 发行版,主要风险在于配置错误或服务重启后可能导致管理员无法远程连接。

先说结论:使用 Ansible 自动化修改 SSH 配置是高效且可回滚的安全加固手段,但必须在执行前确保至少存在一个可用的非 root sudo 账户。

  • 先判断:检查目标主机是否已创建具备 sudo 权限的普通用户,避免锁死访问权限。
  • 优先做:使用 Ansible 的 check 模式预演配置变更,确认 sshd_config 语法无误。
  • 再验证:配置生效后,尝试使用 root 账户 SSH 连接,确认被拒绝且普通用户连接正常。

命令速用版

以下 playbook 片段可直接用于批量修改配置,注意替换 inventory 中的主机组名。

- name: Disable SSH Root Login
  hosts: all
  become: true
  tasks:
    - name: Ensure PermitRootLogin is set to no
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin no'
        state: present
      notify: Restart sshd

  handlers:
    - name: Restart sshd
      ansible.builtin.service:
        name: sshd
        state: restarted
      # 部分 Debian/Ubuntu 系统服务名为 ssh
      # name: ssh

为什么会这样

禁止 root 远程登录的核心目的是缩小攻击面,防止攻击者直接针对最高权限账户进行暴力破解。SSH 服务默认配置有时允许 root 登录,这在互联网暴露面上属于高风险配置。通过 Ansible 批量修改可以确保所有主机配置一致,避免人工逐台操作遗漏。

分步处理

步骤 1:确认备用账户权限
在运行 Ansible 任务前,手动或通过 Ansible 确认目标主机上存在除 root 外的用户,且该用户属于 sudo 或 wheel 组。如果不存在,先通过 Ansible 创建用户并授权。

步骤 2:编写并测试 Playbook
将上述命令速用版保存为 disable_root_ssh.yml。使用 ansible-playbook -i inventory disable_root_ssh.yml `--check` 运行检查模式。检查模式不会实际修改文件,但能验证任务逻辑和权限。

步骤 3:执行配置变更
确认检查无误后,移除 `--check` 参数正式执行。Ansible 会连接目标主机,修改配置文件并触发 handler 重启服务。

步骤 4:保留会话以防万一
在执行重启服务的任务时,建议保持一个当前的 SSH 会话不要关闭,直到新开窗口验证成功。如果担心服务启动失败,可配置 systemd 的 revert 机制或使用 testconfig 验证。

怎么验证是否生效

连接测试:在新终端窗口执行 ssh root@目标主机 IP,应直接收到 Permission denied 提示,而不是密码输入框。

如何通过 Ansible 批量配置 Linux 主机 SSH 禁止 root 远程登录

日志检查:登录目标主机,查看 /var/log/secure(CentOS/RHEL)或 /var/log/auth.log(Ubuntu/Debian)。搜索 Failed password for root,确认 root 登录尝试被记录但拒绝。

配置确认:在目标主机执行 sshd -T | grep permitrootlogin,输出应为 permitrootlogin no。此命令读取当前运行配置,比直接 cat 文件更准确。

常见坑

服务名称差异:CentOS/RHEL 通常服务名为 sshd,而 Ubuntu/Debian 通常为 ssh。在 Ansible task 中需根据发行版变量动态调整服务名,否则重启失败。

配置语法错误:如果 sshd_config 中存在重复冲突的行,sshd 可能拒绝启动。lineinfile 模块的 regexp 参数能确保替换旧配置而非追加重复项。

密钥认证依赖:禁止 root 登录后,确保普通用户已配置 SSH 密钥认证。如果仅依赖密码且密码策略复杂,可能影响自动化运维脚本。

常见问题

配置后无法 SSH 连接怎么办?

立即通过云厂商控制台 VNC 或物理终端登录检查 sshd 服务状态。查看 /var/log 下的日志定位配置错误,修正后重启服务。

禁止 root 登录会影响 sudo 命令吗?

不会影响。禁止 root 登录仅限制远程 SSH 直接以 root 身份进入系统,登录后普通用户仍可通过 sudo 提权执行管理任务。

Ansible 任务执行失败提示权限不足?

修改 sshd_config 需要 root 权限。确保 Ansible 连接用户具备 sudo 权限,并在 playbook 中设置 become: true。