Як отримати Squid для автентифікації з kerberos та Windows 2008/2003/7 / XP


15

Це те, що я налаштував недавно, і було досить великим болем. У моєму середовищі кальмари непомітно перевіряли автентифікацію клієнта Windows 7 проти сервера Windows 2008. NTLM насправді не є варіантом, оскільки для його використання потрібна зміна реєстру для кожного клієнта.

MS рекомендують Kerberos ще з Windows 2000, тому нарешті прийшов час із програмою.

Багато, велике спасибі Маркусу Моллеру з списків розсилки кальмарів за те, що він допоміг працювати.

Відповіді:


15

Це налаштування за допомогою Squid 3.0, також перевірено на Squid 3.1 та має працювати з Squid 2.7. Ваш користувач Windows повинен бути членом групи SQUID_USERS в Active Directory (у будь-якому випадку).

Що стосується Windows, Windows XP та Windows 2007 були протестовані на Windows 2008, а Windows XP на Windows 2003.

Зауважте, що майже кожен крок вимагає того, щоб його зробити.

Якщо у вас є проблеми, DNS - це завжди перше місце. Обидві машини Windows повинні мати можливість пінг-сервера Linux за назвою (і навпаки), і вам може знадобитися запускати ipconfig /flushdnsчасом. Перезавантаження може також допомогти, якщо ви хочете бути впевнені, що навколо вас не буде жодної крихти.

Інформація про домен

  • Домен Windows: dom.local
  • Сервер доменних імен: server.dom.local,172.17.3.11
  • CentOS кальмара сервера: centos.dom.local,172.17.3.10

Налаштування сервера домену

  1. Створіть dom.localзворотну зону в конфігурації DNS.
  2. Створіть статичну ('A') запис для centos.dom.localвказівки 172.17.3.10, виберіть Так, коли запитаєте, чи потрібно також встановити зворотний PTR.

Windows 2008

Для сервера Windows 2008 потрібно встановити виправлення 951191 .

Налаштування Linux

Незначні пакети

Встановіть пакети

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

Встановити msktutil. Потрібно заклеїти його, перш ніж будувати.

$ 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

Складіть останній _бордюр кальмарів _ldap.

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

DNS

Використовуйте system-config-networkдля налаштування точки DNS на контролері домену, встановіть ім'я хоста на centos.dom.local.

Перезавантажте

Перевірте, чи працює зворотний DNS: $ dig -x 172.17.3.10

Вам слід потрапити centos.dom.localв розділ відповідей. Якщо ви цього не зробите , немає сенсу продовжувати . Аутентифікація Kerberos не буде працювати без правильної налаштування DNS.

Керберос

Ви krb.confповинні виглядати приблизно так:

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

Створити клавішу клавіатури:

$ 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

Для Windows 2008 потрібно додати --enctypes 28до msktutilкоманди.

Кальмар

Встановити кальмари:

$ 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

Встановіть відповідні параметри в 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

Налаштування користувача та каталогів:

$ 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

Створіть кеші:

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

Сценарій Init

Тепер це важливо: для правильного запуску кальмару потрібні деякі змінні середовища. Найкращий спосіб зробити це - використовувати сценарій init. Ось трохи відредагований 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 $?

Це важливі рядки:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Клієнтська машина

Встановіть проксі на сервер centos.dom.localза допомогою порту 3128. Важливо, щоб ви використовували повністю кваліфіковане ім'я домену, а НЕ IP-адресу.


msktutil переміщено на fuhm.net/software/msktutil
gurubert

1

Замість редагування /etc/init.d/squid для встановлення змінної середовища KRB5_KTNAME слід просто поставити рядки в / etc / sysconfig / squid. Оскільки джерела сценарію init / etc / sysconfig / squid у кожному виконанні, він підбере ці 2 рядки.

Крім того, вам не потрібно чітко називати хости KDC і сервер kadmin, достатньо лише ввести домен DNS для вашого домену Active Directory. Є 2 причини, чому:

  1. MIT Kerberos та Heimdal kerberos досить розумні, щоб використовувати ті самі записи SRV, які клієнти Windows використовують для пошуку KDC та сервера kadmin
  2. Домен DNS (dom.local у вашому прикладі) поверне записи A, що вказують на ваші контролери домену

Приємні очки. Хоча це було налаштовано в CentOS, я родом з Debian, який не має sysconfig. Чи є якась особлива користь для розміщення рядків там? В якій частині, на вашу думку, вам не доведеться вказувати DC? Я знаю, що це, мабуть, має бути кожна частина, але DNS був таким болем, щоб налаштувати під час цього процесу, мені було легше дати більше інформації, ніж менше.
Харлі

Причиною не редагування /etc/init.d/squid є те, що: а) Це спосіб Red Red Hat (а отже, і CentOS). Більшість адміністраторів RH / CentOS шукатимуть такі налаштування у файлах у / etc / sysconfig, а не в скриптах init. B) Якщо ви вручну редагуєте скрипт init, ви ризикуєте, що ваші зміни будуть перекручені під час оновлення пакета (або помилка виправлення від RH або новішої версії кальмарів) (на питання DC потрібно відповісти в окремому коментарі)

Що стосується питання DC, про які йдеться, "kdc = 172.17.3.11:88" та "admin_server = 172.17.3.11:7491". Ви можете замінити їх на "kdc = dom.local" та "admin = dom.local". "Host -ta dom.local" на ваших Linux-машинах повинен повертати IP-адреси наших контролерів домену; оскільки всі ваші контролери домену - це KDC, навіть версія бібліотек Kerberos, які не підтримують SRV RR, не повинна мати проблем із пошуком KDC, хоча це не виходить, чому хтось використовував библіотеки Kerberos у цій старої.

0

слідуючи цьому tuto, я міг змусити кальмарів працювати на сервері fedora 12. Перевірте брандмауер на своєму сервері Linux (увімкніть порт 3128) та встановіть SELinux у дозвільному режимі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.