问题标签 [linux-namespaces]

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 投票
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 地址。

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

0 投票
0 回答
256 浏览

linux - 将 Docker cgroup 中的线程 id 转换为主机线程 id

假设我知道$CONTAINER_PARENT_PROCESSID及其对应的$HOST_PARENT_PROCESSID.

容器中的ps -T $CONTAINER_PARENT_PROCESSID线程 id 是 的输出的一部分,主机中的线程 id 是 的输出的一部分ps -T $HOST_PARENT_PROCESSID

0 投票
0 回答
716 浏览

python - 为python中的进程创建一个新的系统命名空间

如何更改subprocess.Popen在 Linux 环境中创建的进程的系统命名空间值?

需要在之后设置以下命名空间subprocess.Popen(sys.argv[1:])

  • 系统调用.CLONE_NEWUTS
  • 系统调用.CLONE_NEWPID
  • 系统调用.CLONE_NEWNS
0 投票
2 回答
4398 浏览

linux - unshare --pid /bin/bash - fork 不能分配内存

我正在尝试使用 linux 命名空间。特别是 pid 命名空间。

我以为我会用 bash 测试一些东西,但遇到了这个问题:

从那里运行 ls 给出了核心转储。退出是唯一可能的事情。

为什么这样做?

0 投票
1 回答
1164 浏览

docker - 使用用户命名空间共享 docker 套接字

使用用户命名空间时,是否可以使用从 docker 容器内的主机安装的 docker 套接字?

我有以下配置:

/etc/subuid

/etc/subgid

/etc/docker/daemon.json

我创建了 UID 为 100000 的用户 ns-user 和 GID 为 100000 的组 ns-user。另外,我已将 ns-user 添加到组 docker。当我在主机上以 ns-user 身份登录时,我可以通过套接字使用 docker。

问题是,当我运行安装了 docker 套接字的容器时,我的套接字权限被拒绝。docker容器内的套接字权限:

编辑1:

为了澄清,我认为容器内的 root(uid 0)映射到主机上的 ns-user(uid 100000),该主机有权访问 docker socket。但实际上我得到的许可被拒绝。为什么?

我不想使用 --userns=host 参数。

0 投票
1 回答
712 浏览

go - 容器和系统调用.CLONE_NEWNS

我在这个 repo https://github.com/lizrice/containers-from-scratch/blob/master/main.go上运行 golang 代码,我遇到了挂载命名空间的问题。代码应该做的是在自己的挂载命名空间中创建一个进程。因此,如果我运行代码sudo go run main.go run /bin/bash并在目录中创建一个文件mytemp,我应该能够从新启动的进程中看到该文件,但是如果我尝试查看该文件移动到主机上的 rootfs 目录,我应该由于挂载命名空间,无法看到该文件。不幸的是我仍然看到这个文件,所以我运行的进程似乎没有挂载命名空间。为了运行代码,我使用了这个https://github.com/ericchiang/containers-from-scratch/releases/download/v0.1.0/rootfs.tar.gz作为 rootfs 并将其移至/home/me. 然后我创建了一个mytemp目录用作 tmpfs 挂载目标。您对进程没有安装命名空间的原因有任何想法吗?

谢谢!

0 投票
0 回答
225 浏览

c - 更改命名空间以获取功能

我有调用需要 CAP_NET_ADMIN 功能的函数的代码。如果我构建代码并按原样运行二进制文件,则会收到“RTNETLINK 答案:不允许操作”错误。如果我 sudo 运行它,那么它运行时不会出现错误。我可以更改命名空间以使我的二进制文件具有适当的运行能力吗?如果是这样,怎么做?

0 投票
0 回答
165 浏览

c - 在 Ubuntu 上,实现容器隔离(用户命名空间),更多 /proc/[pid]/gid_map 并且没有输出

在学习docker的时候,章节中的代码: [user namespace] :
demo的意思是使用[user namespace]来实现:
容器外是普通用户权限,容器内是root权限。

在 docker book 上,eUID = 0 和 eGID = 0 ,但我的 eGID = 65534
更多 /proc/pid/gid_map 什么都没有,但更多 uid_map 是可以的

像这样 :

并显示:

当我在子外壳中输入命令时。

显示:0 1000 1

什么都不显示

关键 eUID 和 eGID 应该 = 0 ,但我的 eGID = 65534 。
我不知道为什么我的 eGID = 65534 ,而不是 = 0 ?

gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6 ubuntu1~16.04.4)

英语不是我的母语;请原谅打字错误。

0 投票
1 回答
961 浏览

linux - golang挂载命名空间:进程退出后挂载的卷没有被清除?

下面的代码,我想如果我用 syscall.CLONE_NEWNS 启动一个进程,那么当进程退出时,命名空间内的每个挂载选项都会被清除。

但不是吗?

运行这个并挂载一个目录,程序退出后这个目录仍然存在。

如果这是所需的行为,proc 是如何安装在容器实现中的?因为如果我在命名空间内挂载 proc,我会得到

proc 必须重新安装才能将其取回。

更新:在 C 中做同样的事情也会得到同样的结果,我认为这应该是一种预期的行为。

命令输出:

0 投票
0 回答
367 浏览

android - 控制对 Linux 命名空间 Unix 域套接字的访问的策略

Android SDK 通过 Unix Domain Sockets 为 IPC 提供 LocalSocket 对象,但使用 Linux 抽象命名空间。因此,任何进程都可以绑定到服务器套接字,而标准 Unix 套接字通常需要读/写权限才能访问套接字文件描述符。我可以看到由此产生的许多漏洞,并且想知道使用什么策略来防止来自非预期来源的访问以及通过套接字保护数据的方法。

请注意,该问题专门针对 LocalSockets。使用其他 Android IPC 机制可能会解决不必要的访问问题,但遗憾的是在我的情况下不是一个选项。但是,如果可以保护 LocalSocket,则可以通过此类机制传递某种形式的凭据。