**[Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) Notebook 是一个托管的[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)的计算实例,上面运行着 Jupyter Notebook 应用程序**。用户可以通过 Jupyter Notebook 运行 Python 代码来进行[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)的模型的开发和训练。Jupyter Notebook 允许用户下载原始 .ipynb 文件,甚至提供了一个下载按钮。企业客户出于安全和合规的考虑,希望数据科学家、模型工程师仅从 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) Notebook 实例访问用于[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)训练的数据,并且希望限制他们将数据下载到本地计算机。
![image.png](https://dev-media.amazoncloud.cn/1bb0e0801d6e4a0886efd641127f1b7d_image.png "image.png")
本文将演示**如何在 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) Notebook 上禁止用户下载原始文件**。
### **原理**
Jupyter Notebook 的下载功能是由 c.ContentsManager.files_handler_class 实现的,我们只需要对这个函数进行修改,就可以实现禁止下载的功能。由于 **[Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) Notebook 不会对 /home/ec2-user/SageMaker 目录以外的任何变更持久化,所以我们需要通过生命周期配置,在每次 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) Notebook 实例启动的时候进行变更。**
### **操作**
1、在 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) 的控制面板上选择 Lifecycle Configuration,然后选择 Notebook Instance,并点击 Create configuration 来创建一个新的生命周期配置。
![image.png](https://dev-media.amazoncloud.cn/b0e672ede7814cd7a012de95d77f7b72_image.png "image.png")
2、将以下内容填到 Start notebook 的脚本中,并点击创建。
```js
cat <<END >/home/ec2-user/.jupyter/handlers.py
from tornado import web
from notebook.base.handlers import IPythonHandler
class ForbidFilesHandler(IPythonHandler):
@web.authenticated
def head(self, path):
self.log.info("HEAD: File download forbidden.")
raise web.HTTPError(403)
@web.authenticated
def get(self, path, include_body=True):
self.log.info("GET: File download forbidden.")
raise web.HTTPError(403)
END
cat <<END >>/home/ec2-user/.jupyter/jupyter_notebook_config.py
import os, sys
sys.path.append('/home/ec2-user/.jupyter/')
import handlers
c.ContentsManager.files_handler_class = 'handlers.ForbidFilesHandler'
c.ContentsManager.files_handler_params = {}
END
#change the ownership of the config file and disable passwordless sudo of ec2-user
chown root /home/ec2-user/.jupyter/jupyter_notebook_config.py
chmod 444 /home/ec2-user/.jupyter/jupyter_notebook_config.py
sed --in-place '/ec2-user ALL=(ALL) NOPASSWD:ALL/d' /etc/sudoers.d/90-cloud-init-users
reboot
```
![image.png](https://dev-media.amazoncloud.cn/6846134abc08428aacbcbbfc9f82ae66_image.png "image.png")
3、在创建新的 notebook 实例或者修改现有 notebook 的实例时候,点击 Additional configuration,选择第 2 步创建的 disable-download 生命周期配置。这样上面的脚本就会在每次 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) Notebook 启动的时候对 Jupyter Notebook 的配置进行变更。
![image.png](https://dev-media.amazoncloud.cn/aee00da4df004b418984176cda6c3886_image.png "image.png")
### **测试**
打开 Jupyter Lab 尝试下载原文件,应该会返回 File wasn’t available 的错误:
![image.png](https://dev-media.amazoncloud.cn/ed43e77d62c74c8fbce567e3bd5f55ee_image.png "image.png")
### **权限管理**
如果数据科学家、模型工程师知道管理员是通过修改 Jupyter Notebook 的配置文件来禁止下载功能的,那么就可以**通过修改配置文件的方式将下载功能恢复**。所以在第二部使用的脚本的最后部分,修改了 Jupyter Notebook 的配置文件的访问权限,并且移除了 ec2-user 的无密码 sudo 权限。这样用户就无法更改 Jupyter Notebook 的配置文件。
### **局限性**
由于数据科学家、模型工程师没有 root 的权限,无法自行安全第三方的插件或者库。需要管理员用同样的方式,通过生命周期的脚本将所需要的插件和库安装到 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) Notebook 实例上。
![image.png](https://dev-media.amazoncloud.cn/02d842ae376248388481c64bff2ceea6_image.png "image.png")
![开发者尾巴.gif](https://dev-media.amazoncloud.cn/b2a9023a81054865b270232516fee059_%E5%BC%80%E5%8F%91%E8%80%85%E5%B0%BE%E5%B7%B4.gif "开发者尾巴.gif")