Assignment Chef icon Assignment Chef
All German tutorials

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.

Flask Sicherheit rollenbasierte Zugriffskontrolle RBAC Flask Datenverschlüsselung SQLite Flask Login Session Berechtigungskonzept Webentwicklung Flask cryptography Bibliothek Python Webentwicklung Tutorial Webseite Härtung IT-Sicherheit Flask Baking Contest Website Assignment 6 Cop4521 Flask Benutzerverwaltung Passwort hashing Flask Datenschutz Webapplikation Flask Tutorial Deutsch

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!