【AD DS】システム イベント ID 6 | MaxTokenSizeの超過

システム イベント (ソース:Microsoft-Windows-Security-Kerberos) ID 6 エラーは、Kerberos 認証において、ドメイン コントローラーから受け取った TGT チケットのトークンのデータサイズが MaxTokenSize を超過していたために認証に失敗したことを示すイベント ログです。

今回は、イベント ID 6 の意味や対処策について紹介します。

 

イベント ID 6 の概要

システム イベント ログに以下のようなエラーが記録されることがあります。

ログの名前: System
ソース: Microsoft-Windows-Security-Kerberos
日付: YYYY/MM/DD HH:MM:SS
イベント ID: 4
タスクのカテゴリ: なし
レベル: エラー
キーワード: クラシック
ユーザー: N/A
コンピューター: <コンピューター名>
説明:
kerberos SSPI パッケージでサイズが 18701 バイトの出力トークンが生成されました。これはプロセス ID 4 で提供された、サイズが 12000 バイトのトークン バッファーには大きすぎて収まりませんでした。 この出力 SSPI トークンが大きすぎる原因は、ユーザー user01@NEKOMARU.COM が多数のグループのメンバーであるためと考えられます。 ユーザーが属すグループ数を最小限に抑えることをお勧めします。このユーザーのグループ メンバーシップを減らしても問題が解決しない場合は、システム管理者に連絡して最大トークン サイズを増やしてください。これは次のレジストリ値によってコンピューター レベルで構成されています: HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\MaxTokenSize。

ソース Security-Kerberos ID 6 エラーは、ユーザー プリンシパルのアカウント認証の際に提示された TGT を受け取った時にエラーとなり、Kerberos 認証に失敗したことを意味します。Kerberos 認証に失敗しているため、ユーザーはドメインのリソースへのアクセスやサービスを利用することはできません。
ユーザーがドメインに参加している端末にログオンしたり、ドメイン内のリソースを利用する時に Kerberos 認証が行われます。Kerberos 認証において、ドメイン コントローラー(KDC)から TGT やサービス チケットなどの Kerberos チケットが発行されますが、チケットに含まれるトークンのデータサイズが、クライアント端末で許容されたサイズを超過しているためにメモリに保存できなかったことを意味しています。
イベント ID 6 のイベント ログの説明に記載されている、赤マーカー青マーカーの箇所は環境によって変化します。このマーカーの箇所は、対処策を実施する時に着目する必要がある箇所となります。赤マーカーの部分は、イベント ID 6 の原因となった Kerberos チケットのトークンのデータサイズ、青マーカーの部分は Kerberos チケットが発行された対象のユーザー アカウントの UPN です。
Kerberos 認証で利用されるチケットをメモリに保存できないと、Kerberos 認証に失敗することとなります。イベント ID 6 エラーが記録されても、ドメイン端末へのデスクトップへのログオンはできることはあります。しかしながら、Kerberos 認証には失敗しているため、ドメイン内へリソースへアクセスすることはできません。
 

イベント ID 6 の認証失敗のフロー

イベント ID 6 は、ユーザー プリンシパルのアカウント認証において、ドメイン コントローラーから発行された Kerberos チケットのトークン サイズがクライアント端末で許容されたサイズを超過していることを示しています。

Kerberos 認証はクライアントとサーバーの相互認証を行っており、基本的な認証のフローについては、以下の記事で紹介しております。

あわせて読みたい!

Kerberos 認証とは、ネットワーク認証方式の一つです。 Active Directory のドメイン環境では、ユーザーやコンピューターなどのリソースを一元管理できますが、その際の認証方式の基盤は Kerberos 認証で実現されていま[…]

Kerberos 認証のフローを確認して、イベント ID 6 がどにょうな問題なのか詳細を見ていきましょう。

  1. 接続元のクライアント(ユーザー プリンシパル)は、KDC に TGT を要求
  2. KDC は認証情報を確認して認証できたら、クライアントに TGT を提供します。
  3. TGT チケットのトークンが、クライアント端末に許容するサイズを超過しているためにメモリに保存できません。

TGT チケットのトークンには、認証要求を行ったユーザーの SID やユーザーが所属しているグループの SID などの情報が含まれています。ユーザーが所属するグループの数によって、トークンのデータサイズは異なります。

