密码认证的系统性风险
SSH密码登录是服务器安全加固中最容易被忽视的薄弱环节。暴力破解工具如hydra、ncrack对22端口发起字典攻击已经高度自动化,即使设置了fail2ban,攻击者在更换IP后仍可持续尝试。2025年多家安全厂商的威胁报告显示,超过60%的Linux服务器入侵事件始于SSH暴力破解成功。密码认证的另一个隐性风险是密钥管理——多人共享同一root密码的场景下,人员变动后密码轮换不彻底,留出后门。SSH证书认证(Certificate Authentication)从架构层面解决了这些问题:签发、吊销、授权范围全部可审计,不存在共享密码问题。
SSH证书认证的工作原理
SSH证书认证与HTTPS证书不是同一套体系。SSH证书由用户或机构自行充当CA(Certificate Authority),用CA私钥对用户公钥或主机公钥签名,生成带有效期和授权字段的证书。验证端只需要信任CA公钥,无需逐一配置authorized_keys。
核心流程:
- CA生成一对密钥:
ca_key(私钥,用于签发)和ca_key.pub(公钥,部署到目标服务器的TrustedUserCAKeys) - 为每个用户生成密钥对,用CA私钥签发用户证书
- 用户登录时,SSH客户端自动出示证书,服务器验证CA签名和证书有效期
搭建SSH证书认证CA
选择一台独立的管理机作为CA,不要与业务服务器混用。CA私钥的安全性决定了整个体系的安全基线。
# 在CA管理机上生成CA密钥对
mkdir -p /etc/ssh/ca && chmod 700 /etc/ssh/ca
ssh-keygen -t ed25519 -f /etc/ssh/ca/ca_key -C "ssh-ca@infra-team"
# ca_key 是CA私钥,务必保管好
# ca_key.pub 是CA公钥,将部署到所有目标服务器
# 查看CA公钥指纹,用于后续交叉验证
ssh-keygen -l -f /etc/ssh/ca/ca_key.pub
签发用户证书
为用户签发证书时,需要指定有效期、可登录的用户名和目标主机范围。这些约束直接编码在证书中,服务器端无需额外配置。
# 用户生成自己的密钥对
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "zhangwei@company"
# 将用户公钥发给CA管理员(安全通道传递)
# CA管理员签发证书
ssh-keygen -s /etc/ssh/ca/ca_key \
-I "zhangwei-20260727" \
-V "+52w" \
-n zhangwei,root \
-O source-address=10.0.0.0/8,192.168.0.0/16 \
~/.ssh/id_ed25519.pub
# -I: 证书标识,用于日志审计
# -V: 有效期,+52w表示52周
# -n: 允许登录的远程用户名(可多个)
# -O source-address: 限制来源IP网段
# 签发后生成 ~/.ssh/id_ed25519-cert.pub
验证证书内容:
ssh-keygen -L -f ~/.ssh/id_ed25519-cert.pub
# 输出示例:
# Type: ssh-ed25519-cert-v01@openssh.com user certificate
# Public key: ED25519-CERT SHA256:xxxxx
# Signing CA: ED25519 SHA256:yyyyy (using ssh-ed25519)
# Key ID: "zhangwei-20260727"
# Serial: 0
# Valid: from 2026-07-27T00:00:00 to 2027-07-26T00:00:00
# Principals: zhangwei root
# Critical Options: source-address 10.0.0.0/8,192.168.0.0/16
# Extensions: permit-X11-forwarding permit-agent-forwarding ...
目标服务器配置信任CA
在每台需要接受证书登录的服务器上,配置信任CA公钥:
# 将CA公钥上传到目标服务器
scp /etc/ssh/ca/ca_key.pub root@target-server:/etc/ssh/ca_key.pub
# 编辑目标服务器的sshd_config
cat >> /etc/ssh/sshd_config <<'EOF'
# SSH证书认证配置
TrustedUserCAKeys /etc/ssh/ca_key.pub
AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
EOF
# 创建principals目录和映射文件
mkdir -p /etc/ssh/auth_principals
# root用户允许的principals
echo "zhangwei root admin" > /etc/ssh/auth_principals/root
# 普通用户允许的principals
echo "zhangwei dev ops" > /etc/ssh/auth_principals/zhangwei
# 重启sshd
systemctl restart sshd
PrincipalsFile的机制:证书中-n指定的principal必须出现在目标用户的principals文件中,才允许登录。这提供了精细的授权控制——即使CA签发了证书,目标服务器也可以拒绝不匹配的principal。
禁用密码认证和配置root登录策略
证书认证就绪后,逐步关闭密码登录:
# /etc/ssh/sshd_config 修改以下配置
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password # 允许证书登录root,禁止密码
关键点:PermitRootLogin prohibit-password允许通过证书或密钥登录root,但禁止密码。这比直接PermitRootLogin no更灵活——紧急运维时仍可通过证书登录root,不需要sudo跳转。
主机证书:防止中间人攻击
SSH证书不仅可以认证用户,也可以认证主机。用CA签发主机证书后,客户端不再需要手动确认host key fingerprint,彻底消除中间人攻击风险。
# 在CA管理机上签发主机证书
ssh-keygen -s /etc/ssh/ca/ca_key \
-I "web-node-01-2026" \
-V "+52w" \
-h \
-n web-node-01 \
/etc/ssh/ssh_host_ed25519_key.pub
# -h 表示这是主机证书
# 将生成的 -cert.pub 文件放到目标服务器的 /etc/ssh/ 目录
# 目标服务器的sshd_config添加
echo "HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub" >> /etc/ssh/sshd_config
systemctl restart sshd
客户端配置信任主机CA:
# ~/.ssh/known_hosts 中添加CA公钥(一行)
@cert-authority * ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... ssh-ca@infra-team
# 或者限制到特定域
@cert-authority *.infra.company.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... ssh-ca@infra-team
证书轮换与吊销
SSH证书的最大运维优势是轮换。密码轮换需要通知所有人修改,证书轮换只需要重新签发——老证书到期自动失效。紧急场景下(如员工离职),通过Revocation机制即时吊销:
# 创建吊销列表文件
touch /etc/ssh/revoked_keys
# 添加需要吊销的公钥或证书
ssh-keygen -k -f /etc/ssh/revoked_keys -u ~/.ssh/id_ed25519.pub
# 目标服务器sshd_config添加
echo "RevokedKeys /etc/ssh/revoked_keys" >> /etc/ssh/sshd_config
systemctl restart sshd
被吊销的证书即时生效,不需要等原有证书过期。对于大规模集群,吊销列表通过Ansible或SaltStack统一分发。
SSH证书认证落地的关键注意项
- CA私钥离线存储,签发操作在独立跳板机上完成,签发完毕立即从内存清除
- 证书有效期不宜过长,生产环境建议不超过90天,运维临时证书建议8-24小时
- 所有签发操作记录日志(谁、什么时间、为谁签发、有效期、principals)
- 先灰度切换:先对测试机组启用证书认证,确认无问题再推广到全部节点
- 保留密码登录过渡期:配置PasswordAuthentication yes同时启用证书认证,观察1-2周无异常后再关闭密码
- 主机证书和用户证书建议用不同的CA密钥签发,隔离风险
- 跳板机/堡垒机场景下,证书认证与ssh-agent forwarding结合,实现无密跳转链路
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ssh-zheng-shu-ren-zheng-ti-dai-mi-ma-deng-lu-fu-wu-qi-an/