10 Der Proxy Squid Z
Transcrição
10 Der Proxy Squid Z
10 Der Proxy Squid In diesem Kapitel lernen Sie: • Den Web-Proxy-Server squid zu konfigurieren. • Webseiten zu sperren, Zugriffsbeschränkungen einzurichten • Hierarchische Proxy-Cluster zur Last- und Ressourcenverteilung zu konfigurieren. • Einen transparenten Proxy einzurichten, der gegenüber dem Benutzer nicht in Erscheinung tritt, und damit auf der Client-Seite konfigurationsfrei ist. 10.1 squid, ein Konfigurationsmonster? Der squid ist zu Recht einer der beliebtesten Proxy-Server, wenn es darum geht, HTTP-, HTTPS- oder FTP-Verbindungen zu vermitteln. Der squid ist dabei nicht einfach nur ein Proxy, also Stellvertreter, sondern dient außerdem als Cache , d.h. er speichert die von ihm im Userauftrag“ geholten Daten ” auch, so daß eine weitere Anfrage für dieselbe Seite/Datei nicht mehr aus dem Internet geholt werden muß, sondern direkt innerhalb des LAN/aus der DMZ ausgeliefert werden kann, was wohl in 99% aller Fälle schneller geht. Er ist extrem flexibel, genießt daher allerdings auch den Ruf eines Konfigurations” monsters“. Sie werden den squid allerdings von seiner freundlichen Seite kennenlernen, denn für einen produktiven Einsatz reichen schon wenige Direktiven in seiner Konfiguration (ein echtes Einschalten — läuft“ gibt es allerdings nicht. . . ) ” Der Name squid bedeutet übersetzt übrigens Tintenfisch“, was seine Rolle recht gut ” wiederspiegelt; die vielen Arme sind die dünnen“ Verbindungen in das Internet, der ” dicke Kopf“ ist die Verbindung in das LAN. ” Z Hinweis: Der squid hat im Laufe seiner Entwicklung mehrmals sein Cache-Format geändert. Bei einer Neuinstallation ist das egal, aber bei einem Update sollten die Vorteile der neuen Version gegen den Verlust aller Cache-Daten aufgewogen werden. Wir besprechen hier die aktuelle Version 2.4, wobei die Konfiguration sich kaum geändert hat. Die neueste Version gibt es auf der WWW-Seite http://www.squid-cache.org/. Dort finden Sie auch eine ausführliche(re) Dokumentation. 135 Der Proxy Squid 10.2 Zugriffskonzept/ACLs Der squid bietet sehr flexible Möglichkeiten, den Zugriff sowohl auf sich selbst als auch auf Seiten im Internet zu regeln. So können als Kriterien z.B. bestimmte Hosts im LAN, ganze Netzwerke, aber auch bestimmte User (via ident-Lookups) freigegeben oder gesperrt werden. Es k önnen Zeiten angegeben werden, in denen surfen“ erlaubt/nicht erlaubt ist (z.B. Pausenzei” ten erlauben in einem Schulungszentrum), es ist bei der Auswahl der erlaubten bzw. verbotenen Seiten ein Rückgriff auf reguläre Ausdrücke möglich, aber auch auf fertige Listen, die im Internet von alten Hasen“ zur Verfügung gestellt werden, etc. ” Diese fein gestaffelten Zugriffsrechte werden über sogenannte Access Control Lists ACL s geregelt, die fast beliebig miteinander verknüpft werden können. Eine solche ACL könnte beispielsweise die Rechner in Ihrem Schulungsraum definieren, eine weitere den Rechner Ihres Dozenten, und eine dritte die Zeiten, in denen Sie Pause haben. Durch geschicktes Kombinieren von diesen drei Listen kann der squid jetzt so konfiguriert werden, daß er Ihrem Dozenten rund um die Uhr den Zugriff auf das Internet gewährt, den anderen Rechner im Raum aber nur während der Pausenzeiten... Hinweis: Sämliche im Folgenden dargestellten Konfigurationen betreffen die recht umfangreiche Datei /etc/[squid/]squid.conf. Z Lassen Sie sich von der schieren Größe dieser Datei nicht abschrecken! Es werden, wie oben erwähnt, nur wenige Direktiven wirklich benötigt. Wenn Sie im folgenden Direktiven kennenlernen, benutzen Sie die Suchfunktion Ihres Editors, um vergleichbare Direktiven in der squid.conf zu finden! Alternativ können Sie sich mit folgendem Befehl eine kommentarbereinigte Version anzeigen lassen: # egrep -v ’(ˆ#|ˆ$)’ /etc/squid/squid.conf Eine Datei von über 2000 Zeilen gerät sonst sehr schnell in einen sehr unübersichtlichen Zustand. . . 10.2.1 ACLs Die Syntax der ACL-Definitionen: acl aclname acltype <string1 [string2] ... [stringN]> | <Datei> 136 10.2 Zugriffskonzept/ACLs Erläuterung: Nach dem Schlüsselwort acl folgt ein (fast) frei wählbarer Name, ein Typ und eine Liste von Argumenten für diesen ACL-Typ, wobei ein Argument auch ein Dateiname mit absoluter Pfadangabe sein kann. In einer solchen Datei sind dann die Argumente eingetragen, die sonst in der squid.conf stehen würden. Mögliche ACL-Typen sind (u.a.): src Quelle (source) des Zugriffs auf den Proxy (als IP/Netzmaske) dst Ziel (destination) des Zugriffs (als IP/Netzmaske) srcdomain bzw. dstdomain wie oben, aber Angabe als Name ( .meine-domain.de“) ” srcdom regex bzw. dstdom regex w.o., aber hier k önnen reguläre Ausdrücke für die Domainnamen angegeben werden ( .*porn.*“) ” time Angabe von Zeiten (s.u.) url regex, urlpath regex sucht im URL bzw. im URL-Path (ohne Protokoll & Host) nach Übereinstimmungen mit regulären Ausdrücken port Angabe des Zielports proto Angabe des Protokolls (Argumente: HTTP, FTP) method die für CGI -Programme genutzte Übermittlungsmethode (Argumente: GET, POST) browser welcher Browser wird verwendet (regulärer Ausdruck ) proxy auth ermöglicht die Authentifizierung eines Users mittels eines externen Programms arp die Clients werden nicht anhand ihrer IP-Adresse identifiziert, sondern anhand der MAC-Adresse Z Hinweis: Werden in einer ACL mehrere Argumente angegeben, so werden diese mit einem logischen ODER verknüpft. 137 Der Proxy Squid ✎ Einige Beispiele für ACLs: • acl intern src 192.168.0.0/24 definiert als Quelle für Anfragen das Klasse-C-Netz 192.168.0.x, und gibt ihm den Namen intern • acl schmuddel dstdomain "/etc/squid/schmuddeldomains.txt" .microsoft.com definiert eine ACL namens schmuddel, die jene Domainnamen enthält, die in der Datei /etc/squid/schmuddeldomains.txt aufgelistet sind, sowie eine weitere ;-). • acl SSL\_ports port 443 563 listet die Ports auf, über die SSL-Verbindungen i.A. gefahren werden Diese ACLs werden dann als Argumente an die http access-Direktive übergeben: 10.2.2 Die http access-Direktive Über die http access-Direktive können die vorher definierten ACLs nun gezielt gesperrt oder freigegeben werden. Die Syntax der http access-Direktive: http access allow|deny [!]acl [[!]acl] ... 12 Hinweis: Werden hier mehrere ACLs angegeben, so werden diese mit einem logischen UND verknüpft. Z Beispiele für http access-Direktiven: ✎ • http access allow intern erlaubt den Zugriff auf den Proxy vom (oben deklarierten) Netz intern aus • oder besser: http access allow intern !schmuddel gibt den Zugriff f ür das Netz intern frei, aber nur auf jene Webseiten, die nicht (!) in der acl schmuddel aufgelistet sind 12 Das 138 (optionale) Ausrufezeichen bewirkt eine Negierung. 10.3 Minimalkonfiguration 10.3 Minimalkonfiguration Da squid in der Voreinstellung einen Zugriff nur vom eigenen Rechner erlaubt, müssen wir zuerst unseren Clients den Zugriff erlauben. Dieses erreichen wir in den zwei (immer benötigten) Schritten: • Zuerst werden die berechtigten Clients unter einem frei wählbaren Namen (hier: meine rechner) in einer ACL zusammengefasst: acl meine_rechner src 192.168.0.0/255.255.255.0 • Danach wird der Zugriff auf beliebige Hosts im Internet f ür diese ACL freigegeben: http_access allow Z meine_rechner Hinweis: Diese Zeilen müssen unbedingt vor dem bereits vorhandenen Eintrag http access deny all eingetragen werden!!! (s.a. Hinweis auf S. 136) Jetzt können wir den Proxy über sein Startskript starten und bereits benutzen: # /etc/init.d/squid start 13 10.4 Client-Konfiguration Im Allgemeinen wird der Proxy nun noch auf Client-Seite eingetragen (wahrscheinlich haben Sie diesen Schritt schon mehrmals vorgenommen): Viele Browser lassen sich per Menü konfigurieren. Bei netscape findet sich der entsprechende Eintrag in dem Untermenü Edit→Preferences→Advanced→Proxy→Manual Proxy Configuration oder auf deutsch in Bearbeiten→Voreinstellungen→Erweitert→Proxy→Manuelle Proxy Konfiguration. Die meisten anderen Browser (opera, konqueror, lynx, wget, w3m . . . ) können allesamt über die folgenden Umgebungsvariablen konfiguriert werden: $ export http proxy=http://x.x.x.x:y/ $ export ftp proxy=http://x.x.x.x:y/ (x.x.x.x = IP-Adresse des Proxy-Hosts, y=Port, auf dem der squid lauscht) Tip: Diese Einträge kann der Administrator z.B. direkt in der /etc/profile vor- 13 im Weiteren sollte dieses Skript mit reload statt restart aufgerufen werden, da der squid sich selber einen Zeitraum von i.A. 30 Sekunden zum Herunterfahren gönnt. 139 Der Proxy Squid nehmen. Sie gelten dann für alle User. 10.5 Webseiten sperren Es können über Filterregeln im Proxy gezielt manche Webseiten gesperrt werden, z.B. um die private Nutzung des Internets (Consors et. al.) außerhalb der Mittagspause einzuschränken. Dazu wird eine Sperrliste definiert, die in diesem Fall auf eine Datei mit den unerwünschten URLs verweist. Diese Liste wird danach mittels einer http access-Direktive verboten (hier noch ohne die Zeit-Komponente): acl FORBID_DOMAIN dstdomain "/etc/squid/forbidden" http_access deny FORBID_DOMAIN 10.6 Zugriffszeiten definieren Der ACL-Typ time ermöglicht es uns, auf die Minute genau festzulegen, zu welchen Uhrzeiten gesurft werden darf: acl mittag time MTWH 12:00-13:00 definiert z.B. die Mittagsstunden von Montag (M) bis Donnerstag (H, T ist bereits für Tuesday vergeben) in der ACL mittag. Mit einer solchen ACL könnten wir jetzt schon den Zugriff auf die privaten“ Internet” domains etwas lockern, denn in der Mittagspause steigert sich evtl. sogar die Produktivität der Mitarbeiter... Hinweis: Denken Sie daran, daß http access-Direktiven • mehrere ACLs enthalten können, die dann per logischem UND miteinander verknüpft werden • nach der first match“-Methode gelesen werden; die erste Regel, die paßt, wird ” genutzt Eine Kombination der Form: acl mittag time MTWH 12:00-13:00 acl FORBID_DOMAIN dstdomain "/usr/local/lib/forbidden" http_access allow FORBID_DOMAIN mittag http_access deny FORBID_DOMAIN 140 Z 10.7 Feintuning/Anpassung an die lokalen Gegebenheiten erlaubt also den Zugriff auf unerwünschte“ Domains während der Mittagspausen (so” wohl FORBID DOMAIN als auch mittag treffen zu), verbietet den Zugriff aber zu allen anderen Zeiten (nur FORBID DOMAIN trifft zu). 10.7 Feintuning/Anpassung an die lokalen Gegebenheiten Gerne wird statt der Portnummer 3128 die 8080 (in Anlehnung an den http -Port 80) verwendet. Der Eintrag dafür in der squid.conf lautet 14 : http_port 8080 Die voreingestellte Cachegröße von 100MB ist bei aktuellen Festplatten viel zu klein. Ebenfalls recht knapp bemessen ist die maximale Dateigröße von 4MB. Wir erhöhen diese Werte in unserem Beispiel auf 1000M bzw. 16MB. Wenn häufiger mehrfach benötigte, große Dateien (z.B. Servicepacks oder — hoffentlich — Linux-Kernel) heruntergeladen werden, sind auch erheblich gr ößere Werte sinnvoll: cache_dir ufs /var/cache/squid 1000 16 256 maximum_object_size 16384 Dabei geben die Zahlen nach der Größe die Anzahl der Unterverzeichnisse an, in denen squid die Daten zwischenspeichern soll. Tip: Es lohnt sich übrigens, /var/cache/squid/ auf eine eigene Festplatte auszulagern (den DMA-Modus bei IDE-Platten nicht vergessen!) Mit der Direktive cache mem kann man begrenzen, wieviel Speicher f ür das Zwischenspeichern von Objekten benutzen soll. Dabei empfiehlt es sich, den Speicherverbrauch von SQUID im normalen Betrieb zu beobachten, und dann durch die genannte Direktive die Anzahl von MB angeben, die er maximal zusätzlich verbrauchen darf. Dieser Parameter bezieht sich nur auf die Größe des Zwischenspeichers im RAM, nicht auf die Gesamtgröße des SQUID-Prozesses im Speicher. Die Uhrzeit gibt der squid in den Log-Dateien als Unix-Systemzeit (vergangene Sekunden seit dem 1.1.197015 ) an. Dieses Format ist für Menschen etwas schwer zu lesen, kann aber mit folgender Option auf eine normale Zeitangabe umgestellt werden: emulate_httpd_log on 14 Denken 15 der Sie daran: Im Zweifelsfall ist jede Direktive bereits vorhanden! sog. epoch“ ” 141 Der Proxy Squid Als weiteren Vorteil kann man jetzt die diversen Logfile-Analyzer (z.B. webalizer) des Webservers Apache auch für den Squid verwenden. 10.8 Familienbande: squid mit Parents und Siblings Die meisten Internet-Provider betreiben eigene Proxys, um den Datenverkehr ins Internet zu reduzieren. In so einem Fall sollte unser squid alle Anfragen an den Proxy des Providers schicken. Man spricht dann von einem cache parent oder parent cache ( Elternteil“). ” Aber auch in einem lokalen Netz kann die Verknüpfung mehrerer Proxys sinnvoll sein: Wenn zwei Abteilungen jeweils einen squid betreiben, k önnen diese sich miteinander absprechen und so ihre Cache-Daten gemeinsam nutzen. Zwei gleichberechtigte squids nennt man cache siblings (Geschwister). Ein Squid, der sowohl parents als auch siblings kennt, wird seine Geschwister bevorzugen und den parent als letztes befragen. Dieses Zusammenspiel innerhalb der Familie“ wird als Cache-Hierarchie bezeichnet. ” Die Kommunikation zwischen den Proxies läuft dabei über ein sehr schlankes UDP Protokoll (ICP , Inter Cache Protocol ). Zur Konfiguration dieser Hierarchie dient die cache peer-Direktive. Syntax: cache peer host parent|sibling TCP-Port ICP-Port [weitere Optionen (default, no-query, ...)] Beispiel für eine Cache-Hierarchie: Unser squid soll den Proxy des Providers (IP: 62.1.2.3) als parent verwenden. Er verwendet die Standard-Ports 3128 f ür normale Anfragen und 3130 für ICP -Anfragen seiner Verwandten“: ” cache_peer 62.1.2.3 parent 3128 3130 Tip: Natürlich kann statt der IP auch der Rechnername verwendet werden. Dieser muß allerdings ausgeschrieben werden, die Suchliste aus der Datei /etc/resolv.conf wird nicht verwendet (beliebter Fehler!). 142 ✎ 10.9 Transparent Proxy Soll ein zweiter squid als sibling angesprochen werden, erfolgt ein Eintrag in dieser Form: cache_peer squid2.meine_domain.de sibling 3128 3130 Z Hinweis: Z Hinweis: Wollen Sie einen MS-Proxy als parent oder sibling ansprechen, tragen Sie als ICP -Port 0 und als weitere Option dahinter no-query ein. Dieses Produkt setzt ein eigenes Protokoll zur Kommunikation zwischen den Hosts ein. 16 Hostnamen müssen hier immer inkl. Domain angegeben werden!!! Tip: Sind Sie über einen Zwangs-Proxy mit dem Internet verbunden, so aktivieren Sie zusätzlich zum parent -Eintrag mit Option default“ folgenden Eintrag: ” always direct deny all oder alternativ: never direct allow all Desweiteren sollte man an den Timeout-Werten drehen, denn der squid versieht andere Proxies, die zu langsam antworten, mit dem Status dead peer, so daß diese dann nicht mehr angesprochen werden. Wenn das mit dem einzigen parent passiert, hat man ein Problem... 10.9 Transparent Proxy Eleganter als die Konfiguration jedes einzelnen Clients ist die Einrichtung eines Transparent Proxy . Dieser fängt alle WWW-Anfragen ab und leitet sie — für den Client unmerklich, also transparent — auf den Proxy um. Vorteil: Die Konfiguration des Client entfällt. Nachteil: Da der Client den Proxy nicht kennt, kümmert er sich selbst um die Namensauflösung und benutzt, statt des Proxy-Ports, die Ports der Protokolle HTTP, HTTPS und FTP. Ein Paketfilter zwischen den Clients und dem Proxy muß also entsprechend großzügiger und damit unsicherer eingestellt werden. Die Umleitung ist ein Teil der Linux-Firewall und wird f ür den Kernel 2.2 mit folgendem ipchains-Befehl aktiviert: 16 (Womit wir einmal mehr beim Thema offene Standards“ wären) ” 143 Der Proxy Squid ipchains -A input -i eth0 -p tcp --dport 80 -j REDIRECT 3128 Der Kernel arbeitet ab Version 2.4 stattdessen mit iptables: modprobe ipt_REDIRECT iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 Auch die squid-Konfiguration ändert sich etwas, weil dieser jetzt nicht als Proxy auftritt, sondern einen WWW-Server simuliert: httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on 144 10.10 Querverweise 10.10 Querverweise 1. www.squid-cache.org Die squid-Homepage 2. http://squid.visolve.com/squid24s1/contents.htm Ein ausführliches Handbuch zur Konfiguration 145 Der Proxy Squid 146 10.11 Übungen 10.11 Übungen 1. Installieren und konfigurieren Sie den squid, so daß er den Clients im folgenden Netz zur Verfügung steht: 192.168.0.0/255.255.255.0 2. Konfigurieren Sie Browser und rufen Sie eine WWW-Seite zweimal auf. 3. Verbinden Sie Ihren Proxy gleichberechtigt mit dem Ihres Nachbarn (sibling ). Rufen Sie eine Seite auf, die vorher nur Ihr Nachbar kannte“. ” 4. Tragen Sie den squid Ihres Dozenten als parent cache ein. Er soll Ihre einzige Verbindung ins Internet darstellen. Rufen Sie jetzt gemeinsam mit Ihrem Nachbarn die gleiche WWW-Seite auf. 5. Beobachten Sie mit tcpdump die Kontrollnachrichten des squid auf dessen ICP-Port (3130). 6. Blockieren Sie über eine ACL die WWW-Seiten von microsoft.de :) 7. Was passiert dabei mit benachbarten Proxys, die den Ihren als sibling eingetragen haben? Wie lösen Sie das Problem? Z Hinweis: Sollte in Ihrem Schulungsraum kein direkter Zugriff auf das Internet möglich sein, ziehen Sie bitte Schritt 4 vor!!! 147 Der Proxy Squid 10.12 Lösungen 1. Dazu ist die Definition einer ACL notwendig: acl mein netz src 192.168.0.0/255.255.255.0 Dann diese ACL für den Zugriff freigeben: http access allow mein netz 2. Der zweite Zugriff sollte dabei deutlich schneller erfolgen. 3. Eintrag in der /etc/squid.conf: cache peer sibling x.x.x.x 3128 3130 Dabei sollte der Aufruf einer WWW-Seite auch dann schneller sein, wenn nur der fremde squid sie bereits kannte. 4. Eintrag: cache peer parent x.x.x.x 3128 3130 default .... never direct allow all always direct deny all 5. # tcpdump -i eth0 port 3130 6. acl Unerwuenscht dst domain .microsoft.de .. http access deny Unerwuenscht (vor http access allow mein netz) 7. Für die siblings bietet die Option login=user:password für die cache peerDirektive eine Lösung. Alternativ könnte man auch für die siblings eine eigene ACL definieren. 148