2.6.3 密钥管理与无密码登录

密钥管理与无密码登录#

1. 密钥认证原理与优势#

  • 基于非对称加密:客户端持有私钥,服务器保存公钥。
  • 优势:防暴力破解、便于自动化、可细粒度控制登录权限。
  • 原理草图:
文章图片

2. 生成与管理密钥对#

  • 安装/确认客户端工具:
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y openssh-client

# RHEL/CentOS/Rocky
sudo yum install -y openssh-clients
  • 生成密钥(推荐 ed25519):
ssh-keygen -t ed25519 -C "devops@workstation" -f ~/.ssh/id_ed25519
# 说明:
# -t 指定算法,-C 注释,-f 指定输出文件
  • 兼容旧系统(RSA 4096):
ssh-keygen -t rsa -b 4096 -C "devops@legacy" -f ~/.ssh/id_rsa
  • 权限与文件说明:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
ls -l ~/.ssh
  • 使用 ssh-agent 缓存私钥口令:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l   # 查看已加载密钥

3. 配置无密码登录#

  • 快速复制公钥:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# 预期效果:提示已添加公钥,后续无需密码
  • 手工部署(适用于受限环境):
# 本地输出公钥
cat ~/.ssh/id_ed25519.pub

# 服务器端操作
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA... devops@workstation" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
  • 验证无密码登录:
ssh -i ~/.ssh/id_ed25519 user@server "hostname && whoami"
# 预期输出:服务器主机名和用户名

4. 多主机与多密钥场景#

  • 配置 ~/.ssh/config 示例:
cat > ~/.ssh/config <<'EOF'
Host prod-1
  HostName 10.0.0.1
  User deploy
  IdentityFile ~/.ssh/id_ed25519_prod
  IdentitiesOnly yes

Host dev-1
  HostName 10.0.0.2
  User dev
  IdentityFile ~/.ssh/id_ed25519_dev
  IdentitiesOnly yes
EOF
chmod 600 ~/.ssh/config
  • 验证连接:
ssh prod-1 "id"
ssh dev-1 "id"
  • 说明:
  • IdentityFile:指定私钥路径。
  • IdentitiesOnly:仅尝试指定密钥,避免误用其他密钥。

5. 代理与跳板机#

  • SSH 代理转发(本地与跳板机复用密钥):
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

ssh -A user@bastion   # -A 启用代理转发
  • 使用跳板机连接内网目标:
# 方式一:命令行
ssh -J bastion user@10.0.1.10

# 方式二:配置文件
cat >> ~/.ssh/config <<'EOF'
Host inner-1
  HostName 10.0.1.10
  User app
  ProxyJump bastion
EOF

ssh inner-1 "hostname"

6. 密钥生命周期与安全策略#

  • 定期轮换(示例流程):
# 1. 生成新密钥
ssh-keygen -t ed25519 -C "devops@2024" -f ~/.ssh/id_ed25519_2024

# 2. 添加新公钥
ssh-copy-id -i ~/.ssh/id_ed25519_2024.pub user@server

# 3. 验证新密钥登录
ssh -i ~/.ssh/id_ed25519_2024 user@server "echo OK"

# 4. 移除旧公钥(服务器端)
sed -i '/devops@workstation/d' ~/.ssh/authorized_keys
  • 最小化授权(限制来源/命令):
# 仅允许从指定网段登录,限制执行命令
cat >> ~/.ssh/authorized_keys <<'EOF'
from="10.0.0.0/24",command="/usr/local/bin/backup.sh" ssh-ed25519 AAAA... backup@job
EOF
  • 失窃处理:
  • 立即删除对应公钥、审查登录记录、轮换密钥。
  • 禁止共享密钥:
  • 每人/每系统独立密钥,便于审计与撤销。

7. 常见问题与排查#

  • 登录被拒绝(检查权限):
# 服务器端
ls -ld ~ ~/.ssh
ls -l ~/.ssh/authorized_keys
# 正确权限:~/.ssh 700,authorized_keys 600
  • 使用了错误密钥(客户端调试):
ssh -vvv user@server
# 关注:Offering public key、Authentication succeeded
  • 服务器拒绝公钥(sshd 配置):
# 服务器端
grep -E 'PubkeyAuthentication|AuthorizedKeysFile' /etc/ssh/sshd_config
# 推荐:
# PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys
sudo systemctl restart sshd
  • SELinux 影响(如启用):
# 服务器端
getenforce
restorecon -Rv ~/.ssh

8. 练习与实战#

  • 练习 1:为三台主机配置不同密钥与别名连接。
  • 目标:使用 ssh prod-1ssh dev-1 无密码登录。
  • 练习 2:搭建跳板机访问内网主机。
  • 目标:ssh -J bastion user@inner 成功。
  • 练习 3:密钥轮换演练。
  • 目标:新密钥上线并删除旧公钥,确保服务不中断。