【図解】ADのグループの種類とスコープとは?グローバル・ドメインローカル・ユニバーサルの違いを初心者向けに解説

Active Directoryでファイル共有のアクセス許可を付けるときは、ユーザーを1人ずつ登録するのではなく、グループに許可を付けるのが基本です。ところが、グループを作ろうとすると「セキュリティ」と「配布」、「グローバル」「ドメインローカル」「ユニバーサル」と、選ぶ項目がいくつも出てきます。この記事では、グループの種類とスコープの違いを整理し、よく使われる組み方と、グループが多すぎると起きる問題まで説明します。

この記事でわかること
  1. セキュリティグループと配布グループの違い
  2. グローバル・ドメインローカル・ユニバーサルの3つのスコープの違いと、よく使われる組み方
  3. グループがトークンにどう入るか、多すぎるとなぜサインインやアクセスに失敗するのか

なぜグループを使うのか

ファイルやフォルダのアクセス許可は、ACL(だれに何を許すかの一覧)に書きます。ACLにユーザーを1人ずつ書いていくと、人とフォルダの組み合わせの数だけ設定が必要になり、異動や退職のたびに、たくさんのACLを直すことになります。

ユーザーごとに許可するグループに許可する営業部ACL の行が 4人 × 3フォルダ = 12人が入れ替わるたびに全部を直すACL の行は 3フォルダに1行ずつ人の入れ替えはグループのメンバーだけ直す
図1 ユーザーごとに許可するか、グループに許可するか

グループに許可を付けておけば、ACLは「営業部に変更を許す」のように一度書くだけで済みます。人が入れ替わったときは、グループのメンバーを直すだけです。Microsoftのドキュメントでも、共有フォルダやプリンタのアクセス許可は、個々のユーザーではなくセキュリティグループに付けるよう勧めています。

ACLに書かれるのはグループの名前ではなく、グループのSIDです。アクセスするときは、ユーザーのトークンに入っているSIDと、ACLのSIDが突き合わされます。このしくみは「アクセストークンとACL」の記事で説明しています。

2つの種類:セキュリティグループと配布グループ

グループを作るとき、最初に選ぶのが「グループの種類」です。種類は2つあります。

セキュリティグループ配布グループ
主な使い道アクセス許可やユーザー権利を付けるExchange Serverなどで、メールの宛先リストにする
ACLに書けるか書ける書けない
トークンに入るか入る入らない
メールの宛先にできるかできるできる

アクセス許可に使えるのはセキュリティグループだけです。配布グループはセキュリティの機能を持たないので、ACLに書くことができず、メンバーのトークンにも入りません。種類はあとから相互に変えられますが、ACLに書かれているセキュリティグループを配布グループに変えると、そのACLの行は無視されるようになります。

スコープの前に:ドメイン・フォレスト・信頼関係

グループのスコープは「どの範囲で使えるか」を決めるものなので、その範囲を表す言葉を先に押さえておきます。出てくるのは、ドメイン、フォレスト、信頼関係の3つです。

フォレスト(corp.example.com)別のフォレスト(双方向の信頼あり)本社ドメインcorp.example.comDCアカウント大阪ドメインosaka.corp.example.comDCアカウント取引先のドメインpartner.exampleDCアカウント自動で作られる双方向の信頼管理者が作ったときだけ(フォレストの信頼)
図2 ドメイン、フォレスト、信頼関係
言葉意味
ドメインDCとアカウントをまとめて管理する単位です。corp.example.com のような名前を持ち、ユーザーやコンピュータ、グループはどれか1つのドメインに属します。
フォレスト1つ以上のドメインの集まりです。最初に作ったドメインがフォレストの根元(フォレストルート)になり、osaka.corp.example.com のような子ドメインを足していけます。
信頼関係相手のドメインのアカウントを、自分のドメインのリソースで受け入れるという約束です。

同じフォレストの中のドメインどうしは、ドメインを作ったときに、自動で双方向の信頼関係が結ばれます。この信頼は推移的(AとB、BとCが信頼し合っていれば、AとCも信頼し合っているものとして扱う)なので、フォレスト内のどのドメインのユーザーも、許可さえあれば、ほかのどのドメインのリソースも使えます。

いっぽうで、別のフォレストとは、何もしなければつながっていません。グループ会社や合併した会社のフォレストとリソースを共有したいときに、管理者が「フォレストの信頼」を作ったときだけつながります。