Windows OS には、Kerberos チケットのトークンを保存できるメモリのバッファ サイズの制限値が設定されています。そのバッファ サイズの制限値は、MaxTokenSize というレジストリで定義されています。Kerberos チケットのトークンのデータサイズが、MaxTokenSize の制限値より大きい場合は発行された Kerberos チケットをメモリ上に保存できないため、Kerberos 認証に失敗します。

Kerberos チケットの種類として、TGT とサービス チケットの2種類がありますが、いずれのチケットもトークンが含まれており、MaxTokenSize の制限値の制約を受けます。Kerberos チケットに含まれるトークンは、ユーザーが所属するグループの数が多い程データサイズは大きくなるため、所属するグループが多いユーザーは MaxTokenSize で定義されている制限に超過して Kerberos 認証に失敗します。

 

Kerberos チケットの情報

Kerberos チケットに含まれる情報は以下の通りです。

  • チケット
    • フラグ
    • 有効期限
    • チケットの発行先
    • アクセス先
    • 認可情報(トークン。PAC 領域)
      • ユーザーの SID
      • ユーザーが所属するグループの SID

 

上記の通り、Kerberos チケットにはトークンが含まれており、トークンには認可情報であるユーザーの SID、ユーザーが所属するグループの SID が含まれています。1つのユーザー アカウントが所属するセキュリティ グループが多いと、そのユーザーに発行された Kerberos チケットのトークンに含まれるグループ SID の数が多くなります。トークンに含まれるグループ SID の数が多くなると、Kerberos チケットのデータサイズも大きくなるため、データサイズはユーザーが所属するグループの数に依存します。

Kerberos チケットに含まれるトークンには、ユーザーが直接所属しているグループの SID のみではなく、入れ子になっているグループや sIDHIstory 属性に含まれる SID も含まれます。

グループの入れ子とは、ネスト化したグループのことです。例えば、入れ子にしているグループのみにユーザーが所属しているとしても、その親グループにも所属していると扱われます。

 

MaxTokenSize とは

Kerberos チケットに含まれるトークンのデータサイズには、OS にて許容サイズが定義されており、許容サイズを超えるトークンは制限されます。このトークンの許容サイズは、MaxTokenSize というレジストリにて設定されています。

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters
値:MaxTokenSize 
型:REG_DWORD
MaxTokenSize の既定値は OS バージョンにより異なっており、Windows 7、Windows Server 2008 R2 以前では 12000 バイト、Windows 8、Windows Server 2012 以降では 48000 バイトとなります。
MaxTokenSize の設定値の最大値として、65535 まで指定できます。
 

トークンサイズの概算値の算出方法

Kerberos チケットに含まれるトークンのデータサイズについて概算値を算出することができます。

トークンのデータサイズの概算値の計算式

Kerberos チケットのトークン サイズは、以下の計算式により概算値を計算することができます。

1200 + (40 * d) + (8 * s) [Byte]
d:以下の項目の合計数
・ユーザーが所属するドメイン ローカル グループ
・ユーザーが所属するユニバーサル グループのうち、自身以外のドメインのもの
・ユーザーの sIDHistory 属性に含まれる SID の数
s:以下の項目の合計数
・ユーザーが所属するグローバル セキュリティ グループ
・ユーザーが所属するユニバーサル グループのうち、自身のドメインのもの
このトークンのデータサイズの概算値の算出方法は、マイクロソフトのサポート技術情報 327825 で紹介されております。
-参考情報
ユーザーが多数のグループに属している場合の Kerberos 認証の問題
https://learn.microsoft.com/ja-JP/troubleshoot/windows-server/windows-security/kerberos-authentication-problems-if-user-belongs-to-groups

 

対処策

イベント ID 6 が記録された場合の問題の対処策について紹介します。

対処策①:所属グループの見直し

Kerberos チケットのトークンが MaxTokenSize の制限値を超過するのは、認証要求を行ったユーザー アカウントが所属するグループ数が多いためです。イベント ID 6 の説明に記載されているユーザーのグループの見直しを行い、不要な所属グループは削除します。

“トークンのデータサイズの概算値の計算式” に従って、トークンの概算値を計算し、MaxTokenSize の制限値よりも小さいデータサイズとなるように調整します。

対処策②:MaxTokenSize の設定値の引き上げ

