Squid auf Ubuntu-Server mit Active Directory Anbindung

Endlich konnte ich bei uns im Geschäft den Microsoft-ISA-Server dauerhaft herunterfahren. Wir fuhren zwar noch mit der 2004-er Version, nutzen ihn bloss als Proxy, aber das Teil ging uns allen mächtig auf den Wecker; keine Performance und dauernd Ausfälle.

Als Ersatz konnte ich eine Lösung mit einem Ubuntu-Server und dem Proxy-Server squid einsetzen. Squid ist als OpenSource-Paket zu haben und ist in den offiziellen Paketen von Ubuntu eingebunden. Der Proxy-Server ist sehr leistungsfähig, fein skalierbar und ausbaubar. Er eignet sich eher für grössere Umgebungen, kann aber auch in kleinen Betrieben eingesetzt werden. Wir haben bei uns im Geschäft die Lösung getroffen, dass der Proxy-Server eine NT-Gruppe abfrägt und deren Mitglieder durchlässt, alle andern bekommen keinen Zugriff auf den Cache. Dies bedeutet, dass die Ubuntu-Maschine Zugriff auf das Active Directory braucht. Nachstehend will ich die wichtigsten Konfigurationen nennen.

Der Server

Ich benutze eine virtuelle Maschine auf unserem ESX-Server. Es ist ratsam, die Festplatten-Konfiguration durchdacht zu gestalten, unabhängig davon, ob der Server physikalisch besteht oder eine virtuelle Maschine ist. So würde ich eine separate Platte (oder Partition) für den Cache, das Log und natürlich für das Temp-Verzeichnis und den Swap erstellen. Liegt das Logfile vom Squid nicht im /var/ Verzeichnis, so würde ich /var/ auch noch als separate Platte einbinden. So kann man sicherstellen, dass der Server nicht abraucht, wenn /var/ überläuft. Ich habe dem Rechner 1 GB Memory verpasst, squid ist zwar recht anspruchslos, es lohnt sich aber, genügend flüchtigen Speicher zur Verfügung zu stellen.

Samba

Ohne Samba geht ja nichts, wenn man mit einer Linux-Kiste etwas auf der Windows-Seite tun will. Unter Ubuntu kann man das Samba-Päckli ganz normal installieren. Man kann gleich alle Komponenten auf einmal installieren, die es braucht, also auch Kerberos, Winbin und die Libaries:

sudo aptitude install krb5-user libpam-krb5 winbind samba smbfs smbclient libpam-mount

Danach sollte man sicherstellen, dass die lokale Zeit mit der des Windows-Domänencontrollers dauerhaft übereinstimmt. Dazu muss allenfalls noch das NTP-Paket installiert und konfiguriert werden. Danach sollte die hosts-Datei angeschaut werden und bei Bedarf einige Einträge hinzugefügt werden:

sudo vim /etc/hosts

Auf die Adresse 127.0.0.1 muss nebst dem Rechnernamen auch die FQDN-Adresse des Squid-Servers eingetragen sein. Wir haben den Squid-Server in die Domäne eingebunden (Member-Server) und so ist der FQDN gegeben.

Danach kann Kerberos eingerichtet werden. Die Konfigurationsdatei dazu befindet sich im /etc/ Verzeichnis:

sudo vim /etc/krb5.conf

Die Datei sollte folgende Werte beinhalten:

[logging]
default = FILE:/var/log/krb5.log

[libdefaults]
ticket_lifetime = 24000
clock_skew = 300
default_realm = MeineDomain.ch

[realms]
MeineDomain.ch = {
kdc = Name_des_ersten_Domänencontroller:88
kdc = Name_des_ersten_Domänencontrollers:464
kdc = Name_des_zweiten_Domänencontrollers:88
kdc = Name_des_zweiten_Domänencontrollers:464
admin_server = Name_des_ersten_Domänencontrollers:464
default_domain = MeineDomain.ch
}

[domain_realm]
.MeineDomain.ch = MeineDomain.ch
MeineDomain.ch = MeineDomain.ch

Jetzt kann Kerberos getestet werden:

sudo kinit BenutzerName_Eines_DomänenAdmins

Danach wird das Kennwort verlangt und wenn alles in Ordnung ist, erscheint wieder der normale Prompt. Ob es nun Kerberos geschafft hat, ein Ticket zu eröffnen, kann so angesehen werden:

sudo klist

