进程创建时命名空间处理

 

/*  * called from clone.  This now handles copy for nsproxy and all  * namespaces therein.  */ int copy_namespaces(unsigned long flags, struct task_struct *tsk) {  struct nsproxy *old_ns = tsk->nsproxy;  struct user_namespace *user_ns = task_cred_xxx(tsk, user_ns);  struct nsproxy *new_ns;

 if (likely(!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC |          CLONE_NEWPID | CLONE_NEWNET |          CLONE_NEWCGROUP)))) {   get_nsproxy(old_ns);   return 0;  }

 if (!ns_capable(user_ns, CAP_SYS_ADMIN))   return -EPERM;

 /*   * CLONE_NEWIPC must detach from the undolist: after switching   * to a new ipc namespace, the semaphore arrays from the old   * namespace are unreachable.  In clone parlance, CLONE_SYSVSEM   * means share undolist with parent, so we must forbid using   * it along with CLONE_NEWIPC.   */  if ((flags & (CLONE_NEWIPC | CLONE_SYSVSEM)) ==   (CLONE_NEWIPC | CLONE_SYSVSEM))   return -EINVAL;

 new_ns = create_new_namespaces(flags, tsk, user_ns, tsk->fs);  if (IS_ERR(new_ns))   return  PTR_ERR(new_ns);

 tsk->nsproxy = new_ns;  return 0; }

 
### 创建用户命名空间 在Linux中,可以通过`unshare`命令来创建新的命名空间实例。对于用户命名空间而言,这允许进程拥有一个新的UID和GID映射表,在该命名空间内可以定义自己的用户和组而不会影响全局系统设置[^1]。 具体来说,为了启用并进入一个独立的用户命名空间,可执行如下操作: #### 使用 `unshare` 命令创建用户命名空间 ```bash sudo unshare --fork --pid --mount-proc -U /bin/bash ``` 这条指令做了几件事情: - `-U`: 请求创建一个新的用户命名空间; - `/bin/bash`: 指定启动新shell作为子进程中的一部分; 需要注意的是,默认情况下普通用户无法创建用户命名空间,除非已经在内核配置中启用了相应支持,并调整了一些安全策略参数。例如,在某些发行版上可能需要修改sysctl中的`kernel.unprivileged_userns_clone`选项使其值为1以便让非特权用户也能创建用户命名空间[^2]。 #### 修改 sysctl 参数以允许非root用户创建用户命名空间 如果希望使能非管理员账户创建用户命名空间的能力,则需运行下面这段脚本来更改相应的内核行为: ```bash echo 1 | sudo tee /proc/sys/kernel/unprivileged_userns_clone ``` 上述命令会临改变当前系统的设定直到下次重启为止。若要永久生效,应当编辑/etc/sysctl.conf文件加入一行`kernel.unprivileged_userns_clone=1`再通过`sysctl -p`加载配置。 #### 验证是否成功进入了新的用户命名空间 一旦处于新的用户命名空间环境中,可通过查看特定文件的内容来进行验证: ```bash cat /proc/self/uid_map ``` 此命令显示了当前进程在其所属用户命名空间内的UID映射情况。如果看到类似“0 1000 65536”的输出,意味着已经正确设置了从宿主机视角看属于不同用户的权限转换机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值