イベント ID 6 に記載されているトークンのデータサイズを確認し、MaxTokenSize で定義されているトークンのデータサイズの上限値を引き上げます。

MaxTokenSize の設定値を変更する方法として、レジストリを編集する方法とグループ ポリシーで展開する方法の2通りがあります。レジストリを編集する場合は、ドメインで管理されている各端末ごとに設定を行う必要があります。MaxTokenSize の設定値を変更する対象がドメイン全体の端末である場合は、グループ ポリシーで設定を展開してください。

レジストリを直接設定する方法

下記のレジストリ値を設定することにより、MaxTokenSize の値を変更することができます。

1) イベント ID 6 が記録された端末に管理者権限をもつユーザーでログオンします。

2) [ファイル名を指定して実行] を開き、regedit と入力して [OK] をクリックします。

3) レジストリ エディタを開いたら、以下のレジストリを編集します。

キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters
値の名前: MaxTokenSize
値の種類: REG_DWORD
値のデータ: 48000
※既定では存在しないレジストリとなりますので、新規作成して設定してください。値の単位はバイトです。
4) レジストリを設定した後、設定を反映させるために OS 再起動してください。
 
MaxTokenSize の設定値にて推奨される最大値は 48000 です。
 

グループ ポリシーで設定を展開する方法

MaxTokenSize の設定値をグループ ポリシーでドメイン内の端末に配布する場合、GPO にて以下のポリシーを設定します。

1) 任意のドメイン コントローラーに管理者権限をもつユーザーでログオンします。

2) [Windows 管理ツール] にて、[グループ ポリシーの管理] を開きます。

3) ポリシーの設定を配布する GPO のアイコンを右クリックして、[編集] をクリックします。

4) 以下のポリシーを設定します。

パス: [コンピューターの構成] – [ポリシー] – [管理用テンプレート] – [システム] – [Kerberos]
ポリシー名: [Kerberos SSPI コンテキスト トークンのバッファー サイズの最大値を設定する]
設定値: [有効] を選択し、[最大サイズ] に 48000 を入力します。
※上記のポリシーが対象のドメイン メンバーに適用された後に、ドメイン メンバーのコンピューターの OS を再起動されてから設定が有効となります。
 
MaxTokenSize の設定値は、最大値の 65535 ではなく 48000 以下の値が推奨です。
HTTP 通信で Kerberos 認証が使用する場合、トークンは Base64 でエンコードされるため、HTTP 通信においてはトークンサイズが通常より増大する可能性があるためです。
 

類似問題:トークンの所属グループの最大数

MaxTokenSize の設定値とは別に、Kerberos チケットのトークンに含めることができるグループの SID の数は 1024 までという制限が決められています。Kerberos チケットのトークンに 1024 以上のグループ SID が含まれる状態となると、制限を超過して Kerberos 認証に失敗します。この 1024 という最大の所属グループ数の制限値はハードコードされているため、変更することはできません。

ユーザー アカウントは、既定で 9 個の SID が利用されているため、実質的には 1 ユーザーに追加できるグループ SID は 1015 までとなります。そのため、1ユーザーが所属できるグループ数や入れ子となるグループは 1015 より少ないグループ数で運用してください。

Kerberos チケットのトークンに含まれる SID の数が 1000 を超えると、イベント ID 6035 エラーが記録されます。このエラーが記録されたら、説明に含まれる SID のユーザーの所属グループを少なくしてください。

Kerberos チケットのトークンに 1024 以上のグループ SID が含まれる状態となると、ユーザーはドメイン メンバーのコンピューターにログオンできなくなります。

ログの名前: System
ソース: LsaSrv
日付: YYYY/MM/DD HH:MM:SS
イベント ID: 6035
タスクのカテゴリ: なし
レベル: 警告
キーワード: クラシック
ユーザー: N/A
コンピューター: <コンピューター名>
説明:

ログオンの実行中に、ユーザーのセキュリティ コンテキストで蓄積されたセキュリティ ID が多すぎます。これはきわめてまれな状況です。一部のグローバルまたはローカル グループからユーザーを削除して、セキュリティ コンテキストに組み込むセキュリティ ID の数を削減してください。
ユーザーの SID は S-1-5-21-1898620166-2472858272-1360721051-52567
これが Administrator アカウントである場合は、セーフ モードでログオンすると Administrator は自動的に制限されたグループ メンバーシップでログオンできるようになります。