我有一个从 Netapp SAN 通过 NFS 安装的分区。我可以在该分区中创建文件,并且可以将这些文件 chown 给另一个用户、任何用户,甚至 root。我怎样才能做到这一点?我以为内核会阻止这样的事情发生。我今天一次又一次地这样做,在文件上使用多个用户 ID。
我无法在 /tmp 或本地安装的主目录中执行此操作。
我以前从未见过这种行为。另外,我注意到在这台机器上找不到 setcap/getcap。
我检查了我的 shell 的功能,它们都是 0:
$ echo $$
15007
$ cat /proc/15007/task/15007/status
Name: bash
State: S (sleeping)
SleepAVG: 98%
Tgid: 15007
Pid: 15007
PPid: 14988
TracerPid: 0
Uid: 71579 71579 71579 71579
Gid: 10000 10000 10000 10000
FDSize: 256
Groups: 9000 10000 10001 10013 10018 10420 24611 36021
...
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
我在 Red Hat 5.3 虚拟机上:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.3 (Tikanga)
运行旧内核:
$ uname -r
2.6.18-274.7.1.el5
NFS 挂载使用默认值:
$ cat /etc/fstab
...
mynetapp00:/home /mnt/home nfs defaults 0 0
对于用户身份验证,我们在 Linux 端使用 Windows Active Directory 和 ldap:
$ grep passwd /etc/nsswitch.conf
passwd: files ldap
我可以用 sudo 做任何事情:
User mikes may run the following commands on this host:
(ALL) ALL
因为我是管理员之一(/etc/sudoers 的内容):
User_Alias ADMINS = fred, tom, mikes
ADMINS ALL=(ALL) ALL
...但我不知道这是怎么回事,因为 sudo 不参与其中。无论如何,我能够创建一个文件并以用户“john”的身份授予它我的所有权,该用户在 /etc/sudoers 中找不到:
# grep john /etc/sudoers
# su - john
$ touch /mnt/home/blah
$ chown mikes /mnt/home/blah
$ ls -l /mnt/home/blah
-rwxrwxrwx 1 mikes DomainUsers 0 Oct 23 19:45 /mnt/home/blah
...并且 chown 没有别名(但我们知道,因为如果 chown 是别名或其他程序,那么我也可以更改 /tmp 中的所有权):
$ alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
$ which chown
/bin/chown
PS我不是在开玩笑:
$ id
uid=71579(mikes) gid=10000(DomainUsers)
$ touch /mnt/home/blah
$ chown john /mnt/home/blah
$ ls -l /mnt/home/blah
-rwxrwxrwx 1 john DomainUsers 0 Oct 23 19:04 /mnt/home/blah
$ id john
uid=37554(john) gid=10000(DomainUsers)
$ chmod 755 /mnt/home/blah
chmod: changing permissions of `/mnt/home/blah': Operation not permitted
$ rm /mnt/home/blah
$ ls -l /mnt/home/blah
ls: /mnt/home/blah: No such file or directory
$ touch /tmp/blah
$ chown john /tmp/blah
chown: changing ownership of `/tmp/blah': Operation not permitted
答案1
是的,chown
这是内核的权限,但请记住,NetApp 超出了内核的范围。对于本地文件系统,内核将用户 I/O 请求转换为本地硬件 I/O 操作(在存储设备上)。对于远程(例如,NFS)文件系统,内核将用户 I/O 请求转换为网络通信,要求/告诉服务器执行用户想要的操作。
无法保证服务器会按照请求执行。例如,NetApp 服务器可以配置为同时支持 Unix 样式权限和 Windows 样式权限。 Unix/Linux 客户端将看到 Unix 风格的权限(用户、组、模式,也许还有 ACL)。 Windows 客户端将看到 Windows 样式的权限(用户但不是组、属性、ACL,可能还包括扩展属性)。 NetApp 在内部存储文件属性的组合,并根据某些模糊的专有算法强制访问,因此 Unix 操作可能会因为 Unix 客户端看不到的 Windows 样式权限限制而被拒绝。
长话短说
NetApp 服务器强制执行权限。因此,NetApp 的 NFS 驱动程序可能不会编写为执行任何权限检查,而是发送全部用户向服务器发出请求。因此,允许执行的决定chown
可能 100% 由 NetApp 完成。
我不知道为什么会发生这种情况。这可能是一个错误。这会让我有点惊讶,因为 NetApp 已经存在 25 年了;我希望现在就可以报告并修复这么大的错误。它可能是 NetApp 上的配置设置。这实际上没有意义,但也许服务器的管理员不太明白他在做什么(或者可能有一些模糊的策略原因为什么会这样配置)。
答案2
另一个猜测是 NFS 匿名访问直接映射到 uid 0(又名 root),因此您可以根据需要进行 chown,这可以使用 anonuid nfs 服务器配置参数并在 netapp 中使用导出策略配置来完成。
另请注意:您粘贴的 shell 输出并不能证明所有者已更改,您在运行“chown”之前没有运行“ls -l”,因此另一种可能性是您匿名访问了 NFS 导出,并且服务器配置为映射匿名访问用户名“john”,因此 chown 命令无需更改任何内容。
参考文献:
https://serverfault.com/questions/539267/nfs-share-with-root-for-anonuid-anongid
答案3
这可能会带来一些启示。我用sshfs
。它允许我使用ssh
.
每当我这样做的时候。所有文件操作均由我用来挂载文件系统的远程计算机上的用户控制。所以如果我这样做:
sshsf «remote-user-name»@«remote-machine-name»:~ «local-mount-point»
然后所有操作都以远程用户身份完成。并sudo
没有什么区别。
如果远程用户具有升级的权限,则任何获得挂载访问权限的本地用户都将拥有这些升级的权限。