亚马逊AWS官方博客

如何禁用 Amazon SageMaker Notebook 的下载功能

Amazon SageMaker Notebook 是一个托管的机器学习的计算实例,上面运行着 Jupyter Notebook 应用程序。用户可以通过 Jupyter Notebook 运行 Python 代码来进行机器学习的模型的开发和训练。Jupyter Notebook 允许用户下载原始 .ipynb 文件,甚至提供了一个下载按钮。企业客户出于安全和合规的考虑,希望数据科学家/模型工程师仅从 SageMaker Notebook 实例访问用于机器学习训练的数据,并且希望限制他们将数据下载到本地计算机。

本文将演示如何在 Amazon SageMaker Notebook 上禁止用户下载原始文件。

原理

Jupyter Notebook 的下载功能是由 c.ContentsManager.files_handler_class 实现的,我们只需要对这个函数进行修改,就可以实现禁止下载的功能。由于 SageMaker Notebook 不会对/home/ec2-user/SageMaker 目录以外的任何变更持久化,所以我们需要通过生命周期配置,在每次 SageMaker Notebook 实例启动的时候进行变更。

操作

1. 在 SageMaker 的控制面板上选择 Lifecycle Configuration,然后选择 Notebook Instance,并点击 Create configuration 来创建一个新的生命周期配置。

2. 将以下内容填到 Start notebook 的脚本中,并点击创建。

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

3. 在创建新的 notebook 实例或者修改现有 notebook 的实例时候,点击 Additional configuration,选择第 2 步创建的 disable-download 生命周期配置。这样上面的脚本就会在每次 SageMaker Notebook 启动的时候对 Jupyter Notebook 的配置进行变更。

测试

打开 Jupyter Lab 尝试下载原文件,应该会返回 File wasn’t available 的错误:

权限管理

如果数据科学家/模型工程师知道管理员是通过修改 Jupyter Notebook 的配置文件来禁止下载功能的,那么就可以通过修改配置文件的方式将下载功能恢复。所以在第二部使用的脚本的最后部分,修改了 Jupyter Notebook 的配置文件的访问权限,并且移除了 ec2-user 的无密码 sudo 权限。这样用户就无法更改 Jupyter Notebook 的配置文件。

局限性

由于数据科学家/模型工程师没有 root 的权限,无法自行安全第三方的插件或者库。需要管理员用同样的方式,通过生命周期的脚本将所需要的插件和库安装到 SageMaker Notebook 实例上。

本篇作者

谭继聪

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,并专注于数据库和数据分析技术方向。