Dropbear SSH 完全指南 / 04 - 密钥管理
第四章:密钥管理
4.1 SSH 密钥体系概述
SSH 密钥体系是 SSH 安全模型的核心。Dropbear 使用两套独立的密钥:
| 密钥类型 | 用途 | 存储位置 | 生成方式 |
|---|---|---|---|
| 主机密钥 (Host Key) | 服务器身份验证 | /etc/dropbear/ | dropbearkey |
| 用户密钥 (User Key) | 用户认证 | 用户 ~/.ssh/ | dropbearkey 或 ssh-keygen |
SSH 认证的密钥交互流程
客户端 服务器
│ │
│──── TCP 连接 ─────────────────────▶│
│ │
│◀─── 版本协商 ─────────────────────│
│ │
│◀─── 主机公钥(Host Key)──────────│ ← 服务器证明身份
│ │
│ 用户验证主机密钥指纹 │
│ (known_hosts / TOFU) │
│ │
│──── DH 密钥交换 ──────────────────▶│
│◀─── 会话密钥建立 ─────────────────│
│ │
│ [公钥认证模式] │
│──── 用户公钥 ─────────────────────▶│ ← 客户端声称身份
│◀─── 用用户公钥加密质询 ──────────│
│──── 用私钥解密响应 ───────────────▶│ ← 客户端证明身份
│◀─── 认证成功 ─────────────────────│
│ │
│════ 加密通道建立 ════════════════│
4.2 主机密钥管理
主机密钥用于服务器向客户端证明自己的身份。SSH 首次连接时的信任确认(Trust On First Use,TOFU)就是基于主机密钥的指纹。
生成主机密钥
# 生成 RSA 主机密钥
sudo dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
# 生成 Ed25519 主机密钥(推荐)
sudo dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key
# 生成 ECDSA 主机密钥
sudo dropbearkey -t ecdsa -f /etc/dropbear/dropbear_ecdsa_host_key
# 生成 DSS/DSA 主机密钥(不推荐,已过时)
sudo dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
密钥类型对比
| 类型 | 密钥大小 | 安全性 | 性能 | 兼容性 | 推荐度 |
|---|---|---|---|---|---|
| Ed25519 | 256-bit | ★★★★★ | ★★★★★ | 仅新版客户端 | ✅ 首选 |
| ECDSA | 256/384/521-bit | ★★★★☆ | ★★★★☆ | 广泛 | ✅ 推荐 |
| RSA | 2048/4096-bit | ★★★★☆ | ★★★☆☆ | 最广泛 | ⚠️ 保持兼容 |
| DSS | 1024-bit | ★★☆☆☆ | ★★★☆☆ | 过时 | ❌ 不推荐 |
建议: 同时生成 Ed25519 和 RSA 密钥,Ed25519 优先使用,RSA 作为兼容性回退。
查看密钥信息
# 查看公钥指纹
sudo dropbearkey -y -f /etc/dropbear/dropbear_ed25519_host_key
# 输出示例:
# Public key portion is:
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGrS... user@host
# Fingerprint: SHA256:xR3bP7kF9v2mL5nQ4wJ8hT6yU1iO3pA5sD7fG9hJ
# 仅显示指纹
sudo dropbearkey -y -f /etc/dropbear/dropbear_ed25519_host_key | grep Fingerprint
# 查看 RSA 密钥信息
sudo dropbearkey -y -f /etc/dropbear/dropbear_rsa_host_key
# 输出示例:
# Public key portion is:
# ssh-rsa AAAAB3NzaC1yc2EA... user@host
# Fingerprint: SHA256:aB3cD4eF5gH6iJ7kL8mN9oP0qR1sT2uV3wX4yZ
主机密钥安全
# 设置正确的文件权限
sudo chmod 600 /etc/dropbear/dropbear_*_host_key
sudo chown root:root /etc/dropbear/dropbear_*_host_key
# 验证权限
ls -la /etc/dropbear/
# -rw------- 1 root root 805 ... dropbear_ed25519_host_key
# -rw------- 1 root root 2590 ... dropbear_rsa_host_key
主机密钥轮换
定期轮换主机密钥是一种安全最佳实践:
#!/bin/bash
# rotate_host_keys.sh - 主机密钥轮换脚本
KEY_DIR="/etc/dropbear"
BACKUP_DIR="/etc/dropbear/old_keys/$(date +%Y%m%d)"
TIMESTAMP=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
# 备份现有密钥
for keyfile in "$KEY_DIR"/dropbear_*_host_key; do
[ -f "$keyfile" ] && cp "$keyfile" "$BACKUP_DIR/"
done
echo "旧密钥已备份到 $BACKUP_DIR"
# 生成新密钥
for keytype in rsa ed25519; do
keyfile="$KEY_DIR/dropbear_${keytype}_host_key"
if [ -f "$keyfile" ]; then
rm -f "$keyfile"
dropbearkey -t "$keytype" -f "$keyfile"
echo "已重新生成 ${keytype} 主机密钥"
fi
done
# 重启 Dropbear
if systemctl is-active dropbear >/dev/null 2>&1; then
systemctl restart dropbear
echo "Dropbear 已重启"
else
echo "请手动重启 Dropbear"
fi
# 显示新指纹
echo ""
echo "=== 新主机密钥指纹 ==="
for keyfile in "$KEY_DIR"/dropbear_*_host_key; do
echo "$(basename $keyfile):"
dropbearkey -y -f "$keyfile" | grep Fingerprint
done
echo ""
echo "⚠️ 重要: 请通知所有用户更新 known_hosts 中的主机指纹"
echo " 旧密钥备份: $BACKUP_DIR"
4.3 用户密钥管理
使用 dropbearkey 生成用户密钥
# 生成 Ed25519 用户密钥
dropbearkey -t ed25519 -f ~/.ssh/id_dropbear_ed25519
# 生成 RSA 用户密钥(指定位数)
dropbearkey -t rsa -s 4096 -f ~/.ssh/id_dropbear_rsa
# 生成 ECDSA 用户密钥
dropbearkey -t ecdsa -s 256 -f ~/.ssh/id_dropbear_ecdsa
# 添加注释
dropbearkey -t ed25519 -f ~/.ssh/id_dropbear_ed25519 -C "admin@myhost"
使用 OpenSSH 的 ssh-keygen 生成
Dropbear 也兼容 OpenSSH 格式的密钥(Ed25519 和 ECDSA),但 RSA 密钥格式不完全兼容。
# 使用 ssh-keygen 生成(推荐,兼容性更好)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "admin@myhost"
ssh-keygen -t ecdsa -b 256 -f ~/.ssh/id_ecdsa -C "admin@myhost"
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "admin@myhost"
# 查看公钥
cat ~/.ssh/id_ed25519.pub
格式兼容性注意:
- Ed25519: Dropbear 和 OpenSSH 格式通用
- ECDSA: Dropbear 和 OpenSSH 格式通用
- RSA: Dropbear 使用自有格式,需要用
dropbearconvert转换
4.4 authorized_keys 管理
authorized_keys 文件存放允许登录的用户公钥列表。
文件位置和权限
# 文件位置
~/.ssh/authorized_keys
# 必须的权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown $(whoami):$(whoami) ~/.ssh ~/.ssh/authorized_keys
添加公钥
# 方法一:直接追加
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
# 方法二:使用 ssh-copy-id(需要 OpenSSH 客户端)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote
# 方法三:手动编辑
vi ~/.ssh/authorized_keys
# 粘贴公钥内容(一行一个密钥)
authorized_keys 格式
# 标准格式
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... user@host
# 带选项的格式
command="/usr/bin/menu",no-port-forwarding,no-X11-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... user@host
# 多个密钥,每行一个
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... admin@laptop
ssh-rsa AAAAB3NzaC1yc2EAAA... admin@desktop
Dropbear 支持的 authorized_keys 选项
| 选项 | 说明 | 支持状态 |
|---|---|---|
command="cmd" | 强制执行指定命令 | ✅ |
no-port-forwarding | 禁止端口转发 | ✅ |
no-X11-forwarding | 禁止 X11 转发 | ✅ |
no-agent-forwarding | 禁止 Agent 转发 | ✅ |
no-pty | 禁止分配终端 | ✅ |
permitopen="host:port" | 限制转发目标 | ✅ |
tunnel="n" | tun 设备转发 | ⚠️ 部分版本 |
principals="..." | 证书主体 | ❌ |
受限公钥示例
# 只允许执行备份脚本,禁止其他操作
command="/usr/local/bin/backup.sh",no-port-forwarding,no-X11-forwarding,no-pty ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... backup@server
# 只允许端口转发,禁止 shell
command="/bin/false",no-pty ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... tunnel@client
# 只允许通过特定隧道访问内网
permitopen="192.168.1.100:80",permitopen="192.168.1.100:443",no-port-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... webadmin@client
批量管理 authorized_keys
#!/bin/bash
# manage_authkeys.sh - 批量管理 authorized_keys
AUTH_KEYS="/home/deploy/.ssh/authorized_keys"
KEYS_DIR="/etc/deploy/authorized_keys.d"
# 将所有用户公钥文件合并到 authorized_keys
# 这种方式便于按用户管理密钥
mkdir -p "$KEYS_DIR"
# 添加新用户公钥
add_key() {
local username="$1"
local keyfile="$2"
cp "$keyfile" "$KEYS_DIR/${username}.pub"
echo "已添加 $username 的公钥"
}
# 删除用户公钥
remove_key() {
local username="$1"
rm -f "$KEYS_DIR/${username}.pub"
echo "已删除 $username 的公钥"
}
# 重建 authorized_keys
rebuild_keys() {
cat "$KEYS_DIR"/*.pub > "$AUTH_KEYS.tmp"
mv "$AUTH_KEYS.tmp" "$AUTH_KEYS"
chmod 600 "$AUTH_KEYS"
echo "已重建 authorized_keys ($(wc -l < "$AUTH_KEYS") 个密钥)"
}
case "$1" in
add) add_key "$2" "$3"; rebuild_keys ;;
remove) remove_key "$2"; rebuild_keys ;;
rebuild) rebuild_keys ;;
*) echo "用法: $0 {add|remove|rebuild} [username] [keyfile]" ;;
esac
4.5 密钥格式详解
Dropbear 原生格式
Dropbear 使用自己的密钥格式,与 OpenSSH 格式不同:
# Dropbear 私钥格式(RSA)
# 头部: ---- BEGIN DROPBEAR RSA KEY ----
# Base64 编码的密钥数据
# 尾部: ---- END DROPBEAR RSA KEY ----
# 查看 Dropbear 私钥
head -1 ~/.ssh/id_dropbear_rsa
# ---- BEGIN DROPBEAR RSA KEY ----
OpenSSH 新格式
# OpenSSH 私钥格式(Ed25519)
# 头部: -----BEGIN OPENSSH PRIVATE KEY-----
# Base64 编码的密钥数据(包含 bcrypt 加密)
# OpenSSH 公钥格式
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... comment
格式兼容性矩阵
| 密钥类型 | Dropbear 格式 | OpenSSH 新格式 | OpenSSH 旧格式 | PEM 格式 |
|---|---|---|---|---|
| RSA 私钥 | ✅ | ⚠️ 需转换 | ⚠️ 需转换 | ⚠️ 需转换 |
| RSA 公钥 | - | ✅ | ✅ | - |
| Ed25519 私钥 | ✅ | ✅ | N/A | N/A |
| Ed25519 公钥 | - | ✅ | N/A | - |
| ECDSA 私钥 | ✅ | ✅ | ⚠️ 需转换 | ⚠️ 需转换 |
| ECDSA 公钥 | - | ✅ | ✅ | - |
关键提示: Ed25519 密钥在 Dropbear 和 OpenSSH 之间完全通用,是跨实现使用的最佳选择。
4.6 主机密钥指纹验证
客户端验证流程
# 首次连接时的指纹确认
$ dbclient [email protected]
The authenticity of host '192.168.1.100' can't be established.
Ed25519 key fingerprint is SHA256:xR3bP7kF9v2mL5nQ4wJ8hT6yU1iO3pA5sD7fG9hJ.
Are you sure you want to continue connecting (yes/no)?
预先获取指纹
在设备部署时,预先记录并分发主机密钥指纹:
# 在服务器上获取指纹
dropbearkey -y -f /etc/dropbear/dropbear_ed25519_host_key 2>&1 | grep Fingerprint
# 输出:
# Fingerprint: SHA256:xR3bP7kF9v2mL5nQ4wJ8hT6yU1iO3pA5sD7fG9hJ
预设主机密钥
# 方法一:使用 known_hosts 文件
# 在客户端预设服务器的主机密钥
echo "192.168.1.100 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA..." >> ~/.ssh/known_hosts
# 方法二:使用 SSHFP DNS 记录(Dropbear 不支持验证,但可以记录)
# ssh-ed25519 256 2 1 xR3bP7kF9v2mL5nQ4wJ8hT6yU1iO3pA5sD7fG9hJ
批量设备指纹管理
#!/bin/bash
# collect_fingerprints.sh - 批量收集设备指纹
DEVICES="192.168.1.{1..50}"
OUTPUT_FILE="device_fingerprints.csv"
echo "IP,Type,Fingerprint" > "$OUTPUT_FILE"
for ip in $(echo $DEVICES); do
fp=$(dropbearkey -y -f /etc/dropbear/dropbear_ed25519_host_key 2>&1 | \
grep Fingerprint | awk '{print $NF}')
echo "$ip,ed25519,$fp" >> "$OUTPUT_FILE"
done
echo "指纹已收集到 $OUTPUT_FILE"
4.7 密钥安全最佳实践
密钥保护清单
| 措施 | 命令 | 说明 |
|---|---|---|
| 设置强密码 | dropbearkey 生成后用 dropbearconvert 加密 | 保护私钥文件 |
| 限制文件权限 | chmod 600 ~/.ssh/id_* | 只有所有者可读 |
| 定期轮换 | 脚本自动化 | 建议每 6-12 个月 |
| 使用强算法 | ed25519 > ecdsa > rsa | 避免 DSS |
| 禁用弱算法 | 编译选项禁用 | 移除 SHA1、MD5 |
| 监控密钥使用 | 日志审计 | 追踪认证事件 |
密钥大小建议
| 算法 | 最小推荐大小 | 最佳大小 | 说明 |
|---|---|---|---|
| RSA | 2048-bit | 4096-bit | 嵌入式可用 2048 |
| ECDSA | 256-bit | 256-bit | P-256 曲线 |
| Ed25519 | 256-bit | 256-bit | 固定大小 |
4.8 本章小结
| 要点 | 说明 |
|---|---|
| 主机密钥 | 服务器身份证明,用 dropbearkey 生成 |
| 用户密钥 | 用户认证凭证,可用 dropbearkey 或 ssh-keygen |
| 推荐算法 | Ed25519 优先,RSA 兼容 |
| 授权文件 | ~/.ssh/authorized_keys,注意权限 600 |
| 格式转换 | RSA 需要 dropbearconvert,Ed25519 通用 |
| 安全实践 | 定期轮换、限制权限、监控日志 |