利用notebook解决普通用户调用docker时的潜在权限提升问题
关于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
,如Jupyter
、CodeServer
和Rstudio
。
平台还支持容器服务,可以导入Docker镜像。
在进入notebook
之后,可以发现只能访问自己的家目录,并不能访问超算上其他用户的目录。
策略猜想
结合上述表现,我对该平台的运行模式有了一个猜想:Docker本身运行在一个账户下,比如就叫docker
,同时其他用户都没有访问docker命令
的权限。在docker用户
名下运行一个web服务器,每当普通用户需要创建docker容器,就像web服务器发送请求。docker用户
在收到请求后,创建一个用户所需的容器,并仅将请求用户的家目录映射到容器内。同时,docker用户
在容器内创建一个与请求用户同名的账户,并在容器内通过su
命令登录为该用户,再调用notebook server
。如此一来,普通用户通过notebook server
,在网页端仍仅能拥有自己的用户权限,且无法访问自己家目录之外的文件,通过由docker用户
把控docker容器的创建,最大限度保障了安全性。