如何防止chgrp清除“ setuid位”?


8

我们有基于RH的Linux映像;为了将它们升级到我们产品的最新开发版本,我必须在其上“应用”一些“特殊档案”。

创建档案的人认为,在我们的基本映像中,某些权限是错误的。所以我们被告知要跑步

sudo chgrp -R nobody /whatever

我们做到了;后来,当我们的应用程序运行时,出现了难以理解的问题。

后来我发现:chgrp的调用将清除 / whatever中我们二进制文件中的setuid位信息。

实际的问题是:我们的某些二进制文件必须将setuid位置1才能正常运行。

长话短说:有没有办法在杀死setuid的情况下运行“ chgrp”命令?

我只是在本地Ubuntu上运行了以下命令;导致相同的结果:

mkdir sticky
cd sticky/
touch blub
chmod 4755 blub 
ls -al blub 

->显示带有红色背景的文件名->是的,是setuid

chgrp -R myuser .
ls -al blub 

->显示没有红色背景的文件名-> setuid消失了


1
4XXX位称为setuid位(s),不是粘性位。粘性就是t一点,它的目的有些不同:en.wikipedia.org/wiki/Sticky_bit
zuazo

2
(1)您正在设置setuid位,而不是sticky位。(2)setuid当您这样做chgrpchown将出现安全问题时,不清除该位。
佐藤桂

1
此行为在发行版之间更改。但作为解释在这里,setuid位的变化依赖于底层的系统调用行为。
zuazo

谢谢大家。您是正确的,这与setuid位有关!谢谢你的帮助。我也接受这是“按设计工作”。现在,我只需要找到最明智的方式来完成需要做的事情,而又不浪费这些精力。我考虑使用gefacl创建文本转储,重新处理文本配置,然后应用该配置。那应该让我完全掌控一切。
GhostCat

Answers:


7

如果要chgrp -R nobody /whatever在保留setuid位的同时实现自己的实现,则可以使用以下两个find命令

find /whatever ! -type l -perm -04000 -exec chgrp nobody {} + \
                                      -exec chmod u+s {} +
find /whatever ! -type l ! -perm -04000 -exec chgrp nobody {} +

find ... -perm 04000选项将拾取设置了setuid位的文件。然后,第一个命令应用chgrp,然后应用a chmod来恢复已被删除的setuid位。第二个适用chgrp于所有没有setuid位的文件。

无论如何,您都不想调用chgrpchmod在符号链接上进行调用,因为那样会影响其目标,因此! -type l


请注意,这chgrp还将清除可能也需要恢复的setgid位(以及Linux上的功能)。
斯特凡Chazelas

@StéphaneChazelas你是对的,但是由于没有人提到setgid,所以我不必担心为此提供解决方案。不过,该解决方案具有很强的可扩展性,其中第三个解决方案find
roaima

好吧,这不是第3个发现,您必须解决u + g,仅涉及u,仅涉及g的情况。无论如何,您应该能够一次find调用。当您必须滚动文本时,我不喜欢SE中的长行。我加了!型证关于它走在边缘
斯特凡Chazelas

好吧,如果最终将/ s分解为多个调用find,则-exec +可能很难可靠地实现一种方法。chmodchgrp
斯特凡Chazelas

1
其实,我认为find . ! -type l -exec chgrp nobody {} + \( -perms -6000 -exec chmod gu+s {} + -o -perms -4000 -exec chmod u+s {} + -o -perms -2000 -exec chmod g+s {} + \)应该没问题。因为chgrp匹配的文件更多,所以对于每个文件都应在s 之前完成chmod
斯特凡Chazelas

5

清除chgrp(或chown)上的SUID和SGID位是完全合理的。为了防止安全问题,这是一种安全措施。对于SGID(我认为是在可执行文件上),意味着以有效的group owner组运行该程序

如果更改组所有者,那么就安全性和访问控制而言,这是完全不同的,即,uvw现在,程序不是以有效组运行,而是以有效组运行xyz

因此,您必须在所有权更改时明确恢复SUID或SGID位。

附录:关于chgrp(或chown)仅应清除SGID(或SUID,分别为)的声明

通过chownchgrp更改可执行文件的安全性设置,这是清除任何特权提升属性的充分理由。Unix的强大功能来自于概念上的简单性,并且Unix安全性已经相当棘手。为此,在所有所有权更改时删除SUID和SGID只是一个安全网-毕竟,在Unix / Linux的历史上,由于误导了SUID或SGID设置而存在许多漏洞。

因此,没有任何更深层次的理由说明Unix如此行事,这只是一个保守的设计决定。


1
这完美地解释了为什么更改所有者清除SUID位,而更改组清除SGID位。但是问题是关于在组更改操作期间的SUID位不会影响运行SUID的用户。因此,必须有不同的解释。
Ben Voigt

1
@BenVoigt:它解释得很好。chown和chgrp都调用chown()系统调用,该调用无论如何都会清除常规文件上的suid和sgid。
约书亚

1
@约书亚:这是一个描述。解释是“为了避免这样的情况,uvw程序现在不再以有效的组运行xyz,而是现在以有效的组运行”,但这不适用于所讨论的情况。
Ben Voigt

是的 通过chownchgrp更改安全设置,这是清除特权提升属性的充分理由。否则很容易引起粗心大意。
反模式

4

在的清算setuidsetgid位(至少在Linux上)在非目录由于内核进行chown()系统调用的完成chgrp,而不是chgrp自己。因此,唯一的方法是在以后还原它。

它还清除了安全功能。

因此,在GNU Linux上:

chown_preserve_sec() (
  newowner=${1?}; shift
  for file do
    perms=$(stat -Lc %a -- "$file") || continue
    cap=$(getfattr -m '^security\.capability$' --dump -- "$file") || continue
    chown -- "$newowner" "$file" || continue
    [ -z "$cap" ] || printf '%s\n' "$cap" | setfattr --restore=-
    chmod -- "$perms" "$file"
  done
)

并运行(as root):

chown_preseve_sec :newgroup file1 file2...

在尝试保留权限时更改组。

递归地,您可以执行以下操作:

# save permissions (and ACLs). Remove the "# owner" and "# group" lines
# to prevent them being restored!
perms=$(getfacl -RPn . | grep -vE '^# (owner|group): ')
# save capabilities
cap=$(getfattr -Rhm '^security\.capability$' --dump .)

chgrp -RP nobody .

# restore permissions, ACLs and capabilities
printf '%s\n' "$perms" | setfacl --restore=-
[ -z  "$cap" ] || printf '%s\n' "$cap" | setfattr -h --restore=-

(这一切都假设没有其他东西会同时弄乱文件)。


1

和往常一样,有很多方法可以去。

我提出的解决方案是这样的:

cd /home/me
getfacl -R /whatever > whatever-permissions.org 2> /dev/null

# A) change lines starting with      # group: root
# to                                 # group: whatineed
sed 's/^# group: root/# group: whatineed/g' whatever-permissions.org > whatever-permissions.new

# B) change lines with               group::x.y
# to                                 group::xwy
# (where x, y mean: whatever was there before)
sed 's/^group::\(.\).\(.\)/group::\1w\2/g' whatever-permissions.new > whatever-permissions.new

cd /
setfacl --restore /home/me/whatever-permissions.new
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.