Получение Squid для аутентификации в Kerberos и Windows 2008/2003/7 / XP


15

Это то, что я настроил недавно, и это было довольно большой болью. Моя среда получала squid для невидимой аутентификации клиента Windows 7 на сервере Windows 2008. NTLM на самом деле не вариант, так как его использование требует изменения реестра для каждого клиента.

MS рекомендует Kerberos начиная с Windows 2000, так что, наконец, пришло время заняться этой программой.

Огромное спасибо Маркусу Мёллеру из списков рассылки Squid за помощь, чтобы это заработало.

Ответы:


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.

Kerberos

Вы 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
}

Создать 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

Для Windows 2008 вам нужно добавить --enctypes 28в msktutilкоманду.

Кальмар

Установите 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

Установите соответствующие параметры в 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

Начальный скрипт

Теперь это важно: для правильной работы Squid необходимо настроить некоторые переменные окружения. Лучший способ сделать это - использовать скрипт инициализации. Вот немного отредактированный 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
гуруберт

1

Вместо того, чтобы редактировать /etc/init.d/squid для установки переменной среды KRB5_KTNAME, вы должны просто поместить строки в / etc / sysconfig / squid. Поскольку сценарий инициализации использует / etc / sysconfig / squid при каждом выполнении, он подхватит эти две строки.

Кроме того, вам не нужно явно указывать хосты, которые будут 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 был такой боль в настройке во время этого процесса, мне было легче давать больше информации, чем меньше.
Harley

Причина не редактирования /etc/init.d/squid заключается в том, что: a) Это способ работы Red Hat (и, следовательно, CentOS). Большинство администраторов RH / CentOS будут искать такие настройки в файлах в / etc / sysconfig, а не в скриптах инициализации. Б) Если вы вручную редактируете скрипт инициализации, вы рискуете, что ваши изменения будут испорчены при обновлении пакета (либо ошибка исправить из RH или более новой версии squid) (вопрос о 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

следуя этому туто, я смог заставить squid работать на сервере fedora 12. Проверьте брандмауэр на вашем Linux-сервере (включите порт 3128) и установите SELinux в разрешающий режим.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.