Na wstępie musimy mieć świadomość, iż wszystko to co Apache udostępnia "na zewnątrz" może zostać skonfigurowane i określone wg zadanych mu reguł. Poprawna konfiguracja ma kluczowe znaczenie dla bezpieczństwa naszego serwera, a zasada "im mniej udostępniamy w świat, tym lepiej" ma tutaj bardzo duże znaczenie.
Złotą zasadą udostępniania aplikacji na zewnątrz jest wydzielenie odpowiedniej struktury logicznej naszego projektu i podzielenie jej na dwie sekcje: sekcję, która MUSI zostać udostępniona na zewnątrz - szablon strony, pliki CSS, skrypty .js, czy dołączane grafiki oraz na sekcję z właściwym kodem naszej aplikacji, do której po stronie klienta nie powinno być już dostępu. Warto bowiem zauważyć, że to co udostępnione jest klientowi != temu do czego dostęp ma serwer. Ograniczając udostępniane na zewnątrz zasoby, nie ograniczamy zatem naszej aplikacji, gdyż po stronie serwera ma ona wciąż dostęp do całości kodu ukrytego przed użytkownikiem. Przykładem moze być tutaj popularny framework Symfony, który na zewnątrz udostępnia jedynie folder web/, natomiast cała logika aplikacji znajduje się w folderach powyżej, nie udostępnionych przez WWW.
ORDER, DENY, ALLOW
To pierwsza kluczowa sprawa jaką należy zrozumieć.Popatrzmy na przykładową konfigurację dostępu do danego katalogu:
- Order deny,allow
- Deny from all
- Allow from 127.0.0.1
W pierwszej linijce mamy określoną kolejność przetwarzania reguły:
- Order deny,allow
gdzie:
- deny - oznacza dostęp zabroniony
- allow - oznacza przyznanie dostępu
Aby to zrozumieć popatrzy dalej - w drugiej linijce:
- Deny from all
zabraniamy dostępu dla wszystkich,
aby po chwili w linijce trzeciej:
- Allow from 127.0.0.1
zezwolić na dostęp jedynie z adresu 127.0.0.1, czyli tylko dla nas samych.
Określona wcześniej kolejność - deny, allow powoduje więc, że reguła allow niejako nadpisuje regułę deny.
Aby to lepiej zrozumieć, zamieńmy teraz kolejność przetwarzania reguł:
- Order allow,deny
- Deny from all
- Allow from 127.0.0.1
Powyzsza reguła spowoduje, iż dostęp do katalogu zostanie zabroniony DLA WSZYSTKICH, nawet pomimo faktu, że najpierw podane mamy:
- Deny from all
a po nim przecież:
- Allow from 127.0.0.1
Nie ma więc tutaj znaczenia w jakiej kolejności podajemy reguły, znaczenie ma jedynie słowo kluczowe Order i ustawiona za pomocą niego kolejność przetwarzania. W tym drugim przypadku, czyli:
- Order allow,deny
- Deny from all
- Allow from 127.0.0.1
zadziała to więc wg następującej kolejności:
- zezwalamy na dostęp dla 127.0.0.1
- zabraniamy dostępu dla każdego (a więc tym samym odbieramy go także dla adresu 127.0.0.1)
- Allow from adres/host
dla ustawienia dostępu, oraz:
- Deny from adres/host
dla zabronienia dostępu...
...gdzie w miejsce adres/host możemy podać:
- all - obowiązuje dla WSZYSTKICH adresów i hostów
- adres IP, np. 127.0.0.1
- wybrane adresy IP, np. 192.168.0.1 192.168.0.2 192.168.0.3 (oddzielamy je spacją)
- zakres adresów IP, np. 192.168.0.0/24 (jak korzystać z masek adresów opisane jest np. tutaj: http://www.dslreports.com/faq/15216)
- nazwę hosta lub hostów, np. localhost host2 host3... (tu trzeba zaznaczyć, że podajemy końcową nazwę hosta, np. podanie localhost zezwoli też na dostęp dla abc.localhost)
- zmienną, env=wartość zmiennej... (o tym poniżej)
- SetEnv NAZWA_ZMIENNEJ "wartość zmiennej"
np.
- SetEnv myServerName %{SERVER_NAME}
ustawi zmiennej myServerName wartość odpowiadającą nazwie naszego serwera.
Jak używać zmiennych w regułach dostępu?
Spójrzmy na przykład:
- SetEnvIf User-Agent ^TopSecretBrowser set_access_to_me
- Order deny,allow
- Deny from all
- Allow from set_access_to_me
Powyższa reguła sprawdza, czy przeglądarka identyfikuje się ciągiem zaczynającym się od TopSecretBrowser - jeśli tak to ustawia zmienną set_access_to_me.
Następnie:
- Allow from set_access_to_me
powoduje, iż w przypadku ustawionej zmiennej set_access_to_me zostaje nam przyznany dostęp.
Mały tip: do ustawionych w Apache'u zmiennych możemy odwołać się z poziomu PHP, za pomocą:
- <?php $zmienna = getenv(NAZWA_ZMIENNEJ_APACHE); ?>
<Directory "/path/to">
W pliku httpd.conf możemy ustawić oddzielne reguły dla zadanych katalogów.Robimy to za pomocą dyrektywy Directory, np.:
- <Directory "/ścieżka/do/folderu">
- Order deny,allow
- Deny from all
- Allow from 127.0.0.1
- </Directory>
gdzie /ścieżka/do/folderu to pełna ścieżka do katalogu, np.:
- /var/www/katalog
na Linuxach
lub:
- C:/WWW/katalog
na Windowsach.
Warto pamiętać, iż dana reguła dostępu działać będzie również na podkatalogi w katalogu, do którego ustawiamy dostęp, o ile oczywiście nie nadpiszemy tej reguły w danym podkatalogu.
.htaccess
Reguły takie umieszczać można także w plikach .htaccess.W przypadku takim - reguła obowiązywać będzie dla katalogu, w którym plik .htaccess z regułami się znajduje oraz dla jego podkatalogów (do momentu jej nadpisania przez inny .htaccess).
Plik .htaccess nadpisze wtedy ustawienia tutaj, zamieniając je na swoje własne.
Możliwość korzystania z pliku .htaccess w danym katalogu włączyć lub wyłączyć możemy za pomocą dyrektywy:
- AllowOverride
która może przyjąć kilka możliwych wartości:
- All - zezwala na nadpisywanie wszystkich opcji za pomocą .htaccess
- None - nie pozwala na nadpisywanie żadnych opcji
- FileInfo - pozwala na korzystanie w .htaccess z opcji dotyczących kontroli dokumentu, nagłówków, przekierowań, modułu rewrite itp. opcji
- AuthConfig - pozwala na korzystanie w .htaccess z opcji dotyczących autoryzacji, jak AuthName, AuthType itp.
- Limit - pozwala na ograniczanie dostępu w .htaccess, za pomocą poznanych właśnie Allow i Deny
- AllowOverride FileInfo Limit
Przykładowo, poniższa konfiguracja zabroni nam na zmianę ustawień za pomocą pliku .htaccces w katalogu C:/WWW/katalog:
- <Directory "C:/WWW/katalog">
- AllowOverride none
- Order deny,allow
- Deny from all
- Allow from 127.0.0.1
- </Directory>
a poniższa zezwoli na takie działania:
- <Directory "C:/WWW/katalog">
- AllowOverride all
- Order deny,allow
- Deny from all
- Allow from 127.0.0.1
- </Directory>
REQUIRE ALL
W pliku konfiguracyjnym możemy się też spotkać z następującą dyrektywą:
- Require all granted
która działa tak samo jak:
- Allow from all
oraz:
- Require all denied
która działa tak samo jak:
- Deny from all
Zapis:
- <Directory "C:/WWW/katalog">
- Require all granted
- </Directory>
będzie równoważny z:
- <Directory "C:/WWW/katalog">
- Allow from all
- </Directory>
Analogicznie sprawa wygląda z dyrektywą Deny.
Zapis:
- <Directory "C:/WWW/katalog">
- Require all denied
- </Directory>
będzie równoważny z:
- <Directory "C:/WWW/katalog">
- Deny from all
- </Directory>
W przypadku ustawieniu braku dostępu do katalogu, serwer zwraca do klienta nagłówek z kodem 403 oraz domyślnie wyświetla użytkownikowi komunikat:
Forbidden
You don't have permission to access / on this server.No i to tyle odnośnie podstawowej kontroli dostępu do katalogów w serwerach Apache. W następnych artykułach dowiemy się trochę więcej, a także nauczymy się korzystać z autoryzacji przy dostępie do katalogów.
Prosto, jasno, konkretnie, zrozumiale - dzięki bardzo za ten wpis. Rozjaśnił mi działanie reguł w serweru Apache.
OdpowiedzUsuńBardzo dziękuję. Ukłony.
OdpowiedzUsuń