Wie man die Sicherheit Ihres Django-Produktionsprojekts verstärkt

Die Entwicklung einer Django-Anwendung kann eine angenehme Erfahrung sein, da sie flexibel und skalierbar aufgebaut ist. Dieses Konzept erstreckt sich auf die sicherheitsorientierten Einstellungen von Django, die Ihnen helfen können, Ihr Projekt für die Produktion vorzubereiten. Es gibt jedoch mehrere Möglichkeiten, Ihr Projekt weiter abzusichern.

Aufteilung Ihrer Einstellungen

Die Aufteilung Ihrer Einstellungen ermöglicht es Ihnen, verschiedene Konfigurationen basierend auf der Umgebung einzurichten. Die Nutzung von .env zur Festlegung von Umgebungsvariablen oder zum Verbergen vertraulicher Einstellungen stellt sicher, dass keine Details veröffentlicht werden, die Ihr Projekt gefährden könnten. Und das Ändern von Standard-URLs und anderen Einstellungen hilft Ihnen, häufige Sicherheitslücken zu vermeiden.

Auch wenn die Implementierung dieser Strategien zunächst zeitaufwändig erscheinen mag, ermöglicht Ihnen die Entwicklung eines praktischen Workflows die Bereitstellung von Versionen Ihres Projekts, ohne Kompromisse bei der Sicherheit oder Produktivität einzugehen.

Sicherheitsorientierter Workflow für Django

In diesem Tutorial nutzen Sie einen sicherheitsorientierten Workflow für Ihr Django-Projekt, indem Sie umgebungsbasierte Einstellungen, .env und die integrierten Sicherheitseinstellungen von Django implementieren und konfigurieren. Diese Funktionen ergänzen sich gegenseitig und führen zu einer Version Ihres Django-Projekts, die für verschiedene Bereitstellungsansätze bereit ist.

Voraussetzungen

  • Ein bestehendes Django-Projekt. Wenn Sie noch keines eingerichtet haben, können Sie unser Tutorial „Wie man Django installiert und eine Entwicklungsumgebung einrichtet“ verwenden. In diesem Tutorial wird das Projekt testsite als Beispiel verwendet.
  • Python 3 für Ihr Django-Projekt. Sie können es installieren, indem Sie Schritt 1 unseres Tutorials „Wie man Python 3 installiert und eine Programmierumgebung unter Ubuntu 20.04 einrichtet“ folgen.
  • Ein Let’s Encrypt-Zertifikat. Wenn Sie noch keines eingerichtet haben, können Sie unser Tutorial „Wie man Nginx mit Let’s Encrypt unter Ubuntu 20.04 absichert“ verwenden.
  • Um das Let’s Encrypt-Zertifikat zu verwenden, benötigen Sie Nginx. Sie können es installieren, indem Sie unser Tutorial „Wie man Nginx unter Ubuntu 20.04 installiert“ verwenden.
  • Diese Django-Entwicklungstutorial-Serie ist eine großartige Möglichkeit, sich mit der Dateistruktur und den Kerneinstellungen von Django vertraut zu machen.

Hinweis: Wenn Sie ein vorhandenes Django-Projekt verwenden, können Sie andere Anforderungen haben. Dieses Tutorial schlägt eine bestimmte Projektstruktur vor; Sie können jedoch auch jeden Abschnitt dieses Tutorials nach Bedarf einzeln verwenden.

Schritt 1 — Umstrukturierung der Django-Einstellungen

Bevor Sie mit der Sicherung Ihres Django-Projekts beginnen, müssen Sie in das Verzeichnis Ihres Projekts wechseln und Ihre virtuelle Umgebung aktivieren:

cd django-apps
. env/bin/activate

Im ersten Schritt beginnen Sie damit, Ihre Datei settings.py in umgebungsspezifische Konfigurationen umzustrukturieren…

