SSH 代理(SSH Agent)是一个用于管理 SSH 私钥的辅助程序,它可以在内存中安全地存储私钥,避免每次连接时重复输入密码短语。
SSH Agent 工作原理
核心功能
- 私钥存储:将解密后的私钥存储在内存中
- 密钥管理:管理多个私钥的生命周期
- 签名服务:为 SSH 连接提供签名服务
- 安全隔离:私钥不直接暴露给客户端程序
工作流程
shell1. 用户启动 ssh-agent 2. 用户使用 ssh-add 添加私钥 3. 输入密码短语解密私钥 4. 私钥存储在 agent 内存中 5. SSH 客户端请求签名时,agent 提供签名 6. 无需重复输入密码短语
使用 SSH Agent
启动 Agent
bash# 启动 agent 并设置环境变量 eval "$(ssh-agent -s)" # 或使用 systemd systemctl --user start ssh-agent
添加密钥
bash# 添加默认密钥 ssh-add # 添加指定密钥 ssh-add ~/.ssh/id_rsa # 添加多个密钥 ssh-add ~/.ssh/id_rsa ~/.ssh/id_ed25519 # 添加带超时的密钥(3600秒) ssh-add -t 3600 ~/.ssh/id_rsa # 查看已添加的密钥 ssh-add -l # 删除所有密钥 ssh-add -D # 删除指定密钥 ssh-add -d ~/.ssh/id_rsa
配置自动启动
Bash/Zsh 配置
bash# ~/.bashrc 或 ~/.zshrc if ! pgrep -x ssh-agent > /dev/null; then eval "$(ssh-agent -s)" fi
Fish 配置
bash# ~/.config/fish/config.fish if not pgrep -x ssh-agent > /dev/null ssh-agent -c | source end
SSH Agent 转发
原理
SSH Agent 转发允许远程服务器通过本地 SSH Agent 访问本地私钥,实现多跳认证。
配置转发
bash# 命令行启用转发 ssh -A user@hostname # 配置文件启用转发 # ~/.ssh/config Host * ForwardAgent yes # 服务器端允许转发 # /etc/ssh/sshd_config AllowAgentForwarding yes
应用场景
bash# 通过跳板机访问内网服务器 ssh -A jump-server ssh internal-server # 无需在跳板机上存储私钥 # Git 操作 git push git@github.com:user/repo.git # 通过转发使用本地密钥
安全注意事项
1. 密钥超时
bash# 设置密钥自动过期 ssh-add -t 3600 ~/.ssh/id_rsa # 1小时后过期 # 查看密钥过期时间 ssh-add -L
2. 限制转发
bash# 仅对特定主机启用转发 Host trusted-server ForwardAgent yes Host * ForwardAgent no
3. 使用确认
bash# 添加密钥时需要确认 ssh-add -c ~/.ssh/id_rsa # 每次使用密钥时需要用户确认
4. 禁用不安全的转发
bash# 服务器端禁用 agent 转发 # /etc/ssh/sshd_config AllowAgentForwarding no
高级用法
使用多个 Agent
bash# 启动多个 agent 实例 SSH_AUTH_SOCK=/tmp/agent1.sock ssh-agent -a /tmp/agent1.sock SSH_AUTH_SOCK=/tmp/agent2.sock ssh-agent -a /tmp/agent2.sock # 使用不同的 agent SSH_AUTH_SOCK=/tmp/agent1.sock ssh-add ~/.ssh/id_rsa SSH_AUTH_SOCK=/tmp/agent2.sock ssh-add ~/.ssh/id_ed25519
密钥约束
bash# 添加密钥时设置约束 ssh-add -c -t 3600 ~/.ssh/id_rsa # 确认 + 超时 # 限制密钥只能用于特定主机 ssh-add -h "user@hostname" ~/.ssh/id_rsa
集成到脚本
bash#!/bin/bash # 启动 agent 并添加密钥 eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa # 执行需要 SSH 的操作 ssh user@hostname "command" # 清理 ssh-agent -k
故障排查
检查 Agent 状态
bash# 检查 agent 是否运行 ps aux | grep ssh-agent # 检查环境变量 echo $SSH_AUTH_SOCK # 测试 agent 连接 ssh-add -l
常见问题
bash# 问题:无法连接到 agent # 解决:检查 SSH_AUTH_SOCK 环境变量 # 问题:密钥过期 # 解决:重新添加密钥 ssh-add # 问题:转发不工作 # 解决:检查服务器端 AllowAgentForwarding 配置
最佳实践
- 使用密钥超时:避免私钥长期驻留内存
- 限制转发范围:仅对可信服务器启用转发
- 定期清理:及时删除不需要的密钥
- 监控使用:定期检查 agent 中的密钥
- 安全启动:使用系统服务管理 agent
SSH Agent 是提高 SSH 使用效率的重要工具,合理配置能够显著提升工作流程的便捷性。