Far eseguire l'autenticazione di Squid con Kerberos e Windows 2008/2003/7 / XP


15

Questo è qualcosa che ho installato di recente ed è stato piuttosto doloroso. Il mio ambiente stava diventando calamari per autenticare invisibilmente un client Windows 7 su un server Windows 2008. NTLM non è in realtà un'opzione, poiché l'utilizzo richiede una modifica del Registro di sistema su ciascun client.

MS consiglia Kerberos da Windows 2000, quindi è finalmente arrivato il momento di iniziare con il programma.

Mille grazie a Markus Moeller delle mailing list di Squid per aver contribuito a far funzionare tutto questo.

Risposte:


15

Questo è configurato con Squid 3.0, è stato testato anche con Squid 3.1 e dovrebbe funzionare con Squid 2.7. L'utente di Windows deve essere un membro del gruppo SQUID_USERS in Active Directory (in questo caso comunque).

Sul lato Windows, Windows XP e Windows 2007 sono stati testati su Windows 2008 e Windows XP su Windows 2003.

Si noti che quasi ogni passaggio richiede quello precedente per procedere.

Se hai un problema, DNS è sempre il primo posto dove cercare. Entrambe le macchine Windows dovrebbero essere in grado di eseguire il ping del server Linux per nome (e viceversa) e potrebbe essere necessario eseguire ipconfig /flushdnsa volte. Anche un riavvio può essere d'aiuto, se vuoi essere davvero sicuro che non ci sia alcuna rotta in giro.

Informazioni sul dominio

  • Dominio Windows: dom.local
  • Server di dominio: server.dom.local,172.17.3.11
  • CentOS calamaro server: centos.dom.local,172.17.3.10

Configurazione del server di dominio

  1. Crea la dom.localzona inversa nella configurazione DNS.
  2. Crea un record statico ('A') per il centos.dom.localpuntamento a 172.17.3.10, seleziona quando ti viene chiesto se vuoi impostare anche il PTR inverso.

Windows 2008

Per il server Windows 2008 è necessario installare l' hotfix 951191 .

Installazione di Linux

Pacchetti minori

Installa i pacchetti

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

Installa msktutil. Devi ripararlo prima di costruirlo.

$ 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

Compilare l'ultima calamari _marciapiede _LDAP.

$ cvs -z3 -d:pserver:anonymous@squidkerbauth.cvs.sourceforge.net:/cvsroot/squidkerbauth co -P squid_kerb_ldap
$ cd squid_kerb_ldap
$ ./configure && make

DNS

Utilizzare system-config-networkper configurare il punto DNS sul controller di dominio, impostare il nome host su centos.dom.local.

Reboot

Verifica che il DNS inverso funzioni: $ dig -x 172.17.3.10

Dovresti entrare centos.dom.localnella sezione delle risposte. In caso contrario, non ha senso continuare . L'autenticazione Kerberos non funzionerà senza DNS configurato correttamente.

Kerberos

Il tuo krb.confdovrebbe assomigliare a qualcosa di simile a questo:

[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
}

Crea keytab:

$ 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

Per Windows 2008 è necessario aggiungere --enctypes 28al msktutilcomando.

Calamaro

Installa calamari:

$ 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

Imposta i parametri appropriati in squid.conf:

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

Imposta l'utente e le directory:

$ 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

Crea cache:

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

Script Init

Ora questo è importante: Squid ha bisogno di alcune impostazioni delle variabili d'ambiente per funzionare correttamente. Il modo migliore per farlo è usare uno script init. Ecco un CentOS leggermente modificato:

#!/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 $?

Queste sono le linee importanti:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Macchina client

Imposta il proxy sul server centos.dom.localutilizzando la porta 3128. È importante utilizzare il nome di dominio completo e NON l'indirizzo IP.


msktutil è stato spostato su fuhm.net/software/msktutil
gurubert

1

Invece di modificare /etc/init.d/squid per impostare la variabile d'ambiente KRB5_KTNAME dovresti semplicemente inserire le righe in / etc / sysconfig / squid. Poiché lo script di init genera / etc / sysconfig / squid ad ogni esecuzione, prenderà quelle 2 righe.

Inoltre, non è necessario nominare esplicitamente gli host come KDC e server kadmin, è sufficiente inserire semplicemente il dominio DNS per il dominio Active Directory. Ci sono 2 motivi per cui:

  1. I Kerberos MIT Kerberos e Heimdal sono entrambi abbastanza intelligenti da utilizzare gli stessi record SRV utilizzati dai client Windows per individuare il KDC e il server kadmin
  2. Il dominio DNS (dom.local nel tuo esempio) restituirà i record A che puntano ai tuoi controller di dominio

Bei punti. Sebbene sia stato installato in CentOS, vengo da Debian, che non ha sysconfig. C'è qualche vantaggio speciale nel mettere le linee lì? In quale parte pensi di non dover specificare il DC? So che probabilmente dovrebbe essere ogni parte, ma DNS è stato un tale problema da configurare durante questo processo, ho trovato più facile fornire più informazioni piuttosto che meno.
Harley,

La ragione per non modificare /etc/init.d/squid è che: a) È il modo Red Hat (e quindi CentOS) di fare le cose. La maggior parte degli amministratori RH / CentOS cercherà tali personalizzazioni nei file in / etc / sysconfig anziché negli script init b) Se si modifica manualmente lo script init si corre il rischio che le modifiche vengano rovinate sugli aggiornamenti del pacchetto (sia un bug correzione da RH o da una versione più recente di calamari) (la domanda DC deve essere risolta in un commento separato)

Per quanto riguarda la domanda DC, le righe in questione sono "kdc = 172.17.3.11:88" e "admin_server = 172.17.3.11:7491". Puoi sostituirli con "kdc = dom.local" e "admin = dom.local". Un "host -ta dom.local" sui tuoi computer Linux dovrebbe restituire gli indirizzi IP dei nostri controller di dominio; dal momento che tutti i controller di dominio sono KDC, anche una versione delle librerie Kerberos che non supportano RR SRV non dovrebbe avere problemi a trovare i KDC, anche se è fuori di me il motivo per cui qualcuno dovrebbe utilizzare le librerie Kerberos così vecchie.

0

seguendo questo tuto ho potuto far lavorare i calamari su un server fedora 12. Controllare il firewall sul server Linux (abilitare la porta 3128) e impostare SELinux in modalità permissiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.