群晖公钥私钥登录SSH的教程

AI 摘要997笔记AI

针对NAS密码登录易被暴力破解、脚本明文存密码的问题,文章介绍用SSH公钥登录替代密码:私钥仅留本地,服务器只校验公钥。以群晖DSM 7.x为例,说明须用管理员账号配合sudo、启用用户家目录,并给出生成ed25519密钥、上传公钥、正确设置.ssh与authorized_keys权限、配置本地SSH及用-v验证的方法,附常见报错排查与安全建议,实现免密且更安全的登录。

此内容由AI根据文章内容自动生成。

用密码登录 NAS 有两个老问题:一是密码会被暴力破解,二是自动化脚本里明文存密码。公钥登录把这两个问题一起解决——私钥留在本地、永不传输,服务器只认公钥。

这篇教程从零开始,把群晖(DSM 7.x)配置 SSH 密钥登录的完整流程走一遍,包括每一步的命令、权限要求和常见报错。

一、先搞清楚三件事

1. 不能用 root 登录

DSM 7 默认禁止 root 通过 SSH 登录。要用的是属于 administrators 组的管理员账号,登进去之后再 sudo -i 提权。

2. 必须启用”用户家目录”

公钥要放在 ~/.ssh/authorized_keys,而群晖的 ~ 指向 /var/services/homes/<用户名>。如果家目录服务没开,这个路径根本不存在,公钥写了也不生效。

3. 私钥只有一把,丢了只能重配

生成时不要设空密码又随手删掉私钥。建议加一个 passphrase,或者至少把私钥备份到加密介质里。

二、在 DSM 里开启 SSH

打开 控制面板 → 终端机和 SNMP,勾选「启动 SSH 功能」。

DSM 控制面板中的「终端机和 SNMP」入口
DSM 控制面板中的「终端机和 SNMP」入口
项目 建议值
端口 默认 22;建议改成 20000 以上的端口
来源限制 防火墙里只放行你自己的网段

顺手确认一下 控制面板 → 用户与群组 → 高级 里的「启用用户家目录」是勾上的。没勾的话先勾上,系统会为每个用户创建 home 目录。

三、在本地生成密钥对

Windows(PowerShell)、macOS、Linux 命令都一样,系统自带 OpenSSH:

ssh-keygen -t ed25519 -a 100 -C "nas-key"
  • -t ed25519:推荐算法,密钥短、速度快、安全性够
  • -a 100:KDF 迭代次数,防暴力破解
  • -C "nas-key":注释,方便以后认钥匙

一路回车,会在 ~/.ssh/ 下生成两个文件:

文件 作用 权限要求
id_ed25519 私钥,绝不外传 600
id_ed25519.pub 公钥,装到服务器上 644

老设备如果只支持 RSA,把 -t ed25519 换成 -t rsa -b 4096,其余不变。

四、把公钥装到群晖上

方法 A:ssh-copy-id(Linux / macOS / WSL)

一条命令搞定,会提示输入一次密码:

ssh-copy-id -i ~/.ssh/id_ed25519.pub 你的账号@192.168.1.100

它自动帮你创建 .ssh 目录、写入 authorized_keys、设置好权限。

方法 B:手动写入(Windows 或想搞清原理)

先密码登录进去:

ssh 你的账号@192.168.1.100

然后逐条执行:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAAC3Nza...你的公钥内容... nas-key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod go-w ~

权限是这套东西最容易踩的坑,OpenSSH 对权限的要求很严格:

路径 正确权限 太宽会被拒
~/.ssh 700 755 也可能被拒
authorized_keys 600 644 会被拒

注意:群晖的家目录默认是 drwxrwxrwx+(777 加 ACL),这个「看起来过宽」的权限实测不影响密钥登录,不用去改它。真正必须严格的是 .ssh 和 authorized_keys 这两级。

Windows 下的一行写法

PowerShell 没有 ssh-copy-id,可以这样传:

type $env:USERPROFILE.sshid_ed25519.pub | ssh 你的账号@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

如果提示乱码或公钥内容被截断,改用记事本打开 .pub 文件,整行复制粘贴到 echo "..." 里更稳妥。

五、配置本地 SSH 客户端

每次敲 ssh -i ~/.ssh/id_ed25519 账号@IP 太啰嗦,写进配置文件:

~/.ssh/config(Windows 是 C:Users你的用户名.sshconfig)

Host nas
    HostName 192.168.1.100
    User 你的账号
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 30

之后直接:

ssh nas

ServerAliveInterval 30 是防断线用的——群晖的 SSH 在一段时间无操作后容易掉,加了它每 30 秒发一次心跳。