信頼には向きがあり、アクセスの向きとは逆になるので注意が必要です。

ドメインA信頼される側(アカウントがある)ドメインB信頼する側(リソースがある)B は A を信頼するA のユーザーがB のリソースを使える信頼の矢印とアクセスの矢印は逆向き。双方向の信頼は、この一方向の信頼を2本張ったもの
図3 信頼の向きとアクセスの向き

ドメインBがドメインAを信頼すると、Aのユーザーが、Bのリソースを使えるようになります。リソースを持っている側が、相手のアカウントを「信頼する」と考えると覚えやすいです。

ドメインが1つだけの会社では

多くの会社は、ドメインが1つだけで、それがそのままフォレストになっています。この場合、「フォレスト全体」も「自分のドメイン」も同じ範囲なので、どのスコープを選んでも使える範囲は変わりません。スコープの違いがはっきり出るのは、ドメインが複数あるときや、別のフォレストと信頼関係を結んでいるときです。

3つのスコープ

もう1つ選ぶのが「グループのスコープ」です。スコープは、そのグループに「だれを入れられるか」と「どこで許可を付けられるか」を決めるものです。

グローバル人をまとめるメンバーにできるもの同じドメインのアカウントとグローバル許可を付けられる範囲フォレスト内と、信頼しているドメインのどこでも例Domain Users、Domain Adminsドメインローカル許可を受け止めるメンバーにできるものどのドメインのアカウントやグローバル、ユニバーサルでも許可を付けられる範囲自分のドメインの中だけ例DL-営業資料-変更 など(許可の受け皿)ユニバーサルフォレスト全体で使うメンバーにできるものフォレスト内のアカウント、グローバル、ユニバーサル許可を付けられる範囲フォレスト内と、信頼しているフォレストのどこでも例Enterprise Admins(メンバーはGCにも載る)
図4 グループの3つのスコープ
スコープメンバーにできるもの許可を付けられる
範囲
メンバーになれる先
グローバル同じドメインのアカウント、同じドメインのグローバルフォレスト内のどのドメインでも。信頼しているドメインやフォレストでもユニバーサル、同じドメインのグローバル、ドメインローカル
ドメインローカルどのドメイン(信頼しているドメインを含む)のアカウントやグローバル、同じフォレストのユニバーサル、同じドメインのドメインローカル自分のドメインの中だけ同じドメインのドメインローカル、同じドメインのコンピュータのローカルグループ
ユニバーサル同じフォレストのアカウント、グローバル、ユニバーサルフォレスト内のどのドメインでも。信頼しているフォレストでもユニバーサル、ドメインローカル、コンピュータのローカルグループ

ここからは、図2と同じ「本社ドメイン」「大阪ドメイン」と、双方向の信頼を結んだ「取引先のドメイン」の3つを例に、それぞれのスコープで「だれを入れられるか」と「どこで許可を付けられるか」を図で見ていきます。ドメインが1つだけの環境でも、次の節で説明する「入れ子のルール」はそのまま当てはまります。

グローバルグループ:人をまとめる

グローバルグループに入れられるのは、同じドメインのアカウントとグローバルグループだけです。そのかわり、フォレスト内のどのドメインでも、許可を付ける相手として使えます。「営業部」「経理部」のように、同じドメインにいる人を役割ごとにまとめるのに向いています。

フォレスト(corp.example.com)別のフォレスト(双方向の信頼あり)本社ドメインcorp.example.comuser01大阪ドメインosaka.corp.example.comuser05取引先のドメインpartner.exampleuser09GG-営業部グローバルメンバーにできるフォルダのACLに書いて許可を付けられるできるできない
図5 グローバルグループ(本社ドメインの GG-営業部)の範囲

本社ドメインに作った GG-営業部 には、本社の user01 は入れられますが、大阪の user05 や取引先の user09 は入れられません。そのかわり、GG-営業部 は、本社、大阪、取引先のどのフォルダのACLにも書けます。「入口は狭く、使える場所は広い」グループです。

ドメインに最初からある Domain Users(ドメインのすべてのユーザー)や Domain Admins(ドメインの管理者)も、グローバルグループです。

ドメインローカルグループ:許可を受け止める

ドメインローカルグループには、ほかのドメインや、信頼している別のフォレストのアカウントやグループも入れられます。そのかわり、許可を付けられるのは、そのグループがあるドメインの中だけです。「営業資料フォルダの変更」「経費システムの閲覧」のように、特定のリソースへの許可を受け止める入れ物として使います。

