|
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.
|