Jak mogę zablokować klienta użytkownika ze wszystkich stron na moim serwerze?


9

Pierwotnie napisałem to na webmasters.stackexchange.com , ale powiedziano mi, że otrzymam lepszy odbiór tutaj.


Przez ostatnie kilka dni cierpiałem na (prawdopodobnie nieumyślny) atak DDOS. Otrzymuję tak wiele żądań od agenta identyfikującego się jako „Mozilla / 4.0 (zgodny; ICS)”, że apache zjada całą dostępną pamięć.

W związku z tym chciałbym zablokować wszystkie żądania połączone z tym agentem użytkownika, więc próbowałem to zrobić w httpd.conf:

SetEnvIfNoCase User-Agent "Mozilla/4.0 (compatible; ICS)" bad_user
Deny from env=bad_user

Ale kiedy ponownie uruchamiam apache, narzeka na używanie denytutaj. Bez konieczności owijania go w blok locationlub directory, co oznaczałoby, że musiałbym dodać nowy blok dla każdej witryny, czy jest jakiś sposób, aby odmówić dostępu do całego serwera?


AKTUALIZACJA: Występuje błąd

  • Ponowne uruchamianie serwera WWW apache2
    Błąd składniowy w wierszu 4 pliku /etc/apache2/httpd.conf: odmowa niedozwolona tutaj [błąd]

Odpowiedzi:


7

Wygląda jak stare pytanie, ale chciałem zrobić to samo i znaleźć odpowiedź z nerwów powyżej. Nie jest tak, jak jest - wydaje mi się, że tak powinno być <Location "/">, i SetEnvIfpotrzebuje regularnego wyrażenia, więc nawiasy trzeba cytować.

To działało dla mnie, aby zastosować kontrolę dostępu na wszystkich vhostach:

SetEnvIfNoCase User-Agent "^Mozilla/4.0 \(compatible; Synapse\)" bad_ua
<Location "/">
    Deny from env=bad_ua
</Location>

Po prostu dołącz to przed definicjami vhosta.


(Dla odpowiednika w Apache 2.4) Zachowaj ostrożność, <Location>ponieważ zastępuje on wszelkie inne ograniczenia autoryzacji w <Directory>, chyba że dodasz AuthMerging And. Zobacz ostrzeżenie dotyczące bezpieczeństwa Requirew dokumentach apache: httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require
— Cedric Knight

4

mod_rewrite można skonfigurować na poziomie serwera zgodnie z dokumentacją:

RewriteCond %{HTTP_USER_AGENT} "Mozilla/4\.0 \(compatible; ICS\)" [nocase]
RewriteRule ^.*$ - [forbidden,last]

Nie zapomnij uciec od wyrażenia regularnego w RewriteCond


1
Uwaga: kreska nie jest prawdziwą kreską po skopiowaniu. Próbowałem edytować, ale SF będzie narzekać, że moja edycja jest zbyt mała. W każdym razie dzięki, działa uczta!
— Thibaut Barrère

@ ThibautBarrère, jeśli naprawdę potrzebujesz, możesz ominąć mały limit edycji, dodając niewidzialną <!-- -->do edycji
— hanshenrik

1

Pod warunkiem, że składnia w wierszach SetEnv jest poprawna, powinieneś być w stanie przekazać to w conf w następujący sposób:

<Location *>
SetEnvIfNoCase User-Agent "Mozilla/4.0 (compatible; ICS)" bad_user
Deny from env=bad_user
</Location>

Powinno to umożliwić działanie na wszystkich wirtualnych hostach - właśnie przetestowane w wersji 2.2.24, działało jak urok.


Jest to lepsze, ponieważ nie ma żadnych błędów, ale podczas fałszowania mojego agenta użytkownika nie odmawia mi się. Wiesz, dlaczego to może być?
— Tom Wright
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.