问题标签 [linux-capabilities]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
451 浏览

docker - 在 Docker 中设置文件功能时出错

我正在尝试在 docker 映像中设置 setfcap 功能。当我尝试运行命令setcap cap_setfcap=eip /usr/sbin/setcap时,出现以下错误:

未能在文件上设置功能'/usr/sbin/setcap'(无效参数)

0 投票
2 回答
1176 浏览

linux - 文件功能一旦执行就不会转移到进程

我正在尝试编写一个需要提升功能的程序(而不是简单地使用 sudo 运行它)。但是,我使用 setcap 设置的任何功能似乎都不会在执行后转移到进程中。此问题发生在多个可执行文件中并使用不同的功能。

此代码使用 cap_set_file() 为作为 CLA 传递的文件提供 CAP_NET_RAW 功能。(不要问我为什么需要这个。)

使用 gcc 编译后:

我赋予它以下功能:

并使用 getcap tt,输出为:

但是,当我运行程序时,我得到以下输出(test-client 是一个创建原始以太网套接字的可执行文件):

但是...当我使用 sudo 运行程序时,所有进程功能都很好。

并且目标文件“test-client”正确设置了它的功能。

但是,即使使用 CAP_NET_RAW,客户端在使用 EPERM 调用 socket() 时也会失败。我已经尝试设置 CAP_NET_ADMIN 以防它也需要它;同样的问题。我试过在上面的程序上使用 CAP_SETPCAP;没有骰子。我相当确定我已经将其范围缩小到可执行文件的功能没有进入运行进程的一些断开连接。

我在这里想念什么?


编辑,第二天早上:

好的,所以我做了更多的测试,结果证明这段代码在 Raspberry Pi 上运行良好。我在我的主机上运行带有 LXTerminal 的 Lubuntu 16.04,这就是失败的那个。它在 LXTerminal 和纯文本 shell 中都失败了。也许这是一个操作系统错误?

Lubuntu 机器(cat /proc/version):

圆周率:

再次编辑:-

在另一台机器上用我用来安装的相同 USB 密钥进行了测试。/proc/version 略有不同:

工作正常。我很混乱。

0 投票
0 回答
857 浏览

docker - 以具有功能的非 root 用户身份在 docker 容器中运行应用程序

我尝试在使用非 root 用户的 docker 容器内运行一个简单的 python UDP echo-server 监听端口 507。Dockerfile 看起来像这样:

由于 507 是一个众所周知的端口,我还在发出 docker run 时添加了能力 NET_BIND_SERVICE 但我仍然收到错误:

在检查功能时,我可以看到使用非 root 用户时未设置有效功能。

有谁知道如何在具有非 root 用户和某些功能的 Docker 容器中运行程序?

0 投票
2 回答
819 浏览

linux - Linux 中的 init_user 命名空间是什么?

在浏览 Linux 内核代码时,我在kernel/capability.c.

1)


2)

init_user第一个函数中提到的命名空间是什么?

据我所知,一个进程要么有能力(让我们暂时不用担心进程的不同能力集),要么没有,那么如何才能说一个进程具有关于命名空间的能力?

如果您查看cap_get_target_pid(), 在同一个文件中的定义,它只是谈论使用给定 pid 获取进程的功能,而不用担心用户命名空间。这对我来说看起来更自然。

0 投票
1 回答
3305 浏览

ulimit - 如何使用 setuid 或能力 CAP_SYS_RESOURCE 以编程方式提高实时优先级的 ulimit 硬限制?

我想在linuxSCHED_FIFO实时类下运行一个程序。我更愿意将用户的硬限制RTPRIO设置为 0,并以编程方式提高单个进程的硬限制。广泛声称,如果我允许该过程CAP_SYS_RESOURCE允许它提高硬限制,例如man setrlimit 2

软限制是内核对相应资源强制执行的值。硬限制充当软限制的上限:非特权进程只能将其软限制设置为从 0 到硬限制的范围内的值,并且(不可逆地)降低其硬限制。特权进程(在 Linux 下:具有 CAP_SYS_RESOURCE 能力的进程)可以对任一限制值进行任意更改。

但是,我似乎无法让它为我工作。这是测试代码:

这在没有特殊权限的情况下按预期工作,硬限制为 99:

它使用 sudo 以 0 的硬限制按预期工作:

但是,当 setuid root 时,它不能按预期工作:

它也意外失败,功能 CAP_SYS_RESOURCE 以及所有功能:

我在这里想念什么?

0 投票
2 回答
504 浏览

docker - 特权 docker 容器不能丢弃功能?

我正在运行这个

它应该作为 init 运行 systemd 并从中删除 SYS_BOOT 功能。这是彻底关闭容器所必需的。当如上运行时,它确实以 pid 1 运行 systemd init,但该功能不会被删除:

当 SYS_BOOT 功能被删除时,它应该如下所示:

任何想法为什么这不起作用?码头工人版本:

客户端:
版本:1.12.3
API 版本:1.24
Go 版本:go1.6.3
Git 提交:34a2ead
内置:
OS/Arch:linux/amd64

服务器:
版本:1.12.3
API 版本:1.24
Go 版本:go1.6.3
Git 提交:34a2ead
内置:
OS/Arch:linux/amd64

0 投票
1 回答
1326 浏览

linux - 读取 /proc//fd/没有完全根访问权限

我有一个程序(https://github.com/raboof/connbeat),它依赖于/proc/[pid]/fd/*查找给定(网络)inode 的进程。

/proc/[pid]/fd只能由root读取,但为了安全起见,我想尽可能地放弃特权。

有没有什么方法可以(有效地)获得进程和 inode 之间的关系,而不需要完全的 root 权限?也许一些系统调用可以让我有选择地访问使用功能?

0 投票
0 回答
169 浏览

python - 为 Anaconda 的 python 可执行文件设置功能

我最近切换到 Anaconda,但遇到了问题。我的 python 代码使用一个 C++ 共享库,它从接口接收原始帧。为此,通常需要 root 权限。为了不让每次执行都使用 sudo,我一般都会给 python 解释器cap_net_rawcap_ipc_lock能力(这是一个学术设置,所以没有理由担心安全性,至少现在是这样)。通常这适用于默认的 python 安装(我使用的是 Ubuntu 14.04.4),但是当我尝试对 Anaconda 的 python 可执行文件(4.3.0,Python 3.6)执行相同操作时,我收到以下错误:

python:加载共享库时出错:libpython3.6m.so.1.0:无法打开共享对象文件:没有这样的文件或目录

该库位于应有的位置,并且ldd在 python 可执行文件上显示它指向它。添加它的路径LD_LIBRARY_PATH不会做任何事情。删除功能然后恢复此问题。

我尝试了一个干净的 Python 3.6 系统安装,并且没有任何问题。

将不胜感激任何输入,谢谢。

0 投票
1 回答
1584 浏览

c - msgsnd 没有权限错误

我想在两个进程之间发送消息。但是EACCES当我尝试发送消息时出现错误msgsnd()

创建消息队列

消息结构

发送消息

在 msgsnd 的手册页中写着

EACCES调用进程没有消息队列的读权限,也没有CAP_IPC_OWNER能力。

所以我用setcap命令添加了以下功能

我已经检查getcap了应用程序是否具有这些功能。没关系。但我仍然收到无权限错误。

当以root权限执行应用程序时,它的工作!

有一件事很奇怪,尽管 msgget 成功了,但ipcs没有显示任何消息队列。

那么我的错在哪里?

我正在使用 Linux Mint

附加问题:是否可以在 msg 结构中使用另一种数据类型然后是 char 或者消息是否仅限于字符串?

0 投票
2 回答
607 浏览

linux - 允许容器监听 80 端口的副作用

为了简化 Docker 容器之间的服务端口管理,我希望允许包含的 HTTP 服务侦听其各自容器 IP 地址的 HTTP 的默认 TCP 端口 80。

收听低于 1025 的端口号通常仅限于具有特殊权限的用户,例如root. 这样做的原因,据我了解,是为了禁止多用户系统上的非特权用户充当整机的权威HTTP服务。

在较新的 Linux 版本中,还可以通过应用 Linux 内核功能允许对特定的可执行文件执行此操作CAP_NET_BIND_SERVICE。为了在 Docker 容器中工作,我似乎还需要通过--add-capDocker 客户端上的标志或 Docker-Composecap_add部分将此功能应用于 Docker 容器本身。

从理论上讲,这种端口号限制的原因在这种情况下已经过时了,因为 Linux 内核的网络命名空间允许容器内的进程只绑定它们自己专有的 IP 地址。

我现在的问题是,是否有任何关于这样做的严重警告。这是否或可能以任何方式成为我未考虑的安全问题?或者这样做还有其他问题吗?