利用notebook解决普通用户调用docker时的潜在权限提升问题

发布时间 2023-11-09 09:43:42作者: esctrionsit

关于Docker

使用过Docker的朋友都知道,在Docker创建的Container中,用户可以具有root权限。在多人使用的运算平台上,一些用户使用的软件可能需要通过Docker解决一些环境依赖问题。Docker官方提供了给普通用户调用Docker的方法,即创建一个名叫docker的用户组,然后把普通用户添加进去。

普通用户权限提升风险

然而,通过这种方式,普通用户将能够在docker容器中拥有root权限,而且仅需在创建镜像时使用docker run -v参数即可将宿主机的目录映射到docker容器中,进而利用容器内的root权限编辑宿主机上任何原本无法编辑的文件

SothisAI平台的解决表现

docker提供了一个rootless模式,可以以非root账户运行docker的守护进程。然而,这个具有“歧义”的功能并不能解决前面提出的普通用户提权问题。如何解决这个问题困扰了我很久,直到我在学校的高性能运算平台上发现了SothisAI,一个由中科曙光提供的人工智能管理平台。在学校超算上,用户可以用ssh连接到登录节点,但没有docker的调用权限。作为替代,学校提供了SothisAI支持的网页平台,可以在网页平台上创建在线notebook,如JupyterCodeServerRstudio

平台还支持容器服务,可以导入Docker镜像。

在进入notebook之后,可以发现只能访问自己的家目录,并不能访问超算上其他用户的目录。

策略猜想

结合上述表现,我对该平台的运行模式有了一个猜想:Docker本身运行在一个账户下,比如就叫docker,同时其他用户都没有访问docker命令的权限。在docker用户名下运行一个web服务器,每当普通用户需要创建docker容器,就像web服务器发送请求。docker用户在收到请求后,创建一个用户所需的容器,并仅将请求用户的家目录映射到容器内。同时,docker用户在容器内创建一个与请求用户同名的账户,并在容器内通过su命令登录为该用户,再调用notebook server。如此一来,普通用户通过notebook server,在网页端仍仅能拥有自己的用户权限,且无法访问自己家目录之外的文件,通过由docker用户把控docker容器的创建,最大限度保障了安全性。