mod_auth_kerb を使用して Apache HTTPD 2.4 をセットアップし、Active Directory にサービス アカウントを作成し、http ホスト名に SPN を追加し、Linux マシンにキータブ ファイルを作成し、IE から AD ドメインにログインしたユーザーに対して SSO が適切に機能し始めました。すべてうまくいきました。
しかし、毎週のように、ユーザーは Web サイトにサインインする代わりに、資格情報を受け入れない 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 が再び機能し始め、すべてが正常になります。1 週間ほど経つと、KVNO が AD で静かに、そして不可解に値を 1 つ上げているため、突然再び失敗します...
では、KVNO が 1 ~ 2 週間ごとにランダムに増加し続け、すべてのユーザーがサイトにアクセスできなくなることがないようにするには、AD または Linux での Kerberos キータブ ファイルの作成方法のどちらで何をする必要がありますか?
答え1
Active Directory は、RFC 4120 に従って KVNO を増分します。Microsoft は、その実装を MS-KILE セクション 3.1.5.8 のドキュメントに記載しています。
Active Directory は基本的に KVNO を無視します。(読み取り専用 DC を除きます。RODC が侵害された場合、その RODC が保持するキーは別の DC に対して再利用できません。) つまり、AD は一般的に KVNO が何であるかを気にしません。KVNO は保持していますが、チケットが有効で期限切れでないかどうかだけを気にします。(ただし、Linux クライアントが KVNO を厳密にチェックするかどうかはわかりません。どうやらチェックしているようです。)
Active Directory は、そのプリンシパルに対して保持している最新のキーを使用して復号化/検証を試行します。これが機能しない場合は、以前のキーを使用して試行します (以前のキーの有効期間内である場合)。これが機能しない場合は、要求が失敗します。クライアントが送信する KVNO に関係なく、すべてのドメイン コントローラーが KVNO-1 (つまり、以前の KVNO) を保持するわけではなく、最後にチケットを発行したドメイン コントローラーのみが保持することに注意してください。
KVNOは、クライアントコンピュータがパスワードを変更したり、チケットを更新したり、チケットの有効期限が切れたりすると増加します。デフォルトでは、Active Directoryはチケットを更新できる最大期間として7日間を使用します。これは、「1週間くらいは効きますよ。」
ドメイン メンバー コンピューターから有効なパスワード変更またはチケット ローテーションを受信したときに、Active Directory が KVNO を増分するのを止めるメカニズムはありません。つまり、Active Directory は「不可解に」KVNO を更新するのではなく、特定の理由で更新するということです。
お使いの Linux マシンは、最大有効期間である 7 日を過ぎても (現在は期限切れの) チケットをまだ使用しようとしているようです。 (または、Active Directory がもっと短い期間に設定されている可能性があります。)
チケットの最大有効期間が、Active Directory (既定のドメイン グループ ポリシーの Kerberos ポリシー) で指定されているチケットの最大有効期間内であることを確認します/etc/krb5.conf
。AD によって指定された間隔内にチケットを更新する必要があります (KVNO を増やす必要があります)。
答え2
おそらくこのバグに遭遇しているでしょう https://bugzilla.samba.org/show_bug.cgi?id=6750
解決するには、Sambaの設定をいくつか変更する必要があります。
kerberos method = secrets and keytab