フォレスト(corp.example.com)別のフォレスト(双方向の信頼あり)本社ドメインcorp.example.comuser01大阪ドメインosaka.corp.example.comuser05取引先のドメインpartner.exampleuser09DL-営業資料ドメインローカルメンバーにできるフォルダのACLに書いて許可を付けられるできるできない
図6 ドメインローカルグループ(本社ドメインの DL-営業資料)の範囲

グローバルグループとは逆で、「入口は広く、使える場所は狭い」グループです。本社、大阪、取引先のだれでも入れられますが、ACLに書けるのは本社ドメインのフォルダだけです。大阪のファイルサーバで同じような許可を作りたいときは、大阪ドメインにドメインローカルグループを作ります。

ユニバーサルグループ:フォレスト全体で使う

ユニバーサルグループには、フォレスト内のどのドメインのアカウントやグループも入れられ、フォレスト内のどこでも許可を付けられます。ここでいう「ユニバーサル(全体)」は、フォレストの全体という意味です。別のフォレストのアカウントは、信頼関係があっても入れられません。フォレスト全体の管理者を表す Enterprise Admins は、ユニバーサルグループです。

フォレスト(corp.example.com)別のフォレスト(双方向の信頼あり)本社ドメインcorp.example.comuser01大阪ドメインosaka.corp.example.comuser05取引先のドメインpartner.exampleuser09UG-全社ユニバーサルメンバーにできるフォルダのACLに書いて許可を付けられるできるできないメンバーの一覧は、フォレスト中のグローバルカタログにも複製される
図7 ユニバーサルグループ(UG-全社)の範囲

本社と大阪の両方の人を1つのグループにまとめ、どちらのドメインのフォルダにも許可を付けられます。入口も使える場所も広いグループですが、その分、次に説明するグローバルカタログとの関係に気を付けます。

ユニバーサルグループは、メンバーの一覧がグローバルカタログ(GC)にも載ります。グローバルカタログは、フォレスト内のすべてのドメインのオブジェクトを、よく使う属性に絞って持っているDCです。どのDCをグローバルカタログにするかは、管理者が決めます。

ドメインが複数あるフォレストでは、ユーザーが、別のドメインで作られたユニバーサルグループに入っていることがあります。自分のドメインのDCだけでは、それが分かりません。そのためDCは、ユーザーのサインインを受け付けるときに、グローバルカタログに問い合わせて、ユーザーが入っているユニバーサルグループを調べます。

ドメインが複数あるフォレストでのサインインPC(大阪の拠点)user05 がサインイン大阪ドメインのDCGCではない本社ドメインのDCグローバルカタログサインイン(user05)user05 のユニバーサルグループは?WAN 越しに問い合わせるUG-全社 のメンバーですチケット(UG-全社 の SID 入り)大阪のDCは、ほかのドメインのユニバーサルグループのメンバーを知らないので、毎回 GC に聞く
図8 サインインのときのグローバルカタログへの問い合わせ

DC自身がグローバルカタログなら、問い合わせは自分の中で済みます。ところが、グローバルカタログを置いていない拠点では、サインインのたびにWAN越しの問い合わせが発生します。WANが遅ければサインインに時間がかかり、グローバルカタログに届かなければサインインに失敗します。

これを避けるための機能が「ユニバーサルグループメンバーシップのキャッシュ」です。Active Directory サイトとサービスで拠点(サイト)ごとに有効にでき、有効にすると、その拠点のDCが、グローバルカタログに問い合わせた結果を覚えておくようになります。

① 1回目のサインイン(キャッシュはまだ空)② 2回目以降のサインイン③ ときどきPC(大阪の拠点)user05 がサインイン大阪ドメインのDCGCではない本社ドメインのDCグローバルカタログサインイン(user05)user05 のユニバーサルグループは?UG-全社 のメンバーです大阪のDCが「user05 → UG-全社」をキャッシュに覚えるサインイン(user05)GC には聞かず、キャッシュを使うキャッシュの中身を取り直すグループの変更を反映するため
図9 ユニバーサルグループメンバーシップのキャッシュ
タイミング拠点のDCの動き
1回目のサインインキャッシュが空なので、グローバルカタログに問い合わせる。結果をキャッシュに覚える
2回目以降キャッシュを使うので、グローバルカタログに問い合わせない。WANが細くてもサインインが速い
ときどきグループの変更を反映するため、グローバルカタログからキャッシュの中身を取り直す

Microsoftは、ユーザーが100人に満たない小さな拠点で、本社とのWANが細いときに使うよう案内しています。また、キャッシュを取り直せるように、グローバルカタログから複製で1ホップ以内のところに置くよう求めています。なお、ドメインが1つだけのフォレストでは、どのDCもグローバルカタログのように振る舞えるので、サインインのためにグローバルカタログへ問い合わせる必要はありません。

ビルトインのグループとコンピュータのローカルグループ

この3つのほかに、ADの Builtin コンテナにある Administrators(S-1-5-32-544)などのグループは「ビルトインローカル」というスコープで、スコープも種類も変えられません。また、ドメインに参加したPCやサーバには、それぞれのコンピュータだけのローカルグループ(そのPCの Administrators や Users など)があります。ドメインに参加すると、Domain Admins がそのコンピュータの Administrators に自動で入ります。ローカルグループの置き場所の違いは「ワークグループとドメインの違い」の記事で説明しています。

グループの入れ子とよく使われる組み方

グループは、別のグループのメンバーにできます(入れ子)。ただし、入れられる向きはスコープで決まっています。

グローバルユニバーサルドメインローカルコンピュータのローカルグループグローバルをドメインローカルに直接入れてもよい矢印の向きに「入れられる」(左のグループを、右のグループのメンバーにする)・同じスコープどうしも入れられる(グローバルとドメインローカルは、同じドメインのものだけ)・どのスコープも、コンピュータのローカルグループに入れられる(ドメインローカルは同じドメインだけ)・逆向き(ドメインローカル → グローバル、ユニバーサル → グローバル など)には入れられない
図10 グループの入れ子のルール

このルールを使った定番の組み方が、AGDLPです。アカウント(Account)をグローバルグループ(Global)に入れ、グローバルグループをドメインローカルグループ(Domain Local)に入れ、ドメインローカルグループにアクセス許可(Permission)を付ける、という頭文字を並べたものです。

AアカウントGグローバルDLドメインローカルPアクセス許可user01user02user03GG-営業部GG-営業企画DL-営業資料-変更\\fs01\営業資料ACL:変更人の出入りはここだけ直す許可の変更はここだけ直す
図11 AGDLPの組み方の例

こう組んでおくと、2種類の変更を別々に扱えます。

起きること直す場所
営業部に人が入った・抜けたGG-営業部のメンバーだけ。フォルダのACLは触らない
営業企画にも営業資料の変更を許したいGG-営業企画を DL-営業資料-変更 に入れるだけ。フォルダのACLは触らない
営業資料を読み取りだけにしたい人がいるDL-営業資料-読み取り を別に作り、ACLに1行足す

ドメインが複数あるフォレストでは、各ドメインのグローバルグループをユニバーサルグループにまとめ、それをドメインローカルグループに入れる組み方(AGUDLP)もよく使われます。ユニバーサルグループのメンバーを変えると、その変更はフォレスト中のグローバルカタログに複製されます。そのため、ユニバーサルグループには人を直接入れず、グローバルグループを入れておくのが一般的です。

名前の頭に GG- や DL- を付けておくと、一覧で見たときにスコープを見分けやすくなります。これは決まりではないので、社内のルールに合わせてください。

スコープはあとから変えられる

スコープは作ったあとでも変えられますが、条件があります。グローバルからユニバーサルへは、ほかのグローバルグループのメンバーになっていなければ変えられます。ドメインローカルからユニバーサルへは、メンバーにドメインローカルグループがなければ変えられます。グローバルとドメインローカルの間は直接は変えられず、いったんユニバーサルを経由します。ドメインローカルに変えると、そのSIDは同じドメインの中でしかトークンに入らなくなるので、ほかのドメインのACLで使っていた場合は効かなくなります。

グループとトークン

グループのメンバーであることは、トークンに入ったグループのSIDで表されます。ただし、すべてのグループがいつもトークンに入るわけではありません。

この節では、例の構成を確認したうえで、「トークンをだれが作るか」と「グループの情報をだれが持っているか」の2つを押さえ、最後にまとめの表を読んでいきます。

例の構成

スコープの節で使った本社ドメインと大阪ドメインを、もう少し具体的にしたものです。

フォレスト(corp.example.com) 本社と大阪は自動で信頼し合っている本社ドメイン(corp.example.com)大阪ドメイン(osaka.corp.example.com)DC(GC)user01本社のユーザーPC01user01 のPCFS01ファイルサーバDCFS02ファイルサーバGG-営業部グローバルUG-全社ユニバーサルDL-営業資料ドメインローカルuser01 はこの3つのメンバーDL-大阪資料ドメインローカル(大阪)メンバーに本社の user01 を入れている別のドメインのグループにも入れられる① user01 が PC01 にサインイン同じ本社ドメイン② user01 が \\fs01 を開く同じ本社ドメイン③ user01 が \\fs02 を開く別の大阪ドメインのサーバ
図12 この節で使う例の構成
ドメインあるもの
本社ドメインDC(グローバルカタログも兼ねる)、ユーザーの user01、user01 が使うPC01、ファイルサーバのFS01。user01 は GG-営業部(グローバル)、UG-全社(ユニバーサル)、DL-営業資料(本社のドメインローカル)のメンバー
大阪ドメインDC、ファイルサーバのFS02。大阪のドメインローカルグループ DL-大阪資料 があり、そのメンバーに本社の user01 を入れている

図6で見たとおり、ドメインローカルグループには別のドメインのアカウントも入れられます。DL-大阪資料 は、大阪のFS02の共有フォルダに本社の人がアクセスできるように、大阪の管理者が作ったグループだと考えてください。

この構成で、user01 は次の3つの操作をします。

  1. 本社のPC01にサインインする(同じ本社ドメイン)
  2. \\fs01 の共有フォルダを開く(同じ本社ドメインのサーバ)
  3. \\fs02 の共有フォルダを開く(別の大阪ドメインのサーバ)

ポイントは3つ目です。user01 のアカウントは本社ドメインにありますが、FS02は大阪ドメインのサーバです。本社と大阪は同じフォレストの中で信頼し合っているので、本社のユーザーが大阪のサーバにアクセスできます。このとき、トークンに入るグループが本社のサーバのときと変わります。

トークンは、受け付けたコンピュータごとに作られる

user01 がPC01にサインインすると、PC01が user01 のトークンを作ります。そのあと \\fs01 の共有フォルダを開くと、今度はFS01が、自分の中で user01 のトークンを作ります。PC01のトークンが、そのままネットワークを通ってFS01に渡るわけではありません。FS01は、Kerberosのチケットに入っていた情報をもとにトークンを作り直し、そのトークンと自分のフォルダのACLを突き合わせます。

user01本社ドメインPC01本社・サインインする PCPC01 が作ったトークンuser01GG-営業部UG-全社DL-営業資料PC01 の UsersこのトークンとPC01 の ACL を比べるFS01本社のファイルサーバFS01 が作ったトークンuser01GG-営業部UG-全社DL-営業資料FS01 の UsersこのトークンとFS01 の ACL を比べるFS02大阪のファイルサーバFS02 が作ったトークンuser01GG-営業部UG-全社DL-大阪資料FS02 の UsersこのトークンとFS02 の ACL を比べるサインイン共有フォルダを開くと、開かれた側のサーバが自分でトークンを作る
図13 PC01、FS01、FS02がそれぞれ作る user01 のトークン

3つのトークンを比べると、上の3行(user01、GG-営業部、UG-全社)はどれも同じです。いっぽうで、色を付けた下の2行(ドメインローカルとローカルグループ)は、コンピュータごとに違います。特に、別のドメインにあるFS02のトークンだけ、ドメインローカルの行が DL-営業資料 ではなく DL-大阪資料 になっています。

グループの情報をだれが持っているか

下の2行が違う理由は、グループの種類によって、メンバーの情報を持っている場所が違うからです。

グループ情報を持っている場所トークンに入るとき
グローバルユーザーのドメインのDCサインインのときにチケットに入るので、どのコンピュータのトークンにも入る
ユニバーサルグローバルカタログサインインのときにチケットに入るので、どのコンピュータのトークンにも入る
ドメインローカルそのグループがあるドメインのDCそのドメインのコンピュータのトークンを作るときだけ入る
ローカルそのコンピュータそのコンピュータのトークンを作るときだけ入る

ここからは、本社の user01 が大阪のFS02を開く③の場面で、グループのSIDがどこからFS02に届くのかを順に見ていきます。