Dies ist eine gute Praxis, wenn Sie ein Projekt zwischen verschiedenen Umgebungen verschieben müssen, beispielsweise Entwicklung und Produktion. Diese Anordnung bedeutet weniger Neukonfigurationen für unterschiedliche Umgebungen; stattdessen verwenden Sie eine Umgebungsvariable, um zwischen den Konfigurationen zu wechseln, was später im Tutorial besprochen wird.

Erstellen separater Einstellungsdateien

In Ihrem neuen Ordner settings erstellen Sie drei Python-Dateien:

cd testsite/testsite/settings
touch base.py development.py production.py

Die Datei development.py enthält Einstellungen, die Sie normalerweise während der Entwicklung verwenden. Und production.py enthält Einstellungen für die Verwendung auf einem Produktionsserver. Sie sollten diese trennen, da die Produktionskonfiguration Einstellungen verwendet, die in einer Entwicklungsumgebung nicht funktionieren, z. B. die erzwungene Verwendung von HTTPS, das Hinzufügen von Headern und die Verwendung einer Produktionsdatenbank.

Die Datei base.py enthält Einstellungen, die development.py und production.py erben werden. Dies reduziert Redundanz und hilft, Ihren Code sauberer zu halten. Diese Python-Dateien ersetzen settings.py, also entfernen Sie jetzt settings.py, um Verwirrung in Django zu vermeiden.

Umbenennen der Einstellungen

Benennen Sie die Datei settings.py in base.py um, während Sie sich noch im Einstellungsverzeichnis befinden:

Sie haben gerade die Umrisse Ihres neuen, umgebungsbasierten Einstellungsverzeichnisses abgeschlossen. Ihr Projekt versteht Ihre neue Konfiguration noch nicht, also beheben Sie dies als Nächstes.

Schritt 2 — Verwenden von django-environ

Derzeit erkennt Django Ihr neues Einstellungsverzeichnis oder dessen interne Dateien nicht. Bevor Sie also mit Ihren umgebungsbasierten Einstellungen weiterarbeiten, müssen Sie Django dazu bringen, mit django-environ zu arbeiten. Dies ist eine Abhängigkeit, die Umgebungsvariablen aus einer .env-Datei lädt. Das bedeutet, dass Django in der .env-Datei im Stammverzeichnis Ihres Projekts nachsehen wird, um zu bestimmen, welche Einstellungskonfiguration es verwenden soll.

Stammverzeichnis des Projekts

Wechseln Sie in das Stammverzeichnis Ihres Projekts und verwenden Sie den Befehl ls, um die Inhalte des Verzeichnisses aufzulisten:

Die Dateien im Stammverzeichnis Ihres Projekts sollten wie folgt aussehen:

db.sqlite3  manage.py  testsite

Installieren von django-environ

Installieren Sie django-environ:

pip install django-environ

Jetzt müssen Sie Django so konfigurieren, dass es .env verwendet. Sie bearbeiten dazu zwei Dateien: manage.py für die Entwicklung und wsgi.py für die Produktion.

Bearbeiten von manage.py

Öffnen Sie zunächst manage.py zur Bearbeitung mit nano oder Ihrem bevorzugten Texteditor:

Fügen Sie den folgenden hervorgehobenen Code hinzu:

import os
import sys
import environ

environ.Env.read_env()

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testsite.settings')

    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)

if __name__ == '__main__':
    main()

Speichern und schließen Sie manage.py, indem Sie CTRL+X drücken, Y eingeben und ENTER drücken.

Bearbeiten von wsgi.py

Öffnen Sie als Nächstes wsgi.py zur Bearbeitung:

Fügen Sie die folgenden hervorgehobenen Zeilen hinzu:

import os
import environ

environ.Env.read_env()

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testsite.settings')

application = get_wsgi_application

Speichern und schließen Sie die Datei, indem Sie CTRL+X drücken, Y eingeben und ENTER drücken.

Erstellen einer .env-Datei

Erstellen Sie schließlich eine .env-Datei im aktuellen Verzeichnis:

Fügen Sie die folgende Zeile hinzu, um die Umgebung auf Entwicklung festzulegen:

DJANGO_SETTINGS_MODULE="testsite.settings.development"

