是否可以为每个用户配置Linux功能?
Linux内核中似乎有对的支持,它允许向进程授予权限,以便在不授予进程根权限的情况下执行诸如打开原始套接字或提高线程优先级之类的操作是否可以为每个用户配置Linux功能?,linux,security,permissions,linux-capabilities,Linux,Security,Permissions,Linux Capabilities,Linux内核中似乎有对的支持,它允许向进程授予权限,以便在不授予进程根权限的情况下执行诸如打开原始套接字或提高线程优先级之类的操作 然而,我想知道的是,是否有一种方法可以授予每个用户的功能。也就是说,允许非root和非suid进程获得这些功能。我还没有确认,但我认为SELinux的这一方面可能是您的答案: 是的,您可以使用setcap为可执行文件指定一个功能集,该功能集可以在可执行文件运行时授予特定的功能 从手册页: 文件功能 从内核2.6.24开始, 内核支持关联 具有可执行文件的功能集 文
然而,我想知道的是,是否有一种方法可以授予每个用户的功能。也就是说,允许非root和非suid进程获得这些功能。我还没有确认,但我认为SELinux的这一方面可能是您的答案:
是的,您可以使用
setcap
为可执行文件指定一个功能集,该功能集可以在可执行文件运行时授予特定的功能
从手册页:
文件功能
从内核2.6.24开始,
内核支持关联
具有可执行文件的功能集
文件使用setcap(8)。档案
功能集存储在
扩展属性(参见setxattr(2))
命名为security.capability。写信给
此扩展属性需要
CAP_设置FCAP功能。档案
功能集,与
线程的功能集,
确定线程的功能
在一个execve(2)之后
为每个用户(甚至每个组)授予功能的方法是使用PAM模块。演示如何使用pam_cap执行此操作查看-它应该可以执行您想要的操作
注意:我没有使用它,因为它还没有(还?)被移植到2.6.30ish内核API。它可以通过libcap完成-它提供了一个PAM模块PAM_cap.so。 然而,事情并不是那么简单:) 每个流程有三个功能集:
- 有效(此流程实际具有的上限)
- 允许(此过程可能具有的上限-有效值的超集)
- 可继承(此进程可以传递给子进程的上限)
- pI/pP是流程的初始可继承/允许功能
- pI'/pP'/pE'是流程的新的可继承/允许/有效功能
- fI/fP/fE是文件的可继承/允许/有效功能
- &表示交叉点
- |代表联盟 pI' = pI pP' = fP | (pI & fI) pE' = fE & pP' π'=π pP'=fP |(pI&fI) pE'=fE&pP'
pE'=fE&pP'
)很明显,要使CAP\u NET\u ADMIN位于流程的有效集合中,CAP\u NET\u ADMIN必须位于文件的有效集合中。因此,能力系统不允许我们简单地说“向用户sqweek授予CAP_NET_ADMIN”-程序的能力始终很重要
但是,仅在文件的有效集合中是不够的,cap还需要在流程的新允许集合中。让我们看看这个规则:pP'=fP |(pI&fI)
。因此,有两种方法可以在pP'
中获取cap,要么将cap\u NET\u ADMIN添加到文件的允许集,要么将其添加到文件的可继承集,并确保它位于进程的可继承集中
如果我们将其添加到文件的允许集,那么进程的初始功能将变得无关紧要——openvpn将在每次运行时获得CAP_NET_ADMIN,而不管是谁运行它。这与setuid类似,但提供了更细粒度的方法。尽管如此,它不是每个用户的粒度,所以让我们看看另一个选项
注意第一条规则,pI'=pI
。进程的可继承功能不受exec()的影响。这意味着,我们只需要一个libcap感知程序将CAP_NET_ADMIN设置为可继承的CAP,由此产生的每个进程也将具有CAP_NET_ADMIN可继承性。这就是pam模块所扮演的角色——它在登录期间修改可继承集,然后为该用户的所有进程继承该可继承集
总结如下:
cap_net_admin sqweek
添加到/etc/security/capability.conf
。如果该文件以前不存在,请添加另一行none*
,以获得合理的默认值auth required PAM_cap.so
添加到/etc/PAM.d/login
)。在进行PAM更改时,请确保在注销前在单独的终端中测试您的登录,以免将自己锁定在外setcap CAP_NET_ADMIN+ie/usr/sbin/openvpn
)openvpn
调用ip
来更改路由表等,因此需要相同的处理(setcap-cap\u-net\u-admin+ie/sbin/ip
)请注意,
/etc/pam.d/login
仅管理本地登录-您可能希望给予例如/etc/pam.d/sshd
类似的处理。此外,当您的包管理器安装新版本的目标二进制文件时,您通过setcap添加的任何功能都将被破坏,因此您必须重新添加它们。+1用于SELinux。它解决了这个问题很好。谢谢,我会考虑的,但是对SELinux来说,对于现有的基础设施来说可能是相当繁重的。是的,我知道你可以设置每个可执行文件的能力。但是,我的问题是,如果你能设置能力。