① PC01 にサインイン③ \\fs02 を開く(FS02 は大阪ドメイン)PC01user01(本社)本社のDCGCも兼ねる大阪のDCFS02大阪のサーバサインインTGTGG-営業部・UG-全社 入りfs02 用のチケットは?大阪のDCへ(紹介)fs02 用のチケットをくださいFS02 用のサービスチケット大阪のDCが DL-大阪資料 の SID を足すチケットを見せるFS02 が自分のローカルグループを足してトークンを作る
図14 本社の user01 が大阪のFS02を開くときのKerberosの流れ
流れ何が起きるか
① サインイン本社のDCが、user01 のTGT(チケットをもらうためのチケット)を発行する。TGTには、user01 自身と、GG-営業部(グローバル)、UG-全社(ユニバーサル)のSIDが入る
③-1 本社のDCに頼むPC01が、FS02用のチケットを本社のDCに頼む。FS02は大阪ドメインのサーバなので、本社のDCは「大阪のDCに頼んで」と紹介する
③-2 大阪のDCに頼む大阪のDCがFS02用のサービスチケットを発行する。このとき、user01 が入っている大阪ドメインのドメインローカル(DL-大阪資料)のSIDを足す
③-3 FS02に見せるFS02はチケットに入っていたSIDに、自分のローカルグループ(FS02 の Users など)を足して、user01 のトークンを作る

この流れの中で、本社のドメインローカル DL-営業資料 を足す場面はどこにもありません。DL-営業資料 を足すのは本社のDCで、本社のDCがチケットを発行するのは、本社ドメインのサーバ(PC01やFS01)用のときだけだからです。

大阪ドメインの FS02 が、本社ドメインの user01 のトークンを作るとき本社ドメインのDCuser01 のドメイングローバル:GG-営業部グローバルカタログフォレスト全体ユニバーサル:UG-全社大阪ドメインのDCFS02 のドメイン大阪のドメインローカル:DL-大阪資料FS02 自身FS02 の中だけFS02 のローカルグループ:Users本社ドメインのDCFS02 とは別のドメイン本社のドメインローカル:DL-営業資料FS02 のトークンには入らないFS02 が作ったトークンuser01GG-営業部UG-全社DL-大阪資料FS02 の Usersドメインローカルのメンバーは、そのグループがあるドメインのDCが持つ情報。ローカルグループはそのコンピュータが持つ情報。FS02 のトークンを作るときに使うのは、大阪のDCと FS02 自身の情報だけ
図15 大阪のFS02が、本社の user01 のトークンを作るときに使うグループの情報

図15は、FS02のトークンの中身を、情報の出どころごとに並べたものです。user01 は本社の人ですが、FS02のトークンを作るときに使われるドメインローカルの情報は、FS02と同じ大阪ドメインのものだけです。本社の DL-営業資料 は、user01 が本社でメンバーになっていても、FS02のトークンには入りません。

まとめの表の読み方

ここまでの3つの場面を1つの表にしたのが図16です。

  • 列:トークンを作るコンピュータです。左の2列(PC01、FS01)は user01 と同じ本社ドメイン、右の1列(FS02)は別の大阪ドメインです。
  • 行:user01 が入っているグループです。
  • ○ と ×:その列のコンピュータで作るトークンに、その行のグループのSIDが入るかどうかです。
user01(本社ドメイン)が入っているグループ↑ 別のドメインPC01本社ドメインFS01本社ドメインFS02大阪ドメインuser01 自身の SIDGG-営業部グローバル(本社)UG-全社ユニバーサルDL-営業資料ドメインローカル(本社)DL-大阪資料ドメインローカル(大阪)PC01 のローカルグループPC01 の Users などFS01 のローカルグループFS01 の Users など上の3行はどこでも入る。下の4行(色付き)は、トークンを作るコンピュータによって入るかどうかが変わる
図16 どのコンピュータのトークンに、どのグループのSIDが入るか

まず列を縦に見ます。本社のPC01とFS01の列は、DL-営業資料 が ○ で、DL-大阪資料 が × です。大阪のFS02の列だけ、これが逆になっています。同じ user01 でも、アクセスする先が別のドメインになると、トークンに入るドメインローカルが入れ替わることが分かります。縦に読んだ中身は、図13のトークンのカードと同じです。