Speichern und schließen Sie die Datei, indem Sie CTRL+X drücken, Y eingeben und ENTER drücken.

Hinweis: Fügen Sie .env zu Ihrer .gitignore-Datei hinzu, damit sie niemals in Ihre Commits aufgenommen wird. Diese Datei enthält Daten wie Passwörter und API-Schlüssel, die nicht öffentlich sichtbar sein sollen. Jede Umgebung, in der Ihr Projekt läuft, hat ihre eigene .env mit Einstellungen für diese spezifische Umgebung.

Schritt 3 — Erstellen von Entwicklungs- und Produktionseinstellungen

Öffnen Sie als Nächstes Ihre Datei base.py und fügen Sie die Konfiguration hinzu, die Sie für jede Umgebung in den separaten Dateien development.py und production.py ändern möchten. Die Datei production.py benötigt die Anmeldeinformationen Ihrer Produktionsdatenbank, stellen Sie also sicher, dass diese verfügbar sind.

Konfigurieren der Entwicklungseinstellungen

Beginnen Sie mit dem Öffnen von development.py:

nano testsite/settings/development.py

Fügen Sie den folgenden Code hinzu:

import os
from .base import *

DEBUG = True

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

Speichern und schließen Sie die Datei, indem Sie CTRL+X drücken, Y eingeben und ENTER drücken.

Erstens importieren Sie von base.py—diese Datei erbt Einstellungen von base.py. Dann übertragen Sie die Einstellungen, die Sie für die Entwicklungsumgebung ändern möchten. In diesem Fall sind die spezifischen Einstellungen für die Entwicklung wie folgt: DEBUG, das in der Entwicklung auf True gesetzt sein muss, jedoch nicht in der Produktion; und DATABASES, eine lokale Datenbank anstelle einer Produktionsdatenbank. Hier verwenden Sie eine SQLite-Datenbank für die Entwicklung.

Konfigurieren der Produktionseinstellungen

Als Nächstes fügen Sie production.py hinzu. Öffnen Sie die Datei mit dem folgenden Befehl:

nano testsite/settings/production.py

Fügen Sie dann den folgenden Code hinzu. production.py ist ähnlich wie development.py, jedoch mit einer anderen Datenbankkonfiguration und DEBUG, das auf False gesetzt ist:

import os
from .base import *
import environ

env = environ.Env()
environ.Env.read_env()

DEBUG = False

ALLOWED_HOSTS = []

DATABASES = {
    'default': {
        'ENGINE': env('SQL_ENGINE', default='django.db.backends.sqlite3'),
        'NAME': env('SQL_DATABASE', default=os.path.join(BASE_DIR, 'db.sqlite3')),
        'USER': env('SQL_USER', default='user'),
        'PASSWORD': env('SQL_PASSWORD', default='password'),
        'HOST': env('SQL_HOST', default='localhost'),
        'PORT': env('SQL_PORT', default=''),
    }
}

Speichern und schließen Sie die Datei, indem Sie CTRL+X drücken, Y eingeben und ENTER drücken.

Die für die Produktion spezifischen Einstellungen sind wie folgt: DEBUG ist auf False gesetzt; ALLOWED_HOSTS ist konfiguriert, um den Zugriff auf bestimmte Domänen zu beschränken; und DATABASES ist so konfiguriert, dass sie eine Produktionsdatenbank verwendet, die Sie bereits eingerichtet haben.

Schritt 4 — Arbeiten mit den Sicherheitseinstellungen von Django

Django enthält Sicherheitseinstellungen, die Sie Ihrem Projekt hinzufügen können. In diesem Schritt fügen Sie Ihrem Projekt Sicherheitseinstellungen hinzu, die für jedes Produktionsprojekt als wesentlich angesehen werden. Diese Einstellungen sind für die Verwendung gedacht, wenn Ihr Projekt der Öffentlichkeit zugänglich ist. Es wird nicht empfohlen, diese Einstellungen in Ihrer Entwicklungsumgebung zu verwenden; daher beschränken Sie in diesem Schritt diese Einstellungen auf die Konfiguration von production.py.