Die Ausgabe sollte etwa so ausschauen:

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: fritzli@MeineDomain.ch

Valid starting Expires Service principal
02/28/08 10:42:45 02/28/08 20:42:30 krbtgt/MeineDomain.ch@MeineDomain.ch
renew until 02/28/08 20:42:45

Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

Falls es nicht klappt, ist allenfalls ein Durcheinander mit den Tickets vorhanden. Dann lassen sich mit folgendem Befehl alle Tickets löschen:

sudo kdestroy

Hat das geklappt, kann der Rechner der Windows-Domaine hinzugefügt werden. Dazu sollte die Konfigurationsdatei des Samba-Servers angepasste werden:

sudo vim /etc/samba/smb.conf

Dort sollten folgende Inhalte vorhanden sein:

[global]
security = ads
realm = MeineDomain.ch
password server = 172.31.1.15 #IP des Domain Controllers
workgroup = NT_Name_der_Domäne
# winbind separator = +
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /home/%U
template shell = /bin/bash
client use spnego = yes
client ntlmv2 auth = yes
encrypt passwords = yes
winbind use default domain = yes
restrict anonymous = 2
# to avoid the workstation from
# trying to become a master browser
# on your windows network add the
# following lines
domain master = no
local master = no
preferred master = no
os level = 0

Nach dem speichern der Datei müssen die Dienste neu gestartet werden:

sudo /etc/init.d/winbind stop
sudo /etc/init.d/samba restart
sudo /etc/init.d/winbind start

Und nun kann der Rechner der Domäne hinzugefügt werden:

sudo net ads join -U BenutzerName_eines_Domänen_Admin

Das Kennwort wird verlangt und wenn alles klappt, wird der Rechner der Domäne hinzugefügt. Dann ist er in der Windows-Ungebung unter “Server” zu sehen. Testen lässt sich die Verbindung ganz einfach. Um die Benutzer aus der Domäne anzeigen zu lassen, genügt folgender Befehl:

wbinfo -u

Um die Gruppen anzeigen zu lassen, braucht es die Anweisung:

wbinfo -g

Jetzt folgt noch die switch-Konfiguration, die sich in der Datei einrichten lässt:

sudo vim /etc/nsswitch.conf

Dort müssten folgende Werte verzeichnet sein:

passwd: compat winbind
group: compat winbind
shadow: compat

Die Dienste wollen nun noch einmal gestartet werden, damit die neue Konfiguration wirksam wird:

sudo /etc/init.d/winbind stop
sudo /etc/init.d/samba restart
sudo /etc/init.d/winbind start

Ob die Einstellungen richtig gesetzt wurden, lässt sich mit diesem Befehl kontrollieren, dann sollten die Gruppen der Windows-Domäne angezeigt werden:

getent group

Postfix installieren

Damit Mails vom System versandt werden können, sollte Postfix noch installiert werden. Die Installation habe ich hier beschrieben.

Squid installieren

So, und nun kann endlich squid installiert werden:

sudo apt-get install squid

Nach der Installation ist squid eigentlich bereit. Allerdings lässt der Proxy von Haus aus keine Rechner auf den Cache zugreifen. Dazu muss zuerst die Konfigurationsdatei richtig eingerichtet werden. Squid ist sehr breit in den Möglichkeiten ausgelegt und es gibt daher Tausende von Möglichkeiten, ihn einzurichten. Ich beschreibe hier die Version, welche wir erfolgreich einsetzen, gehe aber nicht in das Detail. Die Konfigurationsdatei würde ich zunächst umbenennen und eine neue anlegen, denn die ist dermassen lang; es sind alle Erklärungen darin enthalten. Berarbeiten kann man die Datei so:

sudo vim /etc/squid/squid.conf

Die Datei beinhaltet bei uns folgende Werte:

### Port
http_port 3128

### Stoplist
hierarchy_stoplist cgi-bin ?

### Cache
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_dir ufs /Pfad_zum_Cache 2024 16 256
# Bei 1 GB flüchtigem Speicher
cache_mem 512 MB
cache_replacement_policy heap GDSF
memory_replacement_policy heap GDSF

### Logfiles
access_log Pfad_zum_access.log
cache_log Pfad_zum_cache.log
cache_store_log Pfad_zum_store.log
emulate_httpd_log on
log_fqdn on

### Hostfile
hosts_file /etc/hosts

###FTP
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320

### Access
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT

##############################################
# Zugriffe für GOInternet (Gruppe, die surfen darf)
##############################################

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --require-membership-of="NT_Name_der_Domain\\GOInternet"
auth_param ntlm children 10 #auth_param ntlm max_challenge_reuses 0
#auth_param ntlm max_challenge_lifetime 2 minutes
#auth_param ntlm use_ntlm_negotiate off auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Domain Proxy Server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
authenticate_cache_garbage_interval 10 seconds

# Credentials past their TTL are removed from memory
authenticate_ttl 0 seconds

#### Regeln für den Zugriff für alle Benutzer
acl AlleBenutzerIntra dstdomain .spitalbuelach.ch
acl AlleBenutzerGoogle dstdomain .google-analytics.com
acl AlleBenutzerKomp dstdomain .kompendium.ch
acl AlleBenutzerPsych dstdomain wdeg.itrust.de
acl AlleBenutzerSBB dstdomain .sbb.ch

#### Anwendung der Regel für alle Benutzer
http_access allow AlleBenutzerIntra
http_access allow AlleBenutzerGoogle
http_access allow AlleBenutzerKomp
http_access allow AlleBenutzerPsych
http_access allow AlleBenutzerSBB

acl lcl src 172.31.0.0/16
acl auth proxy_auth REQUIRED
http_access allow lcl auth
http_access deny all
miss_access allow all
icp_access deny all

##############################################
# Ende Zugriffe für GOInternet
##############################################

http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
http_access deny all

Nicht vergessen, squid neu zu starten, damit die neue Konfiguration greift:

sudo /etc/init.d/squide restart

Herausforderungen

Natürlich gibt es auch einige Stolpersteine, die sich bei einer solchen Installation in den Weg stellen. Ein paar will ich hier notieren, zumal wir sie lösen konnten und wohl auch andere Menschen drauf hineinfallen möchten.

Im Konfigurationsfile zum Squid sollte man bei den Auth-Anweisung darauf achten, dass die Gruppe getrennt durch zwei Backslashes angeben wird:

NT-Domänen_Name\\GOInternet

Wenn der ntml-Authenicator nicht will, wenn man

sudo squid -N -d 1-d 1

eingibt, und dabie folgende Fehlermeldung liefert:

2008/02/26 11:32:03| WARNING: ntlmauthenticator #2 (FD 8) exited
2008/02/26 11:32:03| WARNING: ntlmauthenticator #3 (FD 9) exited
2008/02/26 11:32:03| WARNING: ntlmauthenticator #4 (FD 10) exited
2008/02/26 11:32:03| WARNING: ntlmauthenticator #5 (FD 11) exited
2008/02/26 11:32:03| WARNING: ntlmauthenticator #1 (FD 7) exited
usw.

haben wir so gelöst:

Die Authentifikation von ntml wird im Verzeichnis /var/run/ in einem weiteren Unterverzeichnis erledigt. Jenes Verzeichnis ist temporär angelegt und wird bei jedem Systemstart neu erzeugt. Dort besitzt der User proxy, welcher Squid ausführt, keine Rechte. Man könnte nun ein Skript schreiben, das die entsprechende Rechte bei jedem Systemstart setzt. Das wollten wir aber nicht. Stattdessen haben wir den User Proxy der Gruppe winbindd_priv hinzugefügt:

sudo adduser proxy winbindd_priv

Danach lief alles bestens. Ich habe dann noch einige Verfeinerungen und Optimierungen angebracht. Darüber will ich dann aber separat berichten.Wie gesagt, gibt es sehr viele Wege, squid zu nutzen. Die oben Beschriebene ist wohl nicht das NonPlusUltra. Aber der Weg beschreibt eine recht gute Lösung, die sich in einer Umgebung von etwa 450 Rechner und 600 Benutzer gut nutzen lässt. Dank ntml gibt der Browser (bei uns ist der Internet Explorer 7 standard) die Benutzerdaten gleich mit und niemand muss sich am Proxy von Hand anmelden. Ist ein Benutzer nicht in der Gruppe, erscheint ein Popup mit Benutzername und Kennwort. Die Proxy-Einstellungen geben wir via Gruppenrichtlinen mit, die Einstellungen können nicht mutiert werden. Ausserdem bekommen die Rechner per DHCP keinen Gateway; sie müssen als den Proxy passieren, um auf das Internet zugreifen zu können.

Ähnliche Artikel

Schlagwörter: , , , , , , , ,

11 Kommentare to “Squid auf Ubuntu-Server mit Active Directory Anbindung”

  1. Festplatten-Speed » Re: OT: Festplatten-Backup Prog gesucht, das directory Struktur 1:1 auf CD brenn - Festplatten: Darf’s denn etwas mehr sein… schrieb:

    [...] festplattenl: > > Ich suche seit längerem nach brauchbaren Tools, mit dem ich manuell/ > > automatisch z.B. ab dem root directory ein Abbild sämtlicher Dateien > > und Unterverzeichnisse einer Nicht-Systemplatte sequentiell auf > > mehrere CD-R bzw. CD-RW bzw. DVD /-Rx schreiben kann. > … > > Hmm.. Scheint mir eine relativ einfach lösbare Aufgabe zu sein, wenn > man sich nur etwas mit Shellskripts/Batchdateien befasst hat. Wo ist > das konkrete Problem? Es ist wie meistens unter WinXXYY ein Problem, da die dort vorhandene “shell” eigentlich unbrauchbar ist. Ein konkretes Problem ist z.B. wenn ein zu sicherndes (Unter-)Verzeichnis eine die CD-R überschreitende Kapazität annnimmt. Das tool müßte in diesem Fall mit der gleichen Verzeichnisstruktur auf einer zweiten CD-R weitermachen und dies in einem verteilten Logfile registrieren. Das von diskord_ weiter oben dankenswerterweise aufgeführte tool scdbackup löst aber anscheinend diese Herausforderungen. Filed under: Uncategorized Comments: [...]

  2. AlexNo Gravatar schrieb:

    Ich hab voller Neugier deinen Blogeintrag gelesen, hab aber noch eine Frage dazu.

    Im Prinzip versuche ich gerade fast genau das gleiche, wie du es hier beschrieben hast und die AD-Athentifizierung klappt auch schon. Und auch ich habe eine Gruppe von Leuten die alle Seiten erreichen können sollen und eine Gruppe von Leuten, die nur ausgwählte Seiten ansurfen dürfen.

    Wie hast du das gelöst? Denn bei mir ist es so, dass ein Restricted User zwar einen Teil der Seite angezeigt bekommt (bsp. telefonbuch.de), weil die aber auf ihren Seiten auch Banner einsetzen (mit anderer Url) kommt folgerichtig das Popup-Fenster zur Anmeldung. Das ist aber nicht so schön, weil diese User sich ja eigentlich gar nicht authentifizieren müssten. Wie hast du das gelöst? Ist das bei euch anders`?

  3. Roman HanhartNo Gravatar schrieb:

    Alex, ja, das ist unschön mit den Bannern und auch andern Quellen (URL), die “stören können. Ich konnte es bisher nur so lösen, dass ich AdLink und Konsorten in die Liste aufgenommen habe, welche alle User ohne Login ansehen können. Etwas Besseres ist mir dazu leider auch nicht eingefallen.

  4. Tom SchmidtNo Gravatar schrieb:

    Hallo,
    gelesen, adaptiert, funktioniert, Danke!

    Eine Frage bleibt aber, wie kann ich on diese OU namens GOInternet auf eine Gruppe zugreifen, damit ich in der Domäne einfach mit Mitgliedschaften arbeiten kann, ohne die User in eine andere OU zu verschieben?

    Danke und Gruss, Tom

  5. Roman HanhartNo Gravatar schrieb:

    Die müssten doch alle in der Standard-OU “DomainUsers” oder “Users” sein, oder? Hast Du das mal so probiert? Dann gingen aber alle Users und da willst Du wohl nicht.

    GOInternet ist bei mir übrigens keine OU im eigentlichen Sinne, sondern eine normale Active Directory Sicherheitsgruppe (global). Das funzt bestens so.

  6. Tom SchmidtNo Gravatar schrieb:

    Ja, es funzt bestens mit einer Sicherheitsgruppe. Wir nutzen es auch schon ausgiebig.
    Eine Frage verbleibt, da Seiten wie z.B. dastelefonbuch.de immer Werbung schalten, muss ich diese Domains entweder mit aufnehmen, oder den Users mit eingeschränktem Zugriff sagen, dass sie das dann aufkommende Proxy-Login-Fenster mit ESC beenden sollten, so lange, bis der Proxy Ruhe gibt. Siehe Vorredner Haben Sie mittlerweile eine bessere Lösung?!?

    Nochmals Danke, Tom

  7. Roman HanhartNo Gravatar schrieb:

    Nein, leider nicht, Tom. Es ist mir auch noch nichts Besseres eingefallen, als eben jene URLs freizugeben.

  8. SvenNo Gravatar schrieb:

    Hat schon einmal jemand versucht mit Winbind sich an 2 AD Domains gleichzeitig zu registrieren.

    Also ich bin gerade dabei eine Authentifizierung einzurichten, die in der Lage ist einen User gegen 2 verschiedene Domains zu authentifizieren.

    Das Problem dabei ist folgendes.

    Winbind cached die User und Gruppen Infos in einer .tdb Datei. Sobald ich der Domain beitrete werden die Daten gecached. Wenn ich jetzt der 2 Domain beitrete wird der Cache geflusht und ab dem Punkt stehen nur noch die User und Gruppen Infos der 2 Domain drin.

    Ist es möglich für jede Domain einen einzelnen Winbind Deamon zu habe? Bzw. kann man den Cache pro AD Domain separieren?
    Gibt es irgendeine Möglichkeit gleichzeitig in 2 Domains Mitglied zu sein und lokal die Infos über die User und Gruppen Daten vorzuhalten?

  9. stony007_deNo Gravatar schrieb:

    Als erstes: Super HowTo!!!
    Ich bin nur die letzten Tage am Verzeifeln! Ich habe es mir zur Aufgabe gemacht, unseren ISA-2000 abzulösen! Am liebsten durch nen Squid! Das funktioniert mit der AD Integration auch ganz gut, aber!!!

    Ich habe 2 Gruppen von Usern welche über den Proxy surfen dürfen!
    Die 1. Gruppe darf von diversen festegelegten PCs auf das Internet zugreifen.
    Die 2. Gruppe darf nur über 3 festdefinierte Rechner surfen, nicht über die andenen!

    Und das ganze soll nur von AD konfiguriert werden, nichts auf dem Squid selber!

    Mein bisheriger Ansatz:
    Die Gruppen abhängigen Rechner kann ich über ACLs abbilden! d.h. in meiner Config steht folgendes! :

    .
    ..

    auth_param ntlm program /usr/bin/ntlm_auth –helper-protocol=squid-2.5-ntlmssp #–require-membership-of=”Domain\\squid-proxy-user”

    ..
    .

    acl ComputerGroup1 src “/etc/squid3/SQUID-COMPUTER-GRUPPE1.lst”
    acl ComputerGroup2 src “/etc/squid3/SQUID-COMPUTER-GRUPPE2.lst”
    http_access allow ComputerGroup1 auth
    http_access allow ComputerGroup2 auth
    ..
    .

    Jetzt ist es Computern in den definierten ACLs möglich mit einer gültigen Anmeldeung eines Users aus der AD Gruppe “squid-proxy-user” möglich!
    Das Problem: Es funktioniert an beiden ACLs.

    Ich bräuchte die Möglichkeit, eine Weitere AD Gruppe einzubenden, welche den Usern der 2. Gruppe beinhaltet. Diese sollte dann wiederum via ACL beschräünken, dass diese nur über die Rechner der 2. Gruppe surfen dürfen..

    hat jemand eine Idee??

  10. Roman HanhartNo Gravatar schrieb:

    Ansatzweise dürftest Du hier etwas finden: http://www.informatikserver.at.....uid05.html

  11. Jonas WagnerNo Gravatar schrieb:

    Hallo Roman,

    vielen dank für Deine ausführliche Anleitung. Danach konnte ich diesen Proxy ‘http://www.pro-chip.de/debian/.....utzer.html‘ in einen Domäne einbinden. :-) )

    Einige Dinge verstehe ich nicht anzupassen: was meint ‘acl lcl src 172.31.0.0/16′? Ist das Dein LAN? Diese Art acl kann ich nicht verstehen.
    Der Squid läuft, fragt nach Benutzername und Passwort, was er nicht soll. Die Daten aus der anderen Anleitung werden nicht akzeptiert. Die Windows-Benutzer-Daten werden auch nicht akzeptiert.

    Ich erwart nun nicht, dass Du mein Problem für mich löst.
    In Deiner Anleitung kann ich leider nicht immer erkennen, was ‘adaptiert’ werden muss, wie es in einem anderen Eintrag heißt.

    Viele Grüße

    Jonas

Hinterlasse einen Kommentar

blogoscoop Blogverzeichnis - Blog Verzeichnis bloggerei.de