Saturday 30 December 2006

Autoryzacja dostępu do serwera proxy we FreeBSD

© 2003-03-05 Łukasz Tomaszewski ver. 1.0

WSTĘP

Do czego służy Squid? W poniższym artykule starałem się przedstawić sposoby autoryzacji użytkowników korzystających z serwera proxy w oparciu o program Squid (w wersji 2.5). Jego autorami są Certyfikowani Deweloperzy Squid'a. Potrzeba autoryzacji bardzo często ma miejsce w przedsiębiorstwach. Dzięki autoryzacji możemy zaplanować politykę dostępu do Internetu, co w konsekwencji ułatwi nam również monitorowanie ruchu i tworzenie statystyk używania sieci przez użytkowników (pracowników).

INSTALACJA

W pierwszym kroku należy zainstalować Squida. Dzięki wbudowanemu, we FreeBSD, mechanizmowi portów (/usr/ports) instalacja programu nie powinna przysporzyć większych problemów. Wystarczy wykonać poniższe czynności a program zostanie, po samoczynnym ściągnięciu źródeł z Internetu, automatycznie skompilowany i zainstalowany:
$/> cd /usr/ports/www/squid
$/usr/ports/www/squid> make install clean
W poniższych przykładach opisałem również metody autoryzacji z wykorzystaniem serwera SMB. Jeżeli zdecydujemy się na użycie jednej z nich, konieczne będzie zainstalowanie także serwera Samby. Wykonajmy poniższe czynności:
$/> cd /usr/ports/net/samba
$/usr/ports/net/samba> make install clean
Należy podkreślić, że po wykonaniu powyższych czynności należy jeszcze poprawnie skonfigurować i uruchomić każdy program. W tym celu proponuję skorzystać z dokumentacji zamieszonej na stronach www (odpowiednio): www.squid-cache.org i www.samba.org.

Moduły autoryzujące

Wraz ze źródłami Squida dostarczanych jest kilka modułów autoryzujących, przykładowo: ncsa, msnt, smb, ntlm, winbind i inne. Aby móc autoryzować użytkowników należy skompilować i zainstalować jeden z powyższych modułów autoryzacji. Następnie musimy wskazać Squidowi, którego z autoryzujących programów ma używać. W tym celu podajemy w pliku konfiguracyjnym Squida nazwę programu oraz dodatkowe polecenia, jeśli jest to potrzebne. Autoryzacja dokonywana jest poza głównym procesem Squida. W chwili uruchomienia Squida, tworzy on kilka autoryzujących podprocesów, które odpowiadają za czytanie nazw użytkowników i haseł na standardowym wejściu (stdin), a następnie podają odpowiedź "OK" lub "ERR" na standardowe wyjście (stdout). Uwaga! W przypadku autoryzowania użytkowników serwer proxy nie może pracować w trybie transparentnym. ncsa_auth ncsa_auth jest jednym z modułów służącym do autoryzacji. Jeśli, podczas instalacji Squida, nie został on dodany automatycznie należy go zainstalować "ręcznie". Źródła programu można znaleźć w pliku z dystrybucją Squida (w katalogu - ../helpers/basic_auth/NCSA). Aby zainstalować program wpisz:
$/> make && make install && make clean
Jeśli program jest już zainstalowany w systemie następnym krokiem, który należy wykonać, jest stworzenie pliku z hasłami. W tym celu możemy użyć programu htpasswd, dostarczanego razem z serwerem Apache. Sam program można pobrać z http://www.squid-cache.org/htpasswd. Dla leniwych: możliwe jest wygenerowanie pliku z hasłem korzystając ze strony http://www.php.co.ba/index.php?action=htaccess. Przetestujmy teraz poprawność działania modułu:
$/> cd /usr/local/libexec
$/usr/local/ libexec> ./ncsa_auth /ścieżka/do/pliku/z/hasłami
Wpisujemy nazwę użytkownika oraz hasło. Jeśli podaliśmy prawidłowe dane program zwróci OK - w przeciwnym wypadku ERR. Zakładając, że program działa prawidłowo, do pliku konfiguracyjnego Squida należy dodać poniższe linie:
auth_param basic program /usr/local/libexec/ncsa_auth /ścieżka/do/pliku/z/hasłami
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic realm Squid proxy-caching web server
Ostatnim krokiem, który należy wykonać, jest dodanie poprawnych wpisów ACL (Access Control List - lista kontroli dostępu) do pliku konfiguracyjnego Squida - squid.conf:
acl AuthorizedUsers proxy_auth REQUIRED
http_access allow AuthorizedUsers
http_access deny all
Teraz uruchamiamy Squida z nowymi ustawieniami:
$/> squid -k shutdown
$/> squid
msnt_auth msnt_auth pozwala na autoryzacje użytkowników wielu domen. Źródła programu można znaleźć w pliku z dystrybucją Squida (w katalogu -../helpers/basic_auth/MSNT). Aby zainstalować program wpisz:
$/> make && make install && make clean
W tym momencie wszystkie potrzebne składniki powinny znajdować się w systemie. Teraz możemy przejść do konfiguracji programu. W katalogu /usr/local/etc/squid powinien znajdować się plik msntauth.conf, który należy wyedytować. Przykładowa konfiguracja może wyglądać następująco:
# Sample MSNT authenticator configuration file
# Antonino Iannella, Stellar-X Pty Ltd
# Tue Sep 26 17:26:59 CST 2000