Hinzufügen von Sicherheitseinstellungen

Öffnen Sie zuerst production.py:

nano testsite/settings/production.py

Fügen Sie die hervorgehobenen Sicherheitseinstellungen hinzu:

SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True

SECURE_SSL_REDIRECT leitet alle HTTP-Anfragen zu HTTPS um. SESSION_COOKIE_SECURE stellt sicher, dass Cookies nur über HTTPS übertragen werden. CSRF_COOKIE_SECURE sichert den CSRF-Token, und SECURE_BROWSER_XSS_FILTER verhindert Cross-Site-Scripting.

Für weitere Einstellungen lesen Sie die Dokumentation zu Djangos Sicherheitseinstellungen.

Hinzufügen von HSTS-Unterstützung

Die folgenden Einstellungen unterstützen HTTP Strict Transport Security (HSTS):

SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_PRELOAD = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True

SECURE_HSTS_SECONDS legt die Dauer (in Sekunden) fest, für die HSTS aktiviert ist. SECURE_HSTS_PRELOAD ermöglicht es Ihrem Projekt, in Browsern vorab geladen zu werden, und SECURE_HSTS_INCLUDE_SUBDOMAINS wendet HSTS auf alle Subdomains an.

Warnung: Eine falsche Konfiguration von HSTS kann Ihre Website erheblich beeinträchtigen. Lesen Sie die Django-Dokumentation zu HSTS, bevor Sie diese Einstellungen implementieren.

Schritt 5 — Verwenden von django-environ für geheime Informationen

Im letzten Schritt nutzen Sie django-environ, um sensible Informationen zu verbergen, wie z. B. den SECRET_KEY Ihres Projekts oder die Admin-Login-URL. Dies ist besonders hilfreich, wenn Sie Ihren Code auf Plattformen wie GitHub veröffentlichen, da diese Geheimnisse nicht öffentlich einsehbar sind.

Verbergen des SECRET_KEY

Öffnen Sie Ihre .env-Datei im Stammverzeichnis Ihres Projekts:

Fügen Sie die folgende Zeile hinzu:

SECRET_KEY="your_secret_key"

Speichern und schließen Sie die Datei, indem Sie CTRL+X drücken, Y eingeben und ENTER drücken.

Aktualisieren von base.py

Aktualisieren Sie base.py, um den verborgenen SECRET_KEY zu verwenden:

import environ

env = environ.Env()
environ.Env.read_env()

SECRET_KEY = env('SECRET_KEY')

Speichern und schließen Sie die Datei, indem Sie CTRL+X drücken, Y eingeben und ENTER drücken.

Verbergen der Admin-URL

Fügen Sie eine geheime Admin-URL zu Ihrer .env-Datei hinzu:

SECRET_ADMIN_URL="very_secret_url"

Aktualisieren Sie urls.py, um diese verborgene URL zu verwenden:

from django.urls import path
import environ

env = environ.Env()
environ.Env.read_env()

urlpatterns = [
    path(env('SECRET_ADMIN_URL') + '/admin/', admin.site.urls),
]

Fazit

In diesem Tutorial haben Sie Ihr Django-Projekt für die sichere Verwendung in der Produktion konfiguriert, indem Sie umgebungsbasierte Einstellungen, django-environ und die integrierten Sicherheitseinstellungen von Django genutzt haben. Ihr Projekt bietet jetzt:

  • SSL/HTTPS-Schutz für alle Kommunikationen
  • Schutz vor XSS- und CSRF-Angriffen
  • Verborgenes Projektgeheimnis (SECRET_KEY)
  • Eine versteckte Admin-URL
  • Getrennte Einstellungen für Entwicklung und Produktion

Lesen Sie die offizielle Django-Dokumentation zu Einstellungen, um mehr über die verfügbaren Konfigurationen zu erfahren. Nutzen Sie auch unsere weiteren Tutorials, um Ihre Django-Kenntnisse zu vertiefen.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: