Linux Namespace 介绍(User Namespace)

954人浏览   2024-04-04 16:59:05

User Namespace主要是隔离用户的用户组ID。也就是说每一个进程的User ID和Group ID在User Namespace内外可以是不同的。比较常用的是,在宿主机上以一个非root用户运行创建一个User Namesapce,然后在User Namespace里面却映射成root用户。这意味着,这个进程在User Namespace里面有root权限,但是在User Namesapce外面却没有root的权限。从Linux Kernel 3.8开始,非root进程也可以创建User Namespace,并且用户在Namespace里面可以被映射成root,且在Namespace内有root权限。

下面,继续以一个例子来描述,代码如下:

package main

import (
	"log"
	"os"
	"os/exec"
	"syscall"
)

func main() {
	cmd := exec.Command("sh")
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER,
	}
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		log.Fatal(err)
	}
  os.Exit(-1)
}

本例在原来的基础上增加了syscall.CLONE_NEWUSER。首先,以root来运行这个程序,运行前在宿主机上来看一下当前的用户和用户组,显示如下:

可以看到我们是root用户,接下来运行一下程序。

可以看到,它们的UID是不同的,因此说明User Namespace生效了。

相关推荐