外观
SSH 加固
完成后,root 不能再用 SSH 登录,所有 SSH 登录都只接受公钥,日常管理走一个有 sudo 权限的普通用户。
为什么要改
全新安装的 OMV,SSH 默认是这样的:
| 选项 | 默认 | 含义 |
|---|---|---|
| 已启动(Enabled) | 开 | SSH 服务在运行 |
| 端口(Port) | 22 | |
| 允许 root 登录(Permit root login) | 开 | |
| 密码验证(Password authentication) | 开 | 全局开关,对 root 和普通用户都生效 |
| 公钥认证(Public key authentication) | 开 | |
| TCP 转发(TCP forwarding) | 关 | 是否允许走 SSH 隧道 |
| 压缩(Compression) | 关 | |
| 扩展选项(Extra options) | 空 | 追加 sshd_config 指令 |
默认值来自源码里的全新安装模板,以你界面上显示的为准。
官方文档说明,OMV 默认允许 root SSH 登录,是为了在安装或界面坏掉时还有一条后门,装好后应该在 服务 → SSH(Services → SSH)关掉。另外,只有 root 和 _ssh 组的成员才能用 SSH 登录,所以界面上建的普通用户默认登不上,要加入 _ssh 组(界面也有这条提示)。
改 SSH 设置前先留好退路
- 影响范围:只影响 SSH 登录,也包括用 SSH 账号做 SFTP、SCP 的客户端。Web 界面、SMB 等不受影响。
- 前置条件:能在本机控制台登录;新建的 sudo 用户已经测试成功;改设置时不要关掉当前的 SSH 会话,开第二个窗口测试。
- 怎么回退:Web 界面不依赖 SSH,进入
服务 → SSH把选项勾回来,应用即可。Web 界面也进不去,就在本机控制台用 root 登录处理,控制台登录和 SSH 设置无关。
第一步:建一个能用的用户
- 在客户端电脑上准备密钥对(已有就跳过),并查看公钥:
sh
# 在客户端电脑上
ssh-keygen -t ed25519 -C "<备注>"
cat ~/.ssh/id_ed25519.pub- 在 OMV 里进入
用户 → 用户(Users → Users),点创建,填写:- 名称、密码:小写字母和数字,密码用长口令。
- Shell:选一个真正的 shell(如
bash),不能选nologin。 - 用户组:加入
_ssh和sudo。 - SSH公钥:添加一条,整行粘贴刚才
cat出来的公钥(以ssh-ed25519开头)。
- 保存,点黄色提示条上的应用。公钥在应用时才会写到
/var/lib/openmediavault/ssh/authorized_keys/<用户名>,不应用就登不上。
第二步:测试登录和 sudo
sh
# 在客户端电脑上
ssh <用户名>@<NAS 的 IP>登录后,在 OMV 的 shell 里切到 root 权限:
sh
sudo -i官方文档写的是 sudo su,效果一样。两步都成功,才能往下走。
第三步:关闭 root 登录
服务 → SSH取消勾选允许 root 登录,保存并应用。- 另开一个终端测试:
ssh root@<NAS 的 IP>应该被拒绝,ssh <用户名>@<NAS 的 IP>仍然能登录。
关掉之后,需要 root 权限就用 sudo -i。
第四步:关闭密码登录
只有在所有要用 SSH 的账号都配好公钥之后才做这一步,否则没配公钥的账号会被挡在外面。
- 取消勾选密码验证,保存并应用。
- 在客户端强制用密码试一次,应当失败:
sh
# 在客户端电脑上
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password <用户名>@<NAS 的 IP>应看到 Permission denied (publickey)。同一个 SSH 服务上跑的 SFTP、SCP、rsync over SSH 也会改成只认公钥,用密码的客户端要换成密钥。
root 与密码的组合
允许 root 登录开着、密码验证关掉时,root 只能用公钥登录。允许 root 登录关掉,则无论密码验证怎么设,root 都不能用 SSH 登录。
其他选项
- TCP 转发:保持关。开了以后,拿到账号的人可以借你的 NAS 做跳板,去访问内网里的其他机器。
- 压缩:只在慢速链路上有用,不用开。
- 端口:改端口只能减少机器人扫描在日志里留下的噪音,挡不住针对性的攻击。改了以后要同步改Fail2ban里
ssh规则的端口、防火墙规则和客户端命令(-p)。 - 扩展选项:追加的内容写在 OMV 已设置的指令之后,而
sshd对大多数指令是先出现的先生效,所以覆盖不了 OMV 已经设置的那些(如AllowGroups、PermitRootLogin、PasswordAuthentication)。先只读查看生成的配置,确认没有重复再加。不要手改/etc/ssh/sshd_config,应用配置时它会被重写。
官方文档对远程访问的提醒是四条:转发非 22 的端口、只用公钥、关密码登录、关 root 登录。本站更进一步:SSH 根本不要暴露到公网,需要远程管理走 VPN,见远程访问。
检查结果
在 OMV 的 shell 里查看 sshd 实际生效的配置(只读):
sh
# 在 OMV 的 shell 里,以 root 身份
sshd -T | grep -E '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|allowgroups|allowtcpforwarding|kbdinteractiveauthentication) '按上面的步骤做完,应看到 permitrootlogin no、passwordauthentication no、pubkeyauthentication yes、allowtcpforwarding no,以及 allowgroups 下列出 root 和 _ssh(sshd -T 会把它们分成两行输出)。
再从客户端确认:公钥登录成功,sudo -i 可用,root 和密码登录都被拒绝。
常见问题
Permission denied (publickey)。 依次检查:公钥是否整行粘贴进了该用户的 SSH公钥;是否点过应用;用户是否在 _ssh 组;客户端是否用了对应的私钥(ssh -i)。ssh -v 能看到客户端提供了哪些密钥。
把自己锁在外面了。 先试 Web 界面,在 服务 → SSH 里把选项勾回来并应用。Web 界面也进不去,用本机控制台以 root 登录,再按Web 界面安全里的方法检查。
想让某个人只能传文件,不给 shell。 用独立的 SFTP 服务,把人隔离在指定目录里,见独立 SFTP 服务:sftp 插件。普通 SSH 登录的用法见 SSH 与 SFTP 访问。
Debian 安装器建的用户登不上 SSH。 只有 _ssh 组的成员能登录,手动在 Debian 上装 OMV 时遇到这种情况,需要把用户加入 _ssh 组。
参考资料
- OMV 文档:SSH。
- OMV 源码:
ssh-form-page.component.ts(界面字段)、sshd_config.j2(生成的配置,含AllowGroups root _ssh)、templates/config.xml(全新安装的默认值)、10authorized_keys.sls(公钥写入位置)。