作為普通使用者,我為什麼能夠更改文件的所有權?
我有一個從 Netapp SAN 掛載 NFS 的分區。我可以在該分區中創建文件,並且可以將這些文件分配給另一個使用者,任何使用者,甚至是 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 端使用帶有 ldap 的 Windows Active Directory:
$ 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 沒有參與。無論如何,我能夠創建一個文件並將我的所有權作為在 /etc/sudoers 中找不到的使用者“john”授予它:
# 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
是的,
chown
這是核心的權限,但請記住,NetApp 超出了核心的範圍。對於本地文件系統,核心將使用者 I/O 請求轉換為本地硬體 I/O 操作(在儲存設備上)。對於遠端(例如 NFS)文件系統,核心將使用者 I/O 請求轉換為網路通信,要求/告訴伺服器執行使用者想要的操作。無法保證伺服器會按要求執行。例如,可以將 NetApp 伺服器配置為同時支持 Unix 風格的權限和 Windows 風格的權限。Unix/Linux 客戶端將看到 Unix 風格的權限(使用者、組、模式,可能還有 ACL)。Windows 客戶端將看到 Windows 樣式的權限(使用者但不是組、屬性、ACL,可能還有擴展屬性)。NetApp 在內部儲存文件屬性的組合,並根據一些模糊的專有算法強制訪問,因此 Unix 操作可能會因為 Unix 客戶端看不到的 Windows 風格的權限限製而被拒絕。
TL;DR
NetApp 伺服器強制執行權限。因此,NetApp 的 NFS 驅動程序可能被編寫為不進行任何權限檢查,而是將所有使用者請求發送到伺服器。因此,允許
chown
執行的決定可能在 NetApp 100% 完成。我不知道為什麼會這樣。這可能是一個錯誤。這讓我有點吃驚,因為 NetApp 已經存在 25 年了。我希望現在報告和修復一個這麼大的錯誤。它可能是 NetApp 上的配置設置。這並沒有真正的意義,但也許伺服器的管理員不太了解他在做什麼(或者可能有一些模糊的策略原因為什麼會以這種方式配置)。