kerberos 및 Windows 2008 / 2003 / 7 / XP를 통한 오징어 인증


15

이것은 내가 최근에 설정 한 것으로 상당히 큰 고통이었습니다. 내 환경은 오징어가 Windows 2008 서버에 대해 Windows 7 클라이언트를 보이지 않게 인증했습니다. NTLM은 각 클라이언트에서 레지스트리를 변경해야하므로 실제로는 옵션이 아닙니다.

MS는 Windows 2000 이후로 Kerberos를 권장 해 왔으므로 이제 프로그램을 시작해야합니다.

이 작업을 수행하는 데 도움을 준 Squid 메일 링리스트의 Markus Moeller에게 감사드립니다.

답변:


15

이것은 Squid 3.0으로 설정되었으며 Squid 3.1에서도 테스트되었으며 Squid 2.7에서 작동합니다. Windows 사용자는 Active Directory에서 SQUID_USERS 그룹의 구성원이어야합니다 (이 경우 어쨌든).

Windows 측에서 Windows XP 및 Windows 2007은 Windows 2008에 대해 테스트되었으며 Windows XP는 Windows 2003에 대해 테스트되었습니다.

거의 모든 단계는 진행하기 전에 하나의 단계가 필요합니다.

문제가있는 경우 항상 DNS를 가장 먼저 살펴보십시오. 두 Windows 시스템 모두 이름으로 Linux 서버를 ping 할 수 있어야하며 그 반대도 가능 ipconfig /flushdns합니다. 부스러기가 없는지 확인하려면 재부팅도 도움이 될 수 있습니다.

도메인 정보

  • Windows 도메인 : dom.local
  • 도메인 서버 : server.dom.local,172.17.3.11
  • CentOS 오징어 서버 : centos.dom.local,172.17.3.10

도메인 서버 설정

  1. dom.localDNS 구성에서 리버스 영역을 만듭니다 .
  2. centos.dom.local가리키는 정적 ( 'A') 레코드를 작성 하고 역방향 PTR도 설정할 것인지 묻는 메시지가 표시되면 예를172.17.3.10 선택하십시오 .

Windows 2008

Windows 2008 서버의 경우 핫픽스 951191 을 설치해야합니다 .

리눅스 설정

작은 패키지

패키지 설치

$ 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답변 섹션에 들어가야합니다 . 당신이없는 경우 계속 포인트가 없습니다 . DNS를 제대로 구성하지 않으면 Kerberos 인증 이 작동 하지 않습니다 .

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
}

키탭 생성 :

$ 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

초기화 스크립트

이제 이것이 중요합니다. Squid가 제대로 실행 되려면 환경 변수 설정이 필요합니다. 이를 수행하는 가장 좋은 방법은 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.localport를 사용 하여 프록시를 서버로 설정하십시오 3128. IP 주소가 아닌 정규화 된 도메인 이름을 사용해야합니다.


msktutil은 이동되었습니다 fuhm.net/software/msktutil
gurubert

1

KRB5_KTNAME 환경 변수를 설정하기 위해 /etc/init.d/squid를 편집하는 대신 / etc / sysconfig / squid에 행을 넣어야합니다. init 스크립트는 모든 실행에서 / etc / sysconfig / squid를 소싱하므로이 두 줄을 선택합니다.

또한 호스트를 KDC 및 kadmin 서버로 명시 적으로 지정할 필요가 없으며 Active Directory 도메인의 DNS 도메인 만 입력하면됩니다. 두 가지 이유가 있습니다.

  1. MIT Kerberos 및 Heimdal kerberos는 Windows 클라이언트가 KDC 및 kadmin 서버를 찾는 데 사용하는 것과 동일한 SRV 레코드를 사용할 수있을 정도로 똑똑합니다.
  2. DNS 도메인 (예제에서 dom.local)은 도메인 컨트롤러를 가리키는 A 레코드를 반환합니다.

좋은 지적이야 이것은 CentOS에서 설정되었지만 sysconfig가없는 데비안에서 나왔습니다. 라인을 설치하면 특별한 이점이 있습니까? 어느 부분에서 DC를 지정할 필요가 없다고 생각하십니까? 아마도 모든 부분이 있어야한다는 것을 알고 있지만 DNS는이 과정에서 설정하기가 너무 어려워서 적은 정보보다는 더 많은 정보를 제공하는 것이 더 쉽다는 것을 알았습니다.
할리

/etc/init.d/squid를 편집하지 않는 이유는 다음과 같습니다. a) Red Hat (및 CentOS) 방식입니다. 대부분의 RH / CentOS 관리자는 init 스크립트가 아닌 / etc / sysconfig의 파일에서 이러한 사용자 정의를 찾습니다. b) init 스크립트를 수동으로 편집하면 변경 사항이 패키지 업그레이드에서 망칠 위험이 있습니다 (버그 중 하나) RH 또는 최신 오징어 버전에서 수정) (DC 질문은 별도의 의견으로 답변해야 함)

DC 질문의 경우 해당 행은 "kdc = 172.17.3.11:88"및 "admin_server = 172.17.3.11:7491"입니다. "kdc = dom.local"및 "admin = dom.local"로 대체 할 수 있습니다. Linux 컴퓨터의 "host -ta dom.local"은 도메인 컨트롤러의 IP 주소를 반환해야합니다. 모든 도메인 컨트롤러가 KDC이기 때문에 SRV RR을 지원하지 않는 Kerberos 라이브러리 버전이라도 KDC를 찾는 데 아무런 문제가 없어야합니다. 비록 누군가가 오래된 Kerberos 라이브러리를 사용하는 이유는 저를 넘어서는 것입니다.

0

이 튜토를 따라 오징어가 페도라 12 서버에서 작동하도록 할 수있었습니다. Linux 서버에서 방화벽을 확인하고 (포트 3128 사용) SELinux를 허용 모드로 설정하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.