mod_auth_kerb를 사용하여 Apache HTTPD 2.4를 설정하고, Active Directory에 서비스 계정을 만들고, http 호스트 이름에 대한 SPN을 추가하고, Linux 시스템에 keytab 파일을 만들고, IE에서 AD 도메인에 로그인한 사용자에 대해 SSO가 제대로 작동하도록 했습니다. . 다 좋았어!
그러나 매주 사용자는 웹사이트에 로그인하는 대신 자격 증명을 수락하지 않는 http 기본 인증 프롬프트를 받게 됩니다. httpd 서버 로그를 보면 다음과 같은 항목이 표시됩니다.
[auth_kerb:error] [pid 8040] [client 192.168.100.100:54460] gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, Key version number for principal in key table is incorrect)
발생한 것으로 보이는 것은 AD의 KVNO(Kerberos 키 버전 번호)가 증가하여 키 탭이 유효하지 않다는 것입니다. 다음과 같은 작업을 통해 이를 확인할 수 있습니다.
$ kinit '[email protected]'
Password for [email protected]
$ kvno HTTP/sso.example.com
HTTP/[email protected]: kvno = 12
$ klist -k krb5-keytab
Keytab name: FILE:krb5-keytab
KVNO Principal
---- ---------------------------------------------
11 HTTP/[email protected]
AD가 보고된 KVNO가 어떻게든 증가했으며 Apache가 사용하는 키탭의 KVNO보다 하나 높기 때문에 Kerberos SSO가 실패합니다.
다음과 같이 키탭을 다시 생성하면:
$ kinit '[email protected]'
Password for [email protected]
$ KEYTAB=krb5-keytab
$ SN="HTTP/[email protected]"
$ KVNO=`kvno $SN | awk -F'kvno = ' '{print $2}'`
$ echo "KVNO for $SN is $KVNO"
KVNO for HTTP/[email protected] is 12
$ rm $KEYTAB
$ ktutil
addent -password -p HTTP/[email protected] -k 12 -e arcfour-hmac
wkt krb5-keytab
$ chown apache.apache $KEYTAB
$ chmod 440 $KEYTAB
$ chcon -u system_u -t httpd_config_t $KEYTAB
$ service httpd restart
그러면 Kerberos SSO가 다시 작동하기 시작하고 모두 문제가 없을 것입니다! 일주일 정도 지나면 갑자기 다시 실패하게 됩니다. KVNO가 조용하고 신비롭게 AD에서 한 단계 더 높은 값을 올렸기 때문입니다....
따라서 AD에서 또는 Linux에서 kerberos keytab 파일을 생성하는 방법에서 KVNO가 1~2주마다 무작위로 증가하여 사용자의 사이트 액세스 기능이 손상되지 않도록 하려면 어떻게 해야 합니까? ?
답변1
Active Directory는 RFC 4120에 따라 KVNO를 증가시킵니다. Microsoft는 MS-KILE 섹션 3.1.5.8 문서에 해당 구현을 문서화했습니다.
Active Directory는 기본적으로 KVNO를 무시합니다. (읽기 전용 DC 제외 - RODC가 손상된 경우 보유하고 있는 키는 다른 DC에 대해 재사용할 수 없습니다.) 따라서 내 요점은 AD는 일반적으로 KVNO가 여전히 KVNO를 유지하더라도 KVNO가 무엇인지 상관하지 않는다는 것입니다. 티켓이 유효하고 만료되지 않은 경우에만 중요합니다. (하지만 Linux 클라이언트가 KVNO를 엄격하게 검사하는지 여부는 모르겠습니다. 분명히 그렇습니다.)
Active Directory는 해당 주체에 대해 가지고 있는 가장 최근 키를 사용하여 암호 해독/검증을 시도하고, 그래도 작동하지 않으면 이전 키를 사용하여 시도합니다(이전 키가 수명 내에 있는 한, ) 그래도 작동하지 않으면 요청이 실패합니다. 클라이언트가 보내는 KVNO에 관계없이 모든 도메인 컨트롤러가 티켓을 마지막으로 발행한 도메인 컨트롤러만 KVNO-1(즉, 이전 KVNO)을 갖는 것은 아닙니다.
KVNO는 클라이언트 컴퓨터가 비밀번호를 변경하거나 티켓을 갱신하거나 티켓이 만료되면 증가합니다. 기본적으로 Active Directory는 티켓이 갱신될 수 있는 최대 기간으로 7일을 사용합니다. 이는 설명과 일치합니다."일주일 정도는 효과가 있어요."
도메인 구성원 컴퓨터로부터 유효한 암호 변경 또는 티켓 순환을 수신할 때 Active Directory가 KVNO를 증가시키는 것을 중지하는 메커니즘은 없습니다. 따라서 내 요점은 Active Directory가 KVNO를 "신비하게" 업데이트하지 않는다는 것입니다. 특정 이유로 업데이트를 수행하는 것입니다.
귀하의 Linux 시스템은 최대 수명인 7일이 지난 후에도 여전히 (현재 만료된) 티켓을 사용하려고 시도하고 있는 것 같습니다. (또는 Active Directory가 더 짧은 것으로 구성되었습니다.)
/etc/krb5.conf
최대 티켓 수명이 Active Directory(기본 도메인 그룹 정책의 Kerberos 정책)에 지정된 최대 티켓 수명 내에 있는지 확인하십시오. 해당 간격 내에 티켓을 갱신해야 하며 KVNO도 늘려야 합니다 . AD로 지정됩니다.
답변2
아마 이 버그에 걸렸을 겁니다 https://bugzilla.samba.org/show_bug.cgi?id=6750
이 문제를 해결할 몇 가지 삼바 구성 변경 사항이 있습니다. 나는 설정했다
kerberos method = secrets and keytab