Windowsでファイルを開こうとしたとき、開けるかどうかを決めているのは「アクセストークン」と「ACL」の2つです。アクセストークンは利用者が持つ通行証で、ACLはファイルやフォルダが持つ「入ってよい人の名簿」です。この記事では、それぞれの中身と、Windowsが許可・拒否を決める順番を見ていきます。
- アクセストークンには何が入っていて、いつ作られるのか
- ACL(DACLとACE)の中身と、許可・拒否が決まる順番
- 共有のアクセス許可とNTFSのアクセス許可、UACでつまずく場面
全体像:通行証と、扉の名簿
Windowsのアクセス制御は、利用者の側にある「アクセストークン」と、ファイルやフォルダの側にある「ACL(アクセス制御リスト)」の2つでできています。ファイルを開こうとすると、Windowsはトークンに入っているSIDと、ACLに書かれたSIDを照らし合わせます。この照合を「アクセスチェック」と呼びます。
SIDは、Windowsがユーザーやグループを見分けるための番号です。トークンにもACLにも、名前ではなくSIDが入っています。
アクセストークンとは
アクセストークンは、サインインに成功したときにWindows(LSA)が作る、利用者の情報のまとまりです。そのユーザーが起動したプログラム(プロセス)には、すべてこのトークンのコピーが付きます。プログラムがファイルを開こうとすると、Windowsはそのプロセスのトークンを使ってアクセスチェックをします。
| 入っているもの | 内容 |
|---|---|
| ユーザーのSID | サインインしたユーザー本人のSID |
| グループのSID | ユーザーが入っているグループのSID。Everyone や Authenticated Users のような、Windowsが自動で付けるグループも入る |
| ログオンSID | 今回のサインイン(ログオンセッション)を表すSID |
| 特権 | シャットダウンやバックアップなど、システム全体に関わる操作をしてよいかどうか |
| 既定のDACL | このユーザーが新しくファイルなどを作るときに、ACLを指定しなければ使われるACL |
| トークンの種類 | プロセスが持つ「プライマリトークン」か、別のユーザーになりすますための「偽装トークン」か |
トークンはサインインしたときに作られ、あとから中身は増えません。グループに追加しても、サインインし直すまで反映されないことがあるのはこのためです。
ネットワーク越しのアクセスでは、サーバ側でトークンができる
ファイルサーバの共有フォルダを開くときは、利用者のPCのトークンがそのまま使われるわけではありません。ファイルサーバが利用者を認証し、ファイルサーバの上で、その利用者のアクセストークンを作ります。ファイルサーバは、そのトークンを使って利用者に「なりすまし」、自分のACLと照らし合わせます。
| No. | 何が起きているか |
|---|---|
| ① | PCは、共有を開くときに本人であることを証明します。Kerberosならチケットを、NTLMなら認証の応答を送ります。 |
| ② | NTLMの場合、ファイルサーバはDCに確認を頼み、ユーザーとグループの情報を受け取ります。Kerberosの場合は、チケットの中に入っているユーザーとグループの情報を使います。 |
| ③ | ファイルサーバは、受け取った情報からuser01のアクセストークンを作ります。 |
| ④⑤ | ファイルサーバはuser01になりすまして(偽装トークンを使って)ファイルを開き、ACLと照らし合わせて許可するかどうかを決めます。 |
アクセストークンは、そのコンピュータのWindowsがメモリの中で管理しているもので、ネットワーク越しに渡すことはできません。仮に中身を送れたとしても、利用者のPCが作った情報は書き換えられるおそれがあるため、サーバはDCが保証した情報(Kerberosのチケットに入ったグループ情報や、NTLMでのDCの応答)をもとに、自分でトークンを組み立てます。また、サーバのローカルグループや「ユーザー権利の割り当て」はコンピュータごとに違うので、そのサーバの設定を反映したトークンが必要になります。
特権(ユーザー権利)はACLとは別
トークンには、SIDのほかに「特権」も入っています。特権は、シャットダウン、時刻の変更、ファイルのバックアップなど、特定のファイルではなくシステム全体に関わる操作をしてよいかを表します。たとえば Backup Operators グループには、ファイルのアクセス許可に関係なく、すべてのファイルをバックアップ・復元できる特権が与えられています。
特権は、ローカルセキュリティポリシーやグループポリシーの「ユーザー権利の割り当て」で設定します。ファイルごとのACLとは別の仕組みなので、ACLだけを見ていると見落としやすいところです。
ACLとは
ファイルやフォルダなど、アクセスを制御できるものには「セキュリティ記述子」が付いています。セキュリティ記述子には、所有者と、2種類のACLが入っています。アクセスを許可・拒否するのがDACL、アクセスをログに残すかどうかを決めるのがSACLです。ふだん「アクセス許可」や「ACL」と呼んでいるのは、DACLのことです。
DACLの1行1行を「ACE(アクセス制御エントリ)」と呼びます。ACEには、「だれに(SID)」「許可か拒否か」「どの権利を」が書かれています。エクスプローラーのセキュリティタブに並んでいるのは、このACEです。
| 基本のアクセス許可 | できること | icaclsでの表記 |
|---|---|---|
| フル コントロール | すべての操作。アクセス許可の変更や所有権の取得もできる | F |
| 変更 | 読み取り、書き込み、削除 | M |
| 読み取りと実行 | ファイルを読む、プログラムを実行する | RX |
| 読み取り | ファイルの中身や属性を読む | R |
| 書き込み | ファイルを作る、書き込む | W |
アクセス許可は親フォルダから継承される
新しく作ったファイルやフォルダは、ふつう親フォルダのACEを受け継ぎます(継承)。継承されたACEは、セキュリティタブでは灰色のチェックで表示され、icaclsでは (I) が付きます。フォルダの下のファイルに同じ権限を付けたいときは、親フォルダに設定すれば済みます。
DACLが「ない」場合と「空」の場合では、意味が逆になります。DACLがない(NULL DACL)と、だれでもフルアクセスできます。DACLはあってもACEが1つもない(空のDACL)と、だれもアクセスできません。
許可・拒否はどう決まるのか
アクセスチェックでは、DACLのACEを上から順に見ていきます。求めた権利(たとえば「書き込み」)を拒否するACEに当たれば、その時点で拒否です。許可するACEを足し合わせて求めた権利がそろえば、その時点で許可です。最後まで見てもそろわなければ、拒否になります。
ACEを上から見るので、並び順が大事です。Windowsは、ACEを次の順に並べるように決めています。エクスプローラーやicaclsで設定すると、自動でこの順になります。
| 順 | ACEの種類 | ここから言えること |
|---|---|---|
| 1 | 明示的な拒否(そのフォルダに直接設定した拒否) | 直接設定した拒否は、どの許可よりも先に見られる |
| 2 | 明示的な許可 | 直接設定した許可は、継承した拒否より先に見られる |
| 3 | 継承した拒否(親、祖父母…の順) | 近い親のACEほど先に見られる |
| 4 | 継承した許可 | ― |
また、ACLに名前がない人は、許可も拒否も書かれていなくてもアクセスできません。ふだんは許可だけを設定し、拒否は「グループには許可したいが、その中の特定の人だけ止めたい」ときに使うのが基本です。
共有のアクセス許可とNTFSのアクセス許可
ファイルサーバの共有フォルダには、アクセス許可が2か所にあります。共有の設定(「共有」タブの「詳細な共有」)にある「共有のアクセス許可」と、フォルダそのものの「セキュリティ」タブにあるNTFSのアクセス許可です。ネットワーク越しにアクセスすると、この2つの門を両方通ることになります。
| 項目 | 共有のアクセス許可 | NTFSのアクセス許可 |
|---|---|---|
| 効く場面 | ネットワーク越しのアクセスだけ | ネットワーク越しでも、サーバの上で直接開いても |
| 設定できる権利 | フル コントロール、変更、読み取りの3つだけ | 基本の5つに加え、細かい権利まで設定できる |
| 設定する単位 | 共有ごと | フォルダやファイルごと(継承あり) |
2つの設定が食い違うときは、より厳しいほうになります。共有で「変更」、NTFSで「読み取り」なら、できるのは読み取りだけです。管理を分かりやすくするために、共有のアクセス許可は広めにしておき、細かい制御はNTFSのアクセス許可で行う運用がよく使われます。
ユーザーが実際にどこまでできるかは、フォルダのプロパティで セキュリティ ›› 詳細設定 ›› 有効なアクセス を開くと確認できます。
管理者なのに「アクセスが拒否されました」になる理由
Administratorsグループのメンバーでサインインしても、ACLが「Administrators:フル コントロール」だけのフォルダを開けないことがあります。これはUAC(ユーザーアカウント制御)の働きです。
管理者がサインインすると、Windowsは2つのトークンを作ります。1つは管理者のトークンで、もう1つは管理者の特権を外し、Administratorsを「拒否専用」にした標準ユーザー相当のトークンです。エクスプローラーやふだんのプログラムは、標準ユーザー相当のトークンで動きます。
拒否専用のSIDは、拒否のACEにだけ使われ、許可には使われません。そのため、Administratorsにだけ許可したフォルダは、ふだんのトークンでは開けません。「管理者として実行」したプログラムなら、管理者のトークンが使われるので開けます。ふだん使うフォルダは、Administratorsではなく、利用者のグループに許可を付けておくと混乱しにくくなります。
確認に使うコマンド
PC(コマンドプロンプト):今のトークンのユーザー、グループ、特権をすべて表示する
whoami /all
PC(コマンドプロンプト):今のトークンの特権だけを表示する
whoami /priv
ファイルサーバ(コマンドプロンプト):フォルダのACLを表示する
icacls "D:\Share\営業資料"
ファイルサーバ(PowerShell):フォルダのACLを表示する
Get-Acl -Path "D:\Share\営業資料" | Format-List
ファイルサーバ(PowerShell):共有のアクセス許可を表示する
Get-SmbShareAccess -Name "営業資料"
icacls の表示では、アクセス許可が略号で表されます。よく見るものを挙げます。
| 表示 | 意味 |
|---|---|
| F / M / RX / R / W | フル コントロール/変更/読み取りと実行/読み取り/書き込み |
| (I) | 親フォルダから継承したACE |
| (OI) | このフォルダの中のファイルに継承される |
| (CI) | このフォルダの中のフォルダに継承される |
| (IO) | このフォルダ自身には効かず、中のものにだけ継承される |
まとめ
Windowsは、利用者のアクセストークンと、ファイルやフォルダのACLをSIDで照らし合わせて、アクセスを許可するかどうかを決めます。共有フォルダでは、共有とNTFSの2つの門を通り、より厳しいほうの権利になります。
| 項目 | 押さえておくこと |
|---|---|
| アクセストークン | サインイン時にできる通行証。ユーザーとグループのSID、特権が入る |
| ネットワーク越し | ファイルサーバが利用者のトークンを作り、なりすまして照合する |
| ACL(DACL) | ACEの並び。ACEは「だれに・許可か拒否か・どの権利を」 |
| 判定 | 上から順に見て、拒否に当たれば拒否。許可で権利がそろえば許可。そろわなければ拒否 |
| 順番 | 明示的な拒否 → 明示的な許可 → 継承した拒否 → 継承した許可 |
| 共有とNTFS | 両方が効き、より厳しいほうになる。「有効なアクセス」で確認できる |
| UAC | 管理者でも、ふだんは標準ユーザー相当のトークン。Administratorsだけに許可したものは昇格しないと開けない |
この記事は、次の資料を確認して書いています。
- Access tokens(Microsoft Learn)
- Security principals(Microsoft Learn)
- Client Impersonation(Microsoft Learn)
- Parts of the Access Control Model(Microsoft Learn)
- DACLs and ACEs(Microsoft Learn)
- How AccessCheck Works(Microsoft Learn)
- Order of ACEs in a DACL(Microsoft Learn)
- Null DACLs and Empty DACLs(Microsoft Learn)
- icacls(Microsoft Learn)
- Access Denied when you access an SMB file share in Windows(Microsoft Learn)
- Understand NAS share permissions in Azure NetApp Files(共有とファイルのアクセス許可の関係)(Microsoft Learn)
- How to evaluate effective permissions for resources on remote computers(Microsoft Learn)
- How User Account Control works(Microsoft Learn)
- SID Attributes in an Access Token(Microsoft Learn)
コメント