ここでは,アクセス制御リスト (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 が使用可能かどうかは,システム管理者に確認してください。
アクセス制御リストは,それぞれが以下の 3 つのフィールドを含む多数の ACL エントリから構成されます。
エントリ・タイプを識別するキーワード
グループ ID,ユーザ ID または名前を含む修飾子フィールド
許可指定
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 エントリにリストされたユーザおよびグループを除いたすべてのユーザとすべてのグループに対し,読み取りを許可する。 |
プロセスがファイルまたはディレクトリへのアクセスを要求すると,以下の手順で,アクセス ACL がチェックされます。
プロセスにスーパユーザ特権がある場合,ファイルやディレクトリへのアクセスが許可されます。 アクセス ACL と許可ビットはチェックされません。
ACL が無効になっている場合,または ACL は有効になっているがファイルやディレクトリに対応するアクセス ACL がない場合,従来の UNIX 許可ビットでチェックされます。
ファイルやディレクトリのアクセス ACL は,以下のようにチェックされます。
プロセスがオブジェクトの所有者である場合,所有ユーザ
user::
エントリの許可が与えられます。
他の ACL エントリはチェックされません。
これは,user
許可ビットを使用するのと同じです。
プロセスの UID が
user:
エントリにリストされた UID に一致するか,または
user:
エントリにリストされたユーザ名に帰着する場合,そのエントリの許可が与えられます。
他の残りの ACL エントリはチェックされません。
プロセスの GID がファイルの GID に一致する場合,またはプロセスの補助グループのいずれかがファイルの GID に一致する場合,
プロセスは,group:
エントリの許可と次の項目で説明しているような一致するすべての
group:
エントリの許可の論理和が与えられます。
プロセスの GID がいずれかの
group:
エントリの GID に一致するか,またはいずれかの
group:
エントリにリストされたグループ名に帰着する場合,またはプロセスのいずれかの補助グループの GID またはグループ名が ACL のいずれかの
group:
エントリに一致する場合,一致するすべてのグループ・エントリの許可の論理和が与えられます。
たとえば,グループ
sales
およびグループ
eng
に属するユーザがいるとき,ファイルのアクセス ACL がグループ
sales
に読み取りアクセスを与え,グループ
eng
に書き込みアクセスを与える場合,そのユーザにはファイルへの読み取りおよび書き込みアクセスが与えられます。
other:
エントリの許可が与えられます。
これは,other
許可ビットを使用するのと同じです。
注意
従来の UNIX 許可ビットを持つファイルやディレクトリと,3 つの必須エントリ (
user::
,group::
,およびother::
) だけを含むアクセス ACL を持つファイルやディレクトリは見分けがつきません。
ファイルやディレクトリが作成される際には,親ディレクトリから ACL が継承されます。 デフォルト ACL は,親ディレクトリ内に作成されるファイルおよびサブディレクトリにどのような ACL が継承されるかを,次のように決定します。
親ディレクトリにデフォルト ACL がない場合
そのディレクトリ内に作成される新しいファイルの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | なし |
そのディレクトリ内に作成される新しいサブディレクトリの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | なし |
デフォルト・アクセス ACL | なし |
デフォルト・ディレクトリ ACL | なし |
許可ビットは,従来の UNIX 許可ビットの場合と同様に設定されます。
親ディレクトリにデフォルト・アクセス ACL はあるが,デフォルト・ディレクトリ ACL がない場合
そのディレクトリ内に作成される新しいファイルの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | 親のデフォルト・アクセス ACL |
そのディレクトリ内に作成される新しいサブディレクトリの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | 親のデフォルト・アクセス ACL |
デフォルト・アクセス ACL | 親のデフォルト・アクセス ACL |
デフォルト・ディレクトリ ACL | なし |
親ディレクトリにデフォルト・アクセス ACL はないが,デフォルト・ディレクトリ ACL がある場合
そのディレクトリ内に作成される新しいファイルの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | なし |
そのディレクトリ内に作成される新しいサブディレクトリの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | 親のデフォルト・ディレクトリ ACL |
デフォルト・アクセス ACL | なし |
デフォルト・ディレクトリ ACL | 親のデフォルト・ディレクトリ ACL |
親ディレクトリにデフォルト・アクセス ACL とデフォルト・ディレクトリ ACL の両方がある場合
そのディレクトリ内に作成される新しいファイルの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | 親のデフォルト・アクセス ACL |
そのディレクトリ内に作成される新しいサブディレクトリの ACL は,次のように設定されます。
ACL タイプ | ステータス |
アクセス ACL | 親のデフォルト・ディレクトリ ACL |
デフォルト・アクセス ACL | 親のデフォルト・アクセス ACL |
デフォルト・ディレクトリ ACL | 親のデフォルト・ディレクトリ ACL |
ディレクトリにデフォルト ACL を設定しても,そのディレクトリ内の既存のファイルやサブディレクトリの ACL は変更されません。
G.3.1 ACL 継承の例
ACL 継承の例をいくつか以下に示します。
ディレクトリ
foo
にデフォルト ACL がないときに,次のコマンドを実行して,foo
にデフォルト・アクセス ACL を設定したとします。
% setacl -d -u user::rw-,group::r--,other::r--,user:jdoe:rw-\ foo
ディレクトリ
foo
内に作成されるすべてのファイルやディレクトリは,アクセス ACL として次の ACL を継承します。
# # file: foo # owner: smith # group: system # user::rw- user:jdoe:rw- group::r-- other::r--
ディレクトリ
foo
にデフォルト ACL がないときに,次のコマンドを実行して
foo
にデフォルト・ディレクトリ ACL を設定したとします。
% setacl -D -u user::rw-,group::r--,other::r--,\ user:jdoe:rwx foo
ディレクトリ
foo
内に作成されるすべてのディレクトリは,アクセス ACL として次の ACL を継承します。
デフォルト・ディレクトリ ACL も同様です。
# # file: foo # owner: smith # group: system # user::rwx user:jdoe:rwx group::r-- other::r--
ディレクトリ
foo
にデフォルト ACL がないときに,次のコマンドを実行して
foo
にデフォルト・アクセス ACL とデフォルト・ディレクトリ ACL を設定したとします。
% setacl -D -u user::rw-,group::r--,other::r--,\ user:jdoe:rw- foo % setacl -d -u user::rw-,group::r--,other::r--,\ user:wilson:rwx foo
ディレクトリ
foo
内に作成されるすべてのディレクトリは,デフォルト・ディレクトリ ACL とアクセス ACL として次の ACL を継承します。
# # file: foo # owner: smith # group: system # user::rw- user:jdoe:rw- group::r-- other::r--
次の ACL は,デフォルト・アクセス ACL として継承されます。
# # file: foo # owner: smith # group: system # user::rw- user:wilson:rwx group::r-- other::r--
ディレクトリ
foo
内に作成されるすべてのファイルは,アクセス ACL として次の ACL を継承します。
# # file: foo # owner: smith # group: system # user::rw- user:wilson:rwx group::r-- other::r--
以下のコマンドを使用して,ACL の表示や変更を行います。
dxsetacl
ファイルおよびディレクトリの ACL を一覧表示して変更するグラフィック・インタフェース。
setacl
ファイルおよびディレクトリの ACL を変更する。
getacl
ファイルおよびディレクトリの ACL をリストする。
注意
ACL の作成,変更,削除には,ファイルあるいはディレクトリの所有者アクセス許可 (あるいはスーパユーザ特権) が必要になります。 つまり,
ls -l
でファイル情報を表示した場合に,3 つ目のフィールドにあなたのユーザ名が表示されなければなりません。 スーパユーザ特権についての詳細は 5.7 節 を参照してください。
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 を復元しなければなりません。 また,この手順では,ファイルからハード・リンクが削除されます。 この方法でファイルを修正する一般的なコマンドには,以下のものがあります。
gzip
compress
emacs
この問題を回避するには,元のファイルを一時ファイルへコピーし,一時ファイルに対して処理を行ってから,-p
オプションを指定しないで
cp
を実行して,コピー・バックします。
この手順では元の ACL を維持できます。
ACL のあるファイルをコピーするときには,必ず
cp -p
コマンドを使用します。
このコマンドでは,ACL と他の拡張属性 (プロパティ・リスト) が適切にコピーされます。
G.5.1 pax および tar コマンド
pax
および
tar
では,特に指定しない限り,アーカイブ作成時に,ファイルおよびディレクトリにある ACL および他の拡張属性がアーカイブされます。
ただし,pax
や
tar
ユーティリティを使用してアーカイブからファイルおよびディレクトリを抽出するときには,アーカイブされたファイルおよびディレクトリの ACL は,デフォルトではアーカイブから抽出されません。
格納先ディレクトリにデフォルト ACL が定義されている場合,アーカイブから抽出したファイルおよびディレクトリは,G.3 節
で説明されているようにデフォルト ACL を継承します。
アーカイブから ACL 情報およびプロパティ・リスト情報を復元するには,アーカイブからファイルおよびディレクトリを抽出する際に,tar
には
-p
オプションを指定し,pax
には
-p p
または
-p e
オプションを指定します。
pax
および
tar
ユーティリティでは,ACL のユーザ情報およびグループ情報は UID および GID として保存されます。
つまり,tar -p
,pax -p p
または
pax -p e
コマンドを使用して,システム上にアーカイブを復元し,そのシステムがアーカイブ元のシステムとユーザ情報およびグループ情報を共有していない場合,意図していないファイル・アクセスを許可することになる場合があります。
現時点では,ACL および拡張属性 (プロパティ・リスト) についての正式な業界標準はありません。
このため,プロパティ・リストおよび ACL をサポートする
pax
および
tar
の拡張機能は,Tru64 UNIX 独自の機能です。
他のベンダの
pax
および
tar
では,Tru64 UNIX 独自の拡張機能は無視されます。
ただし,他のベンダのシステムとの相互運用性を確保するためには,マルチベンダ配布用にアーカイブを行うときには
-V
オプションを指定して,ACL および他の拡張属性がアーカイブされないようにします。