5.4.2 Notebook környezetek biztonságosan

2025.10.06.
AI Biztonság Blog

A Jupyter notebookok és társaik a gyors prototipizálás, adatfeltárás és modellképzés svájci bicskái. Kényelmük azonban egyenesen arányos a bennük rejlő biztonsági kockázatokkal. Egy meggondolatlanul kezelt notebook nem csupán sebezhető kódrészlet, hanem nyitott kapu is a rendszereidhez, amelyen keresztül érzékeny adatok szivároghatnak ki, vagy akár teljes irányítást vehetnek át a fejlesztői környezeted felett!

Kapcsolati űrlap

AI Biztonság kérdésed van? Itt elérsz minket:

A kettős élű fegyver: A notebookok biztonsági dilemmája

Mielőtt a védekezési stratégiákra térnénk, értsük meg, miért is jelentenek a notebookok egyedi kihívást. A probléma gyökere az interaktív, állapot-alapú (stateful) természetükben rejlik, ami több fronton is sebezhetőséget teremt.

  • Önkényes kódvégrehajtás: Egy notebook megnyitása és celláinak futtatása lényegében egy szkript futtatásával egyenértékű. Egy rosszindulatú, mástól kapott .ipynb fájl bármilyen parancsot végrehajthat a te felhasználói jogosultságaiddal.
  • Adatszivárgás a kimeneti cellákban: A leggyakoribb hiba. API kulcsok, adatbázis-jelszavak, személyes adatok (PII) vagy belső hálózati információk gyakran a kimeneti cellákban (output cells) landolnak egy-egy print() vagy egy DataFrame megjelenítés után. Ha ezt a notebookot verziókezelőbe küldöd vagy megosztod, az érzékeny adatot is vele adod.
  • Rejtett állapot (Hidden State): A cellák futtatási sorrendje számít. Egy korábban futtatott, majd törölt cella által definiált változók vagy importált modulok továbbra is a memóriában maradhatnak. Ez kiszámíthatatlan viselkedéshez és nehezen felderíthető biztonsági résekhez vezethet! 
  • Hálózati kitettség: A Jupyter szerver alapértelmezetten a localhost-ra kötődik, de gyakori, hogy a távoli elérés érdekében 0.0.0.0-ra állítják. Megfelelő authentikáció nélkül ez bárki számára elérhetővé teszi a szervert és a fájlrendszert.

Alapvető védekezési vonalak

A notebook környezetek biztonságossá tétele többrétegű megközelítést igényel. Kezdjük az alapoknál, amelyek minden Red Team operátor számára kötelezőek.

1. Izoláció: A homokozó elve

Soha ne futtass notebookot közvetlenül a gazda operációs rendszeren. 

Az izoláció a legelső és legfontosabb védelmi réteg. Használj konténereket vagy virtuális környezeteket, hogy elszigeteld a notebook folyamatát és annak függőségeit a rendszer többi részétől.

A Docker a legelterjedtebb eszköz erre. Egy minimalista Dockerfile-al létrehozhatsz egy dedikált, eldobható környezetet!

# Dockerfile egy egyszerű, izolált Jupyter környezethez

# Használj minimalista Python alapképet
FROM python:3.10-slim

# Állítsd be a munkakönyvtárat a konténeren belül
WORKDIR /app

# Másold át a függőségi listát
COPY requirements.txt .

# Telepítsd a szükséges csomagokat, beleértve a Jupytert
RUN pip install --no-cache-dir -r requirements.txt

# Tedd elérhetővé a notebook portját (de csak a gazdagépről!)
EXPOSE 8888

# Indítsd el a Jupyter Lab szervert jelszóval,
# és kösd a 0.0.0.0 címre, hogy a konténeren kívülről is elérhető legyen.
# A token/jelszó használata KRITIKUS!
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''"]

Ez a konténer egy teljesen elszigetelt „homokozót” biztosít. Ha a notebookban lévő kód kártékony is, a hatása a konténerre korlátozódik, amit egyszerűen leállíthatsz és törölhetsz.

2. Hozzáférés-szabályozás és hálózati beállítások

Ha már fut a Jupyter szerver, gondoskodnod kell róla, hogy csak te férj hozzá. Ahogy a fenti Docker példában is láttuk, a --ip=0.0.0.0 beállítás veszélyes lehet.

Figyelem: A Jupyter szerver jelszó vagy token nélküli futtatása publikus IP címen olyan, mintha a lakásod ajtaját tárva-nyitva hagynád egy táblával, amin az áll: „Ingyen számítógép-használat!”

