强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Dropbear SSH 完全指南 / 04 - 密钥管理

第四章:密钥管理

4.1 SSH 密钥体系概述

SSH 密钥体系是 SSH 安全模型的核心。Dropbear 使用两套独立的密钥:

密钥类型用途存储位置生成方式
主机密钥 (Host Key)服务器身份验证/etc/dropbear/dropbearkey
用户密钥 (User Key)用户认证用户 ~/.ssh/dropbearkeyssh-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

密钥类型对比

类型密钥大小安全性性能兼容性推荐度
Ed25519256-bit★★★★★★★★★★仅新版客户端✅ 首选
ECDSA256/384/521-bit★★★★☆★★★★☆广泛✅ 推荐
RSA2048/4096-bit★★★★☆★★★☆☆最广泛⚠️ 保持兼容
DSS1024-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/AN/A
Ed25519 公钥-N/A-
ECDSA 私钥⚠️ 需转换⚠️ 需转换
ECDSA 公钥--

关键提示: Ed25519 密钥在 Dropbear 和 OpenSSH 之间完全通用,是跨实现使用的最佳选择。


4.6 主机密钥指纹验证

客户端验证流程

# 首次连接时的指纹确认
$ dbclient user@192.168.1.100
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
监控密钥使用日志审计追踪认证事件

密钥大小建议

算法最小推荐大小最佳大小说明
RSA2048-bit4096-bit嵌入式可用 2048
ECDSA256-bit256-bitP-256 曲线
Ed25519256-bit256-bit固定大小

4.8 本章小结

要点说明
主机密钥服务器身份证明,用 dropbearkey 生成
用户密钥用户认证凭证,可用 dropbearkeyssh-keygen
推荐算法Ed25519 优先,RSA 兼容
授权文件~/.ssh/authorized_keys,注意权限 600
格式转换RSA 需要 dropbearconvert,Ed25519 通用
安全实践定期轮换、限制权限、监控日志

扩展阅读


上一章:配置详解 | 下一章:认证方式