Fazendo o Squid se autenticar com o kerberos e Windows 2008/2003/7 / XP

15

Isso é algo que eu configurei recentemente e foi uma grande dor. Meu ambiente estava ficando squid para autenticar um cliente Windows 7 em um servidor Windows 2008 invisivelmente. NTLM não é realmente uma opção, pois usá-lo requer uma alteração no registro de cada cliente.

A Microsoft recomenda o Kerberos desde o Windows 2000, então finalmente chegou a hora de começar o programa.

Muito, muito obrigado a Markus Moeller, da lista de emails do Squid, por ajudar a fazer isso funcionar.

Harley
fonte

Respostas:

15

Isso é configurado com o Squid 3.0, também foi testado com o Squid 3.1 e deve funcionar com o Squid 2.7. Seu usuário do Windows deve ser membro do grupo SQUID_USERS no Active Directory (neste caso, de qualquer maneira).

No lado do Windows, o Windows XP e o Windows 2007 foram testados no Windows 2008 e no Windows XP no Windows 2003.

Observe que quase todas as etapas requerem uma antes de prosseguir.

Se você tiver um problema, o DNS é sempre o primeiro local a procurar. Ambas as máquinas Windows devem poder executar ping no servidor Linux por nome (e vice-versa), e pode ser necessário executar ipconfig /flushdnsalgumas vezes. Uma reinicialização também pode ajudar, se você quiser ter certeza de que não há nenhum problema por aí.

Informações sobre o domínio

  • Domínio do Windows: dom.local
  • Servidor de domínio: server.dom.local,172.17.3.11
  • CentOS lula servidor: centos.dom.local,172.17.3.10

Configuração do servidor de domínio

  1. Crie dom.localzona reversa na configuração do DNS.
  2. Crie um registro estático ('A') para centos.dom.localapontar 172.17.3.10, selecione Sim quando for perguntado se você deseja configurar o PTR reverso também.

Windows 2008

Para o servidor Windows 2008, você precisa instalar o Hotfix 951191 .

Configuração do Linux

Pacotes menores

Instalar pacotes

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

Instale msktutil. Você precisa corrigi-lo antes de construí-lo.

$ 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

Compile o ldap mais recente da _calçada do Lula _.

$ 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 o ponto de DNS para o controlador de domínio, defina o nome do host para centos.dom.local.

Reiniciar

Verifique se o DNS reverso está funcionando: $ dig -x 172.17.3.10

Você deve entrar centos.dom.localna seção de respostas. Caso contrário, não faz sentido continuar . A autenticação Kerberos não funcionará sem o DNS configurado corretamente.

Kerberos

Você krb.confdeve se parecer com algo assim:

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

Crie 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

Para o Windows 2008, você precisa adicionar --enctypes 28ao msktutilcomando.

Lula

Instale o 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

Configure os parâmetros apropriados no 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

Configure o usuário e os diretórios:

$ 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

Crie caches:

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

Script inicial

Agora isso é importante: o Squid precisa de algumas configurações de variáveis ​​de ambiente para funcionar corretamente. A melhor maneira de fazer isso é usar um script init. Aqui está um do CentOS ligeiramente 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 são as linhas importantes:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Máquina Cliente

Defina seu proxy como servidor centos.dom.localusando a porta 3128. É importante que você use o nome de domínio totalmente qualificado e NÃO o endereço IP.

Harley
fonte
msktutil foi movido para fuhm.net/software/msktutil
gurubert
1

Em vez de editar /etc/init.d/squid para definir a variável de ambiente KRB5_KTNAME, você deve colocar as linhas em / etc / sysconfig / squid. Como o script init origina / etc / sysconfig / squid em todas as execuções, ele pega essas 2 linhas.

Além disso, você não precisa nomear explicitamente os hosts para serem o KDC e o servidor kadmin; basta apenas inserir o domínio DNS para o seu domínio do Active Directory. Existem 2 razões pelas quais:

  1. O MIT Kerberos e Heimdal kerberos são inteligentes o suficiente para usar os mesmos registros SRV que os clientes do Windows usam para localizar o KDC e o servidor kadmin
  2. O domínio DNS (dom.local no seu exemplo) retornará registros A apontando para seus controladores de domínio

fonte
Pontos agradáveis. Embora isso tenha sido configurado no CentOS, eu venho do Debian, que não possui o sysconfig. Existe algum benefício especial em colocar as linhas lá? Em qual parte você acha que não precisa especificar o CD? Eu sei que provavelmente deve haver todas as partes, mas o DNS foi tão difícil de configurar durante esse processo que achei mais fácil fornecer mais informações do que menos.
Harley
A razão para não editar o /etc/init.d/squid é que: a) É a maneira da Red Hat (e, portanto, do CentOS) de fazer as coisas. A maioria dos administradores de RH / CentOS procurará essas personalizações nos arquivos em / etc / sysconfig em vez dos scripts init b) Se você editar manualmente o script init, corre o risco de que suas alterações sejam prejudicadas nas atualizações de pacotes (um bug correção de RH ou uma versão mais recente do squid) (a questão DC precisa ser respondida em um comentário em separado)
Quanto à questão DC, as linhas em questão são "kdc = 172.17.3.11:88" e "admin_server = 172.17.3.11:7491". Você pode substituir aqueles com "kdc = dom.local" e "admin = dom.local". Um "host -ta dom.local" em suas máquinas Linux deve retornar os endereços IP de nossos controladores de domínio; como todos os seus controladores de domínio são KDCs, mesmo uma versão das bibliotecas Kerberos que não oferecem suporte a SRV RRs não deve ter problemas para encontrar os KDCs, embora esteja fora de mim por que alguém usaria as bibliotecas Kerberos tão antigas.
0

seguindo este tuto eu poderia fazer o squid funcionar em um servidor fedora 12. Verifique o firewall no servidor Linux (ative a porta 3128) e configure o SELinux no modo permissivo.


fonte