无法使用 ACL 或 chmod 向其他用户授予写入权限

New*_*bie 2 linux acl chmod sticky-bit

有人知道为什么 rocky 不能写信吗/tmp/afile?作为其他用户授予不稳定的权限chmod o+w似乎也不起作用

我更新了 acl:setfacl -m u:rocky:rw /tmp/afile

id 作为 rocky 和所有者:

rocky@jammy:~$ id
uid=1001(rocky) gid=1001(rocky) groups=1001(rocky)
Run Code Online (Sandbox Code Playgroud)
seb@jammy:~$ id
uid=1000(seb) gid=1000(seb) groups=1000(seb),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),122(lpadmin),134(lxd),135(sambashare)
Run Code Online (Sandbox Code Playgroud)

ls -ld 输出

seb@jammy:~$ ls -ld /tmp/afile
-rw-rw-rw-+ 1 seb seb 0 Jul  3 14:25 /tmp/afile
Run Code Online (Sandbox Code Playgroud)

所有者可以毫无问题地编写:

seb@jammy:~$ echo rounders > /tmp/afile
seb@jammy:~$ cat /tmp/afile 
rounders
Run Code Online (Sandbox Code Playgroud)

getfacl -n 输出:

seb@jammy:~$ getfacl -n /tmp/afile getfacl: Removing leading '/' from
absolute path names
# file: tmp/afile
# owner: 1000
# group: 1000
user::rw- 
user:1001:rw- 
group::rw- 
mask::rw- 
other::rw-
Run Code Online (Sandbox Code Playgroud)

df -T 和安装输出:

seb@jammy:~$ df -T /tmp
Filesystem     Type 1K-blocks     Used Available Use% Mounted on
/dev/sda2      ext4 120044288 18487840  95412296  17% /
seb@jammy:~$ mount | grep /dev/sda2
/dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro)
/dev/sda2 on /var/snap/firefox/common/host-hunspell type ext4 (ro,noexec,noatime,errors=remount-ro)
Run Code Online (Sandbox Code Playgroud)

尝试以 Rocky 方式写入文件:

seb@jammy:~$ getfacl /tmp/afile
getfacl: Removing leading '/' from absolute path names
# file: tmp/afile
# owner: seb
# group: seb
user::rw-
user:rocky:rw-
group::rw-
mask::rw-
other::rw-

seb@jammy:~$ su - rocky
#Password: 
rocky@jammy:~$ echo hello > /tmp/afile
-bash: /tmp/afile: Permission denied
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 6

您的期望是正确的:权限应该允许rocky写入afile,因为rocky拥有文件的写入权限和所有包含目录的执行权限。然而,您在 Linux 上遇到了额外的安全强化机制。当此机制处于活动状态时,将阻止对具有粘滞位的目录中的文件进行某些写入。

\n

目录上的粘性位由 表示,t作为列表中文件模式/权限的 10 个字符的最后一个ls -l,并且可以使用 进行设置chmod +t。通常,粘滞位对目录的影响是只有文件的所有者才能删除或重命名它。它不会影响写入现有文件。

\n

但是,当fs.protected_regular启用 sysctl 时,粘性位会产生额外的后果:用户无法打开文件以在粘性目录中进行写入,除非他们拥有该文件,如果他们以一种在文件不存在时会创建该文件的方式打开该文件存在,程序通过将O_CREAT文件传递给open系统调用来表明这一点。请注意这里的微妙之处:正常行为仅基于文件是否存在,而强化行为基于文件不存在时是否会创建。这只会影响以可能创建文件的方式打开文件:仍然允许使用其他方式写入文件。

\n

请注意,这不会影响没有粘滞位的目录中的文件。特别是,如果您创建一个目录/tmp/foo并且/tmp/foo没有粘滞位,则文件的权限将/tmp/foo正常运行。

\n

