If such an abusive token usage is logged in log-file or journal from your application (API) you can use fail2ban to ban them.
Here is an example for log-file:
[my-php-app]
ports = http,https
backend = auto
logpath = /var/log/path-to-my.log
datepattern = ^{DATE}
failregex = ^\s*<ADDR>\s+\S+\s+Incorrect token used\.
maxretry = 10
findtime = 30m
bantime = 1h
For systemd journal you have to set backend
to systemd
(and proper value for journalmatch
, see the man pages or fail2ban's default filters for example).
This would match messages illustrated by following test and ban for 1 hour all intruders doing that after 10 attempts occurred in 30 minutes.
$ msg="$(date +%FT%T) 192.0.2.1 - Incorrect token used. (more info here ...)"
$ fail2ban-client -d '^{DATE}' "$msg" '^\s*<ADDR>\s+\S+\s+Incorrect token used\.'
Running tests
=============
Use datepattern : ^{DATE} : Default Detectors
Use failregex line : ^\s*<ADDR>\s+\S+\s+Incorrect token used\.
Use single line : 2021-06-11T17:00:03 192.0.2.1 - Incorrect token us...
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] ^\s*<ADDR>\s+\S+\s+Incorrect token used\.
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] ^ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T| ?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)?
`-
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.00 sec]
If you has different logging format you must adjust failregex
(and possibly datepattern
).
Newer version of fail2ban allows direct notification from application using fail2ban-API (via client or direct via pickle protocol to unix-socket), see GH/fail2ban/fail2ban#2559 (comment).
Prerequirements for this - your php-fpm user is able to write to /run/fail2ban/fail2ban.sock
.