SQUID czyli WWW PROXY pod linuxem.

Transkrypt

SQUID czyli WWW PROXY pod linuxem.
mgr Artur Ejsmont
SQUID czyli WWW PROXY pod linuxem.
1. Wstęp
WWW PROXY jest serwerem pośredniczącym w komunikacji między przeglądarką klienta i
serwerem WWW. Serwery tego typu mogą pełnić szereg funkcji między innymi:
–
–
–
–
–
–
–
–
Cache stron www oraz plików będących elementami stron, głównie obrazki i animacje flash.
Pozwala to na bardziej wydajne wykorzystanie łącza zewnętrznego w przypadku często
odwiedzanych serwisów i dużej liczby klientów w naszej sieci.
Blokowanie dostępu do pojedynczych serwisów lub tworzenie reguł na nazwy domen itd
Cache serwerów FTP w celu przyspieszenia pobierania plików i zmniejszenia ruchu.
Możliwość udostępniania tylko poszczególnych serwisów lub tworzenie zasad które
zezwolą na dostęp do serwisów o określonej tematyce.
Możliwość ściślejszego blokowania ruchu w sieci IP z firmy na zewnątrz.
Praca jako niewidzialny proxy (wymuszenie by cały ruch www naszej sieci przechodził
przez proxy). Nie jest to jednak zalecana metoda ze względu na częste problemy.
Praca jako serwer zmniejszający obciążenie serwera WWW buforując jednocześnie pliki
które nie muszą być generowane przez serwer zmniejszając jego obciążenie. Proxy może
nawet uczestniczyć w równoważeniu obciążenia kierując żądania http do kilku serwerów na
przemian.
Rozszerzanie funkcjonalności poprzez dodatkowe moduły filtrujące zawartość jak antyvirus
czy poszukiwanie programów szpiegowskich.
Serwery proxy działają jako pośrednik. Pobierają żądanie HTTP analizują je tak jakby było
skierowane do nich a następnie jeśli zezwalają na to reguły zabezpieczeń nawiązują połączenie z
serwerem www i pobierają żądane pliki.
Serwer proxy może pracować w trybie normalnym lub transparentnym (niewidoczny proxy).
–
–
W pierwszym przypadku proxy jest zwykłym serwerem w sieci (lokalnej lub nie to nie ma
znaczenia). Korzystają z niego wyłącznie komputery które mają wpisany jego adres w
ustawieniach przeglądarek i innych programów klienckich (np download managery jak
getright czy fdm). Serwer nie uczestniczy jednak w żadnych innych połączeniach. Taki
serwer proxy może stać w sieci lokalnej lub w dowolnym miejscu na świecie. Może być tak
że kożystamy z serwera proxy w naszej firmie by ograniczyć ilość danych przesyłanych
przez naszą sieć lub możemy np. korzystać z dużo większego serwera proxy znajdującego
się w naszym mieście by poprawić szybkość transferu z resztą świata (im bardziej
uczęszczany serwer proxy tym więcej stron buforuje i może potencjalnie przyśpieszyć nasze
surfowanie).
Transparentne proxy działa nieco inaczej. Sam serwer proxy działa podobnie jednak z tą
różnicą że cały ruch www jest przekierowywany do serwera proxy. Oznacza to przeważnie
modyfikacje reguł firewalla polegającą na przekierowaniu wszelkich połączeń z portem 80
do serwera proxy. Ponadto konfiguracja serwera proxy jest zmieniana tak by przyjmował
Materiały do zajęć przygotował Artur Ejsmont.
1/8
żądania pomimo że nie są do niego adresowane.
Transparentne proxy wydaje się kuszące ponieważ buforowane będą zarówno pliki pobierane
przez przeglądarki klientów którzy odpowiednio je skonfigurowali jak i przez wszystkich innych. To
samo dotyczy innych aplikacji (download managerów itd). Należy jednak pamiętać iż od pewnego
czasu coraz więcej aplikacji używa portu 80 do przesyłania swoich danych. Należy więc ostrożnie
konfigurować niewidoczne proxy by nie zablokować dostępu do przypadkowych usług. Należy też
zachować ostrożność co do poprawnego buforowania by serwer nie podawał starych plików.
Użycie transparentnego proxy może być korzystne w większych sieciach, tam gdzie nie mamy
dostępu do komputerów klientów oraz gdy chcemy bardzo restrykcyjnie ograniczać dostęp do stron
www (np w firmie gdzie działanie programow peer to peer jest wręcz niewskazane).
2. Ustawienie klienta (przeglądarka)
Jeśli nie używamy transparentnego proxy przeglądarka będzie zawsze łączyć się bezpośrednio z
serwerami WWW. Aby powiedzieć jej że powinna skorzystać z serwera proxy musimy zmodyfikować
jej ustawienia.
–
Aby skonfigurować IE wybieramy narzędzia -> opcje internetowe -> połączenia ->
ustawienia sieci lan -> użyj serwera sieci LAN -> zaawansowane
–
Aby skonfigurować Mozilla firefox wybieramy: tools -> options -> general -> connection
settings
W naszych ćwiczeniach będziemy konfigurować przeglądarkę tak by serwerem proxy był adres
IP komputera naszego kolegi a portem domyślny port 3128.
3. Serwer SQUID
Urochomienie i zatrzymanie serwera w naszym knoppixie wykonujemy za pomocą poleceń:
/etc/init.d/squid start
/etc/init.d/squid stop
W przypadku gdy nasz serwer nie będzie chciał się zatrzymać możemy śmiało wykonać:
killall squid
Plik konfiguracyjny serwera:
/etc/squid/squid.conf
Katalog cache z plikami stron oraz inną zawartością keszowaną przez serwer znajdziemy
domyślnie w katalogu:
/var/spool/squid
Serwer posiada też domyślnie angielskie strony błędów. Strony te wyświetlane są w przypadku
Materiały do zajęć przygotował Artur Ejsmont.
2/8
braku dostępu do serwera, niepoprawnej nazwy domenowej, zabronionego dostępu itd. Strony te
możemy zmodyfikować i dostosować do naszych potrzeb. Pliki znajdują się w katalogu:
/usr/lib/squid/errors/English
Serwer posiada domyślne pliki w języku polskim. Możemy więc zmienić ścieżkę do plików z
komunikatami o błędach zmieniając parametr error_directory a następnie modyfikując polską wersję
komunikatów.
Plik konfiguracyjny jest strasznie wielki więc powinniśmy używać wyszukiwania w tekście by
odnajdywać pożądane parametry i wpisywać ich wartości zaraz pod opisem parametru. Nie jest dobrą
praktyką wpisywanie wartości na początku pliku bo łatwo pogubić się w tym co jest gdzie ustawione.
Do wyświetlenia aktualnej konfiguracji przyda nam się polecenie filtrujące plik np.:
cat /etc/squid/squid.conf |grep -e "^[^#]" | less
Polecenie to listuje zawartość pliku i wybiera tylko niepuste wiersze które nie zaczynają się od
znaku komentarza. Pozwoli to na skuteczne sprawdzenie jakie parametry są ustawione (jak widać
wszystko jest pozostawione z wartościami domyślnymi. Dodano jedynie trochę reguł acl (o nich za
chwilę). Zawartość będzie można przewijać w górę i dół ponieważ wynik przekazaliśmy do polecenia
less. Przeglądanie zakończymy przyciskiem escape.
Serwer squid nie posiada manuala dla swojego pliku konfiguracyjnego, zamiast tego
dokumentację wszelkich dostępnych opcji znajdziemy bezpośrednio w pliku konfiguracyjnym. Plik
jest przez to strasznie wielki jednak wygodnie jest mieć wszystko pod ręką.
Ponadto dokumentacja znajduje się pod adresem:
http://squid.visolve.com/squid/squid24s1/contents.htm
W przypadku naszego serwera proxy będziemy modyfikować jedynie listy kontroli dostępu
(acl). Nie będziemy modyfikować ustawień serwera takich jak porty, ścieżki do katalogów z cache,
rozmiar pamięci ani miejsca na dysku itd.
Zadania:
1. Przejrzyj pierwszą stronę z dokumentacją (link podany powyżej). Przeczytaj jakie są dostępne
sekcje pliku konfiguracyjnego oraz za co odpowiadają. Przejrzyj też nazwy parametrów.
2. Otwórz plik configuracyjny serwera /etc/squid/squid.conf i przejrzyj dostępne opcje za pomocą
klawiszy pageDown i pageUp. Plik jest bardzo długi więc nie czytaj dokładnie działania
poszczególnych parametrów a jedynie przejrzyj ich nazwy. Nazwy parametrów powinny
podpowiedzieć do czego służy parametr i dać wyobrażenie jakie rzeczy możemy potencjalnie
zmienić w konfiguracji serwera.
3. Przeglądając plik konfiguracyjny pomiń access controls i przejdź od razu do następnej sekcji
4. Przeglądanie powinno zająć około 15 minut więc nie czytaj zbyt dokładnie opisów parametrów
a jedynie postaraj się przeczytać ich nazwy i z jedno lub dwa zdania opisu.
5. Wykonaj polecenie (zobaczysz jedynie aktywne ustawienia)
cat /etc/squid/squid.conf |grep -e "^[^#]" | less
Materiały do zajęć przygotował Artur Ejsmont.
3/8
4. Wstęp do list kontroli dostępu ACL
Najważniejsza część pliku konfiguracyjnego SQUID (z naszego punktu widzenia) to listy
kontroli dostępu. Za ich pomocą będziemy określać dla jakich adresów IP pełnimy funkcję serwera,
jakie domeny są zakazane, jakie dozwolone, jakie porty są dozwolone itd.
Mechanizm list kontrolnych sprowadza się do dwóch kroków.
1. Definiujemy elementy ACL
2. Dodajemy elementy ACL do list
Składnia definiowania elementów ACL jest następująca:
acl nazwa_elementu typ_elementu argument_lub_argumenty
Przykładowo:
acl lokalna src 192.168.192.0/255.255.255.0
Definiuje nam element ACL typu scr (źródłowy adres IP z określonej podsieci).
Dodanie elementu do listy ACL polega na dodanie wpisu z nazwą listy słowem allow lub deny
oraz listą elementów.
nazwa_listy allow|deny element1 element2 ...
Przykładowo:
http_access allow lokalna
Dodaje zdefiniowany wcześniej element lokalna do listy http_access zezwalając na dostęp.
UWAGA
–
–
–
–
–
–
Wpisy w liście są sprawdzane w tej kolejności w jakiej zostaną wpisane do pliku.
Jeśli połączenie nie spełnia warunków wpisu sprawdzane są kolejne
Wpisy w liście przestają być sprawdzane gdy natrafimy na pasującą regułkę
Wpis w liście zawierający więcej niż jeden element będzie dopasowany tylko gdy
spełnione będą wszystkie warunki jednocześnie.
przykład:
acl serwer dst 212.191.65.6/255.255.255.255
acl lokalna src 192.168.192.0/255.255.255.0
http_access deny serwer lokalna
Taki wpis w liście spowoduje że jeśli jednocześnie spełnione będą warunki:
adres docelowy serwera kolos oraz
adres źródłowy z sieci lokalnej to połączenie będzie dopuszczone
ACL działa podobnie do iptables. Parametry określamy tu definiując elementy acl.
Analogia ta jest pomocna tylko jeśli znamy działanie iptables, no ale przecież od
dawna już znamy ;-)
Poniżej lista najważniejszych typów elementów ACL:
• src: source ip klienta
• dst: destination ip serwera
• dstdomain: nazwa domenowa serwera
• srcdom_regex: wyrażenie regularne dopasowujące nazwę domenową klienta
• dstdom_regex: wyrażenie regularne dopasowujące nazwę domenową serwera
• time: czas (dzień tygodnia, godzina itd)
• url_regex: wyrażenie regularne dopasowujące adres URL
Materiały do zajęć przygotował Artur Ejsmont.
4/8
•
•
•
•
•
•
•
port: port docelowy
myport: port z jakim połączył się klient
proto: protokół (http, ftp itd)
method: metoda HTTP (post, get itd)
maxconn: limit połączeń z jednego adresu ip
rep_mime_type: wyrażenie regularne dopasowujące odpowiedź serwera
external: wykorzystanie zewnętrznego narzędzia
Poniżej najważniejsze listy ACL do których możemy dodawać wpisy:
•
•
•
•
•
•
•
http_access: Podstawowa lista zezwalająca klientom na połączenia z serwerami www
http_reply_access: Lista zezwalająca na odbiór danych od serwera, powinna być używana z
rep_mime_type by ograniczać typ danych pobieranych z sieci.
no_cache: Jakie odpowiedzi nie powinny być keszowane
redirector_access: Określa jakie połączenia powinny być przekierowywane
always_direct: Jakie połączenia powinny być zawsze kierowane bezpośrednio do serwera
never_direct: Jakie połączenia nie powinny być nigdy kierowane bezpośrednio do serwera
deny_info: strona błędu jaka ma być pokazana w przypadku zablokowania dostępu
5. Uruchamiamy serwer
Aby uruchomić serwer musimy dodać jeden wpis acl dla komputera naszego kolegi oraz dodać
go do listy przyjmowanych połączeń.
Zadanie:
1. Odszukaj sekcję acl w pliku konfiguracyjnym.
2. Przejdź do definicji listy all
3. Zdefiniuj nową listę z komputerem kolegi oraz dodaj wpis zezwalający na połączenia z tego
adresu (poniżej allow localhost). Oczywiście nie zapomnij wpisać adres IP kolegi.
acl kolega src 192.168.192.0/255.255.255.255
http_access allow lokalna
4. Uruchom serwer
5. Wpisz swój adres IP oraz port 3128 jako serwer proxy w przeglądarce kolegi.
6. Następnie podglądaj ruch na swoim serwerze:
1. Uruchom na swoim komputerze konsole.
2. Przeloguj się na użytkownika root poleceniem su.
3. Uruchom program iptraf. Program ten domyślnie nasłuchuje wyłącznie komunikacji z
naszym komputerem więc nie będziemy widzieć zbędnych połączeń w sieci lokalnej.
4. Wybierz opcję ip trafic monitor a potem all interfaces.
7. W przeglądarce kolegi spróbuj otworzyć jakąś stronę internetową np. www.onet.pl
8. Patrz czy widzisz połączenia w oknie iptraf i zwróć uwagę na porty oraz kierunek i stan
połączeń. Sortuj po ilości przesyłanych danych.
9. Wyjdź z opcji iptraf by wyczyścić listę wejdź ponownie i przeładuj stronę u kolegi. Zastanów
się co dzieje się po przeładowaniu strony i czy to powinno się właśnie dziać.
10. Teraz zrób ten sam eksperyment ze stroną wydziału (www.math.uni.lodz.pl)
11. Czy ruch za pierwszym razem jest tak samo duży jak za kolejnymi odsłonami ?
12. Jeśli doszedłeś do wniosku że nie to dobrze ;-) strony takie jak onet, wp i inne serwisy
dynamiczne posiadają znaczniki html mówiące o tym że nie wolno ich buforować w
przeglądarce ani serwerach proxy. Dlatego każde odwołanie do strony powoduje tak samo duży
ruch sieciowy. W przypadku strony wydziałowej która nie posiada tych znaczników cała
Materiały do zajęć przygotował Artur Ejsmont.
5/8
zawartość może być buforowana.
13. (dla chętnych) Podejrzyj źródło strony onetu i wydziałowej, zwróć uwagę na znaczniki w sekcji
head.
14. Wykonaj polecenie du -h /val/spool/squid aby zobaczyć jak dużo zboforował nasz serwer.
6. Przykłady zastosowania ACL
Poniżej zamieszczam trochę przydatnych przykładów aby lepiej zademonstrować możliwości
list oraz ułatwić zadania do wykonania ;-) Wszystkie przykłady proszę traktować tak jakby były
jedynymi wpisami w listach (jeśli przed przykładem są inne regułki to może on w ogóle nie być użyty)
1. Połączenia będą przyjmowane jedynie z określonej sieci w dni robocze w godzinach pracy
acl ip_acl src 192.168.2.0/24
acl time_acl time M T W H F 7:30-18:00
http_access allow ip_acl time_acl
http_access deny all
2. Zobaczmy jak składają się warunki logiczne.
1. Chcąc pozwolić kierownikowi na łączenie się o dowolnej porze dnia i nocy dodajemy
wpis z regułką bez czasu (tylko adres ip musi być dopasowany żeby zezwolić na
połączenie).
2. Chcąc by kierownik2 mógł łączyć się rano lub wieczorem ale nie w nocy dodamy dwa
wpisy zezwalające na połączenia z jego adresu ip w godzinach porannych i wieczornych.
Nie ma znaczenia że czasy się nakładają. Trzeba zwrócić uwagę na to że jeśli chcemy
połączyć warunki operatorem logicznym LUB musimy utworzyć dwa osobne wpisy.
3. Dalej jeśli chcemy by user1 łączył się tylko rano a user2 tylko wieczorem dodajemy po
jednej regółce. Deny all na końcu listy zapewnia nam że nie będą się mogli łączyć poza
tymi godzinami.
4. No i w końcu błędny wpis. Nie jest on błędny jednak nie będzie działać tak jak możnaby
oczekiwać. Jeśli wpis listy zawiera kilka elementów ACL to wszystkie warunki muszą
być spełnione jednocześnie by połączenie zostało dopasowane. Tak więc wpis dla adresu
blad będzie zezwalał na połączenia w godzinach 12-16 ponieważ tylko wtedy spełnione
są jednocześnie warunki rano oraz wieczor. W przypadku rozłącznych przedziałów
czasowych warunek nigdy nie mógłby być spełniony.
acl
acl
acl
acl
acl
acl
acl
kierownik1 src 172.161.163.1
kierownik2 src 172.161.163.2
user1 src 172.161.163.3
user2 src 172.161.163.4
blad src 172.161.163.5
rano time 08:00-16:00
wieczor time 12:00-20:00
http_access
http_access
http_access
http_access
http_access
http_access
http_access
allow kierownik1
allow kierownik2 rano
allow kierownik2 wieczor
allow user1 rano
allow user2 wieczor
allow blad rano wieczor
deny all
3. Jeśli nie chcemy żeby nasi użytkownicy instalowali jakieś programy lub same im się
instalowały bo kiepsko się znają na komputerach można pokusić się o zablokowanie
niektórych rozszerzeń plików dla określonych komputerów. Proszę zwrócić uwagę na to że
Materiały do zajęć przygotował Artur Ejsmont.
6/8
jeśli chcemy podać całą sieć podajemy adres z odpowiednią maską. W przypadku
pojedynczego komputera podajemy maskę 255.255.255.255 co oznacza ten konkretny adres.
Jak widać w przykładzie możemy też podać zakres adresów ip poprzez użycie myślnika i
maski 255.255.255.255. Takie ustawienie kolejności wpisów spowoduje że adresy z
przedziału 10-20 nie będą mogły pobierać plików. Pozostali użytkownicy z naszej sieci będą
mogli wszystko.
acl local_users src 192.168.1.0/255.255.255.0
acl restricted_files urlpath_regex \.zip$ \.exe$ \.vbs$ \.rar$ \.bat$
acl restricted_users src 192.168.1.10-192.168.1.20/255.255.255.255
http_access deny restricted_users restricted_files
http_access allow local_users
4. Jeśli lista blokowanych domen lub elementów adresów URL jakie chcemy blokować jest
duża możemy umieścić ją w osobnym pliku.
acl lista url_regex -i "/etc/squid/lista.txt"
http_access deny lista
5. Jeśli mamy taką potrzebę możemy odblokować lub blokować całe domeny wraz ze
wszystkimi poddomenami.
acl zezwalaj dstdomain .gov.pl
http_access allow zezwalaj
6. Jeśli nie lubimy download managera naszego pracownika bo nawiązuje za dużo połączeń i
generuje za duży ruch możemy nałożyć limit jednoczesnych połączeń.
acl user1 src 10.1.1.12
acl maxpolaczen maxconn 3
http_access deny user1 maxpolaczen
7. Jeśli chcemy nałożyć jakieś ograniczenia na połączenia i pokazywać własną stronę błędu
możemy to zrobić w następujący sposób.
acl porn url_regex -i "/usr/local/squid/etc/porno.txt"
deny_info ERR_NO_PORNO porn
http_access deny porn
8. Możemy zezwalać na (lub blokować) dostęp do adresów spełniających określone wyrażenie
regularne. Stosując parametr -i wielkość liter będzie pomijana tak że slowo = Slowo itd.
Przykład zezwala na pobieranie dowolnych plików jpeg i zabrania pobieranie plików gif
jeśli w ścieżce lub nazwie pliku zawarte jest określone słowo.
acl blokowac urlpath_regex -i slowo.*\.gif$
acl zezwalac urlpath_regex -i \.jpeg$
http_access deny blokowac
http_access deny zezwalac
Zadania:
1. Zezwól na korzystanie ze swojego serwera proxy całej naszej sieci wydziałowej. Regułka
zezwalająca powinna na dostęp z naszej sieci lokalnej powinna być ostatnia zaraz przed regułką
zabraniającą dostęp wszystkim.
2. Sprawdź czy serwer działa na komputerach kolegów (wpisz swój adres ip i port 3128 w ich
przeglądarce).
3. Wpisz powyższe przykłady i sprawdź ich działanie.
1. zatrzymaj serwer
2. wprowadź zmiany w konfiguracji dodając wpisy z kolejnego przykładu
3. uruchom serwer
4. sprawdź w przeglądarce czy połączenie zostaje nawiązane
4. Zmodyfikuj przykłady tak żeby zobaczyć czy faktycznie działają, np. ograniczenia czasowe
zmień tak by zobaczyć zarówno poprawny jak i negatywny wynik.
5. W przykładzie 4 oraz 7 utwórz plik z listą domen. W każdym wierszu osobny wpis. Wpisz
domeny gastea.pl i onet.pl. Utwórz plik komunikatu o błędzie w odpowiednim katalogu (patrz
Materiały do zajęć przygotował Artur Ejsmont.
7/8
rozdzial 3). Wpisz w komunikacie o błędzie tekst "Blokujemy dostęp do tej domeny.
6. Wyczyść wszystkie edytowane wpisy acl (zakomentuj znakeim #).
7. Utwórz konfigurację która spełni następujące założenia:
1. Zdefiniuj elementy typu src dla wszystkich, sieci wydziałowej, kolegi po prawej, kolegi po
lewej, komputera z windowsem.
2. Dodaj wpis aby nie keszować domeny uni.lodz.pl (wraz z poddomenami) sprawdź transfery
3. Zabraniaj na dostęp (wszystkim) jeśli w nazwie domeny jest słowo czat lub chat lub blog
4. Utworzyć komunikat z treścią "nie wchodź na czaty" i pokazuj jeśli zablokowano domene
5. Zabraniaj na dostęp (wszystkim) jeśli w url znajdzie się słowo gadu lub gg (litery duże i
małe)
6. Utwórz komunikat błędu z treścią "NIE WOLNO KLIKAĆ" i pokazuj go gdy zablokowany
zostanie dostęp z powodu pojawienia się słów gg, gadu
7. Zabraniaj koledze po prawej otwierać wp.pl (z poddomenami)
8. Zabraniaj koledze po lewej na dostęp do serwisów ze słowem blog w url
9. Zabraniaj koledze po prawej pobieranie plików zip, rar, exe, com, bat
10. Zabraniaj koledze po lewej na pobieranie plików avi, mpg, mpeg, mp3, m3u, asf, dat, rm
11. Zabraniaj koledze po prawej na wykonywanie więcej niż 1 połączenie jednocześnie
12. Zezwolić na dostęp dla kolegi po prawej w godzinach od rana do 14
13. Zezwolić na dostęp dla kolegi po lewej w godzinach od 14 do wieczora
14. Zezwolić na dostęp dla sieci wydziałowej
15. Zabronić dostępu całej reszcie
8. Sprawdź działanie poszczególnych ustawień, jeśli trzeba odnajdź odpowiednie strony lub
domeny i zobacz czy faktycznie są blokowane na komputerach odpowiedniego kolegi i nie
blokowane na komputerze drugiej osoby.
Materiały do zajęć przygotował Artur Ejsmont.
8/8