QNAP NAS 权限设置
QNAP 威联通 NAS Linux折腾一下 NAS 的权限管理。
QNAP 的权限模型跟 Linux 是一模一样的,只是在实现权限管理的时候跟经典的 Linux 的用法不太一样。下面是对应关系:
Linux 用户 | Linux 组名 | Linux UID | Linux GID | QNAP 用户 | QNAP 组名 | QNAP UID | QNAP GID |
---|---|---|---|---|---|---|---|
root | root | 0 | 0 | admin | administrator | 0 | 0 |
nobody | nogroup | 65534 | 65534 | guest | guest | 65534 | 65534 |
ds | ds | 1000 | 1000 | ds | everyone | 1000 | 100 |
这里的 ds 是我自己的用户名
下面是我的需求:
- 从一台 Linux Host 上用 NFSv4 连接 NAS,跑 BT 和 Calibre-Web
- 从一台 MacBook 上用 SMB 连接 NAS
- 也从 QNAP 的 Web Console 上管理文件
2 和 3 都很好搞。因为都可以直接用 ds 这个帐号登录,这样读写文件就天然是 ds 的权限。但是 Linux 上的 GID 和 NAS 上的不一样,这就导致从 NAS 上看在 Linux 上创建的文件的权限时,group 权限显示的是一个没有名字的 GID。为了修复这个问题,我研究了一番,最后发现可以通过简单地使用 NFS 的 squash 机制解决这个问题。
squash 是挤压的意思。在 QNAP 的 Control Panel > Privileges > Shared Folders 里有针对 NFS 服务权限的选项 (NFS host access),这里有一个 Squash Option 可以配置。选项有三个,分别是:
- Squash root user 如果客户端以 root 用户的身份来读写文件,在 NAS 这边就把这个文件的权限设置为匿名用户的权限,但是其他的非 root 用户则不受影响
- Squash all users 不管客户端以什么用户来读写文件,在 NAS 这边都按照匿名用户的权限来处理
- Squash no users 直接按照客户端传入的用户身份来设置文件权限,如果用户说自己是 root,那么他就可以写入一个属于 root 的文件,在 NAS 上配置有 suid 机制的情况下很危险,因为恶意的请求可能可以写入一个可执行文件,然后在 NAS 机器上运行这个文件来获取 root 权限的 shell
所以目前我配置的是 squash all users, 并且把 anonymous UID 设置为 ds,并且把 anonymous user GID 设置为 everyone。这样在 NFS 上写入的文件,在 NAS 上都能正常显示,而且其他用户都能够读取(可能有安全问题?)。