标签: linux-namespaces

在非特权命名空间沙箱中挂载proc

我正在尝试使用Linux命名空间创建沙盒环境.我在https://github.com/swetland/mkbox上找到了一个很好的例子,大致可以做我想要的,但我希望在沙盒中出现一个可靠的/ proc.我怎样才能做到这一点?

我尝试将proc FS挂载到"proc"上,但是在EINVAL中失败了.当我尝试正常安装"proc"时,它会产生EPERM.

想法?

linux sandbox linux-namespaces

5
推荐指数
1
解决办法
1029
查看次数

`task_struct`和`pid_namespace`之间有什么关系?

我正在研究一些内核代码并试图理解数据结构是如何链接在一起的.我知道调度程序如何工作的基本思路,以及PID是什么.但我不知道命名空间在这个上下文中是什么,并且无法弄清楚所有这些是如何协同工作的.

我已经阅读了一些解释(包括O'Reilly"理解Linux内核"的部分内容)并理解可能是同一个PID到达两个进程,因为一个已终止并且ID被重新分配.但我无法弄清楚这一切是如何完成的.

所以:

  1. 这个上下文中的命名空间是什么?
  2. task_struct和之间有什么关系pid_namespace?(我已经认为它与它有关pid_t,但不知道如何)

一些参考:

scheduler scheduled-tasks linux-kernel linux-namespaces

5
推荐指数
1
解决办法
2661
查看次数

网络命名空间和桥接

大家好,我是偶尔的 linux 用户,但我有一个项目要做,我需要一些桥接方面的帮助:)
我尝试过使用 google,但没有解决问题。

我的任务是创建网络命名空间,因此它可以用来执行其他一些任务。

Debian 8.2 在 Windows 7 上的 VMWare 虚拟机中使用。我也在 Raspberry Pi 2 上尝试过同样的事情,但出现了同样的问题。

首先,我按照教程https://lwn.net/Articles/580893/创建了一对虚拟以太网接口。所以现在我在全局命名空间中有 veth0,ip 地址为 10.1.1.2/24,在 netns1 命名空间中有 veth1,ip 地址为 10.1.1.1/24。

接下来,我按照教程http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge来桥接 eth0 和 veth0,这样我就可以从 netns1 命名空间访问互联网。

  • 首先,我删除了 eth0 和 veth0 接口的 IP 地址,并将它们设置为 DOWN 状态。

  • 新网桥被创建 (br0) 并且两个接口(eth0 和 veth0)都被添加到其中。

  • 然后两个接口都设置为UP状态,我运行“dhclient br0”将ip地址分配给br0。

从全局命名空间现在可以运行“ping google.com”,但是从 netns1 命名空间我得到错误“网络无法访问”。(我想路由有问题,我尝试向 netns1 命名空间添加一些默认路由,但没有运气。我的网络知识有限,所以我寻求帮助。)

$ ip地址显示

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host …
Run Code Online (Sandbox Code Playgroud)

linux networking ethernet bridge linux-namespaces

5
推荐指数
1
解决办法
5137
查看次数

在特定的用户命名空间配置中运行每个 Docker 容器

问题:

我试图以这样的方式将目录挂载为 Docker 卷,以便在容器内创建的用户可以写入该卷中的文件。同时,该文件至少应该对我的用户lape在容器外可读。

本质上,我需要将容器用户命名空间中的用户 UID 重新映射到主机用户命名空间上的特定 UID。

我怎样才能做到这一点?

我更喜欢以下答案:

  • 不涉及改变 Docker 守护进程的运行方式;
  • 并允许为每个容器分别配置容器用户命名空间;
  • 不需要重建镜像;
  • 我也会接受使用访问控制列表显示一个很好的解决方案的答案;

设置:

这就是可以复制这种情况的方式。

我有我的 Linux 用户lape,分配到docker组,所以我可以运行 Docker 容器,而无需成为 root。

