Squid 3.0 in ein Active Directory von Microsoft integrieren

Nach unendlich langer Zeit ist der bekannte und beliebte Proxy Squid in der Version 3.0 erschienen. Die Entwicklung hat fast acht Jahre gedauert. Ich hatte eigentlich auch schon nicht mehr daran geglaubt, dass es jemals eine Version 3.0 geben würde. Wie man den Release Notes entnehmen kann, hat sich einiges geändert. So wurde Squid jetzt in C++ statt C entwickelt und kann das Internet Content Adaptation Protocol (ICAP). Grund genug für mich, mir die neue Version mal etwas näher anzusehen und in der Praxis zu testen. Deshalb habe ich mich für einen Squid 3.0 entschieden, als ich einen kleineren Proxy für ca. 30 Benutzer benötigte.

Aufgabenstellung
Es wird ein HTTP-Proxy für ca. 30 Benutzer benötigt. Die Benutzer sollen sich für Internetzugriffe authentifizieren und teilweise nur zugriff auf bestimmte Internetseiten bekommen. Die Anmeldenamen und Passwörter dafür sind in einem Active Directory hinterlegt. Bei jedem Zugriff soll der Squid also bei einem Windows Domain Controller nachfragen, ob der Benutzer existiert und ob er Internetseiten sehen darf.

HTTP-Proxy

Installation
Als Server habe ich einen IBM HS21 Blade mit einer 2 GHz Xeon Dual Core CPU, 1 GB Hauptspeicher und einem Debian Linux 4.0 (64 Bit) verwendet. Er hatte bereits einige andere Aufgaben, die ihn aber kaum auslasteten.
Bei Squid habe ich die PRE5-Version verwendet. Diese kann man bei Debian 4.0 mit dem Befehlt aptitude install squid3 installieren. Das STABLE2-Paket gibt es nur für den „testing-Zweig“ von Debian und es ist wegen einigen Abhängigkeiten nicht so einfach zu installieren. Alle aktuellen Debian-Pakete von Squid 3.0 sind unter http://packages.debian.org/squid3 zu finden.

Konfiguration der Authentifizierung
Um die Anmeldenamen und Passwörter abzufragen, habe ich im Active Directory einen Benutzer SquidAuth und die Gruppe InternetZugang angelegt. Der Benutzer sollte aus Sicherheitsgründen keine vollen Admin-Rechte bekommen. Für das abfragen der Gruppenmitgliedschaft reicht es, wenn er Mitglied in der Gruppe RAS- IAS-Server ist. Falls man die Mitgliedschaften von Gruppen nicht braucht und nur den Benutzernamen und das Passwort gegen den Windows Domain Controller Authentifizieren möchte, reichen sogar normale Benutzerrechte!
Danach habe ich die Konfigurationsdatei des Squid (/etc/squid3/squid.conf) entsprechend erweitert. Wenn der befragte Windows Domain Controller ein Global Catalog Server ist, sollte der Port 3268 anstelle von Port 389 (wie eigentlich bei LDAP üblich) verwendet werden.
Falls sich ein Windows Domain Controller (der auch Global Catalog Server ist) mit der IP-Adresse 192.168.140.11 für die Domäne DOMAIN.local verantwortlich fühlt und das LAN den IP-Bereich 192.168.140.0/24 hat, könnte die Erweiterung etwa wie folgt aussehen:


# Authentifizierung an Active Directory
auth_param basic program /usr/lib/squid3/squid_ldap_auth -R -b "dc=DOMAIN,dc=local" -D "cn=SquidAuth,cn=Users,dc=DOMAIN,dc=local" -w "password" -f sAMAccountName=%s -h 192.168.140.11:3268
auth_param basic children 5
auth_param basic realm "Proxy Authentifizierung. Bitte geben Sie Ihren Benutzername und Ihr Passwort ein!"
auth_param credentialsttl 2 hours

external_acl_type InetGroup %LOGIN /usr/lib/squid3/squid_ldap_group -R -b "dc=DOMAIN,dc=local" -D "cn=SquidAuth,cn=Users,dc=DOMAIN,dc=local" -w "password" -f "(&(objectclass=person)(sAMAccountName=%v) (memberof=cn=%a,cn=Users,dc=DOMAIN,dc=local))" -h 192.168.140.11:3268

acl localnet proxy_auth REQUIRED
acl InetAccess external InetGroup InternetZugang
http_access allow InetAccess

Danach fragt Squid beim Aufruf einer Webseite nach einem Benutzernamen und Passwort. Des weiteren erhalten nur noch die Mitglieder der Gruppe InternetZugang Internetzugriff.

Fazit
Der Squid läuft jetzt seit 14 Tagen ohne Probleme. Bis jetzt habe ich keine Probleme mit Webseiten festgestellt. Sogar das Microsoft Windows Update läuft jetzt. Bei den alten Versionen von Squid funktionierte es meist nicht richtig.

34 Antworten auf „Squid 3.0 in ein Active Directory von Microsoft integrieren“

  1. Ich bin genau nach deiner Anleitung vorgegangen, aber es funktioniert trotzdem noch nicht bei mir. Es kommt zwar das Authentifizierungsfenster, aber das poppt immer wieder auf! Egal was ich da eingebe.

  2. Ich gebe meinen Benutzer ein „gfub9001“ und die Gruppe „internet“

    Das kommt raus:

    gfub9001 internet
    squid_ldap_group WARNING, could not bind to binddn ‚Invalid credentials‘
    ERR

  3. Geht es denn, wenn man den Befehlt squid_ldap_group von Hand ausführt?

    Mann muss dazu natürlich den richtigen Kontext aus dem Active Directory angeben. Es sollte ungefähr so aussehen:

    /usr/lib/squid3/squid_ldap_group -R -b „dc=firma,dc=local“ -D „cn=SquidAuth,cn=Users,dc=firma,dc=local“ -w „password“ -f „(&(sAMAccountName=%u)(memberof=cn=%a,cn=Users,dc=firma,dc=local))“ -h 172.30.4.31:3268

    Danach bekommt man ein Prompt in dem man den Benutzernamen und den Gruppennamen nur durch ein Leerzeichen getrennt eingeben kann. Wenn danach Return drückt bekommt man ein OK zurück, wenn der User in der Gruppe ist. Falls der Benutzer dies jedoch nicht ist oder etwas anderes schief geht bekommt man ein ERR.

  4. mein squidauth ist in der OU „Users“ und in den Gruppen „Domänen-Benutzer“ und „RAS- und IAS Server“

    in der OU „Users“ habe ich eine Gruppe „internet“ angelegt und dort ist der Benutzer „gfub9001“ Mitglied. Die Gruppe „internet“ selbst ist Mitglied keiner weiteren Gruppe und als „Sicherheitsgruppe – global“ angelegt.

    gpupdate /force auch schon durchgeführt.

  5. Ich habe schon beides probiert, gleiches Ergebnis.

    /usr/lib/squid/squid_ldap_group -P -R -b „DC=Fuldabrueck,DC=local“ -D „CN=squid,CN=Users,DC=Fuldabrueck,DC=local“ -w „hausbauer770“ -f „(&(objectclass=person)(sAMAccountName=%v)(memberof=CN=%a,CN=Users,DC=fuldabrueck,DC=local))“ -h 10.177.64.51:3268

    so habe ich das auf der Konsole als root ausgeführt. Dannach habe ich dann folgendes eingegeben.

    gfub9001 internet

    Fehler:

    squid_ldap_group WARNING, could not bind to binddn ‚Invalid credentials‘
    ERR

  6. Wenn das eine Standardinstallation von Windows ist, müsste es cn=Users und nicht ou=Users sein. Users ist nämlich keine ou. Könnte das der Fehler sein?

  7. Ich habe das in meinem Beispiel auch gleich mal auf cn=Users korrigiert. Man sollte sich in solchen Beispielen am besten immer an den Standard halten 😉

  8. Bei mir klappt das wenn ich den Benutzernamen und das Passwort anpasse?!? Ich habe es sogar bei zwei AD’s probiert. Allerdings musste ich die Anführungszeichen aus Deinem Beispiel neu schreiben, weil sie nicht mehr ASCI waren. Das hat aber warscheinlich mein Blog verkonvertiert.

    Das Invalid credentials kommt bei mir nur, wenn der Benutzername oder das Passwort falsch sind.

  9. So, ich habe jetzt mal das Passwort von „squid“ zurückgesetzt, da ich schon dachte, dass ich mich evtl verschrieben hatte. Aber es klappt immernoch nicht. So sieht mein Test aus:

    root@sfbkproxy:~# /usr/lib/squid/squid_ldap_group -P -R -b „DC=fuldabrueck,DC=local“ -D „CN=squid,CN=Users,DC=fuldabrueck,DC=local“ -w „password“ -f „(&(objectclass=person)(sAMAccountName=%v)(memberof=CN=%a,CN=Users,DC=fuldabrueck,DC=local))“ -h 10.177.64.51:3268
    squid
    ERR
    gfub9001
    ERR
    gfub9001 internet
    squid_ldap_group WARNING, could not bind to binddn ‚Invalid credentials‘
    ERR

    Muss ich noch zusätzliche tools/module installieren? Auf dem Proxy-Server ist nur Squid mit SquidGuard drauf. Webmin und Open SSH. Ich habe auch noch meinen AD-Server in der etc/hosts eingetragen, und nslookup ist ok. Mit nmap habe ich auch die ports vom AD-Server gescannt, und da sind beide offen 389, 3268.

  10. Folgende neue Erkenntnisse. Wenn ich meinen SquidAuth Benutzer mit dem Administrator ersetze, dann funktioniert es, aber auch nur bedingt, denn jetzt kommt jeder aus dem AD ins Internet. Das mit der Gruppe haut jetzt nur nicht hin.

    Die Gruppe „internet“ ist aber vorhanden, und wenn ich in den Eigenschaften gucke, steht da unter Members nur gfub9001, und unter Members of ist nichts eingetragen.

  11. Wenn ich das bei mir etwas angepasst eingebe get es:

    server02:~# /usr/lib/squid3/squid_ldap_group -P -R -b „DC=TESTDOM,DC=local“ -D „CN=SquidAuth,CN=Users,DC=TESTDOM,DC=local“ -w „password“ -f „(&(objectclass=person)(sAMAccountName=%v)(memberof=CN=%a,CN=Users,DC=TESTDOM,DC=local))“ -h 172.30.4.31:3268

    testuser1 InternetZugang
    OK
    testuser2 InternetZugang
    ERR

    Der testuser1 ist in der Gruppe der testuser2 nicht. Interessant ist bei Dir, dass der Fehler erst kommt, wenn eine Gruppe mit angegeben wird. Kann es sein, dass der User keine Berechtigungen für die Gruppe hat?

  12. Du wirst es kaum glauben, aber jetzt geht alles! Ich hatte bei einem cn=Users noch ein ou davor stehen, und ich musste noch 2 Zeilen in meiner squid.conf auskommentieren.

    #acl gfub_lan src 10.177.64.0/24
    #http_access allow gfub_lan

    Dann ging es auf einmal! Vielen Dank für deine Hilfe! Ich hoffe, dass noch viele mit einem ähnlichen Problem noch auf deinen Blog stoßen werden.

  13. Der Benutzer mit dem man die Abfrage macht sollte – wie in meinem Blogeintrag beschrieben – in der Gruppe „RAS- IAS-Server“ sein. Normale Benutzer dürfen im AD keine Gruppenzugehörigkeiten abfragen.

    Ist die Gruppe den auch unter Users vorhanden? Und steht die Gruppe auch bei dem Benutzer unter „Members Of“?

  14. Dann gehen mir auch langsam die Ideen aus. Bie mir gehts ;-(

    Ich habe das ganze allerdings noch nicht in einem reinen Windows 2003 AD getestet. Ich kann mir allerdings nicht so recht vorstellen, dass sich ein DC hier anders verhält, wenn man den AD auf Windows Server 2003 herauf stuft.

  15. Noch eine Frage, wie kann ich meine Linux-PCs von der Authentifizierung ausschließen. So das die keine Authentifizierung brauchen?

    kann man hinter

    acl localnet proxy_auth REQUIRED

    einfach !10.177.64.103

    dahinter setzen!?

  16. Da bin ich mir nicht ganz sicher. Könnten aber klappen. Ansonsten kann man ja verschiedene ACLs definieren. Z.B.:

    acl normal_networks src 10.177.64.128/25
    acl admin_networks src 10.177.64.0/25

  17. Hallo Martin!

    Ja, localnet sollte definiert sein. Ich habe der Übersichtlichkeit halber nur die hinzugefügten Zeilen Veröffentlicht. Als Vorlage habe ich die Standard-Konfig von Squid bei Debian genommen. Wenn Du möchtest schicke ich Dir die gesamte Konfig per E-Mail

    Gruß
    Kristian

  18. Hallo Kristian,

    Da wäre ich dir doch mal mega dankbar 🙂
    Muss AD-Gruppen mit verschiedenen acls umsetzen können

    Danke schon mal für das file und Grüße aus Ulm
    Martin

  19. Moin!

    ich finde dieses Howto sehr hilfreich. Habe alles zum Laufen bekommen. Habt ihr auch Probleme mit Umlauten oder speziellen Sonderzeichen? Wenn zb. ein Passwort komplex sein soll, funktionieren manche Sonderzeichen nicht.

    Ich weiß soweit, daß es daran liegt das ADS UTF8 spricht und die HTTP Authentifizierung über ASCII läuft, Squid die Userdaten aber einfach nur so weitergibt. Wenn ich zb. den ganzen Kram in der Konsole teste (bei Ubuntu auch UTF8) funktionieren die komplexen Kennwörter ohne weitere Probleme. Mache ichs per Browser „Access Denied“

    Seid ihr auf ähnliche Probleme gestoßen? Es gibt da einen Patch, allerdings habe ich keine Lust Squid komplett from Source zu machen. Bis der Rund läuft und man ja nix vergessen hat. Vergeht ja einige Zeit!

    Anbei die URL zur Diskussion.
    http://www.squid-cache.org/mail-archive/squid-users/200807/0203.html

  20. Hi,

    Du schreibst:

    „Wenn der befragte Windows Domain Controller ein Global Catalog Server ist, sollte der Port 3268 anstelle von Port 389 (wie eigentlich bei LDAP üblich) verwendet werden.“ Muss dies in der squid.conf eingetragen werden?

    Kannst Du mir evtl. mal Deine komplette squid.conf zumailen, wäre Klasse, vielleicht noch mit Angabe des genauen Gruppennamens im Active Directory, welche den Zugriff haben sollen. Ich komm hier auf keinen grünen Zweig ;-( Hat sich eigentlich was zum Server 2008 geändert oder sollte das genauso funktionieren?

    Gruß
    TiTux

  21. Hallo TiTux!

    Habe Dir die Config per Mail geschickt. Für so einen Blog-Eintrag ist sie etwas zu unhandlich. Mit 2008 habe ich es noch nicht versucht. Poste doch mal, um Du es geschafft hast. Demnächst wollte ich auch mal auf 2008R2 updaten. Dann kommt das gleiche auf mich zu.

    Gruß
    Kristian

  22. Hi Kristian,

    so, Squid läuft und die Performance ist echt gut. Unter Windows 2008R2 gab es nichts zu beachten, hat sich wohl zwischen 2003 und 2008 nicht viel getan, was den Bereich LDAP Anbindung angeht. Als nächstes stehen zwei Punkte auf dem Programm:

    Logfile Auswertung mit AWStats und Contentfilterung mit DansGuardian.

    Vielen Dank für Deine Hilfe und der super Unterstützung!

    Gruß
    TiTux

  23. Danke für diese geniale Anleitung, ich habe locker 3h im WWW recherchiert weil ich es nicht hinbekommen habe Squid3 gegen Windows SBS 2008 zu authentifizieren.
    Aber jetzt klappt es 🙂

    Danke!

  24. Hallo!!

    Vielen Dank für das hilfreiche How-To.
    Kann man die Passwortabfrage eigentlich auch ausschalten, wenn der PC sich im localnet befindet und das Windowsbenutzer genutzt wird??
    Verstehst du, was ich meine?

    Vielen Dank für die Hilfe.

    Micha

  25. Hallo Micha!

    Du meinst also, ob man dem Browser beibringen kann automatisch den aktuellen Windowsbenutzer für den Proxy zu verwenden? Da muss ich passen. Das weiß ich jetzt nicht. Das kommt aber auch sicherlich darauf an, welchen Browser man verwendet. Das das Passwort für den Proxy aber in den gängigen Browsern gespeichert werden kann, muss man dieses ja auch nur einmal eingeben und abspeichern.

    Gruß
    Kristian

  26. Hallo Kristian,
    ich möchte gern mein SQUID mit zwei verschiedenen Standorten nutzen.
    An Standort 1 Funktioniert der SQUID problemlos.
    An Standort 2 leider nicht. hier funktioniert etwas nicht mit der AUTH und es kommt jedesmal die Meldung das der Zugriff verweigert wurde.
    Hier mal meine conf:
    external_acl_type AD_Group children=50 %LOGIN /usr/sbin/squid_ldap_group -b „ou=standort1,dc=Firma,dc=local“ -f (&(sAMAccountName=%u)(memberOf=%g)) -h 192.168.100.1 -S -D „cn=SQUIDAUTH,cn=Users,dc=Firma,dc=local“ -w „xxxXXXxxx“
    gibt es die Möglichkeit eine weitere ou hinzuzufügen?! halt nur mit standort2… oder gleich die ganze Domain?!
    Alle User an Standort 2 bekommen die Fehlermeldung Zugriff verweigert.
    Die Standorte sind im AD getrennt.

  27. Hallo Sirtel,

    die Abfrage fragt ja nach der Mitgliedschaft in einer Gruppe. Man könnte für den zweiten Standort also einfach eine zweite Gruppe anlegen.

    Wenn die Authentifizierung verweigert wurde, glaube ich eher an eine nicht funktionierende LDAP Abfrage. Klappt die Abfrage, wenn man sie von Hand per Kommandozeile macht?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.