一、通用准备(必做)
配置文件路径:主配置
/etc/ssh/sshd_config
+ 子配置/etc/ssh/sshd_config.d/*.conf
(确保子配置不冲突,建议删除子配置中与认证相关的行,或与主配置保持一致)。权限检查:服务器用户的
~/.ssh
目录权限700
,authorized_keys
权限600
(避免密钥认证失败):bash
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
重启生效命令:修改后必执行
bash
sudo sshd -t # 检查语法 sudo systemctl restart ssh # 重启服务
二、分场景配置(选一种即可)
场景 1:仅密钥认证(最安全,推荐长期用)
核心配置(添加到 sshd_config
末尾):
conf
PubkeyAuthentication yes # 启用密钥认证
PasswordAuthentication no # 禁用密码认证
# 无需其他配置,默认仅接受密钥
效果:只能通过客户端私钥登录,密码无效。
场景 2:仅密码认证(不推荐,仅临时应急)
核心配置:
conf
PubkeyAuthentication no # 禁用密钥认证
PasswordAuthentication yes # 启用密码认证
PermitEmptyPasswords no # 禁止空密码
效果:只能通过用户密码登录,密钥无效(安全性低,易被暴力破解)。
场景 3:密钥 + 密码双重认证(高安全,需 OpenSSH ≥6.2)
核心配置:
conf
PubkeyAuthentication yes # 启用密钥
PasswordAuthentication yes # 启用密码
AuthenticationMethods publickey,password # 强制两者都通过
效果:必须先通过密钥验证,再输入密码,缺一不可(双重保障)。
场景 4:密钥或密码任选(兼容需求)
核心配置:
conf
PubkeyAuthentication yes # 启用密钥
PasswordAuthentication yes # 启用密码
# 不设置 AuthenticationMethods,默认允许任选一种
效果:用户可选择用密钥直接登录,或用密码登录(兼顾安全与兼容)。
三、验证配置是否生效
执行以下命令,查看当前实际生效的认证方式:
bash
sudo sshd -T | grep -E "pubkey|password|authenticationmethods"
例如场景 3 的预期输出:
pubkeyauthentication yes
+passwordauthentication yes
+authenticationmethods publickey,password
四、关键注意事项
子配置冲突:若
grep -r "PasswordAuthentication" /etc/ssh/sshd_config.d/
有输出,需删除子配置中的认证相关行(或与主配置保持一致),避免被覆盖。版本兼容:双重认证(场景 3)需 OpenSSH ≥6.2,检查版本:
ssh -V
,低于 6.2 则不支持AuthenticationMethods
。日志排查:登录失败时查看日志:
sudo tail -f /var/log/auth.log
(常见错误:权限问题、密钥不匹配、配置语法错误)。
举例,3 个设备上生成独立私钥并同步到服务器的完整方案,核心通过多设备密钥对生成 + 服务器公钥聚合实现:
一、核心原理与流程
密钥对生成:每个设备独立生成自己的
私钥+公钥
对(互不干扰)。公钥聚合:将 3 个设备的公钥全部追加到服务器的
~/.ssh/authorized_keys
文件中。认证机制:服务器验证客户端提供的私钥是否匹配文件中的任一公钥,匹配则允许登录。
二、分步操作指南(以 3 个设备为例)
步骤 1:在每个设备上生成独立密钥对
在设备 1、设备 2、设备 3上分别执行以下命令(生成互不相同的密钥对):
bash
# 设备1:生成RSA密钥对(文件名自定义为device1_rsa)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/device1_rsa -C "device1@example.com"
# 设备2:生成ED25519密钥对(文件名device2_ed25519)
ssh-keygen -t ed25519 -f ~/.ssh/device2_ed25519 -C "device2@example.com"
# 设备3:生成ECDSA密钥对(文件名device3_ecdsa)
ssh-keygen -t ecdsa -b 521 -f ~/.ssh/device3_ecdsa -C "device3@example.com"
关键参数说明:
-t
:指定密钥类型(RSA 兼容性好,ED25519 安全高效)。-f
:自定义密钥文件名(避免覆盖默认的id_rsa
)。-C
:注释(标识设备用途,如device1@example.com
)。
生成后文件:
每个设备会生成 2 个文件,例如设备 1 生成:
plaintext
~/.ssh/device1_rsa # 私钥(需妥善保管,不可泄露)
~/.ssh/device1_rsa.pub # 公钥(需上传到服务器)
步骤 2:将 3 个设备的公钥上传到服务器
方法 1:使用ssh-copy-id
自动上传(推荐)
在设备 1 上执行:
bash
ssh-copy-id -i ~/.ssh/device1_rsa.pub shitou@服务器IP
设备 2 和设备 3 重复此命令,替换为各自的公钥路径。
方法 2:手动上传(适用于无ssh-copy-id
的环境)
在设备 1 上复制公钥内容:
bash
cat ~/.ssh/device1_rsa.pub
复制输出的完整字符串(以
ssh-rsa
或ssh-ed25519
开头)。登录服务器,将公钥追加到
authorized_keys
:bash
ssh shitou@服务器IP echo "设备1的公钥内容" >> ~/.ssh/authorized_keys
重复此步骤,将设备 2 和设备 3 的公钥依次追加到同一文件。
权限检查(必做):
bash
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys # 确保权限正确
步骤 3:验证 3 个设备均能登录
设备 1 登录:
bash
ssh -i ~/.ssh/device1_rsa shitou@服务器IP # 使用设备1的私钥
设备 2 登录:
bash
ssh -i ~/.ssh/device2_ed25519 shitou@服务器IP # 使用设备2的私钥
设备 3 登录:
bash
ssh -i ~/.ssh/device3_ecdsa shitou@服务器IP # 使用设备3的私钥
若无需输入密码直接登录,说明配置成功。
三、关键技术细节
1. 服务器端authorized_keys
文件结构
文件中每行存储一个公钥,示例:
conf
# 设备1的RSA公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDG... device1@example.com
# 设备2的ED25519公钥
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINYQ... device2@example.com
# 设备3的ECDSA公钥
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFB... device3@example.com
2. 客户端免输入私钥路径的技巧
在客户端设备的~/.ssh/config
文件中添加配置,简化登录命令:
conf
# 设备1的配置
Host server-device1
HostName 服务器IP
User shitou
IdentityFile ~/.ssh/device1_rsa
# 设备2的配置
Host server-device2
HostName 服务器IP
User shitou
IdentityFile ~/.ssh/device2_ed25519
# 设备3的配置
Host server-device3
HostName 服务器IP
User shitou
IdentityFile ~/.ssh/device3_ecdsa
登录时只需执行:
bash
ssh server-device1 # 自动使用设备1的私钥
ssh server-device2 # 自动使用设备2的私钥
3. 安全性增强建议
私钥加密:生成密钥时设置密码短语(
ssh-keygen
提示输入时设置),防止私钥泄露后被滥用。定期轮换密钥:每 3-6 个月生成新密钥对,替换旧公钥。
限制公钥用途:在服务器的
authorized_keys
中添加前缀限制,例如仅允许特定 IP 或命令:conf
from="192.168.31.100",command="/usr/bin/backup.sh" ssh-rsa ...
四、常见问题排查
1. 登录失败:Permission denied (publickey)
检查步骤:
确认私钥文件路径和名称正确(如
-i ~/.ssh/device1_rsa
)。检查服务器
authorized_keys
中是否存在对应的公钥。确保服务器
~/.ssh
目录权限为700
,authorized_keys
权限为600
。
2. 公钥重复导致覆盖
解决方案:使用
>>
追加而非>
覆盖(如echo "公钥" >> authorized_keys
)。
3. 设备间私钥混淆
预防措施:为每个设备的私钥文件添加唯一前缀(如
device1_rsa
、device2_ed25519
),并在~/.ssh/config
中明确绑定。
五、扩展场景:结合双重认证(密钥 + 密码)
若需进一步增强安全性,可配置双重认证(需 OpenSSH ≥6.2):
修改服务器
sshd_config
:conf
PubkeyAuthentication yes PasswordAuthentication yes AuthenticationMethods publickey,password # 强制两者都通过
重启 SSH 服务:
bash
sudo systemctl restart ssh