乐闻世界logo
搜索文章和话题

面试题手册

SSH 公钥认证的原理和配置方法是什么?

SSH 公钥认证是一种比密码认证更安全、更便捷的身份验证方式。它基于非对称加密技术,使用一对密钥(公钥和私钥)进行身份验证。公钥认证原理密钥对生成:客户端生成一对密钥私钥:保存在客户端本地,必须严格保密公钥:上传到服务器,可以公开分享认证流程:客户端向服务器发起连接请求服务器检查客户端的公钥是否在 ~/.ssh/authorized_keys 文件中如果公钥存在,服务器生成一个随机挑战字符串客户端使用私钥对挑战字符串进行签名服务器使用对应的公钥验证签名验证通过后,认证成功密钥类型对比| 算法 | 密钥长度 | 安全性 | 性能 | 兼容性 ||------|---------|--------|------|--------|| RSA | 2048/4096 | 高 | 中 | 最好 || ECDSA | 256/384 | 高 | 快 | 良好 || Ed25519 | 256 | 极高 | 最快 | 较新 |生成 SSH 密钥# 生成 RSA 密钥ssh-keygen -t rsa -b 4096 -C "your_email@example.com"# 生成 Ed25519 密钥(推荐)ssh-keygen -t ed25519 -C "your_email@example.com"配置公钥认证# 将公钥复制到服务器ssh-copy-id user@hostname# 或手动复制cat ~/.ssh/id_rsa.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"安全最佳实践私钥保护:设置强密码短语(passphrase)设置正确的文件权限(600)不要在多台设备间共享私钥服务器配置:禁用密码认证:PasswordAuthentication no禁用 root 登录:PermitRootLogin no限制登录用户:AllowUsers username密钥管理:定期轮换密钥使用不同的密钥对管理不同服务器及时撤销不再使用的公钥优势安全性:私钥不通过网络传输,难以被窃取便捷性:无需每次输入密码自动化:便于脚本和自动化工具使用可审计性:可以追踪哪个密钥在何时登录公钥认证已成为现代服务器管理的标准实践,特别适用于 DevOps 和自动化运维场景。
阅读 0·2月19日 19:31

SSH Agent 的作用和使用方法是什么?

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