New*_*bie 2 linux acl chmod sticky-bit
有人知道为什么 rocky 不能写信吗/tmp/afile?作为其他用户授予不稳定的权限chmod o+w似乎也不起作用
我更新了 acl:setfacl -m u:rocky:rw /tmp/afile
id 作为 rocky 和所有者:
Run Code Online (Sandbox Code Playgroud)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)
ls -ld 输出
Run Code Online (Sandbox Code Playgroud)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
getfacl -n 输出:
Run Code Online (Sandbox Code Playgroud)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-
df -T 和安装输出:
Run Code Online (Sandbox Code Playgroud)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)
尝试以 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)
您的期望是正确的:权限应该允许rocky写入afile,因为rocky拥有文件的写入权限和所有包含目录的执行权限。然而,您在 Linux 上遇到了额外的安全强化机制。当此机制处于活动状态时,将阻止对具有粘滞位的目录中的文件进行某些写入。
目录上的粘性位由 表示,t作为列表中文件模式/权限的 10 个字符的最后一个ls -l,并且可以使用 进行设置chmod +t。通常,粘滞位对目录的影响是只有文件的所有者才能删除或重命名它。它不会影响写入现有文件。
但是,当fs.protected_regular启用 sysctl 时,粘性位会产生额外的后果:用户无法打开文件以在粘性目录中进行写入,除非他们拥有该文件,如果他们以一种在文件不存在时会创建该文件的方式打开该文件存在,程序通过将O_CREAT文件传递给open系统调用来表明这一点。请注意这里的微妙之处:正常行为仅基于文件是否存在,而强化行为基于文件不存在时是否会创建。这只会影响以可能创建文件的方式打开文件:仍然允许使用其他方式写入文件。
请注意,这不会影响没有粘滞位的目录中的文件。特别是,如果您创建一个目录/tmp/foo并且/tmp/foo没有粘滞位,则文件的权限将/tmp/foo正常运行。
下表总结了open在相关场景下打开文件进行写入时系统调用的行为(目录存在并且程序可以访问其中的文件,如果文件存在则程序对其具有写权限):
| 目录 | 文件 | 和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 |
(ENOENT错误是\xe2\x80\x9cNo such file or directory\xe2\x80\x9d。EACCES错误是\xe2\x80\x9cPermission returned\xe2\x80\x9d。)
您可以通过sysctl fs.protected_regular=0(禁用)、sysctl fs.protected_regular=1(为全局可写目录启用)或sysctl fs.protected_regular=2(为全局可写或组可写目录启用)来控制是否启用此强化。在启动时,可以从/etc/sysctl.conf或进行设置/etc/sysctl.d/*。某些发行版默认启用它,而其他发行版则不启用。该protected_regular设置适用于常规文件;命名管道也有类似的设置。
要亲自查看这一点(如果您在 Linux 上运行并具有 root 访问权限),请以 root 身份运行以下命令:
\nmkdir /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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n现在,作为一个非 root 用户nobody,让我们运行一些代码来尝试打开文件进行写入,一次带标志O_CREAT,一次不带标志。我使用 Perl 是因为 shell 不提供直接访问权限O_CREAT(shell 写入重定向始终处于O_CREAT启用状态,除了noclobber启用时在某些 shell 中附加之外)。在强化的 Linux 上:
$ 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\nRun Code Online (Sandbox Code Playgroud)\n如果没有 Linux 强化,所有文件打开都会成功,因为程序有权写入文件。
\n如果您启用了审核,则尝试写入会/tmp/experiment/sticky-world/file触发ANOM_CREAT审核事件,该事件会被记录/var/log/audit/audit.log(或这些日志位于您的发行版上的任何位置)。(这就是我发现这种 Linux 机制的方式,以前并不知道。 )
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |