Squid mit Kerberos und Windows 2008/2003/7 / XP authentifizieren lassen

15

Dies ist etwas, was ich vor kurzem eingerichtet habe und war ein ziemlicher Schmerz. Meine Umgebung wurde squid, um einen Windows 7-Client unsichtbar gegen einen Windows 2008-Server zu authentifizieren. NTLM ist eigentlich keine Option, da für die Verwendung eine Registrierungsänderung auf jedem Client erforderlich ist.

MS empfiehlt Kerberos seit Windows 2000, also ist es endlich Zeit, sich mit dem Programm zu beschäftigen.

Vielen, vielen Dank an Markus Moeller von den Squid-Mailinglisten für die Unterstützung.

Harley
quelle

Antworten:

15

Dies wurde mit Squid 3.0 eingerichtet, wurde auch mit Squid 3.1 getestet und sollte mit Squid 2.7 funktionieren. Ihr Windows-Benutzer muss Mitglied der Gruppe SQUID_USERS in Active Directory sein (in diesem Fall jedoch).

Auf der Windows-Seite wurden Windows XP und Windows 2007 gegen Windows 2008 und Windows XP gegen Windows 2003 getestet.

Beachten Sie, dass für fast jeden Schritt der vorherige erforderlich ist.

Wenn Sie ein Problem haben, sollten Sie immer zuerst nach DNS suchen. Beide Windows-Computer sollten in der Lage sein, den Linux-Server nach Namen zu pingen (und umgekehrt), und Sie müssen möglicherweise ipconfig /flushdnszeitweise ausgeführt werden. Ein Neustart kann auch hilfreich sein, wenn Sie wirklich sicher sein möchten, dass keine Kruft herumhängt.

Domain Info

  • Windows-Domäne: dom.local
  • Domain Server: server.dom.local,172.17.3.11
  • CentOS Tintenfisch - Server: centos.dom.local,172.17.3.10

Domain Server Setup

  1. Erstellen Sie eine dom.localReverse Zone in der DNS-Konfiguration.
  2. Erstellen Sie einen statischen ('A') Datensatz, centos.dom.localauf den gezeigt werden soll 172.17.3.10, und wählen Sie Ja , wenn Sie gefragt werden, ob Sie auch die umgekehrte PTR einrichten möchten.

Windows 2008

Für Windows 2008 Server müssen Sie Hotfix 951191 installieren .

Linux-Setup

Kleinere Pakete

Pakete installieren

$ yum install -y cyrus-sasl-gssapi cvs autoconf automake openldap openldap-devel krb5-workstation krb5-devel gcc-c++

Installieren msktutil. Sie müssen es patchen, bevor Sie es erstellen.

$ wget http://download.systemimager.org/~finley/msktutil/msktutil_0.3.16.orig.tar.gz
$ wget http://download.systemimager.org/~finley/msktutil/msktutil_0.3.16-7.diff.gz
$ gunzip msktutil_0.3.16-7.diff.gz
$ tar zxf msktutil_0.3.16.orig.tar.gz
$ cd msktutil-0.3.16
$ patch < ../msktutil_0.3.16-7.diff
$ ./configure && make && make install

Kompilieren Sie die neueste Squid _Curb _LDAP.

$ cvs -z3 -d:pserver:[email protected]:/cvsroot/squidkerbauth co -P squid_kerb_ldap
$ cd squid_kerb_ldap
$ ./configure && make

DNS

Verwenden Sie system-config-networkdiese Option, um den DNS-Punkt für den Domänencontroller zu konfigurieren, und setzen Sie den Hostnamen auf centos.dom.local.

Starten Sie neu

Überprüfen Sie, ob das umgekehrte DNS funktioniert: $ dig -x 172.17.3.10

Sie sollten centos.dom.localin den Antwortbereich gelangen. Wenn Sie dies nicht tun, ist es sinnlos, fortzufahren . Die Kerberos-Authentifizierung funktioniert nicht, wenn DNS nicht ordnungsgemäß konfiguriert ist.

