Squid Samba 3 NTLM-Authentifizierung
Transcription
Squid Samba 3 NTLM-Authentifizierung
Linux-AG des Bürgernetzes Dillingen e.V. Methode zur transparenten Autorisierung und Authentifizierung von Zugriffen auf das Internet über Squid von Windows NT/2000/2003 Domänen-Benutzern anhand ihrer Zugehörigkeit zu einer globalen Gruppe Christian Maushart, 18.02.2004 Problemstellung: In LANs, in denen eine Microsoft Windows-Domäne unter NT 4 oder eine Active Directory (AD)Umgebung unter Windows 2000 Server oder Windows 2003 Server betrieben wird, soll der Internet-Zugang über einen Proxy-Server unter Linux (Squid) autorisiert und authentifiziert werden. Es sollen aber alle User die Berechtigung für den Internet-Zugang haben, sondern nur diejenigen, die einer bestimmten globalen Gruppe innerhalb der Domäne bzw. des AD angehören. Zudem sollen die User möglichst keinen Passwortdialog vorgesetzt bekommen; die Autorisierung und Authentifizierung soll transparent erfolgen. Lösungsvorschlag: In dieser Anleitung wird von der derzeit stabilen Debian Distribution 3.0r2 ausgegangen. Prinzipiell ist die vorgestellte Lösung aber auch auf SuSE-Linux bzw. Redhat übertragbar. Grundlegende Voraussetzung ist natürlich ein installierter Compiler (gcc) mit den üblichen Hilfsprogrammen (make etc.) Benötigt werden folgende Programme im Quelltext: Samba 3.0.2a Squid 2.5STABLE4 (http://www.samba.org) (http://www.squid-cache.org) Seit der Version 3 kann Samba auch mit AD Umgebungen im "einheitlichen Modus" umgehen. Insbesondere das enthaltene Paket "winbind" wird in dieser Anleitung genutzt, um die Benutzer und Gruppen in der Domäne bzw. im AD für Linux und damit für Squid sichtbar zu machen. Squid kann dann mit Hilfe eines Perl-Skriptes die Gruppenmitgliedschaft des Users zuordnen und entscheiden, ob der Internetzugang gewährt wird oder nicht. Das Programm nscd (Name Service Cache Daemon) darf auf dem Linux-Rechner nicht laufen, da sonst die Authentifizierung nicht funktioniert! Im folgenden wird unterschieden, ob es sich um eine Windows NT 4 Domäne bzw. um ein Windows 2000/2003 AD im "gemischten Modus" einerseits oder um ein Windows 2000/2003 AD im "einheitlichen Modus" handelt. Wir beginnen mit der einfacheren Variante: Windows NT 4 Domäne bzw. Windows 2000/2003 AD im "gemischten Modus" Samba/Winbind: Das tar-Archiv samba-3.0.2a.tar.gz auspacken und in das Unterverzeichnis source wechseln Anschließend die Befehle ./configure --with-winbind –with-winbind-auth-challenge make make install eingeben. Standardmäßig wird Samba damit unter /usr/local/samba installiert. Im Unterverzeichnis lib ist die Datei smb.conf mit folgendem Mindestinhalt zu erstellen: /usr/local/samba/lib/smb.conf: [global] workgroup = win2k3 security = domain password server = 2k3svrde encrypt passwords = yes idmap uid = 10000-20000 idmap gid = 10000-20000 winbind enum users = yes winbind enum groups = yes winbind use default domain = yes In diesem Beispiel heisst die Domäne "win2k3". Der Domänencontroller heisst "2k3svrde". Natürlich gibt es eine fast unüberschaubare Anzahl von weiteren Konfigurationsoptionen für Samba. Wir beschränken uns hier aber auf den einzigen Zweck, warum wir Samba überhaupt installiert haben: wir wollen die User und Gruppen aus der Windows Domäne bzw. dem AD unter Linux sichtbar machen. Das funktioniert am einfachsten mit winbind, der aber ein installiertes Samba voraussetzt. Damit die Auflösung der Windows-User- und -Gruppennamen erfolgen kann muss die Datei / etc/nsswitch.conf geändert werden: /etc/nsswitch.conf: passwd: files winbind group: files winbind hosts: files winbind dns #passwd: compat #group: compat shadow: compat #hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis Die bisherigen Eintragungen habe ich nicht gelöscht, sondern nur auskommentiert. Jetzt können die erforderlichen Daemons (in der richtigen Reihenfolge!) gestartet werden: /usr/local/samba/sbin/smbd -D /usr/local/samba/sbin/nmbd -D /usr/local/samba/sbin/winbindd Nun müssen wir mit unserem Linux-Rechner noch der Windows Domäne bzw. dem AD im "gemischten Modus" beitreten: /usr/local/samba/bin/net join win2k3 -U Administrator Anschließend ist ein Passwort anzugeben. Es handelt sich hierbei um das Passwort des Domänen-Administrators! Bereits jetzt sollten die User und (globalen) Gruppen der Domäne bzw. des AD unter Linux sichtbar werden. Das Tool "wbinfo" (unter /usr/local/samba/bin zu finden) liefert hierbei wichtige Hinweise, ob alles in Ordnung ist: wbinfo -u zeigt die Domänenbenutzer an: wbinfo -u: Administrator chris Gast krbtgt SUPPORT_388945a0 wbinfo -g zeigt die gefundenen Gruppen an, wobei hier besonders die von uns auf dem Windows NT bzw. 2000/2003 Server angelegte globale Gruppe "InternetUsers" von Interesse sein wird: wbinfo -g: DomDomDomDomDomSchema-Admins Organisations-Admins Richtlinien-Ersteller-Besitzer DnsUpdateProxy InternetUsers wbinfo -t zeigt an, die die Authentifizierung klappt: wbinfo -t: checking the trust secret via RPC calls succeeded wbinfo -a <USERNAME>%<PASSWORT> überprüft schliesslich, ob sich ein bestimmter User mit seinem Passwort an der Domäne anmelden kann: wbinfo -a chris%<PASSWORT>: plaintext password authentication succeeded challenge/response password authentication succeeded Sollten andere als die gezeigten Meldungen beim Aufruf von wbinfo erscheinen, ist offenbar etwas schief gegangen. Möglicherweise wurde Samba nicht mit den richtigen ./configure-Parametern gebaut. Das Thema Samba/Winbind ist damit abgeschlossen. Squid: Zunächst ist mit addgroup squid die Linuxgruppe Squid zu erzeugen. Damit Squid mit Winbind kommunizieren kann, sind noch die beiden Befehle chmod 750 /usr/local/samba/var/locks/winbindd_privileged chgrp squid /usr/local/samba/var/locks/winbindd_privileged erforderlich. Anschließend kann das tar-Archiv squid-2.5.STABLE4.tar.gz ausgepackt werden. Im Verzeichnis squid-2.5.STABLE4 ist anschließend ./configure --enable-auth=ntlm,basic \ --enable-external-acl-helpers=wbinfo_group make make install einzugeben. Der Squid wird kompiliert. Nach dem "make install" findet sich unter /usr/local/squid bereits eine squid.conf. Diese Datei ist zu bearbeiten. Für unsere Zwecke sind die folgenden Einträge (in der richtigen Reihenfolge!!) zu machen: /usr/local/squid/etc/squid.conf: cache_effective_user nobody cache_effective_group squid auth_param ntlm program /usr/local/samba/bin/ntlm_auth \ --helper-protocol=squid-2.5-ntlmssp -d 3 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/samba/bin/ntlm_auth \ --helper-protocol=squid-2.5-basic auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours external_acl_type ntgroup_helper ttl=10 %LOGIN \ /usr/local/squid/libexec/wbinfo_group.pl acl proxyfullaccess external ntgroup_helper InternetUsers acl AuthorizedUsers proxy_auth REQUIRED http_access allow proxyfullaccess http_access deny !proxyfullaccess http_access allow AuthorizedUsers http_access deny all Squid kennt natürlich eine enorme Anzahl weiterer Konfigurationsoptionen. Diese können selbstverständlich auch verwendet werden, nur sollten sie den oben stehenden Einträgen nicht widersprechen. Die Option -d 3 hinter dem helper-protocol squid-2.5-ntlmssp ist vor allem am Anfang zur Fehlerdiagnose zu empfehlen, ebenso wie der ttl=10 Eintrag. Die Authentifizierungsvorgänge können mit tail -f /usr/local/squid/logs/cache.log verfolgt werden. Sollte alles zur Zufriedenheit laufen, kann der Parameter -d 3 entfernt werden. Auch der ttl-Wert sollte auf 300 oder 600 erhöht werden. Die Zeile acl proxyfullaccess external ntgroup_helper InternetUsers verdient besondere Beachtung. Der letzte Parameter "InternetUsers" muss mit der WindowsGruppe, deren Mitglieder ins Internet dürfen, übereinstimmen. Würden alle User nur einen NTLM-fähigen Browser (Internet Explorer oder Mozilla mit einem entsprechenden Plugin) verwenden, könnte man sich die Zeilen: auth_param basic program /usr/local/samba/bin/ntlm_auth \ --helper-protocol=squid-2.5-basic auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours acl AuthorizedUsers proxy_auth REQUIRED http_access deny !proxyfullaccess http_access allow AuthorizedUsers sparen. Da dem aber unter Umständen nicht so ist, sollten auch diese User irgendwie behandelt werden. Genau dies erfolgt durch die obigen Zeilen. In diesen Fällen erhalten die User aber eine Dialogbox, in der sie ihren Domänen-Usernamen sowie ihr Domänen-Passwort eintragen müssen. Dies läßt sich leider nicht verhindern. Sollte ein User nicht in der Domäne sein, erhält er keinen Zugriff auf das Internet, egal ob er einen NTLM-fähigen Browser verwendet oder nicht. Schließlich müssen noch folgende Befehle eingegeben werden: mkdir /usr/local/squid/var/cache chown nobody:squid /usr/local/squid/var/cache chown nobody:squid /usr/local/squid/var/logs /usr/local/squid/sbin/squid -z Leider hat sich bei Samba 3.0.2 ein Ausgabeformat geändert, so dass die Datei /usr/local/squid/libexec/wbinfo_group.pl, die bei Squid 2.5STABLE4 dabei ist, nicht funktioniert. Statt dessen ist folgender Perl-Code als /usr/local/squid/libexec/wbinfo_group.pl zu speichern und ausführbar zu machen (chmod a+x wbinfo_group.pl): #!/usr/bin/perl -w # # external_acl helper to Squid to verify NT Domain group # membership using wbinfo # # This program is put in the public domain by Jerry Murdock # <jmurdock@itraktech.com>. It is distributed in the hope that it will # be useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Author: # Jerry Murdock <jmurdock@itraktech.com> # # Version history: # 2002-07-05 Jerry Murdock <jmurdock@itraktech.com> # Initial release # # 2004-01-14 Michael "shortbus2" <mike_123456@hotmail.com> # Modified code from multiple users at itmanagers forum # to allow multiple AD group support # added two lines for debug for `wbinfo -r` # # external_acl uses shell style lines in it's protocol require 'shellwords.pl'; # Disable output buffering $|=1; sub debug { # Uncomment this to enable debugging print STDERR "@_\n"; } # Check if a user belongs to a group # sub check { local($user, @group) = @_; $user =~ s/\\\\/\\/; $testcrap = `wbinfo -r \Q$user\E`; &debug ("output -- wbinfo -r \Q$user\E\n$testcrap"); local($group); foreach $group (@group) { $groupSID = `wbinfo -n "$group"`; chomp $groupSID; $groupGID = `wbinfo -Y "$groupSID"`; chomp $groupGID; &debug ("User: -$user-\nGroup: -$group-\nSID: $groupSID-\nGID: -$groupGID-"); return 'OK' if(`wbinfo -r \Q$user\E` =~ /^$groupGID$/m); } return 'ERR'; } # Main loop # while (<STDIN>) { chomp; &debug ("Got $_ from squid"); ($user, @group) = &shellwords; $ans = &check($user, @group); &debug ("Sending $ans to squid"); print "$ans\n"; } So, jetzt sind eigentlich alle Vorarbeiten erledigt. Squid kann mit /usr/local/squid/bin/squid gestartet werden. Falls alles in Ordnung ist, sollte ein ps -auxw | grep squid in etwa wie folgt aussehen: root 28157 0.0 0.7 3472 980 ? nobody 28159 8.5 3.2 6296 4084 ? nobody 28160 0.8 0.7 3176 992 ? 2.5-ntlmssp -d 3 nobody 28161 0.9 0.7 3176 992 ? 2.5-ntlmssp -d 3 nobody 28162 0.9 0.7 3176 992 ? 2.5-ntlmssp -d 3 nobody 28163 1.0 0.7 3176 992 ? 2.5-ntlmssp -d 3 nobody 28164 0.8 0.7 3176 992 ? 2.5-ntlmssp -d 3 nobody 28165 1.0 0.7 3176 988 ? 2.5-basic nobody 28166 1.0 0.7 3176 988 ? 2.5-basic nobody 28167 0.9 0.7 3176 988 ? 2.5-basic nobody 28168 1.0 0.7 3176 988 ? 2.5-basic nobody 28169 0.9 0.7 3176 988 ? 2.5-basic nobody 28170 0.0 0.8 2328 1020 ? usr/local/squid/libexec/wbinfo_group.pl nobody 28171 0.1 0.8 2328 1020 ? usr/local/squid/libexec/wbinfo_group.pl nobody 28172 0.0 0.8 2328 1020 ? usr/local/squid/libexec/wbinfo_group.pl nobody 28173 0.1 0.8 2328 1020 ? usr/local/squid/libexec/wbinfo_group.pl nobody 28174 0.1 0.8 2328 1020 ? usr/local/squid/libexec/wbinfo_group.pl S S S 20:43 20:43 20:43 0:00 /usr/local/squid/sbin/squid 0:01 (squid) 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 (ntlm_auth) --helper-protocol=squid- S 20:43 0:00 /usr/bin/perl -w / S 20:43 0:00 /usr/bin/perl -w / S 20:43 0:00 /usr/bin/perl -w / S 20:43 0:00 /usr/bin/perl -w / S 20:43 0:00 /usr/bin/perl -w / Windows Windows 2000/2003 AD im "einheitlichen Modus" Damit die Authentifizierung im AD klappt, müssen folgende Pakete installiert werden: apt-get apt-get apt-get apt-get install install install install libkrb5-dev libpam-krb5 libldap2-dev libpam0g-dev Samba/Winbind: Das tar-Archiv samba-3.0.2a.tar.gz auspacken und in das Unterverzeichnis source wechseln Anschließend die Befehle ./configure --with-ads --with-pam --with-pam_smbpass --withwinbind --with-winbind-auth-challenge make make install eingeben. Die Datei smb.conf mit folgendem Mindestinhalt erstellen: /usr/local/samba/lib/smb.conf: [global] workgroup = WIN2K3 security = ads password server = 2k3svrde.win2k3.chris.bndlg.de encrypt passwords = yes idmap uid = 10000-20000 idmap gid = 10000-20000 winbind enum users = yes winbind enum groups = yes realm = win2k3.chris.bndlg.de winbind use default domain = yes Anschliessend die Datei /etc/krb5.conf erstellen: /etc/krb5.conf: [libdefaults] ticket_lifetime = 24000 default_realm = win2k3.chris.bndlg.de dns_lookup_realm = yes dns_lookup_kdc = yes [realms] win2k3.chris.bndlg.de = { kdc = 2k3svrde.win2k3.chris.bndlg.de } Die /etc/nsswitch.conf wie folgt anpassen: /etc/nsswitch.conf: passwd: files winbind group: files winbind hosts: files winbind dns #passwd: compat #group: compat shadow: compat #hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis Da das AD ohne einen Nameserver nicht auskommt, in der /etc/resolv.conf am besten den DNSServer des AD eintragen: /etc/resolv.conf: nameserver <IP-Adresse des DNS> Die Datei /etc/ld.so.conf um folgenden Eintrag ergänzen: /etc/ld.so.conf: /lib/security Anschliessend noch einige Dateien in das richtige Verzeichnis kopieren, einen symbolischen Link erstellen und den Linker-Cache neu erstellen: cp /usr/src/samba-3.0.2a/source/nsswitch/libnss_winbind.so /lib cp /usr/src/samba-3.0.2a/source/nsswitch/pam_winbind.so \ /lib/security ln -s /lib/libnss_winbind.so /lib/libnss_winbind.so.2 ldconfig Jetzt können wir dem AD beitreten: net ads join -U Administrator Passwort ist das des Domänen-Admins. Falls hier die Fehlermeldung: "[2004/02/18 20:31:55, 0] libads/kerberos.c:ads_kinit_password(133) kerberos_kinit_password Administrator@WIN2K3.CHRIS.BNDLG.DE failed: KDC has no support for encryption type" erscheint: Auf dem Windows2000/2003-Server das Passwort für den Administrator neu vergeben; damit wird anscheinend ein Kerberos-Ticket erstellt! Im Erfolgsfall erscheint: Using short domain name -- WIN2K3 Joined 'ASUSDEBIAN' to realm 'WIN2K3.CHRIS.BNDLG.DE' Mit wbinfo -u, wbinfo -g, wbinfo -t, wbinfo -a <USERNAME>%<PASSWORT> kann wieder überprüft werden, ob die AD-User und -Gruppen angezeigt werden und ob man sich gegenüber dem AD authentifizieren kann. Wenn alles in Ordnung ist, sollten in etwa folgende Angaben erscheinen: wbinfo -u: Administrator Gast SUPPORT_388945a0 2K3SVRDE$ krbtgt chris HOST/asusdebian wbinfo -g: DomDomSchema-Admins Organisations-Admins DomDomDomRichtlinien-Ersteller-Besitzer DnsUpdateProxy InternetUsers wbinfo -t: checking the trust secret via RPC calls succeeded wbinfo -a chris%<PASSWORD>: plaintext password authentication succeeded challenge/response password authentication succeeded PAM: PAM steht für "pluggable authentication modules" ; damit können Linux-Programme z.B. über die von winbind geholten AD-User -Gruppen verfügen. Damit dies funktioniert müssen folgende Dateien angelegt werden: /etc/pam.d/system-auth-winbind: #%PAM-1.0 auth required /lib/security/pam_env.so auth required /lib/security/pam_securetty.so auth required /lib/security/pam_nologin.so auth sufficient /lib/security/pam_winbind.so auth sufficient /lib/security/pam_unix.so likeauth nullok \ use_first_pass shadow auth required /lib/security/pam_deny.so account sufficient /lib/security/pam_unix.so account required /lib/secuirty/pam_winbind.so password required /lib/security/pam_cracklib.so retry=3 type= password sufficient /lib/security/pam_unix.so nullok \ use_authtok md5 shadow password required /lib/security/pam_deny.so session required /lib/security/pam_limits.so session required /lib/security/pam_unix.so /etc/pam.d/samba: #%PAM-1.0 auth required pam_nologin.so auth required pam_stack.so service=system-auth-winbind account required pam_stack.so service=system-auth-winbind session required pam_stack.so service=system-auth-winbind password required pam_stack.so service=system-auth-winbind /etc/pam.d/squid: #%PAM-1.0 auth required /lib/security/pam_stack.so \ service=system-auth-winbind account required /lib/security/pam_stack.so \ service=system-auth-winbind Squid: Zunächst ist mit addgroup squid die Linuxgruppe Squid zu erzeugen. Damit Squid mit Winbind kommunizieren kann, sind noch die beiden Befehle chmod 750 /usr/local/samba/var/locks/winbindd_privileged chgrp squid /usr/local/samba/var/locks/winbindd_privileged erforderlich. Anschließend kann das tar-Archiv squid-2.5.STABLE4.tar.gz ausgepackt werden. Im Verzeichnis squid-2.5.STABLE4 ist anschließend ./configure --enable-ssl --enable-auth=ntlm,basic \ --enable-external-acl-helpers=wbinfo_group make make install einzugeben. Der Squid wird kompiliert. Nach dem "make install" findet sich unter /usr/local/squid bereits eine squid.conf. Diese Datei ist zu bearbeiten. Für unsere Zwecke sind die folgenden Einträge (in der richtigen Reihenfolge!!) zu machen: /usr/local/squid/etc/squid.conf: cache_effective_user nobody cache_effective_group squid auth_param ntlm program /usr/local/samba/bin/ntlm_auth \ --helper-protocol=squid-2.5-ntlmssp -d 3 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/samba/bin/ntlm_auth \ --helper-protocol=squid-2.5-basic auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours external_acl_type ntgroup_helper ttl=10 %LOGIN \ /usr/local/squid/libexec/wbinfo_group.pl acl proxyfullaccess external ntgroup_helper InternetUsers acl AuthorizedUsers proxy_auth REQUIRED http_access http_access http_access http_access allow proxyfullaccess deny !proxyfullaccess allow AuthorizedUsers deny all Squid kennt natürlich eine enorme Anzahl weiterer Konfigurationsoptionen. Diese können selbstverständlich auch verwendet werden, nur sollten sie den oben stehenden Einträgen nicht widersprechen. Die Option -d 3 hinter dem helper-protocol squid-2.5-ntlmssp ist vor allem am Anfang zur Fehlerdiagnose zu empfehlen, ebenso wie der ttl=10 Eintrag. Die Authentifizierungsvorgänge können mit tail -f /usr/local/squid/logs/cache.log verfolgt werden. Sollte alles zur Zufriedenheit laufen, kann der Parameter -d 3 entfernt werden. Auch der ttl-Wert sollte auf 300 oder 600 erhöht werden. Die Zeile acl proxyfullaccess external ntgroup_helper InternetUsers verdient besondere Beachtung. Der letzte Parameter "InternetUsers" muss mit der WindowsGruppe, deren Mitglieder ins Internet dürfen, übereinstimmen. Würden alle User nur einen NTLM-fähigen Browser (Internet Explorer oder Mozilla mit einem entsprechenden Plugin) verwenden, könnte man sich die Zeilen: auth_param basic program /usr/local/samba/bin/ntlm_auth \ --helper-protocol=squid-2.5-basic auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours acl AuthorizedUsers proxy_auth REQUIRED http_access deny !proxyfullaccess http_access allow AuthorizedUsers sparen. Da dem aber unter Umständen nicht so ist, sollten auch diese User irgendwie behandelt werden. Genau dies erfolgt durch die obigen Zeilen. In diesen Fällen erhalten die User aber eine Dialogbox, in der sie ihren Domänen-Usernamen sowie ihr Domänen-Passwort eintragen müssen. Dies läßt sich leider nicht verhindern. Sollte ein User nicht in der Domäne sein, erhält er keinen Zugriff auf das Internet, egal ob er einen NTLM-fähigen Browser verwendet oder nicht. Schließlich müssen noch folgende Befehle eingegeben werden: mkdir /usr/local/squid/var/cache chown nobody:squid /usr/local/squid/var/cache chown nobody:squid /usr/local/squid/var/logs /usr/local/squid/sbin/squid -z Leider hat sich bei Samba 3.0.2 ein Ausgabeformat geändert, so dass die Datei /usr/local/squid/libexec/wbinfo_group.pl, die bei Squid 2.5STABLE4 dabei ist, nicht funktioniert. Statt dessen ist folgender Perl-Code als /usr/local/squid/libexec/wbinfo_group.pl zu speichern und ausführbar zu machen (chmod a+x wbinfo_group.pl): /usr/local/squid/libexec/wbinfo_group.pl: #!/usr/bin/perl -w # # external_acl helper to Squid to verify NT Domain group # membership using wbinfo # # This program is put in the public domain by Jerry Murdock # <jmurdock@itraktech.com>. It is distributed in the hope that it will # be useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Author: # Jerry Murdock <jmurdock@itraktech.com> # # Version history: # 2002-07-05 Jerry Murdock <jmurdock@itraktech.com> # Initial release # # 2004-01-14 Michael "shortbus2" <mike_123456@hotmail.com> # Modified code from multiple users at itmanagers forum # to allow multiple AD group support # added two lines for debug for `wbinfo -r` # # external_acl uses shell style lines in it's protocol require 'shellwords.pl'; # Disable output buffering $|=1; sub debug { # Uncomment this to enable debugging print STDERR "@_\n"; } # Check if a user belongs to a group # sub check { local($user, @group) = @_; $user =~ s/\\\\/\\/; $testcrap = `wbinfo -r \Q$user\E`; &debug ("output -- wbinfo -r \Q$user\E\n$testcrap"); local($group); foreach $group (@group) { $groupSID = `wbinfo -n "$group"`; chomp $groupSID; $groupGID = `wbinfo -Y "$groupSID"`; chomp $groupGID; &debug ("User: -$user-\nGroup: -$group-\nSID: $groupSID-\nGID: -$groupGID-"); return 'OK' if(`wbinfo -r \Q$user\E` =~ /^$groupGID$/m); } return 'ERR'; } # Main loop # while (<STDIN>) { chomp; &debug ("Got $_ from squid"); ($user, @group) = &shellwords; $ans = &check($user, @group); &debug ("Sending $ans to squid"); print "$ans\n"; }