跳转到内容

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 ​

  1. 打开 服务 → SSH。

  2. 这些选项:

    字段说明
    已启动(Enabled)全新安装默认已启用
    端口(Port)默认 22
    允许 root 登录(Permit root login)默认勾选。官方保留它,是为了界面坏掉时还有一条路能进系统
    密码验证(Password authentication)默认勾选
    公钥认证(Public key authentication)默认勾选
    TCP 转发(TCP forwarding)允许 SSH 隧道,全新安装默认关闭
    压缩(Compression)默认关闭。对慢速的互联网传输有用,局域网里意义不大
    扩展选项(Extra options)追加到 sshd_config 的参数。先看 OMV 生成的文件里有没有同名参数,否则不会生效
  3. 页面提示写得很清楚:用户必须被分配到 _ssh 用户组才能通过 SSH 登录。OMV 生成的配置里 AllowGroups 只有 root 和 _ssh。

  4. 点击 保存(Save),再点击顶部黄色提示条上的 应用(Apply)。

端口、密码和公钥登录的进一步加固见 SSH 加固,这里先做最基本的一步。

让普通用户能用 SSH 和 SFTP ​

  1. 按 用户与用户组 创建用户。Shell 用默认的 /usr/bin/sh,不要选 nologin。

  2. 在这个用户的 用户组 里勾选 _ssh。需要提权的管理员还要勾 sudo。

  3. 保存,按需点 应用。

  4. 在客户端电脑上测试:

    sh
    ssh <用户名>@<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 插件。

配置公钥登录 ​

  1. 在客户端电脑上生成密钥对,按提示保存并设置口令:

    sh
    ssh-keygen -t ed25519
  2. 查看并复制公钥(一整行,以 ssh-ed25519 开头):

    sh
    cat ~/.ssh/id_ed25519.pub

    Windows 上这个文件在 %USERPROFILE%\.ssh\id_ed25519.pub。

  3. 在 OMV 上打开 用户 → 用户(Users → Users),选中用户,点击 编辑(Edit),在 SSH 公钥(SSH public keys)表格里点添加,粘贴公钥,保存,再点 应用。

  4. 回到客户端再运行 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 正常之后:

  1. 打开 服务 → SSH,取消勾选 允许 root 登录。
  2. 保存,点击 应用。
  3. 之后需要 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 插件,以你界面和插件文档的显示为准。

检查结果 ​

  1. 在客户端用普通用户 ssh 登录成功,sftp 能列目录、上传和下载一个测试文件。
  2. 用一个不在 _ssh 组里的用户登录,应该被拒绝。
  3. 诊断 → 服务 → SSH(Diagnostics → Services → SSH)显示当前登录的用户和 SSH 连接,能看到你的会话。
  4. 关闭 root 登录后,ssh root@<NAS 地址> 应该被拒绝。
  5. 想看登录记录,到 诊断 → 系统日志 → 日志(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

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。