[บันทึกกันลืม] วิธีป้องกันไม่ให้ผู้ใช้ดาวน์โหลดสิ่งใด ๆ ออกไปจาก Jupyter Notebook/Lab ได้

ปัญหา

การใช้ Jupyter Notebook/Lab (aka. Jupyter) นั้นมีข้อดีคือ เราสามารถจำกัดการเข้าถึงข้อมูลที่ละเอียดอ่อนได้ อย่างเช่นเราสามารถตั้งค่าการ access ของ database user ได้จาก private ip ของ Jupyter ได้ แต่ก็ยังมีช่องโหว่คือ ผู้ใช้สามารถ Export file แล้ว download ออกไปได้

** Caution: บันทึกนี้ไม่สามารถป้องการการ scp และ API call เพื่อ upload ไปยัง Google Drive, Owncloud ได้ **

ในที่นี้ ใช้ Jupyter ผ่าน Docker/Kubernetes

แนวทางการแก้ไข

Credit:

เปิด Terminal แล้วพิมพ์คำสั่งต่อไปนี้ เพื่อปิด เมนู

# disable downloads from File > Download
jupyter labextension disable @jupyterlab/docmanager-extension:download
# disable downloads from the context menu in the file browser
jupyter labextension disable @jupyterlab/filebrowser-extension:download

แต่ก็ยังมีทางให้เรียกผ่าน URL ได้อยู่ดี จึงต้อง disable การเรียกผ่าน HTTP protocol ได้ จึงต้องปิดด้วยการปิดการเรียก File handler อีกชั้น โดยประกอบด้วย 2 ขั้นตอน

1. การแก้ไขไฟล์ $HOME/.jupyter/jupyter_notebook_config.py

import os, sys
sys.path.append('$HOME/.jupyter/')
c.ContentsManager.files_handler_class = 'handlers.ForbidFilesHandler'
c.ContentsManager.files_handler_params = {}

2. สร้างไฟล์ $HOME/.jupyter/handlers.py

# Creating ForbidFilesHandler class, overriding the default files_handler_class
cat <<END >$HOME/.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

จากนั้น restart jupyter container

ผลคือ

หวังว่าจะเป็นประโยชน์ครับ