Kerberos

Du krb.confsolltest ungefähr so ​​aussehen:

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = DOM.LOCAL
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h

# For Windows XP:
 default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
 default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
 permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

# For Windows 2007:
# default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
# default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
# permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
 forwardable = yes

[realms]
 DOM.LOCAL = {
  kdc = 172.17.3.11:88
  admin_server = 172.17.3.11:7491
  default_domain = dom.local
 }

[domain_realm]
 .dom.local = DOM.LOCAL
 dom.local = DOM.LOCAL

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
}

Keytab erstellen:

$ kinit administrator
$ msktutil -c -b "CN=COMPUTERS" -s HTTP/centos.dom.local -h centos.dom.local -k /etc/HTTP.keytab --computer-name centos-http --upn HTTP/centos.dom.local --server server.dom.local --verbose

Für Windows 2008 müssen Sie --enctypes 28den msktutilBefehl hinzufügen .

Tintenfisch

Installieren Sie Squid:

$ wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE18.tar.gz
$ tar zxvf squid-3.0.STABLE18.tar.gz 
$ cd squid-3.0.STABLE18
$ ./configure --enable-negotiate-auth-helpers=squid_kerb_auth --enable-stacktraces --prefix=/opt/squid-3.0
$ make
$ make install
$ cp helpers/negotiate_auth/squid_kerb_auth/squid_kerb_auth /opt/squid-3.0/sbin/
$ cp ~/squid_kerb_ldap/squid_kerb_ldap /opt/squid-3.0/sbin/
$ cd /opt/squid-3.0/
$ mv etc/squid.conf etc/squid.conf.ORIG

Richten Sie die entsprechenden Parameter in squid.conf ein:

auth_param negotiate program /opt/squid-3.0/sbin/squid_kerb_auth -d -s HTTP/centos.dom.local
auth_param negotiate children 10
auth_param negotiate keep_alive o

external_acl_type SQUID_KERB_LDAP ttl=3600  negative_ttl=3600  %LOGIN /opt/squid-3.0/sbin/squid_kerb_ldap -d -g SQUID_USERS
acl AUTHENTICATED proxy_auth REQUIRED
acl LDAP_GROUP_CHECK external SQUID_KERB_LDAP
acl localnet src 172.17.3.0/24        # RFC1918 possible internal network

#http_access allow localnet
#http_access allow AUTHENTICATED
http_access allow LDAP_GROUP_CHECK

cache_dir ufs /var/cache/squid-3.0 100 16 256
access_log /var/log/squid-3.0/access.log squid
cache_log /var/log/squid-3.0/cache.log
cache_store_log /var/log/squid-3.0/store.log
pid_filename /var/run/squid-3.0.pid
cache_effective_user squid
cache_effective_group squid
coredump_dir /var/cache/squid-3.0

Richten Sie den Benutzer und die Verzeichnisse ein:

$ chown -R squid:squid /opt/squid-3.0/
$ mkdir /var/cache/squid-3.0
$ chown -R squid:squid /var/cache/
$ mkdir /var/log/squid-3.0
$ chown -R squid:squid /var/log/squid-3.0/
$ chown squid:squid /etc/HTTP.keytab

Caches erstellen:

$ /opt/squid-3.0/sbin/squid -z

Init-Skript

Nun ist dies wichtig: Squid benötigt einige Umgebungsvariablen, um ordnungsgemäß zu funktionieren. Der beste Weg, dies zu tun, ist die Verwendung eines Init-Skripts. Hier ist ein leicht bearbeitetes CentOS:

