2、身份认证:多因素认证(MFA)原理、SSH密钥对管理、证书认证体系

身份认证,说白了就是证明「你是你」。在云平台上,这一步要是没守住,后面全是白搭。我见过太多因为密钥泄露导致整个生产环境被端掉的案例了。今天咱们就聊聊三种最核心的认证方式:MFA、SSH密钥对、证书认证。

2.1 多因素认证(MFA)原理

MFA 不是什么高深技术,但很多人理解得不够透。它基于三个要素:

  • 你知道的(密码、PIN码)
  • 你拥有的(手机、硬件令牌)
  • 你本身的(指纹、人脸)

为什么只用密码不够?因为密码太容易被偷了。钓鱼、撞库、键盘记录器……手段多得很。加了第二个因素,攻击者就算拿到密码,没有你的手机也进不去。

核心原理:MFA 不是简单地把两个密码叠加,而是要求两个不同类别的凭证。密码+短信验证码,就是「你知道的」+「你拥有的」。密码+指纹,就是「你知道的」+「你本身的」。

我个人习惯在云平台上强制开启 MFA,尤其是对 root 账号和拥有管理权限的 IAM 用户。你想想看,如果攻击者拿到了你的 AWS 控制台密码,没有 MFA 的话,他可以直接创建一堆高权限实例挖矿。我去年帮一个客户做安全审计,发现他们 80% 的 IAM 用户没开 MFA,吓得我当场让他们整改。

2.1.1 常见的 MFA 实现方式

方式 安全性 便利性 典型场景
短信/语音验证码 个人账号、低风险操作
TOTP(如 Google Authenticator) 企业账号、日常运维
硬件令牌(如 YubiKey) 极高 超级管理员、特权账号
生物识别 移动端、本地登录

避坑指南:我曾经见过一个团队用短信验证码做 MFA,结果 SIM 卡被攻击者通过社会工程学手段补办了,直接绕过了 MFA。所以,短信验证码只能算「中等安全」,别用在关键系统上。

2.2 SSH 密钥对管理

SSH 密钥对是 Linux 服务器远程运维的标配。它比密码安全得多,但前提是你得管好它。

密钥对由两部分组成:公钥放在服务器上,私钥留在本地。登录时,服务器用公钥验证你的私钥签名。私钥一旦泄露,服务器就相当于裸奔了。

2.2.1 密钥对的生命周期管理

  1. 生成:使用 ssh-keygen -t ed25519 -a 100。我个人推荐 Ed25519 算法,比 RSA 更快更安全。RSA 4096 也行,但别再用 2048 了。
  2. 分发:通过安全通道(如 SCP、配置管理工具)将公钥部署到服务器。私钥绝对不要通过网络传输。
  3. 使用:建议配合 ssh-agent 使用,避免反复输入私钥密码。
  4. 轮换:定期更换密钥对。我建议每 90 天轮换一次,或者每次有人员离职时立即轮换。
  5. 吊销:从服务器上移除不再使用的公钥,并在 CA 系统中标记为已吊销。

我的习惯:我会为每个环境(开发、测试、生产)生成不同的密钥对,并且生产环境的私钥永远只存放在硬件安全模块(HSM)或密码管理器中,绝不落地到普通电脑上。

2.2.2 密钥对管理的常见误区

  • 私钥不设密码:这是最致命的。私钥文件本身应该用强密码加密,即使文件被偷,攻击者也用不了。
  • 多个服务器共用同一密钥对:一旦泄露,所有服务器都完蛋。应该为每台服务器或每组服务器使用不同的密钥对。
  • 不记录密钥指纹:首次连接时,SSH 会提示你确认主机密钥指纹。很多人直接点「yes」,从不核对。我建议把服务器公钥指纹记录在 CMDB 中,连接前先比对。

2.3 证书认证体系

当服务器数量超过几十台时,手动管理 SSH 密钥对就变得非常痛苦。这时候,证书认证体系就派上用场了。

证书认证的核心思想是:不再信任「某个特定的公钥」,而是信任「签发公钥的权威机构」。这个权威机构就是证书颁发机构(CA)。

2.3.1 SSH 证书认证的工作流程

  1. 管理员在 CA 服务器上生成一对 CA 密钥(公钥+私钥)。
  2. 所有服务器都配置为信任 CA 的公钥。
  3. 用户生成自己的密钥对,然后将公钥提交给 CA 签名。
  4. CA 用私钥对用户的公钥进行签名,生成证书。
  5. 用户使用证书登录服务器,服务器用 CA 公钥验证证书的合法性。

这样做的好处很明显:

  • 集中管理:用户权限变更时,只需要在 CA 上吊销证书,不需要登录每台服务器修改 authorized_keys
  • 细粒度控制:证书可以设置有效期、允许登录的用户名、来源 IP 等。
  • 审计追踪:每次登录都有证书记录,方便事后追溯。

实战经验:我在一个拥有 500+ 台服务器的项目中推行了证书认证。之前每次有人离职,运维团队要花两天时间手动清理所有服务器的公钥。改用证书后,只需要在 CA 上吊销一个证书,5 分钟搞定。效率提升不是一点半点。

2.3.2 证书认证的典型架构

下面这张图展示了证书认证体系的核心逻辑:

CA 服务器 持有 CA 私钥 用户 生成密钥对 服务器 信任 CA 公钥 ① 提交公钥申请签名 ② 返回签名证书 ③ 使用证书登录 ④ 用 CA 公钥验证签名 CA 服务器 用户 服务器

2.3.3 证书认证的配置示例

在 CA 服务器上签名用户公钥:

# 在 CA 服务器上
ssh-keygen -s ca_key -I user@example.com -n ubuntu -V +52w user.pub
# 参数说明:
# -s ca_key:指定 CA 私钥
# -I user@example.com:证书标识(用于审计)
# -n ubuntu:允许登录的用户名
# -V +52w:有效期 52 周(1 年)

在服务器上配置信任 CA 公钥:

# 在 /etc/ssh/sshd_config 中添加
TrustedUserCAKeys /etc/ssh/ca.pub
# 然后重启 sshd 服务
systemctl restart sshd

注意:CA 私钥是证书体系的命根子。我曾经见过一个团队把 CA 私钥放在一个普通运维工程师的电脑上,结果那人离职后,整个证书体系都得重建。CA 私钥必须离线存储,最好放在硬件安全模块(HSM)中,并且由专人管理。

2.4 三种认证方式的对比

维度 MFA SSH 密钥对 证书认证
适用场景 控制台登录、API 调用 少量服务器运维 大规模服务器集群
管理复杂度 高(需要 CA 基础设施)
安全性 中(取决于密钥管理) 极高
可审计性
典型工具 Google Authenticator、Duo ssh-keygen、ssh-agent OpenSSH CA、Vault

我的建议:别想着只用一种方案。实际项目中,我通常会在控制台登录上强制 MFA,在服务器运维上先用 SSH 密钥对过渡,等规模大了再上证书认证。分层防御,才是正道。

嗯,身份认证这块就聊到这儿。记住一句话:认证是安全的第一道门,门没锁好,后面再强的防火墙都是摆设。


专注资料整理