外观
SSH 与 SFTP 访问
SSH 既是管理 NAS 的命令行入口,也是加密传文件的常用方式(SFTP)。做完这一篇,你会有一个能用 SSH 登录、用 SFTP 传文件的普通用户,可选地配好公钥登录,并关闭 root 的 SSH 登录。
SSH 默认允许 root 用密码登录,而且它给出的是完整的 shell
- 影响范围:OMV 默认启用 SSH,并且允许 root 登录、允许密码验证。能连到 NAS 的人都可以对 root 的密码做暴力尝试。SSH 给的是 shell,权限远大于文件共享,等于完全控制 NAS。
- 前置条件:先建好一个普通用户,加入
_ssh和sudo组,在另一个终端里验证它能登录并能sudo,之后才关闭 root 登录。操作期间保留一个已登录的会话,或者准备好本机控制台。 - 回退:在 Web 界面
服务 → SSH(Services → SSH)里重新勾选 允许 root 登录 并应用;Web 界面也进不去时,在 NAS 的本机控制台(接显示器键盘)用 root 登录,本机登录不受 SSH 设置影响。
SSH 和 SFTP 是什么关系
SFTP 是 SSH 的文件传输子系统,开了 SSH 就有 SFTP。OMV 的 SSH 配置里 SFTP 用的是系统的 /usr/lib/openssh/sftp-server。
要记住它的几个特点:
- 用的是 Linux 用户和文件系统权限。共享文件夹的「共享权限」(第 1 层)对它不起作用,见 三层权限。
- 没有 chroot 限制。用户能浏览到整个文件系统里他有权限看到的部分,不只是共享文件夹。
- 共享文件夹在磁盘上的真实路径是
/srv/dev-disk-by-uuid-<UUID>/<相对路径>。绝对路径可以在存储器 → 共享文件夹(Storage → Shared Folders)的列表里复制。
启用并设置 SSH
打开
服务 → SSH。这些选项:
字段 说明 已启动(Enabled) 全新安装默认已启用 端口(Port) 默认 22 允许 root 登录(Permit root login) 默认勾选。官方保留它,是为了界面坏掉时还有一条路能进系统 密码验证(Password authentication) 默认勾选 公钥认证(Public key authentication) 默认勾选 TCP 转发(TCP forwarding) 允许 SSH 隧道,全新安装默认关闭 压缩(Compression) 默认关闭。对慢速的互联网传输有用,局域网里意义不大 扩展选项(Extra options) 追加到 sshd_config的参数。先看 OMV 生成的文件里有没有同名参数,否则不会生效页面提示写得很清楚:用户必须被分配到
_ssh用户组才能通过 SSH 登录。OMV 生成的配置里AllowGroups只有root和_ssh。点击 保存(Save),再点击顶部黄色提示条上的 应用(Apply)。
端口、密码和公钥登录的进一步加固见 SSH 加固,这里先做最基本的一步。
让普通用户能用 SSH 和 SFTP
按 用户与用户组 创建用户。Shell 用默认的
/usr/bin/sh,不要选nologin。在这个用户的 用户组 里勾选
_ssh。需要提权的管理员还要勾sudo。保存,按需点 应用。
在客户端电脑上测试:
shssh <用户名>@<NAS 地址> sftp <用户名>@<NAS 地址>ssh登录后,需要 root 权限的命令用sudo -i(用户在sudo组里)。图形化的 SFTP 客户端(WinSCP、FileZilla 等)填同样的地址、用户名和密码,协议选 SFTP。
官方文档特别提到:安装 Debian 时创建的普通用户,装完 OMV 后不能 SSH 登录,因为只有 _ssh 组的成员能用 SSH,把他加进去就行。
选了 nologin 的用户用不了系统 SSH 的 SFTP
系统 SSH 的 SFTP 用的是外部的 sftp-server 程序,OpenSSH 会通过用户的登录 shell 来启动它,所以登录 shell 是 nologin 或 false 的用户,既不能登录 shell,也无法用它传文件。这是依据 OpenSSH 的行为推断的,没有在 OMV 上实机验证。只想给人传文件、不给 shell,用下面的独立 SFTP 插件。
配置公钥登录
在客户端电脑上生成密钥对,按提示保存并设置口令:
shssh-keygen -t ed25519查看并复制公钥(一整行,以
ssh-ed25519开头):shcat ~/.ssh/id_ed25519.pubWindows 上这个文件在
%USERPROFILE%\.ssh\id_ed25519.pub。在 OMV 上打开
用户 → 用户(Users → Users),选中用户,点击 编辑(Edit),在 SSH 公钥(SSH public keys)表格里点添加,粘贴公钥,保存,再点 应用。回到客户端再运行
ssh <用户名>@<NAS 地址>,应该不再要密码(用了口令时会要口令)。
界面接受两种格式:OpenSSH 的一行格式(ssh-rsa、ssh-ed25519、[email protected] 开头),或 RFC 4716 格式(---- BEGIN SSH2 PUBLIC KEY ---- 开头)。其他类型,比如 ECDSA 的一行公钥,校验会不通过,先转成 RFC 4716:在客户端运行 ssh-keygen -e -f <公钥文件>,把输出粘进去。
界面里添加的公钥,由 OMV 写到 /var/lib/openmediavault/ssh/authorized_keys/<用户名>,这个目录由 OMV 管理,不要手动改。
关闭 root 登录
确认普通用户能登录、sudo 正常之后:
- 打开
服务 → SSH,取消勾选 允许 root 登录。 - 保存,点击 应用。
- 之后需要 root 权限,用
sudo -i。
和独立 SFTP 插件的区别
omv-extras 有一个独立的 openmediavault-sftp 插件,用来给外部人员只开放 SFTP。两者的区别:
| 系统 SSH(OMV 核心) | 独立 SFTP 插件(omv-extras) | |
|---|---|---|
| 实现 | 系统自带的 sshd | 另外起一个 sshd 实例(omv-sftp 服务,配置在 /etc/ssh/omv_sftp_config) |
| 端口 | 22 | 默认 222 |
| 能做什么 | shell、SFTP,可开隧道 | 对 sftp-access 组的成员只开放 SFTP(强制执行 internal-sftp) |
| 目录范围 | 没有 chroot,按 Linux 权限看到整个文件系统 | sftp-access 组的成员被锁在自己的 chroot 里,只看到绑定给他的共享文件夹 |
| 谁能用 | root 和 _ssh 组成员 | 在插件里把用户和共享文件夹绑定,并让用户加入 sftp-access 组;按插件源码,锁定规则只对这个组生效,建议同时勾选插件的 AllowGroups,只允许该组登录 |
| 适合 | 管理员、熟悉命令行的家人 | 外部协作者、只需要传文件的人 |
具体的设置见 独立 SFTP 服务:sftp 插件,以你界面和插件文档的显示为准。
检查结果
- 在客户端用普通用户
ssh登录成功,sftp能列目录、上传和下载一个测试文件。 - 用一个不在
_ssh组里的用户登录,应该被拒绝。 诊断 → 服务 → SSH(Diagnostics → Services → SSH)显示当前登录的用户和 SSH 连接,能看到你的会话。- 关闭 root 登录后,
ssh root@<NAS 地址>应该被拒绝。 - 想看登录记录,到
诊断 → 系统日志 → 日志(Diagnostics → System Logs → Logs)选 auth。
常见问题
Permission denied。 依次检查:用户在不在 _ssh 组;密码验证有没有被关;公钥有没有保存并应用;是不是在登录 root 而 root 登录已经关了。
SFTP 登录上了,却看不到共享文件夹。 共享文件夹在 /srv/dev-disk-by-uuid-<UUID>/ 下面,不在登录后的默认目录里,用绝对路径进入。
改了端口连不上。 客户端要指定端口,例如 ssh -p <端口> <用户名>@<NAS 地址>;如果加过防火墙规则,也要放行新端口。改端口只能减少扫描噪音,不是安全措施。
提示主机密钥变化的警告。 重装系统或换硬件后会这样,确认确实是你自己的 NAS 之后,清掉客户端 ~/.ssh/known_hosts 里对应的行。
想让朋友只能传文件。 用独立 SFTP 插件,别给他系统 SSH 的账号。
参考资料
- OMV 官方文档:SSH、Users
- OpenBSD 手册:sshd_config(5)
- OMV 源码:
srv/salt/omv/deploy/ssh/(sshd_config与 authorized_keys 的生成规则) - omv-extras 插件源码:
openmediavault-sftp