Programming lesson
Sicherheits-Härtung einer Flask-Website mit rollenbasierter Zugriffskontrolle und Datenverschlüsselung
Lerne, wie du eine Flask-Website mit rollenbasierter Zugriffskontrolle (RBAC) und Feldverschlüsselung in SQLite sicherst – inklusive praktischer Tipps für Passwort-Hashing, Session-Management und den Einsatz der cryptography-Bibliothek.
Einleitung: Warum Sicherheit für deine Flask-Website heute wichtiger ist denn je
Stell dir vor, du entwickelst eine Plattform für einen Baking Contest – ähnlich wie die beliebten Kochshows im Fernsehen. Teilnehmer reichen ihre Kreationen ein, Juroren bewerten, und die Ergebnisse werden veröffentlicht. Klingt harmlos? Aber was, wenn ein Nutzer auf die Daten eines anderen zugreifen kann oder sich als Admin ausgibt? Genau hier setzt Assignment 6 an: Du erweiterst deine bestehende Flask-Website aus Assignment 5 um rollenbasierte Zugriffskontrolle (RBAC) und Datenverschlüsselung sensibler Felder. Dieses Tutorial führt dich Schritt für Schritt durch die Konzepte und zeigt dir, wie du deine Website vor unbefugtem Zugriff schützt – ganz im Sinne der IT-Sicherheit und Webentwicklung.
Grundlagen: Rollenbasierte Zugriffskontrolle (RBAC) in Flask
RBAC ist ein Berechtigungskonzept, bei dem Nutzer je nach Rolle (z.B. SecurityLevel 1, 2, 3) unterschiedliche Aktionen ausführen dürfen. In deiner Baking-Contest-Website könnte das so aussehen:
- SecurityLevel 1 (Teilnehmer): Darf nur eigene Einträge sehen und neue hinzufügen.
- SecurityLevel 2 (Moderator): Darf zusätzlich alle Nutzer auflisten.
- SecurityLevel 3 (Admin): Hat volle Kontrolle, inklusive Nutzer anlegen und Ergebnisse einsehen.
Die Implementierung erfolgt über eine Login-Seite, die die Identität prüft und die Rolle des Nutzers in der Session speichert. Jede Route überprüft dann die Berechtigung des aktuellen Nutzers. Wichtig: Niemals der Client-Seite vertrauen – alle Prüfungen müssen serverseitig erfolgen.
Schritt 1: Login-Seite und Session-Management
Deine Login-Seite (/login) nimmt Benutzername und Passwort entgegen. Nach erfolgreicher Authentifizierung speicherst du user_id, username und SecurityLevel in der Flask-Session. Verwende dafür Flask-Login oder eine eigene Session-Implementierung mit session aus Flask. Achte darauf, dass Passwörter gehasht (z.B. mit werkzeug.security) und nicht im Klartext gespeichert werden.
from flask import session, redirect, url_for, request, render_template
from werkzeug.security import check_password_hash
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = query_db('SELECT * FROM user WHERE username = ?', [username], one=True)
if user and check_password_hash(user['password'], password):
session['user_id'] = user['id']
session['username'] = user['username']
session['security_level'] = user['SecurityLevel']
return redirect(url_for('home'))
else:
return render_template('login.html', error='Invalid username and/or password!')
return render_template('login.html')Schritt 2: Berechtigungsprüfung auf jeder Route
Definiere eine Dekorator-Funktion, die prüft, ob der Nutzer angemeldet ist und die erforderliche Rolle besitzt. Beispiel für die List Users-Seite, die nur für Level 2 und 3 zugänglich ist:
from functools import wraps
def require_role(level):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
return redirect(url_for('login'))
if session.get('security_level', 0) < level:
return render_template('error.html', message='Page not found'), 404
return f(*args, **kwargs)
return decorated_function
return decorator
@app.route('/list_users')
@require_role(2)
def list_users():
# ...So stellst du sicher, dass nur berechtigte Nutzer auf sensible Seiten zugreifen können. Das verhindert unautorisierte Zugriffe und schützt die Datenintegrität.
Schritt 3: Datenverschlüsselung sensibler Felder
Die Aufgabenstellung verlangt, dass Name, PhNum (Telefonnummer) und LoginPassword in der SQLite-Datenbank verschlüsselt gespeichert werden. Verwende dazu die cryptography-Bibliothek (z.B. Fernet). Wichtig: Der Verschlüsselungsschlüssel muss sicher verwaltet werden – z.B. in einer Umgebungsvariable oder einer separaten Konfigurationsdatei.
from cryptography.fernet import Fernet
# Schlüssel generieren (einmalig) und speichern
key = Fernet.generate_key()
cipher = Fernet(key)
def encrypt(plaintext):
return cipher.encrypt(plaintext.encode()).decode()
def decrypt(ciphertext):
return cipher.decrypt(ciphertext.encode()).decode()Beim Einfügen eines neuen Nutzers verschlüsselst du die Felder, bevor du sie in die Datenbank schreibst. Beim Auslesen (z.B. auf der List-Users-Seite) entschlüsselst du sie. Achte darauf, dass die Login-Logik ebenfalls den verschlüsselten Benutzernamen und das Passwort verwendet: Du musst den eingegebenen Benutzernamen verschlüsseln und dann mit der Datenbank abgleichen – oder alternativ alle Benutzernamen entschlüsseln und vergleichen (weniger effizient).
Schritt 4: Praxisbeispiel – Baking Contest mit RBAC und Verschlüsselung
Stell dir vor, du implementierst die Website für einen Baking Contest an deiner Hochschule. Teilnehmer (Level 1) können ihre Backkreationen einreichen und die Stimmen einsehen. Moderatoren (Level 2) verwalten die Teilnehmerliste. Admins (Level 3) haben die volle Kontrolle. Die Datenverschlüsselung schützt die Privatsphäre der Teilnehmer – besonders relevant im Zeitalter von Datenschutz und DSGVO. Ein weiterer Trend: Immer mehr KI-gestützte Plattformen nutzen RBAC, um Nutzerdaten zu segmentieren. Deine Website ist also ein perfektes Beispiel für moderne Webentwicklung.
Schritt 5: Fehlerbehandlung und Logout
Vergiss nicht, eine Logout-Funktion zu implementieren, die die Session löscht und zur Login-Seite weiterleitet. Außerdem solltest du Fehlerseiten definieren (z.B. 404 für nicht berechtigte Zugriffe). Das verbessert die Benutzererfahrung und die Sicherheit.
@app.route('/logout')
def logout():
session.clear()
return redirect(url_for('login'))Fazit: Deine gehärtete Flask-Website ist bereit für die Praxis
Mit rollenbasierter Zugriffskontrolle und Feldverschlüsselung hast du die Sicherheit deiner Flask-Website deutlich erhöht. Du hast gelernt, wie man Authentifizierung, Autorisierung und Kryptografie in einer Webanwendung kombiniert. Diese Konzepte sind nicht nur für dieses Assignment relevant, sondern auch für reale Projekte – sei es ein E-Commerce-Shop, eine Social-Media-Plattform oder ein Online-Banking-System. Bleib neugierig und experimentiere weiter mit Flask und Python!