跳转到内容

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 设置无关。

第一步:建一个能用的用户 ​

  1. 在客户端电脑上准备密钥对(已有就跳过),并查看公钥:
sh
# 在客户端电脑上
ssh-keygen -t ed25519 -C "<备注>"
cat ~/.ssh/id_ed25519.pub
  1. 在 OMV 里进入 用户 → 用户(Users → Users),点创建,填写:
    • 名称、密码:小写字母和数字,密码用长口令。
    • Shell:选一个真正的 shell(如 bash),不能选 nologin。
    • 用户组:加入 _ssh 和 sudo。
    • SSH公钥:添加一条,整行粘贴刚才 cat 出来的公钥(以 ssh-ed25519 开头)。
  2. 保存,点黄色提示条上的应用。公钥在应用时才会写到 /var/lib/openmediavault/ssh/authorized_keys/<用户名>,不应用就登不上。

第二步:测试登录和 sudo ​

sh
# 在客户端电脑上
ssh <用户名>@<NAS 的 IP>

登录后,在 OMV 的 shell 里切到 root 权限:

sh
sudo -i

官方文档写的是 sudo su,效果一样。两步都成功,才能往下走。

第三步:关闭 root 登录 ​

  1. 服务 → SSH取消勾选允许 root 登录,保存并应用。
  2. 另开一个终端测试:ssh root@<NAS 的 IP> 应该被拒绝,ssh <用户名>@<NAS 的 IP> 仍然能登录。

关掉之后,需要 root 权限就用 sudo -i。

第四步:关闭密码登录 ​

只有在所有要用 SSH 的账号都配好公钥之后才做这一步,否则没配公钥的账号会被挡在外面。

  1. 取消勾选密码验证,保存并应用。
  2. 在客户端强制用密码试一次,应当失败:
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(公钥写入位置)。

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