이 문서에서는 Kerberos로 보호되는 애플리케이션에 대해 WebVPN SSO(Single Sign On)를 구성하고 문제를 해결하는 방법에 대해 설명합니다.
Cisco에서는 이러한 주제에 대한 기본적인 지식을 얻을 것을 권장합니다.
이 문서의 정보는 다음 소프트웨어 버전을 기반으로 합니다.
이 문서의 정보는 특정 랩 환경의 디바이스를 토대로 작성되었습니다.이 문서에 사용된 모든 디바이스는 초기화된(기본) 컨피그레이션으로 시작되었습니다.현재 네트워크가 작동 중인 경우, 모든 명령어의 잠재적인 영향을 미리 숙지하시기 바랍니다.
Kerberos는 네트워크 엔티티가 안전한 방식으로 상호 인증할 수 있도록 하는 네트워크 인증 프로토콜입니다.신뢰할 수 있는 서드파티인 KDC(Key Distribution Center)를 사용하여 네트워크 엔터티에 티켓을 부여합니다.이러한 티켓은 엔티티가 요청한 서비스에 대한 액세스를 확인하고 확인하기 위해 사용합니다.
Kerberos로 보호되는 애플리케이션에 대해 KCD(Kerberos Constrained Delegation)라는 Cisco ASA 기능을 사용하여 WebVPN SSO를 구성할 수 있습니다. 이 기능을 사용하면 ASA는 WebVPN 포털 사용자 대신 Kerberos 티켓을 요청할 수 있으며 Kerberos로 보호되는 애플리케이션에 액세스할 수 있습니다.
WebVPN 포털을 통해 이러한 애플리케이션에 액세스할 때 더 이상 자격 증명을 제공할 필요가 없습니다.대신 WebVPN 포털에 로그인하기 위해 사용한 계정이 사용됩니다.
자세한 내용은 ASA 컨피그레이션 가이드의 KCD 작동 방식 이해 섹션을 참조하십시오.
WebVPN의 경우 WebVPN 포털 사용자는 Kerberos 서비스가 아니라 포털에 대한 액세스 권한을 가지므로 ASA는 사용자를 대신하여 티켓을 요청해야 합니다. 이를 위해 ASA는 Constrained Delegation에 Kerberos 확장을 사용합니다.플로우는 다음과 같습니다.
도메인:kra-sec.cisco.com(10.211.0.221 또는 10.211.0.216)
IIS(인터넷 정보 서비스) 7 응용 프로그램:test.kra-sec.cisco.com(10.211.0.223)
도메인 컨트롤러(DC):dc.kra-sec.cisco.com(10.211.0.221 또는 10.211.0.216) - Windows2008
ASA:10.211.0.162
WebVPN 사용자 이름/비밀번호:cisco/cisco
첨부 파일:asa-join.pcap(도메인에 성공적으로 가입)
첨부 파일:asa-kerberos-bad.pcap(서비스 요청)
Kerberos로 보호되는 기능 IIS7 응용 프로그램이 이미 있다고 가정합니다(그렇지 않은 경우 필수 구성 요소 섹션을 읽으십시오). 사용자 위임을 위한 설정을 확인해야 합니다.
기능 도메인 수준이 Windows Server 2003(최소)으로 올라가야 합니다. 기본값은 Windows Server 2000입니다.
올바른 위임으로 AD의 모든 계정을 구성해야 합니다.관리자 계정이 사용됩니다.ASA가 해당 계정을 사용하는 경우 특정 서비스(HTTP 애플리케이션)에 대해 다른 사용자(Constrained Delegation)를 대신하여 티켓을 요청할 수 있습니다. 이 문제가 발생하려면 애플리케이션/서비스에 대해 올바른 위임을 만들어야 합니다.
Windows Server 2003 서비스 팩 1 지원 도구의 일부인 setspn.exe를 사용하여 CLI를 통해 이 위임을 수행하려면 다음 명령을 입력합니다.
setspn.exe -A HTTP/test.kra-sec.cisco.com kra-sec.cisco.com\Administrator
이는 Administrator 사용자 이름이 test.kra-sec.cisco.com에서 HTTP 서비스 위임을 위한 신뢰할 수 있는 계정임을 나타냅니다.
SPN 명령은 해당 사용자의 위임 탭을 활성화하려면 필요합니다.명령을 입력하면 관리자의 위임 탭이 나타납니다."Use any authentication protocol(모든 인증 프로토콜 사용)"은 제한된 위임 확장을 지원하지 않으므로 활성화해야 합니다.
General 탭에서 Kerberos 사전 인증을 비활성화할 수도 있습니다.그러나 이 기능은 재생 공격으로부터 DC를 보호하기 위해 사용되므로 권장되지 않습니다.ASA는 사전 인증과 올바르게 작동할 수 있습니다.
이 절차는 컴퓨터 계정에 대한 위임에도 적용됩니다(ASA는 "신뢰" 관계를 설정하기 위해 도메인으로 가져오기).
interface Vlan211
nameif inside
security-level 100
ip address 10.211.0.162 255.255.255.0
hostname KRA-S-ASA-05
domain-name kra-sec.cisco.com
dns domain-lookup inside
dns server-group DNS-GROUP
name-server 10.211.0.221
domain-name kra-sec.cisco.com
aaa-server KerberosGroup protocol kerberos
aaa-server KerberosGroup (inside) host 10.211.0.221
kerberos-realm KRA-SEC.CISCO.COM
webvpn
enable outside
enable inside
kcd-server KerberosGroup username Administrator password *****
group-policy G1 internal
group-policy G1 attributes
WebVPN
url-list value KerberosProtected
username cisco password 3USUcOPFUiMCO4Jk encrypted
tunnel-group WEB type remote-access
tunnel-group WEB general-attributes
default-group-policy G1
tunnel-group WEB webvpn-attributes
group-alias WEB enable
dns-group DNS-GROUP
kcd-server 명령을 사용한 후 ASA는 도메인 가입을 시도합니다.
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_AS_REQ
Kerberos: Option forwardable
Kerberos: Client Name KRA-S-ASA-05$
Kerberos: Client Realm KRA-SEC.CISCO.COM
Kerberos: Server Name krbtgt
Kerberos: Start time 0
Kerberos: End time -878674400
Kerberos: Renew until time -878667552
Kerberos: Nonce 0xa9db408e
Kerberos: Encryption type rc4-hmac-md5
Kerberos: Encryption type des-cbc-md5
Kerberos: Encryption type des-cbc-crc
Kerberos: Encryption type des-cbc-md4
Kerberos: Encryption type des3-cbc-sha1
********** END: KERBEROS PACKET DECODE ************
In kerberos_recv_msg
In KCD_self_tkt_process_response
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_ERROR
Kerberos: Error type: Additional pre-authentication required, -1765328359
(0x96c73a19)
Kerberos: Encrypt Type: 23 (rc4-hmac-md5)
Salt: "" Salttype: 0
Kerberos: Encrypt Type: 3 (des-cbc-md5)
Salt: "KRA-SEC.CISCO.COMhostkra-s-asa-05.kra-sec.cisco.com" Salttype: 0
Kerberos: Encrypt Type: 1 (des-cbc-crc)
Salt: "KRA-SEC.CISCO.COMhostkra-s-asa-05.kra-sec.cisco.com" Salttype: 0
Kerberos: Preauthentication type unknown
Kerberos: Preauthentication type encrypt timestamp
Kerberos: Preauthentication type unknown
Kerberos: Preauthentication type unknown
Kerberos: Server time 1360917305
Kerberos: Realm KRA-SEC.CISCO.COM
Kerberos: Server Name krbtgt
********** END: KERBEROS PACKET DECODE ************
Attempting to parse the error response from KCD server.
Kerberos library reports: "Additional pre-authentication required"
In kerberos_send_request
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_AS_REQ
Kerberos: Preauthentication type encrypt timestamp
Kerberos: Option forwardable
Kerberos: Client Name KRA-S-ASA-05$
Kerberos: Client Realm KRA-SEC.CISCO.COM
Kerberos: Server Name krbtgt
Kerberos: Start time 0
Kerberos: End time -878667256
Kerberos: Renew until time -878672192
Kerberos: Nonce 0xa9db408e
Kerberos: Encryption type rc4-hmac-md5
Kerberos: Encryption type des-cbc-md5
Kerberos: Encryption type des-cbc-crc
Kerberos: Encryption type des-cbc-md4
Kerberos: Encryption type des3-cbc-sha1
********** END: KERBEROS PACKET DECODE ************
In kerberos_recv_msg
In KCD_self_tkt_process_response
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_AS_REP
Kerberos: Client Name KRA-S-ASA-05$
Kerberos: Client Realm KRA-SEC.CISCO.COM
********** END: KERBEROS PACKET DECODE ************
INFO: Successfully stored self-ticket in cache a6588e0
KCD self-ticket retrieval succeeded.
In kerberos_close_connection
remove_req 0xcc09ad18 session 0x1 id 0
free_kip 0xcc09ad18
kerberos: work queue empty
ASA가 도메인에 성공적으로 가입할 수 있습니다.올바른 인증 후 ASA는 주도자에 대한 티켓을 받습니다.AS_REP 패킷의 관리자(1단계에서 설명한 티켓1).
사용자가 WebVPN 링크를 클릭합니다.
ASA는 AS_REP 패킷에서 수신되는 티켓과 함께 가장된 티켓에 대해 TGS_REQ를 전송합니다.
ASA는 사용자 cisco에 대해 가장된 티켓과 함께 올바른 응답을 받습니다(4단계에서 설명한 Ticket2).
다음은 HTTP 서비스에 대한 티켓 요청입니다(일부 디버그는 명확성을 위해 생략됨).
KRA-S-ASA-05# show WebVPN kcd
Kerberos Realm: TEST-CISCO.COM
Domain Join : Complete
find_spn_in_url(): URL - /
build_host_spn(): host - test.kra-sec.cisco.com
build_host_spn(): SPN - HTTP/test.kra-sec.cisco.com
KCD_unicorn_get_cred(): Attempting to retrieve required KCD tickets.
In KCD_check_cache_validity, Checking cache validity for type KCD service
ticket cache name: and spn HTTP/test.kra-sec.cisco.com.
In kerberos_cache_open: KCD opening cache .
Cache doesn't exist!
In KCD_check_cache_validity, Checking cache validity for type KCD self ticket
cache name: a6ad760 and spn N/A.
In kerberos_cache_open: KCD opening cache a6ad760.
Credential is valid.
In KCD_check_cache_validity, Checking cache validity for type KCD impersonate
ticket cache name: and spn N/A.
In kerberos_cache_open: KCD opening cache .
Cache doesn't exist!
KCD requesting impersonate ticket retrieval for:
user : cisco
in_cache : a6ad760
out_cache: adab04f8I
Successfully queued up AAA request to retrieve KCD tickets.
kerberos mkreq: 0x4
kip_lookup_by_sessID: kip with id 4 not found
alloc_kip 0xaceaf560
new request 0x4 --> 1 (0xaceaf560)
add_req 0xaceaf560 session 0x4 id 1
In KCD_cred_tkt_build_request
In kerberos_cache_open: KCD opening cache a6ad760.
KCD_cred_tkt_build_request: using KRA-S-ASA-05 for principal name
In kerberos_open_connection
In kerberos_send_request
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_TGS_REQ
Kerberos: Preauthentication type ap request
Kerberos: Preauthentication type unknown
Kerberos: Option forwardable
Kerberos: Option renewable
Kerberos: Client Realm KRA-SEC.CISCO.COM
Kerberos: Server Name KRA-S-ASA-05
Kerberos: Start time 0
Kerberos: End time -1381294376
Kerberos: Renew until time 0
Kerberos: Nonce 0xe9d5fd7f
Kerberos: Encryption type rc4-hmac-md5
Kerberos: Encryption type des3-cbc-sha
Kerberos: Encryption type des-cbc-md5
Kerberos: Encryption type des-cbc-crc
Kerberos: Encryption type des-cbc-md4
********** END: KERBEROS PACKET DECODE ************
In kerberos_recv_msg
In KCD_cred_tkt_process_response
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_TGS_REP
Kerberos: Client Name cisco
Kerberos: Client Realm KRA-SEC.CISCO.COM
********** END: KERBEROS PACKET DECODE ************
KCD_unicorn_callback(): called with status: 1.
Successfully retrieved impersonate ticket for user: cisco
KCD callback requesting service ticket retrieval for:
user :
in_cache : a6ad760
out_cache: adab04f8S
DC_cache : adab04f8I
SPN : HTTP/test.kra-sec.cisco.com
Successfully queued up AAA request from callback to retrieve KCD tickets.
In kerberos_close_connection
remove_req 0xaceaf560 session 0x4 id 1
free_kip 0xaceaf560
kerberos mkreq: 0x5
kip_lookup_by_sessID: kip with id 5 not found
alloc_kip 0xaceaf560
new request 0x5 --> 2 (0xaceaf560)
add_req 0xaceaf560 session 0x5 id 2
In KCD_cred_tkt_build_request
In kerberos_cache_open: KCD opening cache a6ad760.
In kerberos_cache_open: KCD opening cache adab04f8I.
In kerberos_open_connection
In kerberos_send_request
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_TGS_REQ
Kerberos: Preauthentication type ap request
Kerberos: Option forwardable
Kerberos: Option renewable
Kerberos: Client Realm KRA-SEC.CISCO.COM
Kerberos: Server Name HTTP
Kerberos: Start time 0
Kerberos: End time -1381285944
Kerberos: Renew until time 0
Kerberos: Nonce 0x750cf5ac
Kerberos: Encryption type rc4-hmac-md5
Kerberos: Encryption type des3-cbc-sha
Kerberos: Encryption type des-cbc-md5
Kerberos: Encryption type des-cbc-crc
Kerberos: Encryption type des-cbc-md4
********** END: KERBEROS PACKET DECODE ************
In kerberos_recv_msg
In KCD_cred_tkt_process_response
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_TGS_REP
Kerberos: Client Name cisco
Kerberos: Client Realm KRA-SEC.CISCO.COM
********** END: KERBEROS PACKET DECODE ************
KCD_unicorn_callback(): called with status: 1.
Successfully retrieved service ticket
for user cisco, spn HTTP/test.kra-sec.cisco.com
In kerberos_close_connection
remove_req 0xaceaf560 session 0x5 id 2
free_kip 0xaceaf560
kerberos: work queue empty
ucte_krb_authenticate_connection(): ctx - 0xad045dd0, proto - http,
host - test.kra-sec.cisco.com
In kerberos_cache_open: KCD opening cache adab04f8S.
Source: cisco@KRA-SEC.CISCO.COM
Target: HTTP/test.kra-sec.cisco.com@KRA-SEC.CISCO.COM
ASA는 HTTP 서비스에 대해 올바른 가장된 티켓을 받습니다(6단계에서 설명한 Ticket3).
두 티켓 모두 확인할 수 있습니다.첫 번째는 사용자 cisco에 대한 가장된 티켓입니다. 이는 액세스되는 HTTP 서비스에 대한 두 번째 티켓을 요청하고 받기 위해 사용됩니다.
KRA-S-ASA-05(config)# show aaa kerberos
Default Principal: cisco@KRA-SEC.CISCO.COM
Valid Starting Expires Service Principal
19:38:10 CEST Oct 2 2013 05:37:33 CEST Oct 3 2013 KRA-S-ASA-05@KRA-SEC.CISCO.COM
Default Principal: cisco@KRA-SEC.CISCO.COM
Valid Starting Expires Service Principal
19:38:10 CEST Oct 2 2013 05:37:33 CEST Oct 3 2013
HTTP/test.kra-sec.cisco.com@KRA-SEC.CISCO.COM
이 HTTP 티켓(Ticket3)은 HTTP 액세스(SPNEGO 사용)에 사용되며 사용자가 어떤 자격 증명도 제공할 필요가 없습니다.
가끔 잘못된 위임 문제가 발생할 수 있습니다.예를 들어, ASA는 HTTP/test.kra-sec.cisco.com(5단계) 서비스를 요청하기 위해 티켓을 사용하지만, 응답은 ERR_BADOPTION과 함께 KRB-ERROR입니다.
위임이 올바르게 구성되지 않은 경우 발생하는 일반적인 문제입니다.ASA에서는 "KDC가 요청된 옵션을 이행할 수 없음"이라고 보고합니다.
KRA-S-ASA-05# ucte_krb_get_auth_cred(): ctx = 0xcc4b5390,
WebVPN_session = 0xc919a260, protocol = 1
find_spn_in_url(): URL - /
build_host_spn(): host - test.kra-sec.cisco.com
build_host_spn(): SPN - HTTP/test.kra-sec.cisco.com
KCD_unicorn_get_cred(): Attempting to retrieve required KCD tickets.
In KCD_check_cache_validity, Checking cache validity for type KCD service ticket
cache name: and spn HTTP/test.kra-sec.cisco.com.
In kerberos_cache_open: KCD opening cache .
Cache doesn't exist!
In KCD_check_cache_validity, Checking cache validity for type KCD self ticket
cache name: a6588e0 and spn N/A.
In kerberos_cache_open: KCD opening cache a6588e0.
Credential is valid.
In KCD_check_cache_validity, Checking cache validity for type KCD impersonate
ticket cache name: and spn N/A.
In kerberos_cache_open: KCD opening cache .
Cache doesn't exist!
KCD requesting impersonate ticket retrieval for:
user : cisco
in_cache : a6588e0
out_cache: c919a260I
Successfully queued up AAA request to retrieve KCD tickets.
kerberos mkreq: 0x4
kip_lookup_by_sessID: kip with id 4 not found
alloc_kip 0xcc09ad18
new request 0x4 --> 1 (0xcc09ad18)
add_req 0xcc09ad18 session 0x4 id 1
In KCD_cred_tkt_build_request
In kerberos_cache_open: KCD opening cache a6588e0.
KCD_cred_tkt_build_request: using KRA-S-ASA-05$ for principal name
In kerberos_open_connection
In kerberos_send_request
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_TGS_REQ
Kerberos: Preauthentication type ap request
Kerberos: Preauthentication type unknown
Kerberos: Option forwardable
Kerberos: Option renewable
Kerberos: Client Realm KRA-SEC.CISCO.COM
Kerberos: Server Name KRA-S-ASA-05$
Kerberos: Start time 0
Kerberos: End time -856104128
Kerberos: Renew until time 0
Kerberos: Nonce 0xb086e4a5
Kerberos: Encryption type rc4-hmac-md5
Kerberos: Encryption type des3-cbc-sha
Kerberos: Encryption type des-cbc-md5
Kerberos: Encryption type des-cbc-crc
Kerberos: Encryption type des-cbc-md4
********** END: KERBEROS PACKET DECODE ************
In kerberos_recv_msg
In KCD_cred_tkt_process_response
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_TGS_REP
Kerberos: Client Name cisco
Kerberos: Client Realm KRA-SEC.CISCO.COM
********** END: KERBEROS PACKET DECODE ************
KCD_unicorn_callback(): called with status: 1.
Successfully retrieved impersonate ticket for user: cisco
KCD callback requesting service ticket retrieval for:
user :
in_cache : a6588e0
out_cache: c919a260S
DC_cache : c919a260I
SPN : HTTP/test.kra-sec.cisco.com
Successfully queued up AAA request from callback to retrieve KCD tickets.
In kerberos_close_connection
remove_req 0xcc09ad18 session 0x4 id 1
free_kip 0xcc09ad18
kerberos mkreq: 0x5
kip_lookup_by_sessID: kip with id 5 not found
alloc_kip 0xcc09ad18
new request 0x5 --> 2 (0xcc09ad18)
add_req 0xcc09ad18 session 0x5 id 2
In KCD_cred_tkt_build_request
In kerberos_cache_open: KCD opening cache a6588e0.
In kerberos_cache_open: KCD opening cache c919a260I.
In kerberos_open_connection
In kerberos_send_request
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_TGS_REQ
Kerberos: Preauthentication type ap request
Kerberos: Option forwardable
Kerberos: Option renewable
Kerberos: Client Realm KRA-SEC.CISCO.COM
Kerberos: Server Name HTTP
Kerberos: Start time 0
Kerberos: End time -856104568
Kerberos: Renew until time 0
Kerberos: Nonce 0xf84c9385
Kerberos: Encryption type rc4-hmac-md5
Kerberos: Encryption type des3-cbc-sha
Kerberos: Encryption type des-cbc-md5
Kerberos: Encryption type des-cbc-crc
Kerberos: Encryption type des-cbc-md4
********** END: KERBEROS PACKET DECODE ************
In kerberos_recv_msg
In KCD_cred_tkt_process_response
********** START: KERBEROS PACKET DECODE ************
Kerberos: Message type KRB_ERROR
Kerberos: Error type: KDC can't fulfill requested option, -1765328371
(0x96c73a0d)
Kerberos: Server time 1360917437
Kerberos: Realm KRA-SEC.CISCO.COM
Kerberos: Server Name HTTP
********** END: KERBEROS PACKET DECODE ************
Kerberos library reports: "KDC can't fulfill requested option"
KCD_unicorn_callback(): called with status: -3.
KCD callback called with AAA error -3.
In kerberos_close_connection
remove_req 0xcc09ad18 session 0x5 id 2
free_kip 0xcc09ad18
kerberos: work queue empty
이는 기본적으로 캡처에서 설명하는 것과 동일한 문제입니다. BAD_OPTION을 사용하는 TGS_REQ에 오류가 있습니다.
응답이 Success이면 ASA는 SPNEGO 협상에 사용되는 HTTP/test.kra-sec.cisco.com 서비스에 대한 티켓을 받습니다.그러나 장애로 인해 NTLM(NT LAN Manager)이 협상되고 사용자는 다음 자격 증명을 제공해야 합니다.
SPN이 하나의 계정에만 등록되어 있는지 확인하십시오(이전 문서의 스크립트). 이 오류(KRB_AP_ERR_MODIFIED)가 표시되면 일반적으로 SPN이 올바른 계정에 등록되지 않았음을 의미합니다.응용 프로그램(IIS의 응용 프로그램 풀)을 실행하기 위해 사용되는 계정에 등록해야 합니다.
이 오류(KRB_ERR_C_PRINCIPAL_UNKNOWN)가 표시되면 DC(WebVPN 사용자:cisco)를 선택합니다.
도메인에 가입하면 이 문제가 발생할 수 있습니다.ASA는 AS-REP를 수신하지만 LSA 레벨에서 다음 오류로 실패합니다.STATUS_ACCESS_DENIED:
이 문제를 해결하려면 해당 사용자의 DC에서 사전 인증을 활성화/비활성화해야 합니다(관리자).
다음과 같은 다른 문제가 발생할 수 있습니다.
다음은 관련 Cisco 버그 ID 목록입니다.