server   wilk  szakal  vtest
#server  my_PDC  my_BDC  my_NTdomain
#server  other_PDC other_BDC otherdomain

#denyusers /usr/local/etc/squid/denyusers
allowusers /usr/local/etc/squid/allowusers
Przynajmniej jeden serwer musi być zdefiniowany, aby program msnt_auth się uruchomił. W przypadku, gdy nie posiadamy zapasowego kontrolera domeny BDC, należy zamiast niego podać nazwę serwera PDC. Następnie musimy dodać odpowiednie wpisy do pliku /etc/hosts (pamiętajmy o kropce na końcu pliku!). Przykładowy plik hosts może wyglądać tak:
#Przykładowy plik /etc/hosts
127.0.0.1 localhost
192.168.1.1 wilk PDC.
Teraz kolej na określenie użytkowników posiadających dostęp do Squida. W przykładzie używany jest jedynie plik allowusers, dlatego też należy stworzyć plik o takiej nazwie w katalogu /usr/local/etc/squid. Do pliku dodajemy nazwy użytkowników, którzy mają posiadać dostęp do proxy. Pamiętajmy, że w przypadku użycia dwóch plików (allowusers i denyusers) w pierwszej kolejności sprawdzany jest ten drugi. Jeśli nazwa użytkownika pojawi się w tym pliku, nie otrzyma on dostępu do proxy, nawet w przypadku gdyby użytkownik był wpisany do pliku allowusers. Jeśli nazwa użytkownika nie pojawi się w obydwu plikach, nie otrzyma on w ogóle dostępu. Ostatecznie jeśli plik allowusers będzie pusty, wszyscy użytkownicy otrzymają dostęp do proxy. Możemy teraz przetestować poprawność działania modułu:
$/> cd /usr/local/libexec
$/usr/local/ libexec> ./msnt_auth
Wpisujemy nazwę użytkownika oraz hasło. Jeśli podaliśmy prawidłowe dane program zwróci OK - w przeciwnym wypadku ERR. Dodajemy teraz do pliku konfiguracyjnego Squida poniższe linie:
auth_param basic program /usr/local/libexec/msnt_auth
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic realm Squid proxy-caching web server

