首页 > 解决方案 > 决定 setgroups() 和 initgroups() 必须由超级用户调用的机制是什么?

问题描述

来自 APUE

#include <grp.h> /* on Linux */
int setgroups(int ngroups, const gid_t grouplist[]);

超级用户setgroups可以调用该函数为调用进程设置补充组ID列表:grouplist包含组ID数组,ngroups指定数组中元素的数量。ngroups 的值不能大于 NGROUPS_MAX。

#include <grp.h> /* on Linux and Solaris */
int initgroups(const char *username, gid_t basegid);

一个必须是超级用户 才能调用initgroups(),因为它调用setgroups()

决定这一点setgroups()并且initgroups()必须由超级用户调用的机制是什么?

我所说的“机制”是指类似于以下内容或与之对应的内容。在 Linux 中,我了解到我们可以根据访问控制列表 (ACL) 确定进程对文件的可访问性:

谢谢。

标签: clinuxprivilegesaccess-control

解决方案


在 Linux 中,如果一个进程有CAP_SETGID 能力,内核将尊重setgid(), setegid(), setregid(), setresgid(), 和setgroups()调用(除非被像 SELinux 这样的 Linux 安全模块拒绝)。

非特权用户可以通过两种主要机制获得能力:

  • 从特权进程继承它。对于普通用户,PAM 模块可能会在登录时授予额外的功能。

  • 通过文件系统功能。

文件系统功能更有趣,对服务/应用程序更有用。它们仅适用于二进制文件,而不适用于脚本,因为内核更新功能作为执行二进制文件机制的一部分;脚本由 shell 使用完全不同的、完全用户空间的机制来解释。

(文件系统必须支持扩展属性。某些文件系统,如 ext2、ext3 和 reiserfs,必须使用user_xattr挂载选项挂载以启用扩展属性。ext4、xfs、jfs、btrfs 和 zfs 都应使用默认挂载选项支持扩展属性。一些 Linux 发行版,如 Debian 和 Ubuntu,已经依赖于扩展属性和文件系统功能。)

注意:您可以使用getcaplsattr实用程序来检查二进制文件系统功能和扩展属性。在我的 Ubuntu 16.04.4 LTS 系统上,/usr/bin/systemd-detect-virt二进制文件具有允许且有效的 CAP_DAC_OVERRIDE 和 CAP_SYS_PTRACE 功能。

在实践中使用文件系统功能非常容易,但为了安全操作,首先应仔细考虑安全隐患:它是一个强大的工具,但您(开发人员、包管理器和/或系统管理员)有责任确保它是正确使用。

例如,如果您正在安装/usr/bin/yourprog受信任且需要 CAP_SETGID 功能,那么您需要做的就是将该功能设置为允许并对该二进制文件有效。为此,您setcap cap_setgid=pe /usr/bin/yourprog需要以 root 权限运行。(在 Debian .deb 包安装脚本中,通常在安装后脚本中运行。)


推荐阅读