#!/bin/bash
# squid     This shell script takes care of starting and stopping
#       Squid Internet Object Cache
#
# chkconfig: - 90 25
# description: Squid - Internet Object Cache. Internet object caching is \
#   a way to store requested Internet objects (i.e., data available \
#   via the HTTP, FTP, and gopher protocols) on a system closer to the \
#   requesting site than to the source. Web browsers can then use the \
#   local Squid cache as a proxy HTTP server, reducing access time as \
#   well as bandwidth consumption.
# pidfile: /var/run/squid-3.0.pid
# config: /opt/squid-3.0/etc/squid.conf

PATH=/usr/bin:/sbin:/bin:/usr/sbin
export PATH

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# don't raise an error if the config file is incomplete
# set defaults instead:
SQUID_OPTS=${SQUID_OPTS:-"-D"}
SQUID_PIDFILE_TIMEOUT=${SQUID_PIDFILE_TIMEOUT:-20}
SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

# determine the name of the squid binary
[ -f /opt/squid-3.0/sbin/squid ] && SQUID=/opt/squid-3.0/sbin/squid

prog="$SQUID"

# determine which one is the cache_swap directory
CACHE_SWAP=`sed -e 's/#.*//g' /opt/squid-3.0/etc/squid.conf | \
    grep cache_dir |  awk '{ print $3 }'`
[ -z "$CACHE_SWAP" ] && CACHE_SWAP=/var/spool/squid-3.0

RETVAL=0

start() {

        #check if the squid conf file is present
        if [ ! -f /opt/squid-3.0/etc/squid.conf ]; then
            echo "Configuration file /opt/squid-3.0/etc/squid.conf missing" 1>&2
            exit 6
        fi
        . /etc/sysconfig/squid

        # don't raise an error if the config file is incomplete.
        # set defaults instead:
        SQUID_OPTS=${SQUID_OPTS:-"-D"}
        SQUID_PIDFILE_TIMEOUT=${SQUID_PIDFILE_TIMEOUT:-20}
        SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}

        if [ -z "$SQUID" ]; then
                echo "Insufficient privilege" 1>&2
                exit 4
        fi

        for adir in $CACHE_SWAP; do
        if [ ! -d $adir/00 ]; then
         echo -n "init_cache_dir $adir... "
         $SQUID -z -F -D >> /var/log/squid-3.0/squid.out 2>&1
    fi
    done
    echo -n $"Starting $prog: "
    $SQUID $SQUID_OPTS >> /var/log/squid-3.0/squid.out 2>&1
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
       timeout=0;
       while : ; do
          [ ! -f /var/run/squid-3.0.pid ] || break
      if [ $timeout -ge $SQUID_PIDFILE_TIMEOUT ]; then
         RETVAL=1
         break
      fi
      sleep 1 && echo -n "."
      timeout=$((timeout+1))
       done
    fi
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/squid-3.0
    [ $RETVAL -eq 0 ] && echo_success
    [ $RETVAL -ne 0 ] && echo_failure
    echo
    return $RETVAL
}

stop() {
    . /etc/sysconfig/squid

    # don't raise an error if the config file is incomplete.
    # set defaults instead:
    SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}

    echo -n  $"Stopping $prog: "
    $SQUID -k check >> /var/log/squid-3.0/squid.out 2>&1
    RETVAL=$?
    if [ $RETVAL -eq 0 ] ; then
        $SQUID -k shutdown &
        rm -f /var/lock/subsys/squid-3.0
    timeout=0
    while : ; do
        [ -f /var/run/squid-3.0.pid ] || break
        if [ $timeout -ge $SQUID_SHUTDOWN_TIMEOUT ]; then
            echo
            return 1
        fi
        sleep 2 && echo -n "."
        timeout=$((timeout+2))
        done
    echo_success
    echo
    else
        echo_failure
    echo
    fi
    return $RETVAL
}

reload() {
    . /etc/sysconfig/squid
    # don't raise an error if the config file is incomplete.
    # set defaults instead:
    SQUID_OPTS=${SQUID_OPTS:-"-D"}

    $SQUID $SQUID_OPTS -k reconfigure
}

