rate_limit: Add a flag to lump all TOR exit node IPs together.

TOR users are legitimate users of the system; however, that system can
also be used for abuse -- specifically, by evading IP-based
rate-limiting.

For the purposes of IP-based rate-limiting, add a
RATE_LIMIT_TOR_TOGETHER flag, defaulting to false, which lumps all
requests from TOR exit nodes into the same bucket.  This may allow a
TOR user to deny other TOR users access to the find-my-account and
new-realm endpoints, but this is a low cost for cutting off a
significant potential abuse vector.

If enabled, the list of TOR exit nodes is fetched from their public
endpoint once per hour, via a cron job, and cached on disk.  Django
processes load this data from disk, and cache it in memcached.
Requests are spared from the burden of checking disk on failure via a
circuitbreaker, which trips of there are two failures in a row, and
only begins trying again after 10 minutes.
This commit is contained in:
Alex Vandiver
2021-11-03 13:43:02 -07:00
committed by Tim Abbott
parent 2d3d0f862a
commit 49ad188449
13 changed files with 278 additions and 3 deletions

View File

@@ -48,4 +48,4 @@ API_FEATURE_LEVEL = 107
# historical commits sharing the same major version, in which case a
# minor version bump suffices.
PROVISION_VERSION = "165.2"
PROVISION_VERSION = "165.3"