Если deny all
создает запись об ошибке в вашем error.log, вы можете использовать fail2ban jail с именем nginx -http-auth, поэтому добавьте это в ваш /etc/fail2ban/jail.local
:
[nginx-http-auth]
enabled = true
перезапустите fail2ban (или fail2ban-client reload
для fail2ban v.0.10 или новее), и они будут забанены. Если у вас есть только записи в access.log или вы хотите попробовать лучший сценарий, вы можете попробовать это:
создать новый формат журнала доступа (nginx по умолчанию немного хуже) в http
разделе nginx config:
log_format badlogfmt '$time_local : $remote_addr : $status : $body_bytes_sent : $request_method : $remote_user : '
'"$request" "$http_referer" "$http_user_agent"';
, а затем написать новую запись, которая будет регистрировать все «плохие» запросы в отдельном файле журнала:
map $status $loggable {
404 0; # ignore page not found (404).
499 0; # ignore canceled/closed requests.
~^[45] 1; # all other requests with status starting with 4 or 5.
default 0;
}
# log the bad requests:
access_log /var/log/nginx/access_bad.log badlogfmt if=$loggable;
# all other requests:
access_log /var/log/nginx/access.log combined;
, это приведет к тому, что все «плохие» запросы переходя к другому журналу, который выглядит следующим образом:
11/Jan/2020:06:27:59 +0100 : 192.0.2.1 : 403 : 154 : GET : - : "GET /admin/ HTTP/1.1" ...
11/Jan/2020:06:28:00 +0100 : 192.0.2.2 : 400 : 166 : - : - : "145.ll|'|'|SGFjS2...
ваша тюрьма может быть похожа на эту:
[nginx-ban-bots]
port = http,https
logpath = /var/log/nginx/access_bad.log
backend = auto
filter =
# ban all but ignore 401 Unauthorized for empty user (: - :) and 404 (and 499 cancel request)...
failregex = ^\s*: <HOST> :(?: (?!40[14]|499)[45]\d{2} :| 401 : \d+ : \S* (?!: - :))
enabled = true
перезагрузите fail2ban и все боты исчезнут.
Подробнее о fail2ban / wiki / Best-Practice # Reduce-Parasiti c -log-traffi c.
Если ваша страница достаточно безопасна, так что вы можете сказать, «На нашей странице нет неработающих ссылок», поэтому у вас почти нет ошибок 404, умный трюк может также запретить крупномасштабных попыток вторжения на каждую несуществующую страницу.
Чтобы вы могли оставить комментарий или удалить директиву 404
в map $status ...
, а также удалить 4
из [14]
из файла fai lregex, и, возможно, увеличьте maxretry
(и findtime
), чтобы избежать ложных срабатываний.
При этой стратегии вам не нужно будет создавать все местоположения nginx для любых искусственных URL, чтобы соответствовать каждому попытки ботов (и это будет работать завтра, если список выгодных URL-адресов изменится) ... Вы также можете попробовать нашу новейшую версию fail2ban (0.11) с добавочным запретом, затем вы можете включить bantime.increment
и установить начальное значение bantime
на более низкое значение, например 30s
(для возможных ложных срабатываний), но все запреты известны как " плохие злоумышленники будут дольше с каждым следующим баном (после повторных попыток).