restart() {
    stop
    start
}

condrestart() {
    [ -e /var/lock/subsys/squid-3.0 ] && restart || :
}

rhstatus() {
    status $SQUID && $SQUID -k check
}

probe() {
    return 0
}

case "$1" in
start)
    start
    ;;

stop)
    stop
    ;;

reload)
    reload
    ;;

restart)
    restart
    ;;

condrestart)
    condrestart
    ;;

status)
    rhstatus
    ;;

probe)
    exit 0
    ;;

*)
    echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
    exit 2
esac

exit $?

Dies sind die wichtigen Zeilen:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Client-Maschine

Stellen Sie Ihren Proxy auf Server centos.dom.localmit Port ein 3128. Es ist wichtig, dass Sie den vollqualifizierten Domainnamen und NICHT die IP-Adresse verwenden.

Harley
quelle
msktutil wurde
gurubert verschoben
1

Anstatt /etc/init.d/squid zu bearbeiten, um die Umgebungsvariable KRB5_KTNAME festzulegen, sollten Sie nur die Zeilen in / etc / sysconfig / squid einfügen. Da das Init-Skript bei jeder Ausführung / etc / sysconfig / squid verwendet, werden diese beiden Zeilen abgerufen.

Außerdem müssen Sie die Hosts nicht explizit als KDC- und KADMIN-Server bezeichnen, sondern müssen lediglich die DNS-Domäne für Ihre Active Directory-Domäne eingeben. Dafür gibt es zwei Gründe:

  1. MIT Kerberos und Heimdal Kerberos sind beide intelligent genug, um dieselben SRV-Einträge zu verwenden, mit denen Windows-Clients das KDC und den KADMIN-Server lokalisieren
  2. Die DNS-Domäne (dom.local in Ihrem Beispiel) gibt A-Einträge zurück, die auf Ihre Domänencontroller verweisen

quelle
Schöne Punkte. Obwohl dies in CentOS eingerichtet wurde, komme ich aus Debian, das nicht sysconfig hat. Gibt es einen besonderen Vorteil, wenn die Leitungen dort verlegt werden? In welchem ​​Teil müssen Sie Ihrer Meinung nach den DC nicht angeben? Ich weiß, dass es wahrscheinlich jeder Teil sein sollte, aber das Einrichten von DNS war während dieses Vorgangs so mühsam, dass es mir leichter fiel, mehr als weniger Informationen zu geben.
Harley
Der Grund, warum /etc/init.d/squid nicht bearbeitet wird, ist folgender: a) Dies ist die Red Hat-Methode (und damit auch CentOS). Die meisten RH / CentOS-Administratoren suchen nach solchen Anpassungen in den Dateien in / etc / sysconfig und nicht in den Init-Skripten. B) Wenn Sie das Init-Skript manuell bearbeiten, besteht die Gefahr, dass Ihre Änderungen durch Paket-Upgrades (ein Fehler) beschädigt werden Korrektur von RH oder einer neueren Version von Squid) (die DC-Frage muss in einem separaten Kommentar beantwortet werden)
Für die DC-Frage lauten die fraglichen Zeilen "kdc = 172.17.3.11:88" und "admin_server = 172.17.3.11:7491". Sie können diese durch "kdc = dom.local" und "admin = dom.local" ersetzen. Ein "host -ta dom.local" auf Ihren Linux-Computern sollte die IP-Adressen unserer Domänencontroller zurückgeben. Da alle Ihre Domänencontroller KDCs sind, sollte auch eine Version der Kerberos-Bibliotheken, die SRV-RRs nicht unterstützen, keine Probleme haben, die KDCs zu finden.
0

nach diesem tuto könnte ich squid auf einen fedora 12 server bringen. Überprüfen Sie die Firewall auf Ihrem Linux-Server (aktivieren Sie Port 3128) und setzen Sie SELinux in den zulässigen Modus.


quelle