Hacer que Squid se autentique con kerberos y Windows 2008/2003/7 / XP

15

Esto es algo que configuré recientemente y fue un gran dolor. Mi entorno se estaba volviendo calamar para autenticar un cliente de Windows 7 contra un servidor de Windows 2008 de forma invisible. NTLM no es realmente una opción, ya que su uso requiere un cambio de registro en cada cliente.

MS ha estado recomendando Kerberos desde Windows 2000, por lo que finalmente es hora de seguir con el programa.

Muchas, muchas gracias a Markus Moeller de las listas de correo de Squid por ayudar a que esto funcione.

Harley
fuente

Respuestas:

15

Esto está configurado con Squid 3.0, también se ha probado con Squid 3.1 y debería funcionar con Squid 2.7. Su usuario de Windows debe ser miembro del grupo SQUID_USERS en Active Directory (para este caso de todos modos).

En el lado de Windows, Windows XP y Windows 2007 se han probado con Windows 2008 y Windows XP con Windows 2003.

Tenga en cuenta que casi todos los pasos requieren el anterior para continuar.

Si tiene un problema, DNS es siempre el primer lugar para buscar. Ambas máquinas con Windows deberían poder hacer ping al servidor Linux por nombre (y viceversa), y es posible que deba ejecutarlo ipconfig /flushdnsa veces. Un reinicio también puede ayudar, si quieres estar realmente seguro de que no hay merodear por ahí.

Información del dominio

  • Dominio de Windows: dom.local
  • Servidor de dominio: server.dom.local,172.17.3.11
  • CentOS calamar servidor: centos.dom.local,172.17.3.10

Configuración del servidor de dominio

  1. Crear dom.localzona inversa en la configuración de DNS.
  2. Cree un registro estático ('A') para centos.dom.localapuntar 172.17.3.10, seleccione cuando se le pregunte si desea configurar también el PTR inverso.

Windows 2008

Para el servidor de Windows 2008 necesita instalar el Hotfix 951191 .

Configuración de Linux

Paquetes menores

Instalar paquetes

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

Instalar msktutil. Necesita parchearlo antes de construirlo.

$ 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

Compila el último _bordillo de calamar _ldap.

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

DNS

Use system-config-networkpara configurar el punto DNS al controlador de dominio, establezca el nombre de host en centos.dom.local.

Reiniciar

Verifique que el DNS inverso esté funcionando: $ dig -x 172.17.3.10

Deberías entrar centos.dom.localen la sección de respuestas. Si no lo hace, no tiene sentido continuar . La autenticación Kerberos no funcionará sin DNS configurado correctamente.

Kerberos

Su krb.confdebería parecerse a algo como esto:

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

Crear tabla de teclas:

$ 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

Para Windows 2008 necesita agregar --enctypes 28al msktutilcomando.

Calamar

Instalar calamar:

$ 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

Configure los parámetros apropiados en 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

Configurar el usuario y los directorios:

$ 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

Crear cachés:

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

Script de inicio

Ahora esto es importante: Squid necesita algunas configuraciones de variables de entorno para ejecutarse correctamente. La mejor manera de hacer esto es usar un script de inicio. Aquí hay un CentOS ligeramente editado:

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

Estas son las líneas importantes:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Máquina cliente

Configure su proxy al servidor centos.dom.localusando el puerto 3128. Es importante que utilice el nombre de dominio completo y NO la dirección IP.

Harley
fuente
msktutil se ha movido a fuhm.net/software/msktutil
gurubert
1

En lugar de editar /etc/init.d/squid para establecer la variable de entorno KRB5_KTNAME, simplemente debe colocar las líneas en / etc / sysconfig / squid. Dado que el script de inicio genera / etc / sysconfig / squid en cada ejecución, recogerá esas 2 líneas.

Además, no necesita nombrar explícitamente los hosts para que sean el KDC y el servidor kadmin, es suficiente simplemente ingresar el dominio DNS para su dominio de Active Directory. Hay 2 razones por las cuales:

  1. MIT Kerberos y Heimdal kerberos son lo suficientemente inteligentes como para usar los mismos registros SRV que los clientes de Windows usan para ubicar el KDC y el servidor kadmin
  2. El dominio DNS (dom.local en su ejemplo) devolverá registros A que apuntan a sus controladores de dominio

fuente
Bonitos puntos. Aunque esto se configuró en CentOS, vengo de Debian, que no tiene sysconfig. ¿Hay algún beneficio especial para poner las líneas allí? ¿En qué parte crees que no tienes que especificar el DC? Sé que probablemente debería ser cada parte, pero DNS fue tan difícil de configurar durante este proceso que me resultó más fácil dar más información en lugar de menos.
Harley el
La razón para no editar /etc/init.d/squid es que: a) Es la forma de hacer las cosas de Red Hat (y, por lo tanto, CentOS). La mayoría de los administradores de RH / CentOS buscarán tales personalizaciones en los archivos en / etc / sysconfig en lugar de los guiones de inicio b) Si edita manualmente el guión de inicio, corre el riesgo de que sus cambios se arruinen en las actualizaciones del paquete (ya sea un error arreglo de RH o una versión más nueva de calamar) (la pregunta de DC debe responderse en un comentario separado)
En cuanto a la pregunta de DC, las líneas en cuestión son "kdc = 172.17.3.11:88" y "admin_server = 172.17.3.11:7491". Puede reemplazarlos con "kdc = dom.local" y "admin = dom.local". Un "host -ta dom.local" en sus máquinas Linux debería devolver las direcciones IP de nuestros controladores de dominio; dado que todos sus controladores de dominio son KDC, incluso una versión de las bibliotecas Kerberos que no admiten SRV RR no deberían tener problemas para encontrar los KDC, aunque no puedo entender por qué alguien usaría las bibliotecas Kerberos tan antiguas.
0

Siguiendo este tutorial, podría hacer que Squid trabaje en un servidor Fedora 12. Verifique el firewall en su servidor Linux (habilite el puerto 3128) y configure SELinux en modo permisivo.


fuente