最近准备调研下 Jupyter Notebook 的 单用户安全机制(认证) 以及如何实现 多租户,以便集成到公司的云平台,进而作为基于大数据平台的机器学习平台的一部分。
1. 问题分析
数据分析以及算法团队的同学使用 Jupyter Notebook 进行数据分析和建模等工作,其工作流程如下所示:
- 业务部门以组为单位申请一台物理服务器
- 搭建 Python 环境,启动 Jupyter Notebook,每个同学创建自己的工程,进行代码开发
- 建模完成之后,各个同学配置离线调度,对预测数据进行离线预测
三个环节分别对应三个问题:
- 公司为节省资源,已经不允许各业务部门直接申请物理机
- Jupyter Notebook 默认配置无法做到代码的严格控制,任何人都可以进入、访问、修改其他人的源码
- 多个同学的代码同时运行,对资源的使用无法做到隔离。尤其是建模之后,对模型的离线调度,内存和CPU的互相抢占问题严重。某个同学的异常资源占用,往往会影响其他同学调度的正常运行
2. 环境版本
- Win10下VMWare 版本:VMware_workstation_10.0.4
- 虚拟机镜像版本:CentOS-7-x86_64-DVD-1708
- Anaconda 版本:Anaconda3-5.2.0-Linux-x86_64
- Jupyter Notebook 版本:4.4.0
备注:
- Windows10 下安装 VMWare,首次打开需要的注册码可以从网上搜索
- 虚拟机镜像下载地址:http://archive.kernel.org/centos-vault/7.4.1708/isos/x86_64/
- 使用 VMWare 安装虚拟机选择支持图形界面(便于设置代理,以便 Anaconda 使用国外源)
3. Token 认证机制
所谓 Token 指管理员同学使用 " jupyter notebook " 在申请的服务器上启动 Jupyter Notebook 时(默认开启 Token 机制), 在服务器控制台打印出此次启动可以对外开放的字符串,每次重启 Token 自动变化
其他同学在首次访问时,需要向启动 Jupyter Notebook 的管理员同学询问 Token,进而进入 Jupyter Notebook。此时,Token 会自动存入浏览器的 Cookie 中,第二次可以直接访问 Jupyter Notebook 的 URL 进入(Cookie 中 Token 的有效期为一个月,除非点击 logout, 否则在有效期内不需要重新输入 Token)
备注:
- 配置文件名称为【jupyter_notebook_config.py】,如果找不到,请在控制台执行 【jupyter notebook --generate-config】,在控制台会提示先生成的文件所在路径。提示:如果已存在会提示是否覆盖,如果已对配置文件进行过修改,请选择 N
- 默认配置文件下, 在虚拟机的 root 用户无法正常启动 "jupyter notebook" 命令,需要修改为【c.NotebookApp.allow_root = True】
- 默认配置文件下,其他同学不能在各自本地浏览器进行访问,需要修改为【c.NotebookApp.ip = '*'】
4. 密码认证机制
同时,同组的管理员同学也可以设置 Password,进而当 Jupyter Notebook 重启后,同组的其他同学不需要每次都向管理员同学询问 Token,可以使用统一的 Password 即可直接访问 Jupyter Notebook。
备注:
- 密码文件名称为【jupyter_notebook_config.json】,里边会存放一个最新的密码(非明文)
- 要想让 Password 生效,需要事先修改配置文件 【jupyter_notebook_config.py】 的【c.JupyterApp.config_file_name = 'jupyter_notebook_config.json'】,用于指定配置文件位置
- Password 有两种生成方式,一种是在控制台下,输入 ipython进而使用代码生成密码;第二种是管理员同学在尚未向对外公告 Jupyter Notebook 的访问地址前,在 Jupyter Notebook 的首页通过输入 Token + Password 设置密码
5. 初步结论
所以,在当前的 Jupyter Notebook 版本下,总共需要修改三处配置:
- c.NotebookApp.allow_root = True
- c.NotebookApp.ip = '*'
- c.JupyterApp.config_file_name = 'jupyter_notebook_config.json'
使用 Jupyter Notebook,即使可以通过使用 Token 和 Password 两种认证方式,增加一定的安全性。但是无法做到多租户场景,并且无法做到资源隔离使用,需要探寻另外的可能。