Apache – listen only on specific domain, not IP address

By | 31/12/2022

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:

Apache - listen only on specific domain

Zdroj:

[1] https://serverfault.com/questions/583884/apache-listen-only-on-specific-domain-not-ip

Dobrovolný dar

Ahoj čtenáři, rád bych tě poprosil aby ses zamyslel, co je vše potřeba ke vzniku článku.
Jakožto amatérský softwarový kutil musím:

1) Nejdříve vše nastudovat v cizích jazycích.
2) Vše následně prakticky vyzkoušet.
3) Svoje poznatky a zkušenosti napsat do článku který si právě přečetl v jazyku kterému rozumíš.
4) Dát článku hlavu a patu a publikovat.

Každý článek zabere několik hodin práce, za kterou mi nikdo neplatí.
Prosím zvaž, kolik času jsem ti právě ušetřil.
Pokud ti to stojí aspoň za cenu jedné kávy, tak mi ji kup.
Předem moc děkuji.

Příspěvek tak můžeš provést zasláním libovolné částky na mé číslo účtu 1558701011/3030 Nebo můžeš dar poslat kliknutím na tento odkaz Podpořit tento WEB , který tě přesměruje na mou platební bránu Revolut.

Dar je také možné poslat ve formě Bitcoinu na BTC peněženku bc1qqdf5fp42a7srwwhh2rut8zr9x4jm5c8fqc9qw6

Veškeré peněžní prostředky budu také používat na zlepšení kvality své webové tvorby a na psaní nových technických návodů. Za každý dar předem děkuji.

Leave a Reply

Your email address will not be published. Required fields are marked *