Linux

作為普通使用者,我為什麼能夠更改文件的所有權?

  • April 5, 2020

我有一個從 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 上的配置設置。這並沒有真正的意義,但也許伺服器的管理員不太了解他在做什麼(或者可能有一些模糊的策略原因為什麼會以這種方式配置)。

引用自:https://unix.stackexchange.com/questions/399975