Windows OSの管理業務で必ず目にするであろう「ACL(アクセス制御リスト)」。その基本は、「誰に」「何を許可するか」という設定の集まりだ。ACLの概要や設定方法、継承の意味などについて解説する。
前回はWindows OSの基本であるユーザーとグループアカウントについて解説した。今回はWindowsのリソース管理で必ず登場する、「アクセス制御リスト」について取り上げる。この機能についてよく知っておかないと、アクセス拒否のエラーに悩まされることになるだろう。
「アクセス制御(Access Control)」とは、システムのセキュリティを確保するために使われる1つの手段である。システム上には、さまざまなオブジェクト(リソース)が存在し、それにアクセスしようとしている主体(ユーザーやグループ、サービスなど)もまたさまざまだ。当然のことだが、どの主体も自由に全オブジェクトにアクセスできるようではセキュリティを維持できない(一般ユーザーがシステム中枢のオブジェクトを変更・削除できたら困るだろう)。そのため、対象オブジェクトにアクセスするための権利を持っているかどうかを主体ごとに判断し、権限の有無に応じてアクセスを許可/拒否する、といったことが必要だ。これをアクセス制御という。
Windows OSにおいて、アクセス制御に利用されているのが「アクセス制御リスト(Access Control List)」(以下ACL)という、アクセス権のセット(集合体)である。ACLを使ってあらかじめオブジェクトのセキュリティを設定しておくと、実行時にはアクセス元のユーザーのアカウントやグループ情報とACLを照らし合わせて、アクセス制御が行われる。
Windows OSで一番多く目にするACLは、NTFSファイルシステムにおけるファイルやフォルダーのアクセス権設定画面だろう。実はファイルシステムに限らず、ファイル共有やプリンター、レジストリ、グループポリシー、サービス、WMIなど、ACLはWindows OS内のさまざまな場所で利用されている(カーネル内部でもさまざまな場所でACLを使ってセキュリティを確保している)。
次の画面は、レジストリのACLの例である。レジストリリソースに対しても、ファイルシステムのファイルやフォルダーと同じように、アクセス可能かどうかをACLで設定している。
MS-DOSのころから使われているFATファイルシステムでは、ファイルには書き込み禁止やシステムファイルという属性を付けることができたが、これはセキュリティのためというよりは、誤った操作からファイルを保護するための機能にすぎなかった。
もう少し進んでいるUNIXでは、所有者/所有者(の属する)グループ/全ユーザーという3種類のアクセス主体に対して、それぞれ読み出し/書き込み/実行を許可するかどうか、を設定することはできたが、それ以上の複雑なアクセス制御はできなかった(伝統的なUNIXの場合。現在のUNIXではACLがサポートされている)。例えばuser1には許可、user2には拒否、といったアクセス制御は設定できない。
Windows OSで使われているACLは、OSのセキュリティレベルを決めたガイドライン「TCSEC(Trusted Computer System Evaluation Criteria。現在は ISO/IEC15408)」で定義されていた、いわゆるC2レベルセキュリティを実現するために用意されたものである。このセキュリティ基準では、あるリソースに対するアクセスを、明示的に許可されたユーザーやグループのみに限定することにより(許可リストは複数定義可)、権限を持たないユーザー(許可リストに含まれていないユーザー)からのアクセスを禁止している。
アクセスを許可するユーザーやグループを記述したエントリをACE(アクセス制御エントリ)と呼ぶ。これを複数集めたものがACLとなる。ACLは可変長であり、複数のエントリを組み合わせて、より複雑なアクセス制御を実現できる。
またWindows OSのACLでは、アクセスを禁止するユーザーやグループも定義でき、これを使うと、アクセスさせたくないユーザーやグループを定義することも可能である。同じユーザーがアクセス許可とアクセス拒否の両方のエントリに含まれて場合は、拒否リストの方が優先される。拒否機能を使えば、例えば既存のアクセス権をそのままにして、アクセスさせたくないユーザーやグループのエントリを追加するだけでアクセス禁止にできるので便利である。もし拒否機能がないと、既存のアクセス権設定から、該当するユーザーやグループを抜いた設定を新たに作成しなければならず、作業がとても面倒になる。
ここでWindows OSにおけるACL関連の用語についてまとめておこう。
オブジェクトのアクセス制御や監査などを行うための機能。ACLにはDACLとSACLの2種類があるが、一般的にACLというと、DACLを指すことが多い。
オブジェクトのアクセス制御を行うためのACL。DACLには、0個以上、任意の数のACEを追加できる。DACLが空だと誰もオブジェクトにアクセスできないので、通常は1つ以上のACEを設定しておくか、上位から「継承」するように設定しておく。DACL中に複数のACEが存在する場合は、まず「アクセス拒否のACE」から該当するものがないかどうか調べられ、なければ「アクセス許可のACE」から検索される。
オブジェクトの監査などを行うためのACL。
ACLの構成要素。1つのACLには、複数のACEを含めることができる(0個も可)。ACEには「アクセス許可ACE」と「アクセス拒否ACE」の2種類がある。各ACEには、「誰に」対して、「どのようなアクセス権」を許可(もしくは禁止)するかの情報が含まれている。さらにACEの継承に関する属性も定義されている。ACEでは、例えば「Everyoneに対して読み取りを許可」とか「user01に対してフルコントロールを許可」「Group1に対してアクセスを拒否」といったアクセス権の設定を行う。
ファイルシステムでアクセス制御を行う場合、全てのファイルやフォルダーに対して適切にACLを設定しておかないと、誰もアクセスできないファイルになってしまう可能性がある。といって、ファイルやフォルダーを作成するたびにACLも設定しなければならないのでは非常に面倒である。そこでACLの継承という機能が使われる。
「ACLの継承」とは、親となるフォルダーに対してACLを定義しておけば、その中に作られるファイルやフォルダーに対して、自動的に親フォルダーのACLが引き継がれるという機能である。例えばWindows 8.1のユーザーフォルダー(「C:\Users\user01」など)は、デフォルトでは「ユーザー(user01)とAdministratorsグループに対してフルコントロール」というアクセス権が付けられており、ユーザーがこの中にファイルやフォルダーを作成すると、このACL設定が引き継がれる。継承したACLだけでは権限が不足(もしくは許可しすぎ)なら、特定のフォルダーだけACLを追加で定義することもできるし、継承を禁止して、別のACLを割り当てる、といったことも可能である。
Copyright© Digital Advantage Corp. All Rights Reserved.