Mindig használj erős jelszót vagy a generált tokent. A jelszó beállításához először generálj egy hash-t:

# Futtasd ezt a parancsot a terminálban
python -c "from notebook.auth import passwd; print(passwd())"
# Add meg a jelszavadat kétszer, a kimenet egy hash lesz, pl. 'argon2:...'

Ezután indítsd a szervert ezzel a hash-sel:

jupyter lab --NotebookApp.password='argon2:$argon2id$v=19$m=10240,t=10,p=8$...'

Ez biztosítja, hogy csak az férhessen hozzá a notebookjaidhoz, aki ismeri a jelszót.

3. A tartalom biztonsága: Mit futtatsz és mit mentesz?

Az izoláció és a hozzáférés-szabályozás a környezetet védi, de magával a notebook tartalmával is foglalkoznunk kell.

Megbízhatatlan notebookok kezelése

Amikor egy ismeretlen forrásból származó notebookot nyitsz meg, a Jupyter alapértelmezetten „nem megbízható” (untrusted) módban teszi ezt. Ez azt jelenti, hogy a JavaScript és HTML kimenetek nem renderelődnek automatikusan, megelőzve ezzel a cross-site scripting (XSS) támadásokat. Ezt soha ne bíráld felül meggondolatlanul.

Mielőtt bármit is futtatnál egy idegen notebookból, alaposan vizsgáld át a kódját. Ha kétségeid vannak, vagy csak az eredményekre vagy kíváncsi, a legjobb, ha törlöd az összes kimeneti cellát futtatás előtt. Erre az nbconvert kiváló eszköz:

# Ez a parancs helyben törli az összes kimenetet a notebookból
jupyter nbconvert --ClearOutputPreprocessor.enabled=true --inplace "gyanakus_notebook.ipynb"

Titkok és érzékeny adatok kezelése

Az aranyszabály: soha ne írj jelszavakat, API kulcsokat vagy más titkokat közvetlenül a notebook celláiba! 

Ezek kezelésére bevált gyakorlatok léteznek:

  • Környezeti változók (Environment Variables): Tárold a titkokat környezeti változókban, és a notebookból olvasd be őket. Így a kód tiszta marad, a titkok pedig nem kerülnek be a verziókezelőbe.
  • Titokkezelő rendszerek: Nagyobb projektek esetén használj dedikált titokkezelő eszközöket, mint a HashiCorp Vault, AWS Secrets Manager vagy Azure Key Vault.

Példa titok beolvasására környezeti változóból Pythonban:

import os

# Az API kulcs beolvasása a 'MY_API_KEY' nevű környezeti változóból
# A .get() metódus None-t ad vissza, ha a változó nem létezik,
# így elkerülhető a program összeomlása.
api_key = os.getenv('MY_API_KEY')

if not api_key:
 raise ValueError("A MY_API_KEY környezeti változó nincs beállítva!")

# Itt már biztonságosan használhatod az 'api_key' változót
# print(f"API kulcs első 5 karaktere: {api_key[:5]}...") # Óvatosan a kiíratással!

A biztonságos notebook életciklus

A fenti elveket egy teljes életciklus-modellbe foglalhatjuk, amely vizuálisan is segít megérteni a folyamatot.

1. Létrehozás és Izoláció Docker / venv 2. Fejlesztés és Titokkezelés os.getenv() 3. Megosztás és Tisztítás nbconvert –clear-output 4. Futtatás és Authentikáció Jelszó/Token

A paranoid fejlesztő mantrája

A notebookok ereje a felelősségteljes használatukban rejlik. Egy AI Red Teaming szakember számára a biztonságos fejlesztői környezet nem opció, hanem alapkövetelmény. A támadások szimulálása közben a saját eszközeink és adataink védelme elsődleges prioritás.

Ha csak három dolgot jegyzel meg ebből a fejezetből, az a következő legyen:

  • Izolálj mindent: Minden projekt, minden kísérlet kapjon saját, eldobható konténert vagy virtuális környezetet!
  • Authentikálj mindig: Soha ne tegyél ki jelszó nélkül Jupyter szervert a hálózatra, még a belsőre sem.
  • Tisztíts megosztás előtt: Mielőtt commitolsz vagy elküldesz egy notebookot, mindig távolítsd el a kimeneti cellákat és ellenőrizd, hogy nem maradt-e benne érzékeny információ.

Ezen alapelvek betartásával a notebookok valóban a hatékony munka eszközei maradnak, nem pedig a véletlen adatszivárgások forrásai.