lape@localhost ~ $ id
uid=1000(lape) gid=1000(lape) groups=1000(lape),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),121(lpadmin),131(sambashare),999(docker)
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM alpine
RUN apk add --update su-exec && rm -rf /var/cache/apk/*

# I create a user inside the image which i want to be mapped to my `lape`
RUN adduser -D -u 800 -g 801 insider
VOLUME /data

COPY ./entrypoint.sh …
Run Code Online (Sandbox Code Playgroud)

linux file-permissions docker linux-namespaces

5
推荐指数
1
解决办法
1593
查看次数

取消共享启用环回的网络

要对程序的开发版本运行测试,我需要将其与网络隔离。不过,构建仍然需要访问loopback(127.0.0.1)。

我尝试使用unshare -c -n <program>但环回接口默认情况下处于关闭状态。usingunshare -r -n bash允许我通过 using 启用接口,但随后ip link set lo up需要在该shell 中手动调用该程序。 bash

我尝试创建一个持久的网络命名空间(ip netns add vnet1),但这只适用于sudo我需要避免的情况。

因此可以使用lodown 创建一个非共享的网络命名空间,而不使用 sudo.

我需要lo在启动构建之前启动界面。理想情况下,我会将设置集成到 bash 脚本中,而不使用权限升级。我读到 Fedora 默认提供了一个启用的环回接口,所以我可以用sysctl等等来调整这个行为吗?(我在 archlinux 上)

linux-namespaces unshare

5
推荐指数
0
解决办法
279
查看次数

使用 CLONE_NEWNS 标志克隆后挂载文件系统

我正在尝试实现以下场景:

  1. clone()CLONE_NEWNS标志的主进程(这意味着新的挂载命名空间)
  2. mount() 子进程中的新文件系统
  3. 子进程完成并且所有在这个进程文件系统中创建的都被卸载

但它并没有像我预期的那样工作,我仍然在主进程中看到挂载的文件系统。我究竟做错了什么?

来源在这里https://github.com/dmitrievanthony/sprat/blob/master/src/container.c#L47

系统默认为 AWS Ubuntu,

ubuntu@ip-172-31-31-112:~/sprat$ uname -a
Linux ip-172-31-31-112 4.4.0-53-generic #74-Ubuntu SMP Fri Dec 2 15:59:10 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

c linux containers mount linux-namespaces

3
推荐指数
1
解决办法
972
查看次数

取消共享用户名称空间,并使用newuidmap设置uid映射

我正在尝试通过使用unshareand newuidmap命令来更好地理解用户名称空间。

这些是我运行的命令:

[root@host ~]$ ls -l /usr/bin/newuidmap
-rwsr-xr-x 1 root root 32944 May 16 19:37 /usr/bin/newuidmap
[root@host ~]$  unshare -U bash namespace
[nobody@host ~]$ echo $$
7134
[nobody@host ~]$ newuidmap 7134 65534 5000 1
newuidmap: write to uid_map failed: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

/ etc / subuid:

nobody:5000:1
root:5000:1
Run Code Online (Sandbox Code Playgroud)

知道为什么这失败了吗?

然后,我尝试newuidmap在父命名空间的同一PID上运行命令,它似乎可以正常工作:

[root@host ~]$ newuidmap 7134 65534 5000 1
[root@host ~]$ cat /proc/7134/uid_map 
 65534       5000          1
Run Code Online (Sandbox Code Playgroud)

但是,当我从新名称空间中运行进程时,它似乎仍以root身份而不是UID 5000身份运行:

[nobody@host ~]$ exec sleep 20
Run Code Online (Sandbox Code Playgroud)

从另一个shell:

[root@host ~]$ …
Run Code Online (Sandbox Code Playgroud)

linux linux-namespaces

3
推荐指数
1
解决办法
2261
查看次数

Kubernetes 命名空间和 Linux 命名空间的区别?

Kubernetes 命名空间究竟是什么,它与 linux 命名空间(mnt、pid、net、ipc、uts、user、cgroup)有何不同?

kubernetes linux-namespaces kubernetes-namespace

3
推荐指数
1
解决办法
556
查看次数

如何为命名空间添加名称?

据我所知,我可以使用"clone"来创建进程和命名空间,但以这种方式创建的命名空间没有名称.例如,我使用参数:CLONE_NEWNS创建网络命名空间,但在命令"ip netns list"中,没有命名空间列表,因为创建的命名空间没有名称.但我可以使用命令"ip netns add xxx"来创建名为"xxx"的命名空间.

我想知道如何使用系统调用"clone"创建名称命名空间.

linux ip networking linux-namespaces

2
推荐指数
1
解决办法
547
查看次数

无法打开 uid_map 以从具有 cap_setuid 功能集的应用程序进行写入

在玩弄user_namespaces(7)的示例时,我遇到了一种奇怪的行为。

该应用程序的作用

应用程序user-ns-ex使用 CLONE_NEWUSER 调用clone(2),从而在新的用户命名空间中创建一个新进程。父进程将映射 ( 0 1000 1) 写入 /proc//uid_map 文件并告诉(通过管道)子进程可以继续。然后子进程执行bash

我在这里复制了源代码。

问题

如果我不设置任何功能或设置所有功能,应用程序将打开 /proc//uid_map 进行写入。

当我仅设置 set_capuid、set_capgid 和可选的 cap_sys_admin 时,对 open(2) 的调用失败:

设置上限:

arksnote linux-namespaces   # setcap 'cap_setuid,cap_setgid,cap_sys_admin=epi' ./user-ns-ex
arksnote linux-namespaces   # getcap ./user-ns-ex
./user-ns-ex = cap_setgid,cap_setuid,cap_sys_admin+eip
Run Code Online (Sandbox Code Playgroud)

尝试运行:

kamyshev@arksnote ~/workspace/personal/linux-kernel/linux-namespaces  $ ./user-ns-ex -v -U -M '0 1000 1' bash
./user-ns-ex: PID of child created by clone() is 19666
ERROR: open /proc/19666/uid_map: Permission denied
About to exec bash
Run Code Online (Sandbox Code Playgroud)

现在来看一个成功的案例:

无能力:

arksnote …
Run Code Online (Sandbox Code Playgroud)

linux procfs linux-capabilities linux-namespaces

2
推荐指数
1
解决办法
2102
查看次数

unshare 命令不会创建新的 PID 命名空间

我正在学习 linux 核心,现在正在讨论命名空间主题。我尝试使用“unshare”命令只是为了掌握命名空间及其要点。问题是它没有,或者更有可能的是,我做错了什么。如果您能帮助我理解,我将不胜感激。我尝试在它自己的 PID 命名空间内执行 busybox sh 程序。我就是做这个的:

[ab@a ~]$ sudo unshare --pid  busybox sh
/home/ab # ps
PID TTY          TIME CMD
6014 pts/1    00:00:00 sudo
6016 pts/1    00:00:00 busybox
6026 pts/1    00:00:00 ps
Run Code Online (Sandbox Code Playgroud)

正如我从 ps 命令的输出中看到的那样,所有进程在新环境中都是可见的。当我检查新创建的进程和当前进程的 pid 命名空间 id 时,这一点得到了确认。见下文

[ab@a ~]$ ps -p 6016,$$
PID TTY          TIME CMD
4604 pts/0    00:00:00 bash
6016 pts/1    00:00:00 busybox
[ab@a ~]$ sudo ls -l /proc/4604/ns
total 0
lrwxrwxrwx. 1 ab ab 0 Aug  8 23:49 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 ab …
Run Code Online (Sandbox Code Playgroud)

namespaces linux-namespaces

2
推荐指数
1
解决办法
1791
查看次数

在网络命名空间中运行多个命令

我想在一个步骤中在网络命名空间中运行一系列连接的bash命令,但似乎ip netns exec mynetns只需要一个bash命令作为参数.例如:

ip netns exec mynetns ip a
Run Code Online (Sandbox Code Playgroud)

......按预期工作.

ip netns exec mynetns "ip a ; ip a"
Run Code Online (Sandbox Code Playgroud)

...回报exec of "ip a" failed: No such file or directory.

显然,

ip netns exec mynetns ip a ; ip a
Run Code Online (Sandbox Code Playgroud)

...将返回网络命名空间和主机上的接口.

有没有办法让它发挥作用?

手册只谈论一个命令,这是不是一个非常好的迹象...

linux ip bash namespaces linux-namespaces

1
推荐指数
1
解决办法
2417
查看次数

eBPF:在 Linux 命名空间中运行

所以BPF程序是内核实体,因为它们在内核空间中运行。另一方面,Linux 命名空间又名容器,提供应用程序级别的隔离,在这种情况下,它们都共享主机的内核、内核模块等。

所以我想bpf每个容器加载一个程序是没有意义的,因为它也会在主机上可见?

因此,我猜测bpf程序会加载到主机和监视器/损坏/等上。进出命名空间的数据包。鉴于struct sock有关于命名空间 id 的信息,我认为只有某些类型的bpf程序才能做到这一点?

bpf linux-namespaces ebpf

1
推荐指数
1
解决办法
818
查看次数