Bắt Squid để xác thực với kerberos và Windows 2008/2003/7 / XP


15

Đây là một cái gì đó tôi thiết lập gần đây và là một nỗi đau lớn. Môi trường của tôi đã trở nên khó khăn để xác thực máy khách Windows 7 với Máy chủ Windows 2008 một cách vô hình. NTLM không thực sự là một lựa chọn, vì sử dụng nó đòi hỏi phải thay đổi sổ đăng ký trên mỗi máy khách.

MS đã giới thiệu Kerberos kể từ Windows 2000, vì vậy cuối cùng cũng đến lúc có chương trình.

Rất, rất cám ơn Markus Moeller của danh sách gửi thư của Squid vì đã giúp công việc này hoạt động.

Câu trả lời:


15

Đây là thiết lập với Squid 3.0, cũng đã được thử nghiệm với Squid 3.1 và sẽ hoạt động với Squid 2.7. Người dùng Windows của bạn phải là thành viên của nhóm SQUID_USERS trong Active Directory (dù sao trong trường hợp này).

Về phía Windows, Windows XP và Windows 2007 đã được thử nghiệm với Windows 2008 và Windows XP với Windows 2003.

Lưu ý rằng hầu hết mọi bước đều yêu cầu bước trước khi tiến hành.

Nếu bạn gặp vấn đề, DNS luôn là nơi đầu tiên để xem xét. Cả hai máy Windows đều có thể ping máy chủ Linux theo tên (và ngược lại) và đôi khi bạn có thể cần phải chạy ipconfig /flushdns. Khởi động lại cũng có thể giúp ích, nếu bạn muốn thực sự chắc chắn rằng không có hành trình treo xung quanh.

Thông tin tên miền

  • Tên miền Windows: dom.local
  • Máy chủ tên miền : server.dom.local,172.17.3.11
  • Máy chủ mực CentOS : centos.dom.local,172.17.3.10

Thiết lập máy chủ tên miền

  1. Tạo dom.localvùng đảo ngược trong cấu hình DNS.
  2. Tạo bản ghi tĩnh ('A') để centos.dom.localtrỏ đến 172.17.3.10, chọn khi được hỏi nếu bạn cũng muốn thiết lập PTR ngược.

Windows 2008

Đối với máy chủ Windows 2008, bạn cần cài đặt Hotfix 951191 .

Thiết lập Linux

Gói nhỏ

Cài đặt gói

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

Cài đặt msktutil. Bạn cần phải vá nó trước khi bạn xây dựng nó.

$ 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

Biên dịch mực mới nhất _lề đường _ldap.

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

DNS

Sử dụng system-config-networkđể định cấu hình điểm DNS cho bộ điều khiển miền, đặt tên máy chủ thành centos.dom.local.

Khởi động lại

Kiểm tra DNS ngược đang hoạt động: $ dig -x 172.17.3.10

Bạn nên centos.dom.localvào phần trả lời. Nếu bạn không có điểm nào tiếp tục . Xác thực Kerberos sẽ không hoạt động nếu không được cấu hình DNS đúng cách.

Kerberos

Bạn krb.confsẽ trông giống như thế này:

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

Tạo 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

Đối với Windows 2008, bạn cần thêm --enctypes 28vào msktutillệnh.

Mực ống

Cài đặt mực:

$ 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

Thiết lập các tham số thích hợp trong 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

Thiết lập người dùng và thư mục:

$ 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

Tạo bộ nhớ cache:

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

Kịch bản ban đầu

Bây giờ điều này rất quan trọng: Mực cần một số thiết lập biến môi trường để chạy đúng. Cách tốt nhất để làm điều này là sử dụng tập lệnh init. Đây là một bản CentOS được chỉnh sửa một chút:

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

Đây là những dòng quan trọng:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Máy khách

Đặt proxy của bạn đến máy chủ centos.dom.localbằng cổng 3128. Điều quan trọng là bạn sử dụng tên miền đủ điều kiện và KHÔNG phải địa chỉ IP.


msktutil đã được chuyển đến fuhm.net/software/msktutil
gurubert

1

Thay vì chỉnh sửa /etc/init.d/squid để đặt biến môi trường KRB5_KTNAME, bạn chỉ nên đặt các dòng trong / etc / sysconfig / squid. Vì tập lệnh init nguồn / etc / sysconfig / squid trên mỗi lần thực thi, nó sẽ nhận 2 dòng đó.

Ngoài ra, bạn không cần phải đặt tên rõ ràng cho các máy chủ là KDC và máy chủ kadmin, chỉ cần nhập tên miền DNS cho miền Active Directory của bạn là đủ. Có 2 lý do tại sao:

  1. MIT Kerberos và Heimdal kerberos đều đủ thông minh để sử dụng cùng một bản ghi SRV mà các máy khách Windows sử dụng để định vị KDC và máy chủ kadmin
  2. Tên miền DNS (dom.local trong ví dụ của bạn) sẽ trả về một bản ghi trỏ đến bộ điều khiển miền của bạn

Điểm hay. Mặc dù điều này đã được thiết lập trong CentOS, tôi đến từ Debian, không có sysconfig. Có bất kỳ lợi ích đặc biệt để đặt các dòng ở đó? Phần nào bạn nghĩ rằng bạn không phải chỉ định DC? Tôi biết nó có thể là tất cả các phần, nhưng DNS là một nỗi đau để thiết lập trong quá trình này, tôi thấy việc cung cấp nhiều thông tin hơn là ít hơn.
Harley

Lý do không chỉnh sửa /etc/init.d/squid là: a) Đó là cách làm việc của Red Hat (và do đó là CentOS). Hầu hết các quản trị viên RH / CentOS sẽ tìm kiếm các tùy chỉnh như vậy trong các tệp trong / etc / sysconfig thay vì các tập lệnh init b) Nếu bạn chỉnh sửa thủ công tập lệnh init, bạn sẽ gặp rủi ro khi các thay đổi của bạn bị vướng vào nâng cấp gói (có thể là lỗi sửa từ RH hoặc phiên bản mới hơn của mực) (câu hỏi DC cần được trả lời trong một nhận xét riêng)

Đối với câu hỏi DC, các dòng trong câu hỏi là "kdc = 172.17.3.11:88" và "admin_server = 172.17.3.11:7491". Bạn có thể thay thế chúng bằng "kdc = dom.local" và "admin = dom.local". Một "máy chủ -ta dom.local" trên các máy Linux của bạn sẽ trả về địa chỉ IP của các bộ điều khiển miền của chúng tôi; vì tất cả các bộ điều khiển miền của bạn là KDC thậm chí là một phiên bản của các thư viện Kerberos không hỗ trợ SRV RR nên không gặp khó khăn khi tìm KDC, mặc dù điều đó vượt xa tôi tại sao mọi người sẽ sử dụng các thư viện Kerberos cũ.

0

Theo tuto này tôi có thể có được mực để làm việc trên máy chủ fedora 12. Kiểm tra tường lửa trên Máy chủ Linux của bạn (bật cổng 3128) và đặt SELinux ở chế độ cho phép.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.