G    アクセス制御リスト (ACL)

ここでは,アクセス制御リスト (ACL) を使用して,特定のユーザおよびユーザのグループに対してファイルおよびディレクトリ・アクセス許可を設定する方法について説明します。

ACL は,ファイルおよびディレクトリに関する Tru64 UNIX のアクセス許可を拡張するものです。 ACL を使用して,特定のユーザおよびグループにファイルおよびディレクトリに関するアクセス許可を設定することができます。 ファイルやディレクトリに設定されている通常のアクセス許可に加え,ACL は各ユーザあるいはグループに対する特別なアクセス許可を設定します。

ファイルには,ACL が 1 つだけ対応付けられます。 ディレクトリには,アクセス ACL,デフォルト・アクセス ACL,デフォルト・ディレクトリ ACL の 3 つの ACL を対応付けることができます。 アクセス ACL は,誰がそのファイルあるいはディレクトリに対してアクセスできるかを決定します。 デフォルト・アクセス ACL は,デフォルト・アクセス ACL を持つディレクトリでファイルあるいはディレクトリを作成した場合にどの ACL を継承するかを決定します。

ACL はいつでも設定できますが,ACL のアクセス・チェックと ACL の継承は ACL が有効になっている場合のみ行われます。 システムで ACL が無効になっている場合は,ACL コマンドを実行すると警告メッセージが表示される。 ACL はすべてのファイル・システムでサポートされるわけではありません。 ACL は,ACL をサポートするファイル・システム上のファイルあるいはディレクトリに対してのみ設定できます。

注意

ACL を作成するためには,システムで ACL サポートが有効になっている必要があります。使用しているシステムおよびファイル・システムで ACL が使用可能かどうかは,システム管理者に確認してください。

G.1    ACL の構造

アクセス制御リストは,それぞれが以下の 3 つのフィールドを含む多数の ACL エントリから構成されます。

ACL の外部 (出力可能) 表現は,カンマ (,) または改行で区切られたエントリからなります。 ACL エントリ内のフィールドはコロン (:) で区切られます。 次の例は,典型的な ACL エントリです。

user::rwx
user:juanita:r-w
user:sam:r-x
group::rwx
other::---
 

ACL エントリのキーワードと修飾子は以下のように定義されます。

user::

修飾子フィールドが空の user エントリは,ファイルを所有するユーザのアクセス許可を定義します。 このエントリ (所有ユーザ・エントリと呼ぶ) は,常に user 許可ビットと同じです。 ACL には,user:: エントリが 1 つだけ含まれていなければなりません。

user:

修飾子フィールドが空でない user エントリは,修飾子フィールドで指定されたユーザのアクセス許可を定義します。 修飾子フィールドには,ユーザ名と UID のどちらかが含まれていなければなりません。 ACL には 0 個以上の user: エントリを含めることができます。

group::

修飾子フィールドが空の group エントリは,ファイルを所有するグループのメンバのアクセス許可を定義します。 このエントリ (所有グループ・エントリと呼ぶ) は,常にグループ許可ビットと同じです。 ACL には,group:: エントリが 1 つだけ含まれていなければなりません。

group:

修飾子フィールドが空でない group エントリは,修飾子フィールドで指定されたグループのメンバのアクセス許可を定義します。 修飾子フィールドには,グループ名と GID のどちらかが含まれていなければなりません。 ACL には,0 個以上の group: エントリを含めることができます。

other::

other エントリは,修飾子が空の場合にのみ有効です。 このエントリは,ACL の他のエントリのどれとも一致しないユーザすべてのアクセス許可を定義します。 このエントリは,常に other 許可ビットと同じです。 ACL には,other:: エントリが 1 つだけ含まれていなければなりません。

許可フィールドの文字列は,ls コマンドが従来の許可ビットに対して表示する文字列と同じで,順序も同じです。 r は読み取りアクセス,w は書き込みアクセス,そして x は実行または検索アクセスを示します。 これらの文字の代わりにハイフン (-) 文字が使用されるているときには,そのアクセスの拒否を示します。

ACL のユーザ,グループ,その他のエントリは,ファイルやディレクトリの従来の許可ビットに対応しています。 ACL が有効で,chmod コマンドを使用してファイルやディレクトリの従来の許可ビットを変更した場合,chmod は所有ユーザ・エントリ,所有グループ・エントリ,および other エントリ用のアクセス ACL を適切に変更します。

表 G-1 では,典型的な ACL エントリを示して説明します。

表 G-1:  ACL エントリの例

