龙空技术网

Linux Namespace 介绍(User Namespace)

坑害小朋友的少年 135

前言:

眼前小伙伴们对“phpusenamespace”大体比较注意,我们都想要学习一些“phpusenamespace”的相关内容。那么小编在网络上收集了一些对于“phpusenamespace””的相关内容,希望各位老铁们能喜欢,看官们快快来了解一下吧!

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 mainimport (	"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生效了。

标签: #phpusenamespace