我已經使用mod_auth_kerb 設定了Apache HTTPD 2.4,在Active Directory 上建立了一個服務帳戶,為我的http 主機名稱新增了SPN,在Linux 電腦上建立了一個keytab 文件,並且讓SSO 開始為從IE 登入AD網域的使用者正常工作。一切都很好!
然而,大約每週,使用者不會登入網站,而是收到 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 高 1,這導致 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。
Active Directory 本質上忽略了 KVNO。 (只讀 DC 除外 - 如果 RODC 受到損害,它所持有的密鑰不能在另一個 DC 上重複使用。)所以我的觀點是 AD 通常不關心你的 KVNO 是什麼 - 儘管它仍然維護 KVNO -它只關心您的門票是否有效且未過期。 (不過,我不知道你的 Linux 用戶端是否對 KVNO 進行嚴格檢查。顯然是這樣。)
Active Directory 將嘗試使用該主體的最新金鑰進行解密/驗證,如果這不起作用,它將嘗試使用前一個金鑰(只要前一個金鑰仍在其生命週期內, ),如果這不起作用,請求就會失敗。無論用戶端發送什麼 KVNO。
當用戶端電腦變更其密碼或更新其票證或其票證過期時,KVNO 會遞增。預設情況下,Active Directory 使用 7 天作為票證續訂的最長時間,這與您的描述相符“它可以持續一周左右。”
當 Active Directory 從網域成員電腦收到有效的密碼變更或票證輪替時,沒有任何機制可以阻止 Active Directory 增加 KVNO。所以我的觀點是,Active Directory 不會「神秘地」更新 KVNO - 它這樣做是出於特定原因。
在我看來,您的 Linux 機器在其最長生命週期 7 天後仍在嘗試使用其(現已過期)票證。 (或 Active Directory 已配置為更短的內容。)
查看/etc/krb5.conf
並驗證最大票證生命週期是否在 Active Directory 中指定的最大票證生命週期(預設網域群組原則中的 Kerberos 策略)內。由AD 指定。
答案2
您可能遇到了這個錯誤 https://bugzilla.samba.org/show_bug.cgi?id=6750
有一些 samba 設定變更可以解決這個問題。我設定
kerberos method = secrets and keytab