Linux Namespace 介绍(User Namespace)
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生效了。
相关推荐
-
PHP8种变量类型的详细讲解2025-02-22 00:32:24
-
php+apache 和 php+nginx的区别2025-02-22 00:21:27
-
PHP:与workerman结合实现定时任务2025-02-22 00:15:57
-
Nginx的Rewrite规则与实例2025-02-22 00:15:39
-
MySql中身份证字段的简单脱敏介绍2025-02-22 00:15:36