次に行を横に見ます。上の3行(user01、GG-営業部、UG-全社)は、どの列も ○ です。グローバルとユニバーサルは、サインインのときにもらうTGTに入っているので、どのドメインのサーバにアクセスしても一緒に届きます。下の4行は、○ が1列か2列だけです。ドメインローカルは同じドメインのコンピュータだけ、ローカルグループはそのコンピュータだけ、という決まりが行ごとに表れています。

グループトークンに入るか
グローバル、ユニバーサルどのコンピュータで作るトークンにも入る(入れ子で入っているものも含む)
ドメインローカルトークンを作るコンピュータと同じドメインのものだけが入る
コンピュータのローカルグループそのコンピュータで作るトークンにだけ入る

ドメインローカルグループが「自分のドメインの中だけ」で使えるのは、このためです。図16の DL-営業資料 は、大阪のFS02で作るトークンには入らないので、仮にFS02のACLに書けたとしても効きません。

Kerberosでは、こうしたグループのSIDは、チケットの中のPAC(認可情報)という部分に入って運ばれます。トークンやチケットはサインインしたときに作られるので、グループのメンバーを変えても、すでにサインインしている人には反映されません。サインインし直すと、新しいグループが入ったトークンになります。

グループが多すぎると起きること

1人のユーザーがたくさんのグループに入っていると、トークンやチケットが大きくなり、ある数を超えると認証やアクセスに失敗します。気を付ける上限は2つあります。

Kerberos チケットの大きさ48,000 バイトMaxTokenSize の既定値(Windows 8 / Server 2012 以降)グループの SID は PAC としてチケットに入るIIS は既定でヘッダー1つ 16,384 バイトまで→ ここに先に当たって HTTP 400 になることもトークンに入る SID の数1,024 個グループの数でいうと、約 1,010 個までKerberos でも NTLM でも同じ上限超えるとトークンを作れない→ サインインそのものが失敗するグループが多い、入れ子が深い、移行で sIDHistory がたまっている、のどれでも上限に近づく
図17 グループが多すぎると当たる2つの上限

Kerberos チケットの大きさ(MaxTokenSize)

Kerberosのチケットを受け取るための入れ物の大きさが MaxTokenSize です。Windows 8 と Windows Server 2012 以降では、既定値は48,000バイトです(それより前のWindowsでは12,000バイトでした)。チケットの大きさは、次の式でおおよそ見積もれます。

TokenSize = 1200 + 40d + 8s
記号数えるもの(Windows Server 2012 以降)
1200チケットそのものの大きさの目安。ドメイン名やユーザー名の長さで変わる
dユーザーのドメインの外にあるユニバーサルグループの数と、sIDHistory(ドメインを移行したときに残る古いSID)の数の合計
sユーザーのドメインの中にあるユニバーサルグループ、ドメインローカルグループ、グローバルグループの数の合計

同じドメインのグループは1つあたり8バイトで済みますが、外のドメインのグループやsIDHistoryは1つあたり40バイトになります。たとえば、次のようになります。

例同じドメインの
グループ(s)
外のユニバーサルと
sIDHistory(d)
見積もり
例145個0個1200 + 8 × 45 = 1,560バイト
例2650個0個1200 + 8 × 650 = 6,400バイト
例3650個200個(50+150)1200 + 40 × 200 + 8 × 650 = 14,400バイト

例3でも48,000バイトには届きませんが、Webのシステムでは先に別の上限に当たります。HTTPでKerberosのチケットを送るときは、チケットをBase64に変換してヘッダーに入れるので、大きさがおよそ4/3倍になります。IIS(HTTP.sys)は、既定ではヘッダー1つあたり16,384バイトまでしか受け取らないため、14,400バイトのチケット(変換後は約19,200バイト)は受け取ってもらえず、「HTTP 400 – Bad Request (Request Header too long)」になります。

MaxTokenSize は最大65,535バイトまで大きくできますが、Base64で大きくなることを考えて、48,000バイトより大きくしないよう勧められています。Windows Server 2012 以降のDCでは、グループポリシーの「コンピューターの構成 ›› 管理用テンプレート ›› システム ›› KDC」にある「大きな Kerberos チケットに関する警告」(英語版では Warning for large Kerberos tickets)を有効にすると、大きなチケットを発行したときにイベントID 31が記録されるようになります。

トークンに入るSIDの数(1,024個)

もう1つの上限は、アクセストークンに入れられるSIDの数です。上限は1,024個で、Windowsが自動で加えるSID(Everyone や Authenticated Users など)の分を引くと、グループの数ではおよそ1,010個が目安になります。入れ子で間接的に入っているグループやsIDHistoryも数に入ります。