エントリ 照合基準
group:acct:r-- acct グループのすべてのユーザに対し,読み取りを許可する。
user:joe:rw- ユーザ joe に対し,読み取りと書き込みを許可する。
user::rwx ファイルの作成後に所有者が変更されていないかどうかには関係なく,オブジェクトの所有者に対し,読み取り,書き込み,および実行を許可する。
group::r-- ファイルの作成後に所有グループが変更されていないかどうかには関係なく,オブジェクトの所有グループに対し,読み取りを許可する。
other::r-- 所有ユーザおよび所有グループ,ACL エントリにリストされたユーザおよびグループを除いたすべてのユーザとすべてのグループに対し,読み取りを許可する。

G.2    アクセス決定のプロセス

プロセスがファイルまたはディレクトリへのアクセスを要求すると,以下の手順で,アクセス ACL がチェックされます。

  1. プロセスにスーパユーザ特権がある場合,ファイルやディレクトリへのアクセスが許可されます。 アクセス ACL と許可ビットはチェックされません。

  2. ACL が無効になっている場合,または ACL は有効になっているがファイルやディレクトリに対応するアクセス ACL がない場合,従来の UNIX 許可ビットでチェックされます。

  3. ファイルやディレクトリのアクセス ACL は,以下のようにチェックされます。

    1. プロセスがオブジェクトの所有者である場合,所有ユーザ user:: エントリの許可が与えられます。 他の ACL エントリはチェックされません。 これは,user 許可ビットを使用するのと同じです。

    2. プロセスの UID が user: エントリにリストされた UID に一致するか,または user: エントリにリストされたユーザ名に帰着する場合,そのエントリの許可が与えられます。 他の残りの ACL エントリはチェックされません。

    3. プロセスの GID がファイルの GID に一致する場合,またはプロセスの補助グループのいずれかがファイルの GID に一致する場合, プロセスは,group: エントリの許可と次の項目で説明しているような一致するすべての group: エントリの許可の論理和が与えられます。

    4. プロセスの GID がいずれかの group: エントリの GID に一致するか,またはいずれかの group: エントリにリストされたグループ名に帰着する場合,またはプロセスのいずれかの補助グループの GID またはグループ名が ACL のいずれかの group: エントリに一致する場合,一致するすべてのグループ・エントリの許可の論理和が与えられます。 たとえば,グループ sales およびグループ eng に属するユーザがいるとき,ファイルのアクセス ACL がグループ sales に読み取りアクセスを与え,グループ eng に書き込みアクセスを与える場合,そのユーザにはファイルへの読み取りおよび書き込みアクセスが与えられます。

    5. other: エントリの許可が与えられます。 これは,other 許可ビットを使用するのと同じです。

注意

従来の UNIX 許可ビットを持つファイルやディレクトリと,3 つの必須エントリ (user::group::,および other::) だけを含むアクセス ACL を持つファイルやディレクトリは見分けがつきません。

G.3    ACL の継承

ファイルやディレクトリが作成される際には,親ディレクトリから ACL が継承されます。 デフォルト ACL は,親ディレクトリ内に作成されるファイルおよびサブディレクトリにどのような ACL が継承されるかを,次のように決定します。

ディレクトリにデフォルト ACL を設定しても,そのディレクトリ内の既存のファイルやサブディレクトリの ACL は変更されません。

G.3.1    ACL 継承の例

ACL 継承の例をいくつか以下に示します。

G.4    ACL の管理

以下のコマンドを使用して,ACL の表示や変更を行います。

dxsetacl

ファイルおよびディレクトリの ACL を一覧表示して変更するグラフィック・インタフェース。

setacl

ファイルおよびディレクトリの ACL を変更する。

getacl

ファイルおよびディレクトリの ACL をリストする。

注意

ACL の作成,変更,削除には,ファイルあるいはディレクトリの所有者アクセス許可 (あるいはスーパユーザ特権) が必要になります。 つまり,ls -l でファイル情報を表示した場合に,3 つ目のフィールドにあなたのユーザ名が表示されなければなりません。 スーパユーザ特権についての詳細は 5.7 節 を参照してください。

G.4.1    dxsetacl インタフェースの使用

ACL の表示は,dxsetacl の GUI または getacl コマンドを使用して行います。 dxsetacl インタフェースは,アプリケーション・マネージャからアクセスできる CDE デスクトップ・アプリケーション内に含まれています。 またはコマンド行から次のように入力して起動することもできます。

% /usr/bin/X11/dxsetacl &
 

詳細は, dxsetacl(1) および dxsetacl のオンライン・ヘルプを参照してください。

G.4.2    getacl コマンドの使用

ファイルあるいはディレクトリの ACL を表示には getacl コマンドを使用します。 例 G-1では,getacl file.txt コマンドで file.txt ファイルの ACL を表示しています。

例 G-1:  ファイルの ACL の表示

$ getacl file.txt
#
# file: file.txt
# owner: peter
# group: system
#
user::rw-
user:jdoe:rw-
group::r--
other::r--

