首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法让CAP_CHOWN和CAP_DAC_OVERRIDE为常规用户工作

无法让CAP_CHOWN和CAP_DAC_OVERRIDE为常规用户工作
EN

Stack Overflow用户
提问于 2015-08-07 16:57:09
回答 3查看 2.1K关注 0票数 2

我的需求

我的python服务器在RHEL上以常规用户的身份运行,但它需要在无法访问的地方创建文件/目录。还需要使用随机UID/GID对这些文件进行格式化

My approach

在只有功能的环境中尝试,没有setuid。我正在尝试使用cap_chown和cap_dac_override功能。但是我完全不知道如何让它在系统环境中工作。

目前,我在服务文件中有以下内容:

代码语言:javascript
复制
#cat /usr/lib/systemd/system/my_server.service 

[Service]
Type=simple
SecureBits=keep-caps
User=testuser
CapabilityBoundingSet=~
Capabilities=cap_dac_override,cap_chown=eip
ExecStart=/usr/bin/linux_capability_test.py

以下是二进制本身:

代码语言:javascript
复制
# getcap /usr/bin/linux_capability_test.py
/usr/bin/linux_capability_test.py = cap_chown,cap_dac_override+ei

但是这里说,它永远不会在脚本上工作:Is there a way for non-root processes to bind to "privileged" ports on Linux?

对于当前的设置,我对于正在运行的进程具有以下功能:

代码语言:javascript
复制
# ps -ef | grep lin
testuser    28268     1  0 22:31 ?        00:00:00 python /usr/bin/linux_capability_test.py

# getpcaps 28268
Capabilities for `28268': = cap_chown,cap_dac_override+i

但是,如果我试图在/etc/从该脚本中创建文件:

代码语言:javascript
复制
try:
    file_name = '/etc/junk'
    with open(file_name, 'w') as f:
        os.utime(file_name,None)

如果“拒绝许可”,它将失败。

对我来说也是同样的情况不起作用吗?我可以在这里使用python模块让它正常工作吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-08 17:16:09

在上述讨论的基础上,我做了以下工作:

代码语言:javascript
复制
[Service]
Type=simple
User=testuser
SecureBits=keep-caps
Capabilities=cap_chown,cap_dac_override=i
ExecStart=/usr/bin/linux_capability_test.py

这将启动服务器,这两个功能都是可继承的。

编写了一个小的C,测试代码到chown文件

代码语言:javascript
复制
#include <unistd.h>

int main()
  {
    int ret = 0;

    ret = chown("/etc/junk", 160, 160);

    return ret;
  }

gcc双星的集合跟随

代码语言:javascript
复制
chown testuser:testuser /usr/bin/chown_c
chmod 550 /usr/bin/chown_c
setcap cap_chown,cap_dac_override=ie /usr/bin/chown_c

服务器执行以下操作来调用二进制文件

代码语言:javascript
复制
import prctl
prctl.cap_inheritable.chown = True
prctl.cap_inheritable.dac_override = True
execve('/usr/bin/chown_c',[],os.environ)

我得到了想要的结果

代码语言:javascript
复制
# ll /etc/junk 
-rw-r--r-- 1 root root 0 Aug  8 22:33 /etc/junk

# python capability_client.py 

# ll /etc/junk 
-rw-r--r-- 1 testuser testuser 0 Aug  8 22:33 /etc/junk
票数 0
EN

Stack Overflow用户

发布于 2015-08-08 02:50:22

由于脚本的执行方式,setuid将无法处理脚本,因为它是一个安全漏洞。这方面有几份文件。你甚至可以从维基百科页面开始。

一个很好的解决方法是编写一个小的C程序,它将用硬编码的路径启动Python脚本和脚本。关于所有问题的很好的讨论可以找到here

票数 0
EN

Stack Overflow用户

发布于 2015-08-08 09:34:03

更新:一种方法,不确定是否是最好的方法。使用‘’模块:

代码语言:javascript
复制
1. Ditch 'User=testuser' from my-server.service
2. Start server as root
3. Set 'keep_caps' flag True
4. Do 'setgroups, setgid and setuid'
5. And immediately limit the permitted capability set to 'DAC_OVERRIDE' and 'CHOWN' capability only
6. Set the effective capability for both to True

下面是相同的代码

代码语言:javascript
复制
import prctl

prctl.securebits.keep_caps = True

os.setgroups([160])
os.setgid(160)
os.setuid(160)

prctl.cap_permitted.limit(prctl.CAP_CHOWN, prctl.CAP_DAC_OVERRIDE)
prctl.cap_effective.dac_override = True
prctl.cap_effective.chown = True`

完成!!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31883010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档