Tinyworker的技术小站

学而不思则罔,思而不学则殆,温故而知新。
知不弃行,行不离思,慎思之,笃行之。

Follow me on GitHub

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版本保持最新是一种很好的做法。