Featured image of post 我为什么使用多个 SSH 密钥,而不是只用一个?

我为什么使用多个 SSH 密钥,而不是只用一个?

从单点故障到多层安全:学习如何通过按用途和环境分离 SSH 密钥来提升系统安全性,降低爆炸半径风险。

作者:Faruk Ahmed

对于许多 Linux 管理员来说,使用单个 SSH 密钥对登录他们所有的服务器、测试环境或云实例是默认做法。 这种方式简单、方便——但它也是一个单点故障。

随着时间的推移,我了解到按用途和环境分离 SSH 密钥不仅是良好的安全习惯,更是重大的安全提升。

🛑 “一钥通吃”的风险

如果你对所有事务都使用同一个 SSH 私钥,那么一旦泄露,后果可能是灾难性的:

  • 笔记本电脑丢失?所有使用该密钥的服务器都将面临风险。
  • 密钥从安全性较低的环境中被窃取?攻击者可以利用它渗透到关键系统。
  • 需要轮换密钥?你将不得不手忙脚乱地在所有地方替换它。

这就是爆炸半径问题 (blast radius problem) 的定义。

🧩 我如何划分密钥

我为以下用途维护单独的 SSH 密钥

  1. 生产环境 (Production)

    • 存储在硬件令牌 (hardware token) 或安全密钥保管库 (secure key vault) 中
    • 仅用于关键服务器
    • 绝不离开安全设备
  2. 预演/测试环境 (Staging/Test)

    • 与生产环境分离
    • 存在于工作笔记本电脑上
    • 易于替换
  3. 个人项目 (Personal Projects)

    • 用于家庭实验室 (home labs)、个人 VPS、树莓派 (Raspberry Pis)
    • 绝不与工作系统混用
  4. 一次性/临时用途 (Disposable/Temporary)

    • 为短期项目或供应商访问创建
    • 使用后删除

🛠 我的工作流程

密钥生成 (Key Generation)

1
2
3
ssh-keygen -t ed25519 -f ~/.ssh/prod_id_ed25519 -C "Production Key"
ssh-keygen -t ed25519 -f ~/.ssh/staging_id_ed25519 -C "Staging Key"
ssh-keygen -t ed25519 -f ~/.ssh/personal_id_ed25519 -C "Personal Key"

SSH 配置示例 (~/.ssh/config):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Host prod-server-1
    HostName 192.168.1.100
    User admin
    IdentityFile ~/.ssh/prod_id_ed25519

Host staging-box-alpha
    HostName staging.example.com
    User deploy
    IdentityFile ~/.ssh/staging_id_ed25519

Host personal-pi
    HostName raspberrypi.local
    User pi
    IdentityFile ~/.ssh/personal_id_ed25519

这样,我就不必记住要使用哪个密钥——SSH 会自动选择正确的密钥。

🧠 这种方法为何有效

  • 限制损害 (Limits Damage) — 如果一个密钥泄露,只有该环境面临风险。
  • 更易轮换 (Easier Rotation) — 我可以轮换单个密钥而无需触及其他密钥。
  • 利于审计 (Audit-Friendly) — 密钥直接映射到其用途,使合规性 (compliance) 更容易。
  • 鼓励最小权限原则 (Encourages Principle of Least Privilege) — 没有单个密钥可以访问所有内容。

📌 总结

一开始,管理多个 SSH 密钥可能感觉有些多余,但这却是最简单、最不影响效率的风险降低方法之一。

一个密钥通吃所有事务可能很方便……直到它不再方便为止。

扩展附录:SSH Config 常用技巧

1. 通配符与模式匹配

  • Host *
    匹配所有主机,可以用来定义全局默认配置。
  • Host *.example.com
    匹配所有 example.com 域下的主机。
  • Host staging-*
    匹配前缀为 staging- 的所有主机别名。

优先级:具体匹配 > 通配符匹配 > Host *

2. Include 指令

可以拆分配置文件,保持清晰:

1
Include ~/.ssh/config.d/*.conf

3. JumpHost / ProxyJump

  • 通过中间跳板机连接:

    1
    2
    3
    4
    
    Host prod-app
        HostName app.internal
        User deploy
        ProxyJump bastion.example.com
    

4. 端口转发

  • 本地转发:

    1
    
    LocalForward 8080 localhost:80
    
  • 远程转发:

    1
    
    RemoteForward 9000 localhost:9000
    

5. 指定端口与超时

  • 非标准端口:

    1
    
    Port 2222
    
  • 连接保持活跃:

    1
    2
    
    ServerAliveInterval 60
    ServerAliveCountMax 5
    

6. 多身份密钥管理

  • 全局默认密钥:

    1
    
    IdentityFile ~/.ssh/id_ed25519
    
  • 针对特定主机指定:

    1
    2
    3
    
    Host gitlab.com
        User git
        IdentityFile ~/.ssh/gitlab_id_ed25519
    

7. 控制连接复用 (提升速度)

  • 避免重复握手,复用连接:

    1
    2
    3
    4
    
    Host *
        ControlMaster auto
        ControlPath ~/.ssh/control-%r@%h:%p
        ControlPersist 10m
    

8. 别名与简化命令

  • 配置好 Host 别名后,可以直接:

    1
    2
    3
    
    ssh prod-server-1
    ssh staging-box-alpha
    ssh personal-pi
    

⚡ 这些技巧组合使用,可以大幅简化 SSH 日常管理,尤其是 多环境运维开发调试 场景。

comments powered by Disqus
本博客始于 2007 年
使用 Hugo 构建
主题 StackJimmy 设计