{% extends "xeolux_securitykit/base.html" %} {% block title %}Documentation{% endblock %} {% block content %}

Documentation SecurityKit

Référence complète des conditions, actions, configuration et mise en place.

Mise en place rapide
1
Installer le package

pip install xeolux-securitykit

2
Ajouter à INSTALLED_APPS

"xeolux_securitykit" dans settings.py

3
Ajouter le middleware

"xeolux_securitykit.middleware.SecurityKitMiddleware" en premier dans MIDDLEWARE

4
Inclure les URLs

path("", include("xeolux_securitykit.urls")) dans urls.py

5
Migrer la base

python manage.py migrate puis python manage.py setup_securitykit

6
Donner la permission

Dans Django Admin → Utilisateur → Permissions : ajouter xeolux_securitykit | Configuration SecurityKit | Peut accéder à l'interface SecurityKit

Configuration Django (settings.py)
Toutes les clés ci-dessous sont optionnelles. La configuration peut aussi être modifiée dynamiquement via Paramètres avancés sans redémarrer le serveur.
XEOLUX_SECURITYKIT = {
    "ENABLED": True,                     # Active/désactive le package entier
    "DEFAULT_RESPONSE": "fake_404",      # fake_404 | 403 | ghost | json | redirect
    "SELF_PROTECTION_ENABLED": True,     # Protège /securitykit/ lui-même
    "LOCKOUT_SAFETY_ENABLED": True,      # Empêche l'admin de se verrouiller
    "STRICT_MODE_ENABLED": True,
    "ANTI_DDOS_ENABLED": True,
    "AUTO_STRICT_THRESHOLD": 80,         # Score → mode strict automatique
    "AUTO_LOCKDOWN_THRESHOLD": 95,       # Score → lockdown automatique
    "TEMP_BAN_DURATION": 3600,           # Durée bannissement (secondes)
    "RATE_LIMIT_WINDOW": 60,             # Fenêtre rate limit (secondes)
    "RATE_LIMIT_MAX_REQUESTS": 120,      # Max requêtes/IP dans la fenêtre
    "EXEMPT_PATHS": ["/static/", "/media/"],
    "EMAIL_SUPER_ADMINS": True,          # Alertes email aux superadmins
    "UNLOCK_CODE_TTL": 3600,             # Durée code déverrouillage strict
}
Routes protégées

Une route est un chemin ou pattern d'URL. Chaque route peut avoir plusieurs règles. Les règles sont évaluées par priorité décroissante. La première règle dont toutes les conditions sont remplies détermine l'action.

TYPES DE CORRESPONDANCE
exact
/admin/ correspond uniquement à /admin/
prefix
/api/ correspond à /api/users/, /api/v2/…
regex
^/user/\d+/ — expression Python complète
Les utilisateurs avec la permission access_securitykit ne sont jamais bloqués par les règles de route, quel que soit le contenu des conditions.
+ Créer une route
Conditions disponibles

Les conditions sont stockées en JSON dans le champ conditions d'une règle. Toutes les conditions doivent être vraies pour que la règle s'applique (logique ET).

{% for group in conditions_grouped %}
{{ group.category }} {% for cond in group.conditions %}
{{ cond.key }}
{{ cond.label }}
{{ cond.desc }}
{{ cond.example }}
{{ cond.type }}
{% endfor %}
{% endfor %}
Actions disponibles

Action déclenchée quand les conditions de la règle sont remplies et que l'accès doit être refusé.

fake_404 — Fausse page 404 Django (indiscernable)
403 — Erreur HTTP 403 Forbidden classique
ghost — TCP RST (connexion coupée immédiatement)
redirect — Redirection HTTP 302 vers l'URL définie
json — Réponse JSON {"error": "Forbidden"}
allow — Autorisation explicite (priorité max)
L'action allow est prioritaire : si une règle allow est satisfaite, toutes les règles de blocage suivantes sont ignorées. C'est le mécanisme de whitelist par règle.
Niveau de menace

