User Namespace
- User Namespace主要是隔离用户的用户组id,也就是一个进程的User ID和Group ID在User Namespace内外是可以不同的,比较常用的是再宿主机以一个非root权限用户运行创建一个User Namespace,然后在User Namespace内却映射为root。这意味着这个进程在User Namespace里面有root权限,但是在User Namespace外面却没有,从linux kernel3.8开始,非root进程可以创建User Namespace,并且此用户在User Namespace里可以被映射为root,且在User Namespace内部有root权限。
package main
import(
"os/exec"
"syscall"
"os"
"log"
)
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.SysProcAttr.Credential=&syscall.Credential{Uid:uint32(1),Gid: uint32(1)}
cmd.Stdin=os.Stdin
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
if err:=cmd.Run();err!=nil{
log.Fatal(err)
}
os.Exit(-1)
}
- 运行程序,使用id查看uid发现是不同的说明,User Namespace生效了。