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:
mv ../settings.py base.py
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:
cd ../../
ls
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:
nano manage.py
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:
nano testsite/wsgi.py
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:
nano .env
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:
nano .env
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.