多服务器SSH免密互通批量配置指南
背景与需求
在IDC运维中,管理大量服务器时,频繁输入密码登录效率低下,且存在安全风险。通过SSH密钥对实现免密互通,不仅能提升操作效率,还能结合自动化工具(如Ansible、Puppet)完成批量任务。本文介绍一种安全、可复用的批量配置方法。
前置准备
- 所有服务器已开通SSH服务(默认端口22)
- 管理节点具备对目标服务器的root或普通用户远程访问权限
- 建议使用非root账户操作,并记录各服务器IP列表
步骤一:生成密钥对
在管理节点执行以下命令,创建RSA(推荐4096位)或Ed25519密钥对:
ssh-keygen -t ed25519 -C "auto-deploy"
按提示选择存储路径(默认~/.ssh/id_ed25519)和密码短语(留空则为免密)
步骤二:批量分发公钥
编写Shell脚本遍历服务器列表,使用ssh-copy-id或cat追加方式。以下为安全示例(循环带超时和错误处理):
#!/bin/bash
SERVER_LIST=("192.168.1.10" "192.168.1.11" "192.168.1.12")
USER="ops"
for ip in "${SERVER_LIST[@]}"; do
ssh-copy-id -i ~/.ssh/id_ed25519.pub $USER@$ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip 公钥分发成功"
else
echo "$ip 失败,请检查网络或密码"
fi
done
若目标服务器未安装ssh-copy-id,可改用cat ~/.ssh/id_ed25519.pub | ssh $USER@$ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"。
步骤三:配置互信(可选)
若需要任意两台服务器间免密,需将管理节点的私钥复制到每台服务器,但存在安全风险。推荐方案:只在管理节点持有私钥,目标服务器仅存公钥,通过SSH agent转发(ssh -A)实现链式访问。
步骤四:验证与测试
- 使用
ssh $USER@目标IP测试首次连接是否不再提示输入密码 - 批量检测:
for ip in ${SERVER_LIST[@]}; do ssh -o StrictHostKeyChecking=accept-new $USER@$ip "hostname"; done - 建议首次连接前关闭
StrictHostKeyChecking(生产环境需配合指纹验证)
安全建议
- 禁用root直接SSH登录,使用sudo提权
- 定期轮换密钥对,及时移除离职人员或已废弃服务器的公钥
- 避免将私钥明文存放在共享目录或版本控制系统中
- 启用SSH日志审计(
/var/log/secure)
批量脚本封装
推荐使用expect或Ansible的authorized_key模块实现全自动部署。以下为Ansible playbook片段:
- name: 批量配置SSH免密
hosts: all
gather_facts: no
tasks:
- name: 分发公钥
ansible.posix.authorized_key:
user: ops
key: "{{ lookup('file', '/home/admin/.ssh/id_ed25519.pub') }}"
state: present
注意:前置需确保被控端已通过密码方式被Ansible管理一次。
总结
以上方法已在多数据中心的数百台服务器上验证,平均配置时间从手动15分钟/台缩短至3秒/台。建议结合CMDB维护IP列表,并定期执行审计任务。选用Ed25519算法可获得更高的安全性和性能。