acl AuthorizedUsers proxy_auth REQUIRED
http_access allow AuthorizedUsers
http_access deny all
Następnie uruchamiamy Squida z nowymi ustawieniami:
$/> squid -k shutdown
$/> squid
smb_auth Kolejnym modułem służącym do autoryzacji jest smb_auth. Dzięki smb_auth można uwierzytelniać użytkowników i grupy poprzez serwer SMB taki jak Windows NT lub Samba. Rozpocznijmy od konfiguracji Samby. Musimy pamiętać aby kontrola dostępu odbywała się na poziomie domeny. W ten sposób Samba będzie działała jako członek domeny Windows. Aby to wykonać należy dodać do sekcji [global] pliku konfiguracyjnego Samby następujące wpisy:
workgroup = vtest
netbios name = owca
security = domain
password server = wilk
Następnie należy skonfigurować serwer PDC i BDC (o ile istnieje) do prawidłowej pracy z modułem smb_auth. W tym celu tworzymy w udziale [netlogon] plik o nazwie proxyauth, w którym umieszczamy słowo "allow". W kolejnym kroku przyznajemy uprawnienia do czytania tego pliku użytkownikom i/lub grupom, które mają posiadać dostęp do proxy. Jeśli dostęp ma być realizowany dla wielu domen, należy umieścić plik i ustawić prawa dostępu na każdym kontrolerze domeny. Następnie do pliku konfiguracyjnego Squida dodajemy poniższe linie:
auth_param basic program /usr/local/bin/smb_auth -W domain -U PDCip
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic realm Squid proxy-caching web server
Teraz możemy przetestować konfigurację:
$/> cd /usr/local/bin
$/usr/local/bin> ./smb_auth -W vtest -d
Wpisujemy nazwę użytkownika oraz hasło. Na ekranie powinny wyświetlić się poniższe informacje diagnostyczne:
nazwa_użytkownika hasło
Domain name: vtest
Pass-through authentication: no
Query address options:
Domain controller IP address: IP.ADD.RRE.SS
Domain controller NETBIOS name: wilk
Contents of //wilk/netlogon/proxyauth: allow
OK
Oczywiście w przypadku podania nieprawidłowej nazwy użytkownika lub hasła, program zwróci wartość ERR zamiast OK. W konsekwencji użytkownik nie dostanie uprawnień do korzystania z serwera proxy. Ostatnim krokiem, który należy wykonać, jest dodanie poprawnych wpisów ACL (Access Control List - lista kontroli dostępu) do pliku konfiguracyjnego Squida - squid.conf:
acl AuthorizedUsers proxy_auth REQUIRED
http_access allow AuthorizedUsers
http_access deny all
Teraz uruchamiamy Squida z nowymi ustawieniami:
$/> squid -k shutdown
$/> squid
Dzięki konfiguracji praw dostępu bezpośrednio z poziomu kontrolera domeny, można autoryzować także grupy. Ma to duże znaczenie w przypadku dużej ilości użytkowników. Zamiast dodawać wiele wpisów acl do pliku squid.conf należy nadać uprawnienia do czytania pliku proxyauth odpowiednim grupom. winbind Powyższe sposoby autoryzacji mają zasadniczą wadę. Każdorazowo, podczas uruchomienia przeglądarki www, użytkownikowi pojawia się okno (tzw. pop-up window), w którym należy podać właściwą nazwę użytkownika oraz hasło. Warto więc przyjrzeć się innemu programowi, dzięki któremu możemy autoryzować użytkowników transparentnie (transparentna autoryzacja dokonywana jest jedynie przy korzystaniu z przeglądarki Microsoft Internet Explorer. W innych przypadkach (Netscape, Mozilla, Opera) pojawi się standardowe okno pop-up). Do poprawnej pracy systemu należy zainstalować Sambę razem z winbindem. W tym celu musimy skompilować źródła z dodatkowymi opcjami: --with-winbind oraz -with-winbind-auth-challenge. Następnie skonfigurujmy Sambę tak, aby kontrola dostępu odbywała się na poziomie domeny. W ten sposób Samba będzie działała jako członek domeny Windows (trzeba pamiętać o dodaniu konta zaufania na kontrolerze domeny PDC). Należy dodać również opcje odpowiedzialne z konfiguracje winbinda. Do sekcji [global] pliku konfiguracyjnego Samby dodajmy więc następujące wpisy:
workgroup = vtest
netbios name = owca
security = domain
password server = wilk
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind use default domain = yes
Wygodnym sposobem jest również skonfigurowanie Samby tak, aby automatycznie logowała się do domeny (można o tym przeczytać w Samba FAQ). Połączmy się z domeną. Aby to wykonać wykonajmy polecenie:
$/> smbpasswd -j vtest -r wilk -U Administrator
Musimy uruchomić demona winbindd oraz sprawdźić czy konto zaufania działa poprawnie:
$/> wbinfo -t
Secret is good
Przetestujmy autoryzację użytkownika poprzez winbindd:
$/> wbinfo -a vtest\\nazwa_użytkownika%hasło
plaintext password authentication succeeded
error code was NT_STATUS_OK (0x0)
challenge/response password authentication succeeded
error code was NT_STATUS_OK (0x0)
Obydwie metody autoryzacji powinny zwrócić wartość "succeeded". Mając poprawnie skonfigurowaną Sambę możemy przystąpić do konfiguracji Squida. Aby Squid mógł poprawnie autoryzować użytkowników poprzez winbind, musi zostać skompilowany z poniższymi opcjami:
 --enable-auth="ntlm,basic"
 --enable-basic-auth-helpers="winbind"
 --enable-ntlm-auth-helpers="winbind"
Zanim przejdziemy dalej, sprawdźmy poprawność działania Squida bez żadnych autoryzacji. Kolejnym krokiem jaki wykonamy będzie sprawdzenie działania modułu winbind (dokonamy sprawdzenia trybu basic):
$/> /usr/local/libexec/wb_auth -d
/wb_auth[65180](wb_basic_auth.c:136): basic winbindd auth helper ...
mydomain\myuser mypasswd                  
/wb_auth[65180](wb_basic_auth.c:107): Got 'mydomain\myuser mypasswd' from squid (length: 24).
/wb_auth[65180](wb_basic_auth.c:54): winbindd result: 0
/wb_auth[65180](wb_basic_auth.c:57): sending 'OK' to squid
OK
Jeśli podamy prawidłowe dane, powinniśmy otrzymać rezultat OK. Ostatnim etapem, który nam pozostał, jest dodanie poniższych opcji do pliku konfiguracyjnego squid.conf:
auth_param ntlm program /usr/local/libexec/wb_ntlmauth
auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes

auth_param basic program /usr/local/libexec/wb_auth
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

acl all src 0.0.0.0/0.0.0.0
acl AuthorizedUsers proxy_auth REQUIRED
http_access allow all AuthorizedUsers
Powyższy przykład autoryzuje każdego użytkownika zalogowanego do domeny. Jeśli jednak chcemy zezwolić wybranym osobom korzystać z proxy, zamiast opcji REQUIRED możemy podać listę użytkowników w postaci nazwa_domeny\nazwa_użytkownika, na przykład:
acl AuthorizedUsers proxy_auth vtest\admin

Dodatkowe informacje można uzyskać kontaktując się z autorem: Łukasz Tomaszewski

No comments: