Django is een uitstekend framework met krachtige beveiligingsfuncties. Maar veel ontwikkelaars maken de fout om de /admin URL, die ze hebben gemaakt door de officiële documentatie of tutorials te volgen, ongewijzigd te laten, vooral aan het begin van een project.
Dit is alsof je een groot bord plaatst met de tekst "De voordeur van ons huis is hier". Geautomatiseerde scanners en aanvallers van over de hele wereld scannen voor het eerst example.com/admin/ wanneer ze een website ontdekken.
In dit artikel bespreken we een paar cruciale manieren om de Django-beheerpagina veilig te beschermen, van eenvoudige URL-wijzigingen tot actieve verdediging door onmiddellijk IP-adressen van indringers te blokkeren, met een focus op waarom dat moet gebeuren.
1. Het basisprincipe: wijzig de beheers URL (gebruik omgevingsvariabelen)
De eenvoudigste, snelste en meest effectieve eerste verdedigingslinie.
🤔 WHY: Waarom zou je de URL moeten verbergen?
Een aanvaller kan geen brute force-aanvallen of inloggegevensroof proberen zonder de URL te kennen. Door in plaats van de algemeen bekende route /admin een URL te gebruiken zoals my-super-secret-admin-path/, kun je 99% van de geautomatiseerde aanvallen blokkeren.
'Verhullen (Obscurity)' is niet de enige vorm van 'beveiliging (Security)', maar het is wel de meest kosteneffectieve verdediging.
🚀 HOW: Injecteren met omgevingsvariabelen
Het is een best practice om de URL niet hardcoded in de code te zetten, maar met omgevingsvariabelen te injecteren.
- .env-bestand (of server omgeving variabele instellingen)
# .env
# Gebruik een complexe string die niemand kan raden.
DJANGO_ADMIN_URL=my-secret-admin-portal-b7x9z/
- settings.py
# settings.py
import os
# Stel een standaardwaarde in, maar laat deze vanuit omgevingsvariabelen lezen
ADMIN_URL = os.environ.get('DJANGO_ADMIN_URL', 'admin/')
- urls.py (hoofdproject)
# urls.py
from django.contrib import admin
from django.urls import path
from django.conf import settings # importeer de settings module
urlpatterns = [
# gebruik settings.ADMIN_URL in plaats van admin/
path(settings.ADMIN_URL, admin.site.urls),
# ... andere urls
]
Nu kun je in de ontwikkelomgeving admin/ gebruiken, terwijl je in de productieomgeving de omgevingsvariabele wijzigt om het werkelijke beheerspad te verbergen.
2. Muren bouwen: IP-toegangsbeperkingen in Nginx
Zelfs als de URL zichtbaar is, is het een krachtige manier om toegang tot de beheerspagina volledig te blokkeren als het IP niet is toegestaan.
🤔 WHY: Waarom moet je het in Nginx blokkeren?
Deze methode blokkeert het aanvallersverkeer voordat het de Django applicatie bereikt, op het niveau van de webserver (Nginx). Dit betekent dat Django niet eens weet dat er een aanval is geprobeerd, waardoor onnodige middelen worden bespaard. Dit is de meest zekere manier als de beheerder alleen toegang heeft vanaf bepaalde IP's (kantoor, VPN, enz.).
HOW: Voorbeeld van Nginx-configuratie
Voeg een location block toe aan het Nginx-configuratiebestand (de site-instellingen in sites-available).
server {
# ... (bestaande instellingen)
# Geef een pad op dat overeenkomt met de ADMIN_URL omgevingsvariabele
location /my-secret-admin-portal-b7x9z/ {
# 1. Toegelaten IP-adressen (bijv. statisch IP van kantoor)
allow 192.168.0.10;
# 2. Toegelaten IP-bereiken (bijv. VPN-bereik)
allow 10.0.0.0/24;
# 3. Lokale host (server intern)
allow 127.0.0.1;
# 4. Blokkeer alle toegang behalve de bovengenoemde IP's
deny all;
# 5. Stuur al het verkeer door naar uwsgi/gunicorn proxy
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
# ... (andere locatie-instellingen)
}
Nu zal Django helemaal niet reageren voor alle gebruikers die proberen toegang te krijgen via deze URL, en Nginx zal onmiddellijk een 403 Forbidden-fout retourneren.
3. Deurwachten: Beperk het aantal inlogpogingen (django-axes)
Als een aanvaller er op een of andere manier in slaagt om de URL te ontdekken en de IP-beperkingen te omzeilen, moet je nu brute-force-aanvallen stoppen.
🤔 WHY: Waarom moet je het aantal pogingen beperken?
Brute-force-aanvallen toetsen automatisch duizenden of tienduizenden wachtwoorden aan een veel voorkomend account-ID zoals 'admin'. Pakketten zoals django-axes creëren regels zoals "Als er binnen korte tijd meer dan 5 mislukte inlogpogingen zijn, blokkeer dan dat IP of account voor een bepaalde tijd".
Dit maakt geautomatiseerde scripts bijna nutteloos.
HOW: Gebruik van django-axes
django-axes is het meest standaardpakket voor deze taak.
-
Installatie:
pip install django-axes -
Registreer in settings.py:
INSTALLED_APPS = [
# ...
'axes', # aanbevolen om boven andere apps te plaatsen
# ...
'django.contrib.admin',
]
AUTHENTICATION_BACKENDS = [
# AxesBackend moet als eerste komen.
'axes.backends.AxesBackend',
# Standaard Django-authenticatie-backend
'django.contrib.auth.backends.ModelBackend',
]
# 5 falen = 10 minuten blokkeren (standaard)
AXES_FAILURE_LIMIT = 5
AXES_COOLOFF_TIME = 0.166 # 0.166 * 60 = ongeveer 10 minuten
- Migratie:
python manage.py migrate
Nu, als iemand 5 keer achtereenvolgens faalt bij het inloggen, registreert axes deze pogingen en blokkeert die inloggen voor het opgegeven tijdsduur van het IP/account.
4. Dubbele beveiliging: Twee-staps verificatie (2FA)
Dit is de laatste redding voor het geval het wachtwoord wordt gekraakt.
🤔 WHY: Waarom is 2FA nodig?
Het wachtwoord van het beheerdersaccount kan zijn gelekt, of je hebt misschien een te eenvoudig wachtwoord gebruikt. Twee-staps verificatie (Two-Factor Authentication) vraagt zowel om "wat ik weet (wachtwoord)" als "wat ik heb (smartphone OTP)".
Zelfs als een hacker het wachtwoord steelt, kan hij nooit inloggen zonder de smartphone van de beheerder.
HOW: Gebruik van django-otp
django-otp is het kernpakket om 2FA in Django te integreren.
-
Installatie:
pip install django-otp -
Registreer in settings.py:
INSTALLED_APPS = [
# ...
'django_otp',
'django_otp.plugins.otp_totp', # ondersteunt Google Authenticator en anderen
# ...
]
MIDDLEWARE = [
# ...
'django_otp.middleware.OTPMiddleware', # na SessionMiddleware
# ...
]
django-otp is de basisstructuur, en door het samen te gebruiken met een pakket zoals django-two-factor-auth kan de gebruiker eenvoudig QR-codes scannen en registreren in het volledige proces.
5. Plaats een val: Honeypot en integratie met Fail2Ban
Dit is de meest proactieve verdedigingsmaatregel. Het maakt gebruik van de pogingen van de aanvaller om /admin te scannen om ze permanent van de server te verbannen.
🤔 WHY: Waarom moet je een val plaatsen?
Aangezien aanvallers /admin toch blijven scannen, maak je van deze route een nepval (Honeypot), zodat elk IP dat hier ooit naar toe probeert te gaan, als kwaadwillig wordt beschouwd en onmiddellijk geblokkeerd wordt.
HOW: Nep Admin + Fail2Ban
Deze methode is iets complexer, maar zeer effectief.
- Creëer een nep Admin view: Verberg de echte beheer URL zoals in stap 1 met
my-secret-admin-portal-b7x9z/. Koppel een nep view aan het verlate/admin/pad.
# urls.py
from django.urls import path
from . import views # importeer de nep view
urlpatterns = [
path('my-secret-admin-portal-b7x9z/', admin.site.urls), # echt
path('admin/', views.admin_honeypot), # nep (val)
]
# views.py
import logging
from django.http import HttpResponseForbidden
# honeypot-specifieke logger configureren (definieer 'honeypot' logger in settings.py)
honeypot_logger = logging.getLogger('honeypot')
def admin_honeypot(request):
# Registreer het IP van de poging in de 'honeypot' log
ip = request.META.get('REMOTE_ADDR')
honeypot_logger.warning(f"HONEYPOT: Poging tot toegang tot admin vanaf {ip}")
# Laat de aanvaller gewoon een 403 fout zien
return HttpResponseForbidden()
-
Fail2Ban configureren:
Fail2Bancontroleert logfile van de server in realtime en voegt het IP dat een bepaalde patroon (bijv. "HONEYPOT: ...") heeft gecreëerd toe aaniptables(Linux-firewall) om het te blokkeren.-
Zorg ervoor dat Django logs naar het
honeypot.logbestand schrijft. -
Zorg ervoor dat Fail2Ban het
honeypot.logbestand in de gaten houdt. -
Als iemand toegang probeert te krijgen tot
/admin/, registreertviews.pyde log en detecteert Fail2Ban dit, waardoor alle toegang (SSH, HTTP, enz.) van dat IP onmiddellijk wordt geblokkeerd.
-
Samenvatting
De beveiliging van de Django-beheerpagina draait om het leggen van meerdere lagen van verdediging.
-
(Verplicht) 1. URL wijzigen: Investeer nu 5 minuten om dit te doen.
-
(Aanbevolen) 2. IP-beperkingen: Dit is het krachtigste als je een statisch IP hebt.
-
(Aanbevolen) 3. django-axes: voorkomt brute force-aanvallen.
-
(Zeer aanbevolen) 4. 2FA: voorkomt het stelen van beheerdersaccounts volledig.
-
(Geavanceerd) 5. Honeypot: beschermt de hele server met een agressieve verdediging.
Het ongewijzigd laten van /admin is een nalatigheid in beveiliging. Controleer nu je urls.py.
EdwardCaway
Nov 14, 2025 18:14
You are mistaken. Let's discuss it.
------
https://the.hosting/pl/help/instalacja-wsl-2-w-systemie-windows-10