Last Updated on 05/01/2023 by administrator
Apache – listen only on specific domain, not IP address
Apache – listen only on specific domain, not IP address
Motivace:
Webový server jedoucí pod službou Apache2, lze nastavit tak, aby odpovídal jen na doménové jméno a ne na jeho IP adrese zadanou v prohlížeči.
Jak je to myšleno? Praxi to funguje tak, že např. webový server https://test.cz má přiřazenou veřejnou IP adresu 185.175.8.140. To znamená, že se lze dostat na webový server pod https://185.175.8.140, což lze zadat v prohlížeči.
Pro útočníka je mnohem jednoduší provést sken nějakého rozsahu IP adres, než uhodnout doménové jméno příslušného serveru. Díky tomu, že je pro útočníka těžší zjistit doménové jméno serveru se také zvýší jeho bezpečnost.
Důvodem vypnutí bylo hlavně to, že jsem si všiml, že nějaký bot posílá TCP SYN požadavky, které ani nevypadaly jako DoS útok, ale po hlubším prozkoumání bylo zjištěno, v logu Apache, že si bot proskenoval celou stránku WordPress a začal posílat GET požadavky na jednotlivé soubory ve WordPressu. To stále vytěžovalo CPU serveru a tím pádem webový server odpovídal jiným uživatelům pomaleji.
OS:
Implementace byla prováděna na Debian GNU/Linux 11 (bullseye) a verzi Apache 2.4.54. Postup bude podobně aplikovatelný všechny Debian-base distribuce a verze Apache 2.4.x
Implementace:
Webové stránky WordPress jsou obluhované službou Apache v souboru wordpress.conf ve složce /etc/apache2/sites-available/ (může se jednat ale i o jiný konfigurační soubor ve stejné složce):
vi /etc/apache2/sites-available/wordpress.conf
V souboru wordpress.conf přidat úplně nahoru kód níže:
<VirtualHost *:80> ServerName catchall <Location /> Order allow,deny Deny from all </Location> </VirtualHost> <VirtualHost *:443> ServerName catchall <Location /> Order allow,deny Deny from all </Location> </VirtualHost>
Celý konfigurační soubor wordpress.conf může vypadat takto:
<VirtualHost *:80> ServerName catchall <Location /> Order allow,deny Deny from all </Location> </VirtualHost> <VirtualHost *:443> ServerName catchall <Location /> Order allow,deny Deny from all </Location> </VirtualHost> <VirtualHost *:80> UseCanonicalName Off ServerAdmin webmaster@localhost DocumentRoot /var/www/wordpress ServerName test.cz </VirtualHost> <VirtualHost *:443> SSLEngine on ServerAdmin webmaster@localhost DocumentRoot /var/www/wordpress ServerName test.cz </VirtualHost> <Directory /var/www/wordpress> Options +FollowSymLinks Options -Indexes AllowOverride All order allow,deny allow from all </Directory>
Provést restart služby apache2:
sudo systemctl restart apache2
Jak to funguje? Kód výše ukazuje koncept virtualhostů. Jedná se o způsob, jak provozovat více webů (virtuálních webů) na jednom stroji pod jedinou IP adresou. Server podle příchozího požadavku od uživatele HTTP GET v poli Host pozná, o jaký web se jedná.
Apache čte konfigurační soubor wordpress.conf jako knížku. V kódu výše je definován webový server test.cz, čili když nějaký uživatel zadá přes prohlížeč webovou stránku test.cz, Apache ho nasměruje do složky /var/www/wordpress a zobrazí se mu obsah webu. Všechny ostatní požadavky od uživatele HTTP GET v poli Host, které neodpovídají parametru ServerName v souboru wordpress.conf, budou zakázány a webová stránka napíše uživatelům „Forbidden – You don’t have permission to access this resource.„a to včetně IP adresy, na které naslouchá webový server. To definuje v kódu parametr Deny from all.
Výsledek zobrazení v prohlížeči pak vypadá takto:
Zdroj:
[1] https://serverfault.com/questions/583884/apache-listen-only-on-specific-domain-not-ip