Skip to main content

Blacklist users and hosts in Django. Automatically blacklist rate-limited clients.

Project description

Django Blacklist

Blacklist users and hosts in Django. Automatically blacklist rate-limited clients.

Overview

Django Blacklist allows you to block specific users and IP addresses/networks from accessing your application. Clients can be blocked manually from the admin interface, or automatically after exceeding a request rate limit. Each blacklist rule is applied for a specific duration. The blacklist is very scalable and is applied without noticeable overhead for large numbers of rules.

Installation

To install the package, run:

$ pip install django-blacklist

Add the blacklist application to INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'blacklist'
]

Add the BlacklistMiddleware middleware after AuthenticationMiddleware:

MIDDLEWARE = [
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'blacklist.middleware.BlacklistMiddleware',
    ...
]

Apply the blacklist database migrations:

$ python manage.py migrate blacklist

Usage

You can manage the blacklist rules from the admin. Changes take effect after a configurable time, or when the server is restarted. A rule can target a user or an IP address. You can also target IP networks (ranges) by specifying the optional prefixlen field (number of network prefix bits). Each rule has a specific duration. After that time interval passes, the rule expires. When a request is blocked due to a matching rule:

  • Status 400 (bad request) is returned.
  • An error template is rendered. You can specify a custom one (see Settings below), or use the one for status 400.
  • A message is logged (warning from logger blacklist.middleware for custom templates, or error from logger django.security otherwise).

Removing Expired Rules

Expired rules are not automatically removed from the database. They can be cleaned up with the included management command trim_blacklist:

$ python manage.py trim_blacklist [-c <created_days>] [-e <expired_days>]

The options -c and -e specify the minimum ages of creation and expiry, respectively.

Automatic Blacklisting

Clients can be blacklisted automatically, after exceeding a specified request rate limit. This feature requires django-ratelimit.

First, rate-limit a view by applying the @ratelimit decorator. Make sure to set block=False. Then, blacklist rate-limited clients by adding the @blacklist_ratelimited decorator. Specify the blacklist duration. For example:

from datetime import timedelta
from django_ratelimit.decorators import ratelimit
from blacklist.ratelimit import blacklist_ratelimited

@ratelimit(key='user_or_ip', rate='50/m', block=False)
@blacklist_ratelimited(timedelta(minutes=30))
def index(request):
    ...

Automatic rules take effect immediately. If the request comes from an authenticated user, the rule will target that user. Otherwise, it will target their IP address.

@blacklist_ratelimited accepts two arguments: (duration, block=True).

  • duration can be a timedelta object, or a tuple of two separate durations (for user-based and IP-based rules).
  • block specifies if the request should be blocked immediately, or passed to the view.

Automatic rules will have a comment that contains the ID of the request, which triggered the creation of the rule, and the "request line". The request ID is added only if available. Django does not generate request IDs. For that purpose, you can install django-log-request-id.

Proxies and Client Addresses

By default, the client IP address is taken from the REMOTE_ADDR value of request.META. If your application server is behind one or more reverse proxies, this will usually be the address of the nearest proxy, and not the actual client address. To properly blacklist clients by IP address, you can configure Django Blacklist to use addresses from another source (see Settings below).

To actually obtain the proxied client addresses, you can use django-ipware. In this case, you can configure Django Blacklist to obtain client addresses from your function, which in turn calls django-ipware for the actual logic.

Alternatively, you can set REMOTE_ADDR from the X-Forwarded-For header in middleware, installed before Django Blacklist. However, keep in mind that this header can be forged to bypass the rate limits. To counter that, you can use the last address in that header (which should be set by your trusted reverse proxy). If you are behind two proxies, use the second to last address, and so on.

Settings

  • BLACKLIST_ENABLE - whether blacklisted clients should be blocked, and rate-limited clients should be blacklisted; default: True
  • BLACKLIST_RELOAD_PERIOD - how often to reload the blacklist, in seconds; default: 60
  • BLACKLIST_RATELIMITED_ENABLE - whether rate-limited clients should be automatically blacklisted; requires BLACKLIST_ENABLE; default: True
  • BLACKLIST_TEMPLATE - name of a custom error template to render to blocked clients; its context will contain request and exception; set to None to use the template for status 400; default: None
  • BLACKLIST_LOGGING_ENABLE - whether blocked requests should be logged (honored only if a custom error template is configured); default: True
  • BLACKLIST_ADDRESS_SOURCE - the source of client addresses; can be a key in request.META, a callable that receives the request object, or the dotted string path to such a callable; default: 'REMOTE_ADDR'

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-blacklist-0.7.0.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

django_blacklist-0.7.0-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

Details for the file django-blacklist-0.7.0.tar.gz.

File metadata

  • Download URL: django-blacklist-0.7.0.tar.gz
  • Upload date:
  • Size: 10.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.8

File hashes

Hashes for django-blacklist-0.7.0.tar.gz
Algorithm Hash digest
SHA256 e62f9e1274abde7c2c3fe22b5cce5e7c17bef436c5c2b74521f763b1dba5ac7a
MD5 a7dffdb85fcc750547ba5767ced10d51
BLAKE2b-256 698bb290c76547a536897b3a63c80ddba41b1a8544655fe5d37c7468f684edc1

See more details on using hashes here.

File details

Details for the file django_blacklist-0.7.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_blacklist-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 70cfc2252510d00e776d14b911c01961e4a45e312d4d7c89083a7d34dffe1ef1
MD5 107761b69ce51f228276081171cf73dc
BLAKE2b-256 4357fa47ccf06bc4aaf099b17f3d8e77d6365e48a7c800bdbd59c85ea5b93789

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page