ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
マニュアルページセクション 5: 標準、環境、マクロ Oracle Solaris 11.1 Information Library (日本語) |
- アクセス制御リスト
アクセス制御リスト (ACL) は、ファイルおよびディレクトリへのアクセスを付与および拒否する随意アクセス制御メカニズムです。2 つの異なる ACL モデルが Solaris リリース (POSIX ドラフト ACL および NFSv4 ACL) でサポートされます。
古い POSIX ドラフトモデルは、UFS ファイルシステムでサポートされます。このモデルは、標準化されなかった削除済みの ACL POSIX 仕様に基づいています。これは、その後 POSIX 委員会によって削除されました。
他のモデルは、NFSv4 タスクグループの標準に基づいており、Internet Engineering Task Force (IETF) から承認済みの標準です。ZFS ファイルシステムは NFSv4 モデルを使用し、POSIX ドラフトモデルより豊富なセマンティクスときめ細かなアクセス権機能を備えています。
POSIX ドラフト ACL は、Solaris リリースで基本 UNIX ファイルアクセス権に代替のセキュリティーメカニズムを提供します。目的は、ファイルおよびディレクトリへのアクセスをさらに制限すること、または特定のユーザーにアクセス権を拡張することです。ACL を使用して、標準の所有者とグループのアクセス権、およびファイルのモードのその他のクラスビットを変更できます。ACL は、ファイルへの追加のユーザーおよびグループアクセスを付与できます。ディレクトリは、デフォルト ACL という特殊な種類の ACL を持つことができます。これは、ディレクトリの子孫によって継承される ACL エントリを定義します。POSIX ドラフト ACL には、マスクという ACL エントリがあります。マスクは、追加のユーザーとグループエントリに付与できる最大のアクセス権を定義します。chmod(1) または chmod(2) によってファイルが作成されるか、そのモードが変更されるたびに、マスクが再計算されます。これは、chmod(2) に渡されるモードで定義されたグループアクセス権になるよう再計算されます。
POSIX ドラフト ACL モデルは、従来の UNIX アクセス権の標準の rwx モデルを使用します。
ACL は次のように表されます:
acl_entry[,acl_entry]...
それぞれの acl_entry には ACL エントリが 1 つ含まれています。ACL エントリは、2 つまたは 3 つのコロン区切り (:) フィールドで表されます。
uid がブランクの場合、ファイル所有者を表します。
gid がブランクの場合、所有するグループを表します。
ファイルのその他のクラスを表します。
付与する MAX アクセス権を定義します。
たとえば、ユーザー joe に読み取り/書き込みアクセス権を付与するには、次のように ACL エントリを指定します:
user:joe:rw-
NFSv4 ACL モデルは、大まかに Windows NT ACL モデルに基づいています。NFSv4 ACL は、POSIX ドラフト ACL より大幅に豊富な ACL モデルを提供します。
NFSv4 と POSIX ドラフト ACL の主な違いは次のとおりです:
NFSv4 ACL は、rwx モデルよりきめ細かなアクセス権を提供します。
NFSv4 ACL では、ALLOW と DENY の両方をエントリが可能です。
NFSv4 ACL には、豊富な継承セマンティクスセットが用意されています。POSIX ACL には継承も用意されていますが、NFSv4 モデルを使用すると次の継承機能を制御できます:
継承がファイルとディレクトリの両方にカスケードするか、ファイルまたはディレクトリのみにカスケードするか。
ディレクトリの場合、継承がディレクトリ自体に適用されるのか、1 つのレベルのサブディレクトリのみに適用されるのか、ディレクトリのすべてのサブディレクトリにカスケードされるのかを指定できます。
NFSv4 ACL には、システムの監査トレールに接続するためのメカニズムが用意されています。現在、Solaris ではこのメカニズムはサポートされていません。
NFSv4 ACL を使用すると、管理者は ACL エントリが検査される順序を指定できます。POSIX ドラフト ACL では、ファイルシステムは、ACL エントリを適切に定義された厳格なアクセスチェック順序に並べ替えます。
POSIX ドラフト ACL セマンティクスは、NFSv4 ACL を使用して実現できます。ただし、一部の NFSv4 ACL のみを同等の POSIX ドラフト ACL に変換できます。
アクセス権を指定する際には、異なる 3 つの chmod ACL 形式を使用できます。 冗長、コンパクト、定位置です。冗長形式では、単語を使ってアクセス権を指定し、複数のアクセス権はスラッシュ (/) 文字で区切ります。コンパクト形式ではアクセス権文字を使用し、定位置形式ではアクセス権文字またはハイフン (-) を使用してアクセス権がないことを示します。
冗長モード用のアクセス権とコンパクトモードおよび定位置モード用の短縮形について、次に説明します。短縮形は括弧内に示しています。
ファイルのデータを読み取るアクセス権
ディレクトリの内容を表示するためのアクセス権。
ファイルのオフセット範囲内の任意の場所にある、ファイルのデータを変更するアクセス権。これには、ファイルを拡張または任意のオフセットに書き込む能力が含まれます。
ディレクトリに新しいファイルを追加するためのアクセス権。
ファイルのデータを変更する能力。ただし、変更できるのは EOF 以降のみです。現在、この権限はサポートされていません。
ディレクトリにサブディレクトリを作成する権限。
ファイルの拡張属性を読み取ったり拡張属性ディレクトリの検索を実行したりする能力。
拡張属性を作成したり拡張属性ディレクトリに書き込んだりする能力。
ファイルを実行する権限。
ファイルの基本属性 (ACL 以外) を読み取る機能。基本属性は、stat レベル属性であるとみなされます。このアクセスマスクビットを許可することは、エンティティが ls(1) および stat(2) を実行できることを意味します。
ファイルまたはディレクトリに関連付けられた時間を任意の値に変更するためのアクセス権。
ファイルを削除するアクセス権。
ディレクトリ内のファイルを削除する権限。
ACL を読み取るアクセス権。
ACL を書き込むアクセス権、または chmod(1) または setfacl(1) を実行する能力。
同期読み取り権と書き込み権を使ってサーバー上のファイルにローカルアクセスするアクセス権。現在、この権限はサポートされていません。
次の継承フラグが NFSv4 でサポートされます:
ディレクトリ内で新しく作成したすべてのファイルに継承します。
ディレクトリ内で新しく作成したすべてのディレクトリに継承します。
ディレクトリに入れますが、そのディレクトリ自体には適用せず、新しく作成されたファイルとディレクトリのみに適用します。このフラグでは、継承する内容を示すために file_inherit と dir_inherit の両方またはどちらかが必要です。
ディレクトリに入れて、ツリーの 1 レベルのみ ACL エントリを継承すべきであることを示します。このフラグでは、継承する内容を示すために file_inherit と dir_inherit の両方またはどちらかが必要です。
正常にアクセスしたときに、アラームまたは監査記録を開始するかどうかを指定します。監査/アラーム ACE タイプと同時に使用されます。
アクセスに失敗したときに、アラームまたは監査記録を開始するかどうかを指定します。監査/アラーム ACE タイプと同時に使用されます。
ACE が継承されました。
アクセス権は付与されていません。
NFSv4 ACL は次の構文を使用して表されます:
acl_entry[,acl_entry]... owner@:<perms>[:inheritance flags]:<allow|deny> group@:<perms>[:inheritance flags]:<allow|deny> everyone@:<perms>[:inheritance flags]:<allow|deny> user:<username>[:inheritance flags]:<allow|deny> group:<groupname>[:inheritance flags]:<allow|deny>
ファイル所有者
グループ所有者
特定のユーザーのアクセス権
特定のグループのアクセス権
アクセス権と継承フラグは / 文字で区切られます。
ACL の指定例:
user:fred:read_data/write_data/read_attributes:file_inherit:allow owner@:read_data:allow,group@:read_data:allow,user:tom:read_data:deny
コンパクト ACL 形式では、14 個の一意の文字を使ってアクセス権を指定します。
定位置 ACL 形式では、ls -V の形式に似た定位置引数として、アクセス権を指定します。ハイフン (-) は、その位置のアクセス権が許可されていないことを示しますが、このハイフンは省略可能であり、指定する必要があるのは必須文字だけです。
前述の文字は、定位置表記で指定する順番に並んでいます。
これらの文字を使用して、次のような方法でアクセス権を指定できます。
user:fred:rw------R------:file_inherit:allow
または、- を削除して詰めることができます。
user:fred:rwR:file_inherit:allow
継承フラグは、次のようにコンパクトな方法で指定することもできます:
user:fred:rwR:f:allow user:fred:rwR:f------:allow
Solaris コマンドインタフェースでは、ACL の操作がサポートされます。次の Solaris ユーティリティーが両方の ACL モデルに対応します:
chmod ユーティリティーは、ACL の設定と削除を行うことができるように拡張されました。これは、ACL の操作をサポートする symbolic-mode 引数を拡張することで可能になります。詳細は、chmod(1) を参照してください。
ファイルを圧縮すると、元のファイルに関連付けられた ACL は、圧縮済みのファイルとともに保持されます。
デフォルトでは、-p オプションを指定しない限り、cp は ACL を無視します。-p を指定すると、所有者とグループ ID、アクセス権モード、変更時間とアクセス時間、ACL、および拡張属性 (該当する場合) が保持されます。
-P オプションを指定すると、ACL が保持されます。
-acl フラグを指定すると、ACL が設定されたファイルが検索されます。
デフォルトでは、ls は ACL 情報を表示しません。-v オプションを指定すると、ファイルの ACL が表示されます。
ファイルを移動すると、すべての属性が名前変更されたファイルとともに移動されます。ファイルシステムの境界の間でファイルを移動すると、ACL が複製されます。ACL 情報を複製できない場合、移動は失敗し、ソースファイルは削除されません。
ファイルをパックすると、元のファイルに関連付けられた ACL は、パック済みのファイルとともに保持されます。
rcp は、コピーをサポートするために拡張されました。リモートホストで ACL がサポートされるときのみ、ファイルの ACL が保持されます。
-p オプションを指定すると、ACL が保持されます。
ACL のあるファイルをアンパックすると、アンパック済みのファイルでは ACL 情報が保持されます。
プログラムレベルでファイルシステム ACL にアクセスするために必要なプライマリインタフェースは、acl_get() 関数と acl_set() 関数です。これらの関数は、POSIX ドラフト ACL と NFSv4 ACL の両方をサポートします。
int acl_get(const char *path, int flag, acl_t **aclp); int facl_get(int fd, int flag, acl_t **aclp);
acl_get(3SEC) および facl_get(3SEC) 関数は、パスによって名前が付けられるか、開いているファイル記述子 fd によって名前が参照されるファイルで ACL を取得します。フラグ引数は、簡易 ACL を取得すべきかどうかを指定します。フラグ引数が ACL_NO_TRIVIAL の場合、簡易ではない ACL のみが取得されます。ACL は aclp 引数で返されます。
void acl_free(acl_t *aclp)s;
acl_free() 関数は、引数 aclp; で割り当てられたメモリを解放します。
int acl_set(const char *path, acl_t *aclp); int facl_set(int fd, acl_t *aclp);
パスによって名前が付けられるか、開いているファイル記述子 fd によって名前が参照されるファイルで ACL を設定するには、acl_set(3SEC) および facl_get(3SEC) 関数が使用されます。aclp 引数は、設定する ACL を指定します。ターゲットファイルシステムで NFSv4 ACL がサポートされるとき、acl_set(3SEC) は、POSIX ドラフト ACL を NFSv4 ACL に変換します。POSIX ドラフト ACL でサポートされるファイルシステムで NFSv4 ACL を設定しようとすると、変換は実行されません。
int acl_trivial(const char *path);
acl_trivial() 関数は、ファイルに簡易 ACL があるかどうかを判定するために使用されます。ACL が簡易かどうかは、ACL のタイプに基づきます。POSIX ドラフト ACL は、MIN_ACL_ENTRIES より大きい場合は簡易ではありません。NFSv4/ZFS スタイル ACL は、owner@、group@、および everyone@ より大きいエントリを持つか、継承フラグが設定されているか、POSIX アクセス制御の要件を満たす方法で順序付けられていない場合は簡易ではありません。
int acl_strip(const char *path, uid_t uid, gid_t gid, mode_t mode);
acl_strip() 関数は、ファイルからすべての ACL を削除し、引数モードで渡される内容に基づいて簡易 ACL と置き換えます。ACL の置き換え後に、ファイルの所有者とグループは、uid および gid パラメータで指定された値に設定されます。
int acl_fromtext(const char *path, acl_t **aclp); char *acl_totext(acl_t *aclp, int flags);
acl_text() 関数は、aclp が指し示す内部 ACL 表現を外部表現に変換します。外部表現の詳細は、「説明」を参照してください。
acl_fromtext() 関数は、外部表現を内部表現に変換します。外部表現の詳細は、「説明」を参照してください。
次の例は、API を使用して ACL で基本操作を実行する方法を示しています。
例 1 ACL を取得および設定する
ACL を取得して、別のファイルで設定するには、次を使用します:
error = acl_get("file", ACL_NO_TRIVIAL, &aclp); if (error == 0 && aclp != NULL) { error = acl_set("file2", aclp) acl_free(aclp); } ...
例 2 任意の ACL を取得および設定する
簡易 ACL を含む任意の ACL を取得して、別のファイルで設定するには、次を使用します:
error = acl_get("file3", 0, &aclp); if (error == 0) { error = acl_set("file4", aclp) acl_free(aclp); } ...
例 3 ファイルに簡易 ACL があるかどうかを判定する
ファイルに簡易 ACL があるかどうかを判定するには、次を使用します:
istrivial = acl_trivial("file") if (istrivial == 0) printf("file %s has a trivial ACL\n", file); else printf("file %s has a NON-trivial ACL\n", file); ...
例 4 ファイルから ACL をすべて削除する
ファイルからすべての ACL を削除して、新しいモード、所有者、およびグループを設定するには、次を使用します:
error = acl_strip("file", 10, 100, 0644); ...
chgrp(1), chmod(1), chown(1), cp(1), cpio(1), find(1), ls(1), mv(1), tar(1), setfacl(1), chmod(2), acl(2),stat(2),acl_get(3SEC), aclsort(3SEC), acl_fromtext(3SEC), acl_free(3SEC), acl_strip(3SEC), acl_trivial(3SEC)