c - 决定 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) 确定进程对文件的可访问性:
进程的有效用户ID、有效组ID和补充组ID和
文件的权限位。
谢谢。
解决方案
在 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,已经依赖于扩展属性和文件系统功能。)
注意:您可以使用getcap
和lsattr
实用程序来检查二进制文件系统功能和扩展属性。在我的 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 包安装脚本中,通常在安装后脚本中运行。)
推荐阅读
- python - 错误:命令 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' 失败,退出状态为 2
- c# - vSphere VMware.Vim Clone_VM '当前状态下不允许该操作。'
- asp.net-mvc - C# StyleBundle 不包含链接文件
- python - 某些测试用例的最大数组总和失败
- terraform - 在 terraform 中生成一次随机值
- pandas - 熊猫在条件和添加新列的情况下分享价值
- arrays - VBA 全局帧数组
- scala - 在 Azure 数据工厂中提交 Spark
- reactjs - 找不到 reactjs 服务人员 .license 文件
- google-cloud-platform - 如何解决我们无法连接到端口 22 上的 VM。了解有关 GCP 上此问题的可能原因的更多信息?