User Namespace
基本信息
用户命名空间是Linux内核的一个功能,提供用户和组ID映射的隔离,允许每个用户命名空间拥有自己的用户和组ID集合。这种隔离使得在不同用户命名空间中运行的进程可以拥有不同的特权和所有权,即使它们在数字上共享相同的用户和组ID。
用户命名空间在容器化中特别有用,每个容器应该有自己独立的用户和组ID集合,从而在容器和主机系统之间实现更好的安全性和隔离。
工作原理:
创建新用户命名空间时,它从一个空的用户和组ID映射集开始。这意味着在新用户命名空间中运行的任何进程最初在命名空间外部没有特权。
可以在新命名空间和父(或主机)命名空间之间建立ID映射。这允许新命名空间中的进程具有与父命名空间中的用户和组ID相对应的特权和所有权。但是,ID映射可以限制为特定范围和ID子集,从而对在新命名空间中的进程授予的特权进行精细控制。
在用户命名空间内,进程可以拥有完整的根特权(UID 0)用于命名空间内的操作,同时在命名空间外部具有有限特权。这允许容器在其自己的命名空间中以类似根用户的能力运行,而不会在主机系统上具有完整的根特权。
进程可以使用
setns()系统调用在命名空间之间移动,或者使用带有CLONE_NEWUSER标志的unshare()或clone()系统调用创建新命名空间。当进程移动到新命名空间或创建一个时,它将开始使用与该命名空间关联的用户和组ID映射。
实验:
创建不同的命名空间
命令行界面
通过使用参数--mount-proc挂载/proc文件系统的新实例,确保新的挂载命名空间具有准确且独立的进程信息视图,特定于该命名空间。
Docker
要使用用户命名空间,Docker 守护程序需要使用 --userns-remap=default 启动(在 Ubuntu 14.04 中,可以通过修改 /etc/default/docker 然后执行 sudo service docker restart 来完成)
检查您的进程位于哪个命名空间
可以使用以下命令检查 Docker 容器中的用户映射:
或者从主机执行:
查找所有用户命名空间
进入用户命名空间
另外,只有作为root用户才能进入另一个进程命名空间。而且,没有指向它的描述符(比如/proc/self/ns/user),你无法进入其他命名空间。
创建新的用户命名空间(带映射)
恢复权限
在用户命名空间的情况下,当创建一个新的用户命名空间时,进入该命名空间的进程将在该命名空间内被授予完整的权限集。这些权限允许进程执行特权操作,如挂载文件系统、创建设备或更改文件所有权,但仅限于其用户命名空间的上下文。
例如,当您在用户命名空间中拥有CAP_SYS_ADMIN权限时,您可以执行通常需要此权限的操作,比如挂载文件系统,但仅限于您的用户命名空间的上下文。您使用此权限执行的任何操作都不会影响主机系统或其他命名空间。
因此,即使在新的用户命名空间中获得一个新进程将使您恢复所有权限(CapEff: 000001ffffffffff),实际上您只能使用与命名空间相关的权限(例如挂载),而不是所有权限。因此,仅凭这一点是不足以逃离 Docker 容器的。
```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash
Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error
最后更新于