getacl コマンドでファイルあるいはディレクトリのアクセス ACL を表示する場合,ファイルあるいはディレクトリにアクセス ACL が設定されていないと,Tru64 UNIX アクセス許可が ACL フォーマットで表示されます。

詳細は getacl(1) を参照してください。

G.4.3    setacl コマンドの使用

ファイルあるいはディレクトリの ACL の作成,変更,削除には,setacl コマンドを使用します。 例 G-2 では,getacl file.txt コマンドで file.txt ファイルの ACL を表示しています。 setacl コマンドは ACL を更新しています。

例 G-2:  ファイルの ACL の設定

$ getacl file.txt
#
# file: file.txt
# owner: peter
# group: system
#
user::rw-
user:jdoe:rw-
group::r--
other::r--
$ setacl -u group::rw-,user:evan:rw- file.txt 
$ getacl file.txt
#
# file: file.txt
# owner: peter
# group: system
#
user::rw-
user:jdoe:rw-
user:evan:rw-
group::rw-
other::r--
 
 

所有グループ・エントリが変更され,書き込み許可が含まれています。 ユーザ evan のエントリは既存のエントリと一致せず,読み書き許可が追加されています。その他のエントリは変更ありません。

詳細については setacl(1) を参照してください。

G.5    コマンド,ユーティリティ,およびアプリケーションと ACL の相互作用

ACL は,POSIX P1003.6 ドラフト 13 に基づく,POSIX および System V 互換の UNIX 拡張です。 すべての既存のコマンド,ユーティリティ,およびアプリケーションが ACL を適切に使用または伝達しているわけではありません。 特に HP 以外から提供されたアプリケーションや POSIX 互換でないアプリケーションでは注意が必要です。 コマンド,ユーティリティ,またはアプリケーションを使用して,ACL が設定されているファイル・システム・オブジェクト (ファイルまたはディレクトリ) をアクセスまたは処理する場合は,処理の完了後に,ACL が削除も変更もされていないことを確認しなければなりません。

ファイルを修正する多くのプログラムは,以下の手順で処理します。

修正しているファイルに ACL があり,ファイルの一時的バージョンの作成時に,プログラムが ACL を複製しない場合,上記の手順ではファイルの ACL が削除されるか,または親ディレクトリのデフォルト・アクセス ACL (もしある場合) で ACL が置き換えられます。 ACL のあるファイルに対してそのようなプログラムを使用した場合,後で ACL を復元しなければなりません。 また,この手順では,ファイルからハード・リンクが削除されます。 この方法でファイルを修正する一般的なコマンドには,以下のものがあります。

この問題を回避するには,元のファイルを一時ファイルへコピーし,一時ファイルに対して処理を行ってから,-p オプションを指定しないで cp を実行して,コピー・バックします。 この手順では元の ACL を維持できます。

ACL のあるファイルをコピーするときには,必ず cp -p コマンドを使用します。 このコマンドでは,ACL と他の拡張属性 (プロパティ・リスト) が適切にコピーされます。

G.5.1    pax および tar コマンド

pax および tar では,特に指定しない限り,アーカイブ作成時に,ファイルおよびディレクトリにある ACL および他の拡張属性がアーカイブされます。 ただし,paxtar ユーティリティを使用してアーカイブからファイルおよびディレクトリを抽出するときには,アーカイブされたファイルおよびディレクトリの ACL は,デフォルトではアーカイブから抽出されません。 格納先ディレクトリにデフォルト ACL が定義されている場合,アーカイブから抽出したファイルおよびディレクトリは,G.3 節 で説明されているようにデフォルト ACL を継承します。

アーカイブから ACL 情報およびプロパティ・リスト情報を復元するには,アーカイブからファイルおよびディレクトリを抽出する際に,tar には -p オプションを指定し,pax には -p p または -p e オプションを指定します。 pax および tar ユーティリティでは,ACL のユーザ情報およびグループ情報は UID および GID として保存されます。 つまり,tar -ppax -p p または pax -p e コマンドを使用して,システム上にアーカイブを復元し,そのシステムがアーカイブ元のシステムとユーザ情報およびグループ情報を共有していない場合,意図していないファイル・アクセスを許可することになる場合があります。

現時点では,ACL および拡張属性 (プロパティ・リスト) についての正式な業界標準はありません。 このため,プロパティ・リストおよび ACL をサポートする pax および tar の拡張機能は,Tru64 UNIX 独自の機能です。 他のベンダの pax および tar では,Tru64 UNIX 独自の拡張機能は無視されます。 ただし,他のベンダのシステムとの相互運用性を確保するためには,マルチベンダ配布用にアーカイブを行うときには -V オプションを指定して,ACL および他の拡張属性がアーカイブされないようにします。