JupyterHub - 安全性概览
本节用于了解:
- Jhub对web安全性的设计。
- 半信任用户
- 可用的缓解措施,保护不受信任的用户
- 定期安全审计的价值
半信任用户和非信任用户
Jhub首先是一个简单的多用户服务,为半信任成员组成的适度大小的组织服务。虽然是服务半信任用户,但不代表不适合为不受信任用户提供服务。使用Jhub服务非信任用户需要管理员做更多的工作。
Hub和SUNS是放在单个域名,代理之后的,如果Hub服务非信任用户,在SUNS与hub之间或SUNS之间的许多web跨域保护措施就无法使用。
保护用户
为了保护用户,用户不能在Hub中编写任意的HTML来提供给其他用户。Jhub的验证可防止用户编写任意HTML并将其提供给其他用户,因为只允许指定的SUNS所有者查看其服务用户的创作页面。
为了达到目的,管理员要保证如下:
- 用户不能拥有修改他们SUNS的权限,包括
- 用户不能在Python环境中安装新的包来运行他们的单用户服务。
- 如果PATH用于解决单用户执行,那么用户不能在任意PATH路径下创建新的文件。
- 不能修改环境变量。
- 不能修改笔记本服务的配置
如果在与Hub相同的域上运行任何其他服务,那服务永远不会向没有作者身份的用户显示。
缓解安全问题
配置选项中有几个途径来缓解安全问题
激活子域
Jhub提供运行单用户服务在其自己的子域的能力。这意味着服务之间的跨域保护有预期的效果,并且用户服务与Hub间能相互保护。
用户的的单用户服务域名为username.jupyter.mydomain.com,这要求所有的用户子域都指向同一个地址,通过通配符DNS是最容易实现的。当服务扩散到多个域时,需要通配符SSL。然而,许多机构的域,通配符DNS和SSL是不支持的。若要计划服务于非信任用户,强烈推荐使用子域来解决跨站点问题。
禁用用户配置
若子域无法使用或不满足期望,Jhub提供了配置项Spawner.disable_user_config,能预防用户持有的配置文件被加载。实现了该选项后,PATH和包安装以及PATH是管理员必须执行的操作。
防止生成器评估shell配置文件
对于大部分的生成器,PATH是用户无法影响到的,但应该保持关注来确保生成器在启动服务器之前不会评估shell配置文件。
隔离包使用虚拟环境
处理包的隔离,最轻松的方式是通过禁用system-site-packages并在虚拟环境中运行单用户服务。用户无权在此环境中安装包。
需要注意的是,该环境仅影响单用户服务,不会影响到用户核心的运行环境。在内核环境中安装附加包不会给web应用的安全性带来额外风险。
通过SSL/TLS进行内部连接加密
默认情况下,所有的服务通信,包括代理,hub,单用户笔记本都表现的是解密状态。在jupyterhub_config.py中设置internal_ssl标记能确保上述路径。要启动这个特性需要启动的生成器可以使用Hub生成的证书。
需要注意的是,当前的加密并没有覆盖基于zmq/tcp的笔记本客户端和内核间的套接字。当用户无法向其他用户内核任意提交指令时,将KernelManager.transport设置为ipc可以降低这种窃听。浙江标准UNIX权限应用于通信套接字上,从而限制于套接字所有者的通信。internal_ssl选项最终将扩展到保护tcp套接字上。
安全审计
我们建议您定期检查部署的安全性。 将JupyterHub,configurable-http-proxy和nodejs版本保持最新是一种很好的做法。