下表总结了open在相关场景下打开文件进行写入时系统调用的行为(目录存在并且程序可以访问其中的文件,如果文件存在则程序对其具有写权限):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
目录文件O_CREAT没有O_CREAT
rwxr-xr-x(755)存在,可写 (666)好的好的
rwxr-xr-x(755)不存在好的ENOENT
rwxrwxrwx(777)存在,可写 (666)好的好的
rwxrwxrwx(777)不存在好的ENOENT
rwxr-xr-t(1755)存在,可写 (666)好的好的
rwxr-xr-t(1755)不存在好的ENOENT
rwxrwxrwt【1777】平常存在,可写 (666)好的好的
rwxrwxrwt【1777】平常不存在好的ENOENT
rwxrwxrwt(1777) 在强化 Linux 上存在,可写 (666)EACCES好的
rwxrwxrwt(1777) 在强化 Linux 上不存在好的ENOENT
\n
\n

ENOENT错误是\xe2\x80\x9cNo such file or directory\xe2\x80\x9d。EACCES错误是\xe2\x80\x9cPermission returned\xe2\x80\x9d。)

\n

您可以通过sysctl fs.protected_regular=0(禁用)、sysctl fs.protected_regular=1(为全局可写目录启用)或sysctl fs.protected_regular=2(为全局可写或组可写目录启用)来控制是否启用此强化。在启动时,可以从/etc/sysctl.conf或进行设置/etc/sysctl.d/*。某些发行版默认启用它,而其他发行版则不启用。该protected_regular设置适用于常规文件;命名管道也有类似的设置。

\n

要亲自查看这一点(如果您在 Linux 上运行并具有 root 访问权限),请以 root 身份运行以下命令:

\n
mkdir /tmp/experiment\nmkdir -m 1777 /tmp/experiment/sticky-world\nmkdir -m 777 /tmp/experiment/ordinary-world\nmkdir -m 1755 /tmp/experiment/sticky-user\nmkdir -m 755 /tmp/experiment/ordinary-user\nfor d in /tmp/experiment/*; do touch $d/file; chown nobody:nogroup $d/file; chmod 666 $d/file; done\n
Run Code Online (Sandbox Code Playgroud)\n

检查权限:

\n
$ ls -l /tmp/experiment \ntotal 16\ndrwxr-xr-x 2 root root 4096 Jul  3 21:10 ordinary-user\ndrwxrwxrwx 2 root root 4096 Jul  3 21:10 ordinary-world\ndrwxr-xr-t 2 root root 4096 Jul  3 21:10 sticky-user\ndrwxrwxrwt 2 root root 4096 Jul  3 21:10 sticky-world\n$ ls -l /tmp/experiment/*/file\n-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/ordinary-user/file\n-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/ordinary-world/file\n-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/sticky-user/file\n-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/sticky-world/file\n
Run Code Online (Sandbox Code Playgroud)\n

现在,作为一个非 root 用户nobody,让我们运行一些代码来尝试打开文件进行写入,一次带标志O_CREAT,一次不带标志。我使用 Perl 是因为 shell 不提供直接访问权限O_CREAT(shell 写入重定向始终处于O_CREAT启用状态,除了noclobber启用时在某些 shell 中附加之外)。在强化的 Linux 上:

\n
$ perl -w -MFcntl -e \'foreach (@ARGV) { sysopen(F, $_, O_WRONLY | O_CREAT) or warn "$_: $!\\n"; close F; }\' /tmp/experiment/*/file\n/tmp/experiment/sticky-world/file: Permission denied\n$ perl -w -MFcntl -e \'foreach (@ARGV) { sysopen(F, $_, O_WRONLY) or warn "$_: $!\\n"; close F; }\' /tmp/experiment/*/file\n
Run Code Online (Sandbox Code Playgroud)\n

如果没有 Linux 强化,所有文件打开都会成功,因为程序有权写入文件。

\n

如果您启用了审核,则尝试写入会/tmp/experiment/sticky-world/file触发ANOM_CREAT审核事件,该事件会被记录/var/log/audit/audit.log(或这些日志位于您的发行版上的任何位置)。(这就是我发现这种 Linux 机制的方式,以前并不知道。 )

\n