六、验证是否真的走了密钥

别只看”能登进去”,用 -v 看认证过程才准:

ssh -v nas

关键看这几行:

Offering public key: /Users/xxx/.ssh/id_ed25519 RSA SHA256:...
Server accepts key: ...
Authenticated to 192.168.1.100 using "publickey"

出现 using "publickey" 且全程没提示输入密码,才算成功。

如果看到 Offering public key 之后又是 Authentications that can continue: password,说明服务器拒绝了公钥,回到第四节检查权限。

七、常见报错对照表

现象 原因 解决
Permission denied (publickey) 公钥没写对 / 权限太宽 检查 chmod 700 ~/.ssh、chmod 600 authorized_keys
一直提示输密码 私钥没被使用 检查 IdentityFile 路径、私钥权限是否 600
Connection refused SSH 没开或端口不对 控制面板确认「启动 SSH 功能」、核对端口
公钥写进去了却不生效 家目录服务没启用 控制面板 → 用户与群组 → 高级 → 启用用户家目录
root@... Permission denied DSM 默认禁止 root 登录 改用管理员账号,登录后 sudo -i
突然连不上,提示拒绝 触发「自动封锁」 控制面板 → 安全 → 自动封锁,解除你的 IP
Windows 下公钥被截断 PowerShell 管道编码问题 改用文本方式粘贴公钥

八、安全上的几条建议

  1. 私钥权限必须是 600,Windows 上也要确认没有给其他用户读权限。
  2. 私钥不要放网盘、不要贴聊天记录,更别提交到 Git 仓库。
  3. 改 SSH 端口,22 是全网的扫描靶子,换成高位端口能挡掉九成噪音。
  4. 不开 SSH 时记得关掉。密钥登录再安全,也不该把管理口长期暴露。
  5. 配合防火墙只放行内网网段,别把 22 口映射到公网。
  6. 定期轮换密钥,尤其是多人用过的机器。

九、一分钟速查

# 1. 本地生成密钥
ssh-keygen -t ed25519 -a 100 -C "nas-key"

# 2. 上传公钥(Linux/macOS)
ssh-copy-id -i ~/.ssh/id_ed25519.pub 账号@NAS_IP

# 3. 手动写(通用)
ssh 账号@NAS_IP
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys && chmod go-w ~

# 4. 验证
ssh -v 账号@NAS_IP
# 看到 Authenticated ... using "publickey" 即成功

十、实测记录(DS1621+ / DSM 7.4.1)

下面是这套流程在真实机器上跑通后的记录,可以作为对照:

项目 实测值
NAS / 系统 Synology DS1621+ / DSM 7.4.1
SSH 服务端 OpenSSH 8.2,端口 22
登录账号 admin(属 administrators 组)
家目录 /var/services/homes/admin
家目录权限 drwxrwxrwx+(DSM 默认带 ACL,不影响登录)
.ssh / authorized_keys 700 / 600
服务端认证方式 publickey,password(密码登录仍然开启)
sudo 需要输入 admin 密码,不是免密

用 ssh -v 抓到的关键几行:

debug1: Remote protocol version 2.0, remote software version OpenSSH_8.2
debug1: Authentications that can continue: publickey,password
debug1: Server accepts key: /root/.ssh/id_ed25519 ED25519 SHA256:g312P20...
debug1: Authenticated to 192.168.11.220 ([192.168.11.220]:22) using "publickey".

登录成功后 id 的输出:

uid=1024(admin) gid=100(users) groups=100(users),101(administrators)

注意 administrators 组是提权的前提,但没有免密 sudo —— 要 root 权限还是得 sudo -i 再输一次密码。

十一、想彻底关掉密码登录

DSM 的图形界面没有「禁用密码登录」的开关,只能改配置文件:

sudo vi /etc/ssh/sshd_config
# 改成:
PasswordAuthentication no
PubkeyAuthentication yes

改完重启服务:

sudo synosystemctl restart sshd

⚠️ 两个前提:

  1. 先确认密钥登录已经能成功,再关密码,否则会把自己锁在外面
  2. DSM 系统升级后 sshd_config 可能被重置,升级完要复查一遍

结语

密钥登录不难,难的是权限和家目录这两个”看起来没问题、实际不生效”的隐性条件。把 ~、.ssh、authorized_keys 三级权限对齐,基本就不会再翻车。

配好之后,建议把 SSH 端口改掉、防火墙收紧,让这条维护通道既方便又安全。

上一篇 iStoreOS/OpenWrt 易有云安装与配置教程