Nasz sponsor:
O serwisie | Baza domen | Secondary | TLD | FAQ | Literatura | Propaganda | Mapa serwisu | Kontakt
Strona g?ówna :: Literatura  

Ten tekst można by zawrzeć w jednym zdaniu: nie wymagaj od Apache korzystania z DNS gdy przetwarza pliki konfiguracyjne. Jeśli Apache musi jednak użyć DNS w tym celu, to możesz mieć różne problemy ze swoim serwerem (może nawet się nie uruchomić), być wystawionym na ataki typu denial lub theft of service (włączając możliwość przechwycenia odwiedzin od innych użytkowników).

Prosty przykład: przyjrzyj się poniższemu fragmentowi:
<VirtualHost www.abc.com>
ServerAdmin webgirl@abc.com
DocumentRoot /www/abc
</VirtualHost>

Apache do poprawnego działania bezwzględnie wymaga dwóch informacji o każdym virtualhoście: ServerName oraz co najmniej jednego adresu IP na którym serwer odpowiada. Ten przykład nie zawiera adresu IP, więc Apache musi użyć DNS aby znaleźć adres domeny www.abc.com. Jeśli z jakiegokolwiek powodu DNS nie jest dostępny w momencie gdy serwer przetwarza pliki konfiguracyjne, to dany virtualhost nie będzie skonfigurowany. Nie będzie w stanie odpowiadać na żadne odwołania do swojego adresu (wersje Apache do 1.2 nawet się nie uruchomią).

Załóżmy, iż domena www.abc.com ma adres 10.0.0.1.
Spójrzmy wówczas na ten przykład:
<VirtualHost 10.0.0.1>
ServerAdmin webgirl@abc.com
DocumentRoot /www/abc
</VirtualHost>

Teraz Apache musi użyć zwrotnego DNS aby znaleźć wartość ServerName dla tego virtualhosta. Jeśli badanie domeny odwrotnej nie powiedzie się, to częściowo wyłączy to dany virtualhost (wersje Apache do 1.2 nawet się nie uruchomią). Jeśli dany virtualhost jest oparty na nazwie to uniemożliwi mu to całkowicie działanie, lecz jeśli jest związany jedynie z adresem IP to będzie raczej działać. Jednakże jeśli Apache będzie musiał wygenerować pełen URL dla serwera który zawiera w sobie tę nazwę domenową, to nie będzie w stanie tego dokonać.

Oto przykład który rozwiązuje oba z tych problemów.
<VirtualHost 10.0.0.1>
ServerName www.abc.com
ServerAdmin webgirl@abc.com
DocumentRoot /www/abc
</VirtualHost>

Denial of Service

Są (przynajmniej) dwie formy ataku które mogą zostać użyte w tym przypadku. Jeśli posiadasz wersję Apache 1.2 lub wcześniejszą to Twój serwer nawet się nie uruchomi jeśli zapytanie o którąkolwiek z domen w virtualhostach się nie powiedzie.
W niektórych przypadkach owe zapytania DNS mogą nawet nie być pod Twoją kontrolą. Na przykład jeśli abc.com należy do jednego z Twoich klientów i kontrolują oni swój DNS, to mogą zmusić Twój serwer (w wersji 1.2 lub niższej) do nie uruchomienia się przez zwykłe usunięcie rekordu www.abc.com.

Inna metoda jest znacznie bardziej podstępna.
Przyjrzyj się temu przykładowi:
<VirtualHost www.abc.dom>
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
</VirtualHost>

<VirtualHost www.def.dom>
ServerAdmin webguy@def.dom
DocumentRoot /www/def
</VirtualHost>

Przyjmijmy, że przypisałeś 10.0.0.1 do www.abc.com oraz 10.0.0.2 do www.def.com. Dodatkowo załóżmy, iż def.com ma kontrolę nad ich własnym DNSem. Z taką konfiguracją umożliwiłeś def.com przejęcie całego ruchu do abc.com. Aby tego dokonać wystarczy, iż ustawią dla domeny www.def.com adres 10.0.0.1. Ponieważ kontrolują swój DNS nie możesz ich powstrzymać od ustawienia dla www.def.com adresu jaki tylko chcą.

Zapytania przychodzące na adres 10.0.0.1 (włączając wszystkie gdzie URL został wpisany w formie http://www.abc.com/cokolwiek) będą obsługiwane przez virtualhost def.com. Dla lepszego zrozumienia dlaczego tak się dzieje należy znać zasady w jaki sposób Apache porównuje przychodzące zapytania z virtualhostami które je obsłużą.
Dokument opisujący to jest dostępny pod tym adresem.

Adres "głównego serwera"

Dodanie virtualhostów opartych na nazwie w Apache 1.1 wymaga od Apache znajomości adresu(ów) IP hosta na którym działa httpd. Aby uzyskać ten adres używa się zmiennej globalnej ServerName (jeśli obecna) lub wywołania funkcji C gethostname() (która powinna zwrócić to samo co wpisanie "hostname" w linii poleceń). Wówczas wykonuje się sprawdzenie DNS dla tego adresu. Aktualnie nie ma sposobu aby to ominąć.

Jeśli obawiasz się, iż to zapytanie może się nie powieść, gdyż Twój serwer DNS nie działa, to możesz umieścić nazwę hosta w pliku /etc/hosts (gdzie prawdopodobnie już ją masz, aby maszyna mogła się prawidłowo uruchomić). Następnie upewnij się, że Twój system jest prawidłowo skonfigurowany aby używał tego pliku w razie gdyby DNS zawiódł. W zależności od systemu jakiego używasz należy to zrobić edytując /etc/resolv.conf lub ewentualnie /etc/nsswitch.conf

Jeśli Twój serwer nie musi przeprowadzać zapytań DNS z żadnego innego powodu, to możesz uruchomić Apache ze zmienną systemową HOSTRESORDER ustawioną na "local". Zależy to od systemu i bibliotek których używasz. Ma to wpływ również na CGI o ile nie używasz mod_env aby kontrolować ich środowisko.
Najlepiej jest zajrzeć do podręcznika man lub FAQ-ów dla swojego systemu.

Porady aby uniknąć tych problemów:
  • Uzywaj adresów IP w <VirtualHost>
  • Używaj adresów IP w Listen
  • Używaj adresów IP w BindAddress
  • Upewnij się, że wszystkie virtual hosty mają jednoznaczne ServerName.
  • Stwórz <VirtualHost _default_:*> który nie obsługuje żadnych stron.
© 2001-2010 www.domeny.org.pl   Historia serwisu | Polityka ochrony prywatności