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
Najnowsza wersja tego opracowania jest dostępna pod adresem:
http://bofh.vt.pl
Dodatkowe informacje można uzyskać kontaktując się z autorem:
Łukasz Tomaszewski