问题出现得很突然,日志倒是留得挺全。Ubuntu 22.04 做安全加固,sshd_config 里同时改 PermitRootLogin no 和 PasswordAuthentication no,三十台机器的 ansible 批量任务全部 Permission denied (publickey),只剩带外控制台能进。
真正麻烦的地方在于,几个原因的现象几乎一样。ansible 的 remote_user 是 root,禁 root 登录后连认证都过不去。还有一种是新建的运维账号没配 sudo 免密,become 一执行就卡在密码交互。
另外,改完没跑 sshd -t,个别机器 sshd 没 reload 成功,行为不一致。
第一件事是改之前先留一个登录会话
改 sshd_config 前开两个 root 终端,其中一个别关
建运维账号并放公钥
useradd -m ops && install -d -m700 -o ops /home/ops/.ssh && cp /root/.ssh/authorized_keys /home/ops/.ssh/ && chown -R ops: /home/ops/.ssh
再往下配免密 sudo
printf '%s\n' 'ops ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/ops && chmod 440 /etc/sudoers.d/ops
末了改 ansible 的登录身份
ansible.cfg 里写 remote_user = ops,playbook 里加 become: yes
改之前我把相关日志按时间截了一段存着,事后对时间线用得上。
改完先别撤,确认这几项。ansible all -m ping 全部返回 SUCCESS,ssh ops@host 能登录且 sudo -n whoami 返回 root,root 直接登录被拒并记入 auth.log。
提醒一点。禁 root 登录必须先把运维账号和免密 sudo 铺好再改,顺序反了就得挨个进控制台;加固类改动先在一台上验证再推开。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