Chaque IP accumule un score de menace basé sur son comportement. Le score global influence l'activation automatique du mode strict et du lockdown.

ÉvénementPoints
Chemin suspect (suspicious_path)+5
Accès fichier sensible (file_access)+5
User-Agent bloqué+3
Flood détecté+15
Tentative bruteforce+10
Seuils actuels — Mode strict auto : {{ conf_auto_strict }} pts · Lockdown auto : {{ conf_auto_lockdown }} pts. Modifiables via Paramètres avancés.
Mode strict & Lockdown
MODE STRICT
  • IPs non whitelistées → ghost response (TCP RST)
  • IPs whitelistées → accès normal
  • Activable manuellement ou via score de menace
  • Désactivable via URL secrète envoyée par email
MODE LOCKDOWN
  • Tous les visiteurs → page lockdown.html (503)
  • Même les IPs whitelistées sont affectées
  • Activé automatiquement si score ≥ {{ conf_auto_lockdown }} pts
  • Désactivable manuellement depuis le dashboard
Gérer le mode strict →
Modules de sécurité

Les modules sont des protections indépendantes activables/désactivables depuis Modules.

{% for module in modules %} {{ module.label }} {% endfor %}
Honeypot formulaires

Le honeypot est un champ invisible ajouté à vos formulaires Django. Les bots qui remplissent automatiquement tous les champs déclenchent la protection et voient leur soumission silencieusement ignorée.

1. Activer le module honeypot

Dans l'interface SecurityKit, allez dans Modules et activez honeypot.

2. Ajouter le tag dans votre template

<!-- En haut du template -->
{% verbatim %}{% load securitykit_tags %}

<form method="post">
  {% csrf_token %}
  {% honeypot_field %}  <!-- champ invisible pour les bots -->

  <!-- vos champs normaux -->
  {{ form.as_p }}

  <button type="submit">Envoyer</button>
</form>{% endverbatim %}

3. Vérifier la soumission dans la vue

from xeolux_securitykit.modules.honeypot import check_honeypot

def my_contact_view(request):
    if request.method == "POST":
        # Retourne True si c'est un bot (champ honeypot rempli)
        if check_honeypot(request):
            return redirect("contact")  # fausse réussite, silencieuse

        form = ContactForm(request.POST)
        if form.is_valid():
            # traitement normal...
            pass

4. Via le décorateur (optionnel)

from xeolux_securitykit.modules.honeypot import honeypot_protected

@honeypot_protected  # bloque silencieusement les bots avant d'entrer dans la vue
def my_contact_view(request):
    form = ContactForm(request.POST or None)
    ...
Comment ça marche — Le champ honeypot est camouflé via CSS (display:none + label trompeur). Un vrai visiteur humain ne le verra jamais. Un bot qui remplit tous les champs automatiquement le remplira, déclenchant la protection.
Configuration active
ParamètreValeur activeDescription
AUTO_STRICT_THRESHOLD{{ conf_auto_strict }}Score menace → mode strict
AUTO_LOCKDOWN_THRESHOLD{{ conf_auto_lockdown }}Score menace → lockdown automatique
TEMP_BAN_DURATION{{ conf_temp_ban }}sDurée d'un bannissement temporaire
RATE_LIMIT_WINDOW{{ conf_rate_limit_window }}sFenêtre glissante rate limit
RATE_LIMIT_MAX_REQUESTS{{ conf_rate_limit_max }}Max requêtes/IP par fenêtre
Modifier les paramètres →
Commandes manage.py
# Initialise les données de test (users, routes, clés)
python manage.py setup_securitykit

# Active le mode strict manuellement
python manage.py securitykit_strict_on --reason "Maintenance"

# Désactive le mode strict
python manage.py securitykit_strict_off

# Vide tous les scores de menace en cache
python manage.py securitykit_reset_threats

# Export / import de la configuration complète
python manage.py securitykit_export > config.json
python manage.py securitykit_import config.json
{% endblock %}