Uwierzytelnianie Squid w Kerberos i Windows 2008/2003/7 / XP

15

To jest coś, co ostatnio ustawiłem i było dość dużym bólem. Moje środowisko dostawało kałamarnicę do niewidocznego uwierzytelnienia klienta Windows 7 przeciwko Windows 2008 Server. NTLM nie jest tak naprawdę opcją, ponieważ jego użycie wymaga zmiany rejestru na każdym kliencie.

MS poleca Kerberos od Windows 2000, więc w końcu nadszedł czas na skorzystanie z programu.

Ogromne podziękowania dla Markusa Moellera z list mailingowych Squid za pomoc w uruchomieniu tego.

Harley
źródło

Odpowiedzi:

15

Jest to skonfigurowane z Squid 3.0, zostało również przetestowane z Squid 3.1 i powinno działać z Squid 2.7. Użytkownik systemu Windows musi być członkiem grupy SQUID_USERS w usłudze Active Directory (w tym przypadku i tak).

Po stronie Windows systemy Windows XP i Windows 2007 zostały przetestowane pod kątem systemu Windows 2008, a Windows XP pod Windows 2003.

Pamiętaj, że prawie każdy krok wymaga wykonania tego kroku przed nim.

Jeśli masz problem, DNS jest zawsze pierwszym miejscem do wyszukiwania. Oba komputery z systemem Windows powinny być w stanie pingować serwer Linux według nazwy (i odwrotnie), a ipconfig /flushdnsczasem może być konieczne uruchomienie . Ponowne uruchomienie może również pomóc, jeśli chcesz być naprawdę pewny, że nie kręci się wokół niego cruft.

Informacje o domenie

  • Domena Windows: dom.local
  • Serwer domeny: server.dom.local,172.17.3.11
  • CentOS kalmary serwera: centos.dom.local,172.17.3.10

Konfiguracja serwera domeny

  1. Utwórz dom.localstrefę odwrotną w konfiguracji DNS.
  2. Utwórz statyczny („A”) rekord centos.dom.localwskazujący na 172.17.3.10, wybierz Tak, gdy pojawi się pytanie, czy chcesz również ustawić odwrotny PTR.

Windows 2008

W przypadku serwera z systemem Windows 2008 musisz zainstalować poprawkę 951191 .

Konfiguracja systemu Linux

Drobne paczki

Zainstaluj pakiety

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

Zainstaluj msktutil. Musisz go załatać, zanim go zbudujesz.

$ 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

Skompiluj najnowszy ldap _krawężnika kałamarnicy _.

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

DNS

Służy system-config-networkdo konfigurowania punktu DNS kontrolera domeny, ustaw nazwę hosta na centos.dom.local.

Restart

Sprawdź, czy działa odwrotny DNS: $ dig -x 172.17.3.10

Powinieneś dostać się centos.dom.localw sekcji odpowiedzi. Jeśli nie, nie ma sensu kontynuować . Uwierzytelnianie Kerberos nie będzie działać bez poprawnie skonfigurowanego DNS.

Kerberos

Twój krb.confpowinien wyglądać mniej więcej tak:

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

Utwórz 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

W systemie Windows 2008 musisz dodać --enctypes 28do msktutilpolecenia.

Kałamarnica

Zainstaluj kalmary:

$ 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

Ustaw odpowiednie parametry w pliku 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

Skonfiguruj użytkownika i katalogi:

$ 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

Twórz skrzynki:

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

Skrypt początkowy

Teraz jest to ważne: Squid potrzebuje ustawień zmiennych środowiskowych, aby działał poprawnie. Najlepszym sposobem na to jest użycie skryptu inicjującego. Oto nieco zredagowany 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 $?

Oto ważne linie:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Maszyna klienta

Ustaw serwer proxy na serwer centos.dom.localza pomocą portu 3128. Ważne jest, aby używać w pełni kwalifikowanej nazwy domeny, a NIE adresu IP.

Harley
źródło
msktutil został przeniesiony na fuhm.net/software/msktutil
gurubert
1

Zamiast edytować /etc/init.d/squid, aby ustawić zmienną środowiskową KRB5_KTNAME, powinieneś po prostu wstawić wiersze do pliku / etc / sysconfig / squid. Ponieważ skrypty inicjujące źródła / etc / sysconfig / squid przy każdym wykonaniu będą pobierać te 2 wiersze.

Ponadto nie trzeba jawnie określać hostów jako KDC i serwera kadmin, wystarczy jedynie wprowadzić domenę DNS dla domeny Active Directory. Istnieją 2 powody, dla których:

  1. Kerberos z MIT i Kerberos z Heimdal są wystarczająco inteligentni, aby używać tych samych rekordów SRV, których używają klienci Windows do lokalizowania KDC i serwera kadmin
  2. Domena DNS (dom.local w twoim przykładzie) zwróci rekordy A wskazujące na twoje kontrolery domeny

źródło
Niezłe punkty. Chociaż zostało to skonfigurowane w CentOS, pochodzę z Debiana, który nie ma sysconfig. Czy jest jakaś szczególna korzyść z umieszczenia tam linii? Jak myślisz, w której części nie musisz określać DC? Wiem, że prawdopodobnie powinna to być każda część, ale DNS był tak trudny do skonfigurowania podczas tego procesu, że łatwiej było podać więcej informacji niż mniej.
Harley,
Powodem nie edytowania /etc/init.d/squid jest to, że: a) Jest to sposób Red Hat (i stąd CentOS). Większość administratorów RH / CentOS szuka takich dostosowań w plikach w / etc / sysconfig, a nie w skryptach inicjujących b) Jeśli ręcznie edytujesz skrypt inicjujący, istnieje ryzyko, że twoje zmiany zostaną zepsute podczas aktualizacji pakietów (błąd poprawka z RH lub nowszej wersji kałamarnicy) (na pytanie DC należy odpowiedzieć w osobnym komentarzu)
Jeśli chodzi o pytanie DC, linie, o których mowa, to „kdc = 172.17.3.11:88” i „admin_server = 172.17.3.11:7491”. Można je zastąpić słowami „kdc = dom.local” i „admin = dom.local”. „Host -ta dom.local” na komputerach z systemem Linux powinien zwracać adresy IP naszych kontrolerów domeny; ponieważ wszystkie kontrolery domeny to KDC, nawet wersja bibliotek Kerberos, które nie obsługują SRV SRV, nie powinna mieć problemów ze znalezieniem KDC, chociaż to poza mną, dlaczego ktoś używałby tak starych bibliotek Kerberos.
0

po tym tuto mogłem zmusić kałamarnicę do pracy na serwerze fedora 12. Sprawdź zaporę na serwerze Linux (włącz port 3128) i ustaw SELinux w trybie zezwolenia.


źródło