この上限を超えるとトークンを作れないので、サインインそのものが失敗し、「セキュリティ ID が多すぎる」という内容のメッセージが出ます。イベントID 4625 には 0xc000015a(STATUS_TOO_MANY_CONTEXT_IDS)が記録されます。こちらはKerberosでもNTLMでも同じで、MaxTokenSize を大きくしても解決しません。

減らし方

  • 使っていないグループからユーザーを外す
  • アクセス許可に使っていないセキュリティグループを配布グループに変える(配布グループはトークンに入らないので、数に入らない)
  • ドメインの移行で残った sIDHistory を、使っていないことを確かめてから消す
  • 入れ子を深くしすぎない。1つのグループが多くのグループに入っていると、メンバー全員のSIDが一度に増える

ドメインローカルグループは、アクセス先と同じドメインのものだけがトークンに入ります。そのため、ドメインが複数ある環境では、あるドメインのサーバにはサインインできるのに、別のドメインのサーバでは失敗する、ということも起きます。

確認に使うコマンド

PC(コマンドプロンプト):今のトークンに入っているグループを一覧で表示する

whoami /groups

PC(PowerShell):今のトークンに入っているグループの数を数える

(whoami /groups /fo csv | ConvertFrom-Csv).Count

管理用PC(PowerShell):ドメインのグループを、種類とスコープ付きで一覧にする

Get-ADGroup -Filter * | Select-Object Name, GroupCategory, GroupScope | Sort-Object GroupScope, Name

管理用PC(PowerShell):グローバルのセキュリティグループを作る

New-ADGroup -Name "GG-営業部" -GroupCategory Security -GroupScope Global -Path "OU=Groups,DC=corp,DC=example,DC=com"

管理用PC(PowerShell):ドメインローカルのセキュリティグループを作る

New-ADGroup -Name "DL-営業資料-変更" -GroupCategory Security -GroupScope DomainLocal -Path "OU=Groups,DC=corp,DC=example,DC=com"

管理用PC(PowerShell):ユーザーをグローバルグループに、グローバルグループをドメインローカルグループに入れる

Add-ADGroupMember -Identity "GG-営業部" -Members user01, user02
Add-ADGroupMember -Identity "DL-営業資料-変更" -Members "GG-営業部"

管理用PC(PowerShell):ユーザーが直接入っているグループを表示する

Get-ADPrincipalGroupMembership -Identity user01 | Select-Object Name, GroupScope

管理用PC(PowerShell):入れ子をたどって、グループに入っているユーザーを全部表示する

Get-ADGroupMember -Identity "DL-営業資料-変更" -Recursive | Select-Object Name

管理用PC(PowerShell):グループのスコープをユニバーサルに変える

Set-ADGroup -Identity "GG-営業部" -GroupScope Universal

Get-ADGroup などのコマンドには、RSATのActive Directoryモジュールが必要です。whoami /groups の一覧には、ログオンセッションのSIDなど一部のSIDが表示されないので、1,024個の上限と比べるときは目安として見てください。

まとめ

項目ひとことで
ドメイン・フォレストドメインは管理の単位、フォレストはドメインの集まり。フォレストの中は自動で信頼し合い、別のフォレストとは信頼を作ったときだけつながる
グループの種類アクセス許可に使えるのはセキュリティグループだけ。配布グループはメールの宛先用で、トークンに入らない
グローバル同じドメインの人をまとめる。フォレスト内のどこでも許可を付けられる
ドメインローカルどこの人やグループでも入れられ、自分のドメインの中でだけ許可を受け止める
ユニバーサルフォレスト全体で使える。メンバーの一覧はグローバルカタログにも載る
組み方AGDLP:人はグローバルに、グローバルはドメインローカルに、許可はドメインローカルに付ける
トークングローバルとユニバーサルはどこでも入る。ドメインローカルはトークンを作るコンピュータと同じドメインのものだけ、ローカルグループはそのコンピュータだけで入る
多すぎるときKerberosのチケットが大きくなり(既定48,000バイト、IISのヘッダー上限にも注意)、SIDが1,024個を超えるとサインインできない

「人をまとめるグループ」と「許可を受け止めるグループ」を分けておくと、アクセス許可の見直しがずっと楽になります。グループが増えてきたら、トークンの大きさにも目を向けておくと安心です。

コメント