Mendapatkan Squid untuk diautentikasi dengan kerberos dan Windows 2008/2003/7 / XP

15

Ini adalah sesuatu yang saya setup baru-baru ini dan cukup menyakitkan. Lingkungan saya mendapatkan squid untuk mengotentikasi klien Windows 7 terhadap Windows 2008 Server tanpa terlihat. NTLM sebenarnya bukan pilihan, karena menggunakannya membutuhkan perubahan registri pada setiap klien.

MS telah merekomendasikan Kerberos sejak Windows 2000, jadi akhirnya saatnya untuk mengikuti program ini.

Banyak, banyak terima kasih kepada Markus Moeller dari milis Squid untuk membantu agar ini berfungsi.

Harley
sumber

Jawaban:

15

Ini adalah pengaturan dengan Squid 3.0, juga telah diuji dengan Squid 3.1 dan harus bekerja dengan Squid 2.7. Pengguna Windows Anda harus menjadi anggota grup SQUID_USERS di Active Directory (untuk kasus ini).

Di sisi Windows, Windows XP dan Windows 2007 telah diuji terhadap Windows 2008, dan Windows XP melawan Windows 2003.

Perhatikan bahwa hampir setiap langkah memerlukan yang sebelum melanjutkan.

Jika Anda memiliki masalah, DNS selalu menjadi tempat pertama untuk mencari. Kedua mesin Windows harus dapat melakukan ping ke server Linux dengan nama (dan sebaliknya), dan Anda mungkin perlu menjalankannya ipconfig /flushdnsbeberapa kali. Reboot juga bisa membantu, jika Anda ingin benar-benar yakin tidak ada masalah.

Info domain

  • Domain Windows: dom.local
  • Server Domain: server.dom.local,172.17.3.11
  • CentOS cumi Server: centos.dom.local,172.17.3.10

Penyiapan server domain

  1. Buat dom.localzona terbalik di konfigurasi DNS.
  2. Buat catatan statis ('A') untuk centos.dom.localmenunjuk ke 172.17.3.10, pilih Ya ketika ditanya apakah Anda ingin mengatur PTR terbalik juga.

Windows 2008

Untuk server Windows 2008 Anda harus menginstal Hotfix 951191 .

Pengaturan Linux

Paket kecil

Instal paket

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

Instal msktutil. Anda perlu menambalnya sebelum membangunnya.

$ 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

Kompilasi ldap cumi _curb terbaru _.

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

DNS

Gunakan system-config-networkuntuk mengkonfigurasi titik DNS ke pengontrol domain, atur nama host ke centos.dom.local.

Mulai ulang

Periksa apakah DNS terbalik berfungsi: $ dig -x 172.17.3.10

Anda harus masuk centos.dom.localke bagian jawaban. Jika tidak, tidak ada gunanya melanjutkan . Otentikasi Kerberos tidak akan berfungsi tanpa DNS dikonfigurasi dengan benar.

Kerberos

Anda krb.confakan terlihat seperti ini:

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

Buat 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

Untuk Windows 2008 Anda perlu menambahkan --enctypes 28ke msktutilperintah.

Cumi-cumi

Pasang 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

Siapkan parameter yang sesuai di 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

Atur pengguna dan direktori:

$ 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

Buat cache:

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

Skrip init

Sekarang ini penting: Squid memerlukan beberapa pengaturan variabel lingkungan agar dapat berjalan dengan baik. Cara terbaik untuk melakukan ini adalah dengan menggunakan skrip init. Ini CentOS yang sedikit diedit:

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

Inilah garis-garis penting:

KRB5_KTNAME=/etc/HTTP.keytab
export KRB5_KTNAME

Mesin Klien

Setel proxy Anda ke server centos.dom.localmenggunakan porta 3128. Adalah penting bahwa Anda menggunakan nama domain yang sepenuhnya memenuhi syarat dan BUKAN alamat IP.

Harley
sumber
msktutil telah dipindahkan ke fuhm.net/software/msktutil
gurubert
1

Alih-alih mengedit /etc/init.d/squid untuk mengatur variabel lingkungan KRB5_KTNAME, Anda cukup meletakkan baris di / etc / sysconfig / squid. Karena skrip init sumber / etc / sysconfig / squid pada setiap eksekusi, ia akan mengambil 2 baris tersebut.

Selain itu, Anda tidak perlu secara eksplisit memberi nama host untuk menjadi KDC dan server kadmin, cukup dengan hanya memasukkan domain DNS untuk domain Active Directory Anda. Ada 2 alasan mengapa:

  1. MIT Kerberos dan Heimdal kerberos keduanya cukup pintar untuk menggunakan catatan SRV yang sama yang digunakan klien Windows untuk menemukan KDC dan server kadmin
  2. Domain DNS (dom.local dalam contoh Anda) akan mengembalikan catatan yang menunjuk ke pengontrol domain Anda

sumber
Poin yang bagus. Meskipun ini adalah setup di CentOS, saya berasal dari Debian, yang tidak memiliki sysconfig. Apakah ada manfaat khusus untuk meletakkan garis di sana? Menurut Anda di bagian mana Anda tidak perlu menentukan DC? Saya tahu itu mungkin harus menjadi setiap bagian, tetapi DNS sangat merepotkan untuk pengaturan selama proses ini saya merasa lebih mudah untuk memberikan lebih banyak informasi daripada sedikit.
Harley
Alasan untuk tidak mengedit /etc/init.d/squid adalah: a) Ini cara Red Hat (dan karenanya CentOS) dalam melakukan sesuatu. Sebagian besar administrator RH / CentOS akan mencari penyesuaian seperti itu di file di / etc / sysconfig daripada skrip init b) Jika Anda mengedit skrip init secara manual, Anda menghadapi risiko bahwa perubahan Anda akan dikacaukan pada peningkatan paket (baik bug perbaiki dari RH atau versi yang lebih baru dari cumi-cumi) (pertanyaan DC perlu dijawab dalam komentar yang terpisah)
Sedangkan untuk pertanyaan DC, baris yang dimaksud adalah "kdc = 172.17.3.11:88" dan "admin_server = 172.17.3.11:7491". Anda bisa menggantinya dengan "kdc = dom.local" dan "admin = dom.local". "Host -ta dom.local" di mesin Linux Anda harus mengembalikan alamat IP pengontrol domain kami; karena semua pengontrol domain Anda adalah KDC, bahkan versi pustaka Kerberos yang tidak mendukung RR SRV seharusnya tidak mengalami kesulitan menemukan KDC, meskipun di luar saya mengapa ada orang yang menggunakan pustaka Kerberos yang lama.
0

mengikuti tuto ini saya bisa mendapatkan squid untuk bekerja di server fedora 12. Periksa firewall di Server Linux Anda (aktifkan port 3128) dan atur SELinux dalam mode permisif.


sumber