wtorek, 26 maja 2015

[APACHE] Allow, Deny - konfiguracja dostępu do katalogów

TRUE
2928057261481344895
Podczas pracy z serwerem Apache bardzo często spotkamy się z regułami Allow i Deny, które odpowiadają za ustawianie reguł dostępu do danego katalogu z zewnątrz. Reguły te można narzucać globalnie za pomocą głównego pliku konfiguracyjnego Apache'a, można także je nadpisywać w plikach .htaccess o ile na to zezwolimy. Reguły dostępu mają ściśle określoną składnię i warto się z nią zapoznać, aby móc wykorzystywać to w praktyce. Nie jest to trudne i ogranicza się w zasadzie do zrozumienia kilku podstawowych zasad. W tym krótkim artykule postaram się wyjaśnić na czym polega konfiguracja takich reguł, a także kiedy i jak należy je stosować.

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:
[code]
Order deny,allow
Deny from all
Allow from 127.0.0.1
[/code]
W pierwszej linijce mamy określoną kolejność przetwarzania reguły:
[code]Order deny,allow[/code]
gdzie:
  • deny - oznacza dostęp zabroniony
  • allow - oznacza przyznanie dostępu
Podana jest tutaj kolejność deny,allow - oznacza to, iż najpierw przetwarzane są reguły zabraniające dostępu, dopiero następnie reguły zezwalające na dostęp.
Aby to zrozumieć popatrzy dalej - w drugiej linijce:
[code]Deny from all[/code]
zabraniamy dostępu dla wszystkich,
aby po chwili w linijce trzeciej:
[code]Allow from 127.0.0.1[/code]
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ł:
[code]
Order allow,deny
Deny from all
Allow from 127.0.0.1
[/code]
Powyzsza reguła spowoduje, iż dostęp do katalogu zostanie zabroniony DLA WSZYSTKICH, nawet pomimo faktu, że najpierw podane mamy:
[code]Deny from all[/code]
a po nim przecież:
[code]Allow from 127.0.0.1[/code]
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:
[code]
Order allow,deny
Deny from all
Allow from 127.0.0.1
[/code]
zadziała to więc wg następującej kolejności:
  1. zezwalamy na dostęp dla 127.0.0.1
  2. zabraniamy dostępu dla każdego (a więc tym samym odbieramy go także dla adresu 127.0.0.1)
Ogólnia składnia prezentuje się więc następująco:
[code]Allow from adres/host[/code]
dla ustawienia dostępu, oraz:
[code]Deny from adres/host[/code]
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)
Zmienną ustawić możemy w następujący sposób:
[code]SetEnv NAZWA_ZMIENNEJ "wartość zmiennej"[/code]
np.
[code]SetEnv myServerName %{SERVER_NAME}[/code]
ustawi zmiennej myServerName wartość odpowiadającą nazwie naszego serwera.

Jak używać zmiennych w regułach dostępu?
Spójrzmy na przykład:
[code]
SetEnvIf User-Agent ^TopSecretBrowser set_access_to_me
Order deny,allow
Deny from all
Allow from set_access_to_me
[/code]
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:
[code]Allow from set_access_to_me[/code]
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ą:
[code]<?php $zmienna = getenv(NAZWA_ZMIENNEJ_APACHE); ?>[/code]

<Directory "/path/to">

W pliku httpd.conf możemy ustawić oddzielne reguły dla zadanych katalogów.
Robimy to za pomocą dyrektywy Directory, np.:
[code]
<Directory "/ścieżka/do/folderu">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
[/code]
gdzie /ścieżka/do/folderu to pełna ścieżka do katalogu, np.:
[code]/var/www/katalog[/code]
na Linuxach
lub:
[code]C:/WWW/katalog[/code]
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:
[code]AllowOverride[/code]
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
Możemy podać kilka wartości, oddzielonych spacjami, np.:
[code]AllowOverride FileInfo Limit[/code]
Przykładowo, poniższa konfiguracja zabroni nam na zmianę ustawień za pomocą pliku .htaccces w katalogu C:/WWW/katalog:
[code]
<Directory "C:/WWW/katalog">
AllowOverride none
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
[/code]
a poniższa zezwoli na takie działania:
[code]
<Directory "C:/WWW/katalog">
AllowOverride all
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
[/code]

REQUIRE ALL

W pliku konfiguracyjnym możemy się też spotkać z następującą dyrektywą:
[code]Require all granted[/code]
która działa tak samo jak:
[code]Allow from all[/code]
oraz:
[code]Require all denied[/code]
która działa tak samo jak:
[code]Deny from all[/code][/code]

Zapis:
[code]
<Directory "C:/WWW/katalog">
Require all granted
</Directory>
[/code]
będzie równoważny z:
[code]
<Directory "C:/WWW/katalog">
Allow from all
</Directory>
[/code]

Analogicznie sprawa wygląda z dyrektywą Deny.
Zapis:
[code]
<Directory "C:/WWW/katalog">
Require all denied
</Directory>
[/code]
będzie równoważny z:
[code]
<Directory "C:/WWW/katalog">
Deny from all
</Directory>
[/code]

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.

2 komentarze:

  1. Prosto, jasno, konkretnie, zrozumiale - dzięki bardzo za ten wpis. Rozjaśnił mi działanie reguł w serweru Apache.

    OdpowiedzUsuń
  2. Bardzo dziękuję. Ukłony.

    OdpowiedzUsuń

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji