Squid3: Active-Directory Anbindung mit Kerberos-, NTLM- und Basic-Authentifizierung

0

Situations-Beschreibung

Viele Unternehmen verwenden das ActiveDirectory von Microsoft um die Benutzer und Computer-Objekte ihrer Umgebung zu verwalten. Häufig kommt daher auch der Wunsch auf, den Internet-Zugang anhand der AD-Benutzer zu steuern. Häufig über AD-Gruppen-Mitgliedschaften, da dies die Verwaltung wesentlich vereinfachen kann. Hierbei sollte es aber nicht nur einfach um die AD-Anbindung gehen, sondern nach Möglichkeit auch mit der entsprechenden Sicherheit bei der Authentifizierung. Nachfolgend ist daher Beispielhaft die Konfiguration eines Debian 7 Systems beschrieben, auf dem Squid3 mit der Anbindung an eine Windows 2008 R2 installiert wurde. Der einfachheitshalber wird der Proxy auch so vorbereitet, dass er eine Proxy.pac über Port 8083 ausliefern kann. Die notwendige Sicherheit bei der Authentifizierung der Benutzer wird erreicht, indem der Proxy die Benutzer mittels Kerberos, NTLM oder der Basic-Authentifizierung authentifizieren kann und das genau in der Reihenfolge.

Um die Beispielkonfiguration zu vereinfachen, wird zuerst die Beispiel-Umgebung beschrieben. Später wird dann pro Abschnitt auf die jeweilige Konfigurationsdatei verlinkt. Am Ende des Artikels gibt es dann ein Zip-Archiv, mit allen im Artikel verwendeten Konfigurations-Dateien.

Umgebungsübersicht

Eigenschaft Wert Beschreibung
NetBios Domain-Name DOMAIN  
FQDN DOMAIN.TLD  
Proxy-Name squidproxy  
Domain-Controller 1 192.168.0.1  
Domain-Controller 2 192.168.0.2  
Parent-Proxy IP 192.168.1.1  
AD-Gruppe(n) mit Internet-Zugang AD-Group_with_Internet_Access Mitglieder dieser AD-Gruppe dürfen ins Internet
Speicherort der AD-Gruppen OU=Groups,OU=Common Objects,ou=DEU,dc=DOMAIN,dc=TLD Wenn mehrere AD-Gruppen für unterschiedliche Regeln angelegt werden,
müssen diese alle hier liegen, da nur dort gesucht wird
AD-Proxy-Benutzer AD-Proxy-User Service-Konto für die Kerberos-Authentifizierung
AD-Suchpfad ou=DEU,dc=DOMAIN,dc=TLD Einschränkung des Suchpfades für die Benutzer-Objekte.
Macht in größeren Umgebungen Sinn.

 

#1. Zeitsynchronisierung sicherstellen

Für eine funktionieren Kerberos-Authentifizierung darf sich die Zeit zwischen dem Client und dem Server maximal um 5 Minuten unterscheiden. Um die gewährleisten zu können, sollte sich das Linux-System immer mit den DCs der Domäne abgleichen. Hierzu wird ntp installiert.

$ apt-get install ntp ntpdate

Anschließend müssen in der Datei /etc/ntp.conf die nachfolgenden Zeilen

server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

auskommentiert werden und durch eine Zeile für die Domäne ersetzte werden:

server domain.tld iburst

Anschließend den Dienst neustarten und die Uhrzeit einmal manuell synchronisieren:

$ /etc/init.d/ntp restart
$ ntpd -q -g

Der Neustart des Dienstes geht auch mittels

$ service restart ntp

… jedoch kann ich mich nur langsam in diese Schreibweise gewöhnen

 

#2. Installation und Einrichtung von Samba sowie winbind

$ apt-get install winbind samba

Für die Konfiguration muss die /etc/samba/smb.conf wie folgt angepasst werden:

[global]netbios name = squidproxy
workgroup = DOMAIN
realm = DOMAIN.TLD
server string =
security = ADS
encrypt passwords = true
log level = 3
log file = /var/log/samba/%m
preferred master = no
template shell = /bin/false
template homedir = /home/%D/%U
winbind uid = 10000-20000
winbind gid = 10000-20000
enhanced browsing = no
winbind use default domain = yes
winbind enum users = no
winbind enum groups = no
idmap cache time = 604800
idmap negative cache time = 20
winbind cache time = 600

password server = 192.168.0.1, 192.168.0.2
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes

kerberos method = system keytab
dedicated keytab file = /etc/krb5.keytab

 

#3. Installation und Einrichtung von Apache2

$ apt-get install apache2 libapache2-mod-perl2

Damit Apache2 über Port 8083 eine proxy.pac (Funktionen,Microsoft-Artikel) ausliefern kann, muss dieser Port in der Datei /etc/apache2/ports.conf freigeschaltet werden, indem der folgende Eintrag hinzugefügt wird:

Listen 8083

Des weiteren muss für die proxy.pac noch eine Site erstellt und aktiviert werden. Dazu wird die Datei /etc/apache2/sites-available/proxypac.conf mit folgendem Inhalt erstellt:

<VirtualHost *:8083>
    DocumentRoot "/var/www/proxypac/"
</VirtualHost>

und aktiviert

$ mkdir /var/www/proxypac/
$ a2ensite proxypac.conf

Soll der Apache2 Dienst auch cgi bzw. pl-Skripte verarbeiten können, muss die Datei /etc/apache2/sites-available/default noch wie folgt angepasst werden:

<Directory /var/www/>
Options ExecCGI
AddHandler cgi-script cgi pl

Dies macht z.B. dann Sinn, wenn man eine individuelle Blockpage verwenden möchte. Weitere Informationen dazu findet man unter http://www.squidguard.org/Doc/redirect.html.

Nun noch den Apache2-Dienst neustarten:

$ service apache2 restart

 

#4. Installation und Einrichtung von Squid3

$ apt-get install squid3
$ service squid3 stop
$ adduser proxy winbindd_priv

Damit die Authentifizierung später auch klappt, müssen in der Datei /etc/nsswitch.conf die folgenden Zeilen angepasst werden:

passwd: files winbind
group: files winbind


Nun ist der Zeitpunkt gekommen, das Service-Konto für den Proxy im AD anzulegen. In diesem Beispiel heißt das Konto AD-Proxy-User.
 Sobald es angelegt wurden, muss das Kennwort dieses Konto in der Datei /etc/squid3/authfile gespeichert werden. Man kann das Kennwort auch später direkt in der Konfigurationsdatei eintragen, jedoch würde es in diesem Fall auch im Klartext in der Prozessliste ausgegeben.

$ touch /etc/squid3/authfile
$ echo <password> > /etc/squid3/authfile

Nun kann das Linux-System der Domäne beitreten. Dazu wird im nachfolgenden Befehl mittels DEU/XX/Servers direkt angegeben, in welcher OU das Computerobjekt erstellt werden soll:

$ net ads join createcomputer='DEU/XX/Servers' -U ADA-Firstname.Lastname

Anschließend einmal den Winbind- und Samba-Dienst durchstarten:

$ service winbind restart
$ service samba restart

Nun kann die AD-Konnektivität überprüft werden, indem einmal die Authentifizierung eines Benutzers getestet wird:

$ /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
<username> <password>

… sowie die Gruppenmitgliedschaft abgefragt wird:

$ /usr/lib/squid3/wbinfo_group.pl
<username> <group_name>

Wenn beides überrüft werden konnte, geben beide Test jeweils ein OK zurück. Ein ERR bedeutet, dass die Abfrage nicht erfolgreich war.

Jetzt bitte die /etc/squid3/squid.conf erstmal so übernehmen. Nachfolgend ein paar Worte zu den Einstellungen. Unter "cheap rules first" sind die Regel aufgeführt, die am häufigsten zutreffen und die wenigsten "Kosten" durch weitere Abfragen verursachen. Im Abschnitt "sites free for all part" können Internetseiten angegeben werden, die für alle Mitarbeiter, unabhänging von weiteren Internetrechten erreichbar sein sollen, wie z.B die Seite der Gewerkschaft. Anschließend kommt der Kerberos, NTLM und BASIC Abschnitt. Die Reihenfolge ist Absicht, da zwar eigentlich von einem Client die stärkste Authentifizierungsmethode zuerst verwendet werden sollte, aber da dies nicht immer der Fall ist, wird dies durch die Reihenfolge erzwungen.

In den Abschnitten NTLM und BASIC ist jeweils die erste Zeile auskommentiert, da eine Gruppenabfrage auch direkt erfolgen kann. Möchte man jedoch auf verschiedene Gruppenmitgliedschaften prüfen, darf diese Zeile nicht verwendet werden. Statt dessen muss die Abfrage mittels "ldap_group" erfolgen.

Nun wird noch der Squid-Cache angelegt sowie zwei Whiteliste-Dateien.

$ squid3 -z
$ touch /etc/squid3/dom_white.acl
$ touch /etc/squid3/regexp_white.acl

Jetzt den ganzen Server einmal durchstarten um sicher zu gehen, dass alle Dienste die aktuellen Konfigurationsdateien gelesen haben.

 

#5. Installation und Einrichtung von Kerberos

Als erstes müssen wiede ein paar Pakete installiert werden:

$ apt-get install krb5-doc krb5-user

Anschließend muss die Datei /etc/krb5.conf wie folgt angepasst werden:

[libdefaults]debug = true
    default_realm = DOMAIN.TLD
    clockskew = 300
    default_tkt_enctypes = rc4-hmac
    default_tgs_enctypes = rc4-hmac

[realms]DOMAIN.TLD = {
    kdc = 192.168.0.1:88
    kdc = 192.168.0.2:88
    admin_server = 192.168.0.1:464
    admin_server = 192.168.0.2:464
    default_domain = DOMAIN.TLD
    kpasswd_server = 192.168.0.1:88
    kpasswd_server = 192.168.0.2:88
}

[domain_realm].DOMAIN.TLD = DOMAIN.TLD
    DOMAIN.TLD = DOMAIN.TLD

[logging]kdc = SYSLOG:DEBUG:AUTH
    admin_server = SYSLOG:DEBUG:AUTH
    default = SYSLOG:DEBUG:AUTH

[appdefaults]pam = {
        ticket_lifetime = 1d
        renew_lifetime = 1d
        forwardable = true
        krb4_convert = false
}

Da in der Datei /etc/krb5.keytab gleich Informationen für die Kerberos Authentifizierung gespeichert werden und diese Datei beim starten von Squid3 mit gezogen werden muss, ist noch eine Anpassung der Datei /etc/default/squid3 notwendig. Um über die Bash auch gleich die entsprechende Tests durchführen zu können, muss die Datei /etc/profile ebenfalls angepasst werden.

$ vim /etc/default/squid3

KRB5_KTNAME=/etc/squid3/krb5.keytab
export KRB5_KTNAME
$ vim /etc/profile

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

KRB5_KTNAME=/etc/squid3/krb5.keytab
export KRB5_KTNAME

Nun den Squid3-Dienst noch einmal neustarten und in der Bash einmal ab- & wieder anmelden, damit diese Änderungen greifen.

Noch einmal zur Sicherheit die AD-Anbindung prüfen

$ net ads testjoin

Jetzt wird die Datei krb5.keytab erstellt. Dazu muss man sich auf einem DC anmelden und einer Eingabeaufforderung mit Administratorrechten den folgenden Befehel ausführen:

c:> ktpass /princ HTTP/squidproxy.domain.tld@DOMAIN.TLD /mapuser AD-Proxy-User /crypto RC4-HMAC-NT /pass <password> /ptype KRB5_NT_SRV_HST /out krb5.keytab

Die Datei krb5.keytab wird nun auf die Linux Maschine kopiert und es werden die Dateirechte angepasst

$ chmod 644 /etc/squid3/krb5.keytab
$ chown proxy:proxy /etc/squid3/krb5.keytab

Nun kann die Kerberos Authentifizierung getestet werden:

$ kinit -V -k -t /etc/squid3/krb5.keytab HTTP/squidproxy.domain.tld@DOMAIN.TLD

HTTP/squidproxy.dommain.tld
Using default cache: /tmp/krb5cc_0
Using principal: HTTP/squidproxy.domain.tld@DOMAIN.TLD
Using keytab: /etc/squid3/krb5.keytab
Authenticated to Kerberos v5

Bei erfolgreicher Authentifizierung sollte das Ergebniss wie oben aussehen. Wenn dies nicht klappt, bitte folgendes prüfen:

  • Winbind & Samba Konfiguration, ob die richtigen DCs angegeben wurden und diese auch erreichbar sind.
  • Das Service-Konto richtig angelegt wurde. Bitte nicht vom SamAccountName irritieren lassen, dieser lautet jetzt HTTP/…, was aber richtig ist.
  • Die krb5.keytab richtig erstellt wurde.

Bei erfolgreicher Authentifizierung sollte die Linux Maschine jetzt ein Kerberos-Ticket erhalten haben.

$ klist -ek
Keytab name: FILE:/etc/squid3/krb5.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   6 01.01.1970 01:00:00 HTTP/squidproxy.domain.tld@DOMAIN.TLD (arcfour-hmac)

Mit folgendem Befehl noch die KVNO (Key-Version-Number) prüfen. Diese sollte identisch sein mit der obigen Ausgabe:

$ kvno HTTP/squidproxy.domain.tld@DOMAIN.TLD
HTTP/squidproxy.domain.tld@DOMAIN.TLD: kvno = 6

Weitere Informatione zu Kerberos findet man unter http://www.grolmsnet.de/kerbtut/.

Links

Teilen.

Über den Autor

Seit der Ausbildung zum Fachinformatiker Systemintegration (2002-2005) bei der DaimlerChrysler AG, beruflich im Bereich der E-Mail Kommunikation (Exchange, Linux) sowie des ActiveDirectory, mit entsprechenden Zertifizierungen (MCSE 2003, MCITP Ent.-Admin 2008, MCSE 2012, LPIC 1-3) tätig. Abgeschlossenes Studium zum Master of Science der IT-Management an der FOM sowie zertifizierter Datenschutzbeauftragter. Aktuell im Projektmanagement tätig.

Antworten