setfacl - アクセス制御リスト (ACL) の設定、削除および変更

形式

setfacl [–ahqv] -s entries [path ... ]
setfacl [–ahqv] -S file [path ...
setfacl [–ahqv] -D type [...] [path ... ]
setfacl [–ahqv]  -m|M|x|X EntryOrFile [...] [path ... ]

説明

setfacl は、変更の始まり正規のファイルおよびディレクトリーに対する変更の終わりアクセス制御リスト (ACL) の設定 (置き換え)、変更、または除去を行います。また、path で指定したファイルおよび ディレクトリーごとに、ACL エントリーの更新および削除も行います。path を指定しなかった場合、ファイル名およびディレクトリー名は標準入力 (stdin) から読み取られます。この場合、入力は、1 行当たり 1 つのパス名を与えなければなりません。

setfacl を出すには、 ファイル所有者であるか、スーパーユーザー権限 (UNIXPRIV クラスにある SUPERUSER.FILESYS.CHANGEPERMS への UID 0 または読み取りアクセス) を持っていることが必要です。

ファイル名の代わりに stdin ("-") を指定すると、 他のオプションのいずれにもそれを指定することはできません。 また、stdin からターゲットのパス名を読み取ることもできません。

ファイルまたはディレクトリーの ACL エントリーの最大数は、セキュリティー・プロダクトと物理ファイル・システムによって調整されます。

最初の 2 つの形式により、ACL 全体を 設定 (置き換え) することができます。3 番目の形式により、拡張 ACL 全体を 削除することができます。4 番目の形式により、ACL エントリーを 削除、追加、または変更することができます。mMx、および X オプションを 単一のコマンド行に指定することはできますが、それぞれのオプションを 指定できるのは一度だけです。

アクセス ACL を設定しているとき、ACL エントリーは、ファイル許可ビットに対応した 3 つの必須の基本 ACL エントリーで 構成される必要があります。また、ACL エントリーは、0 個以上の拡張 ACL エントリーで 構成される必要があります。そうすることにより、アクセス制御時に、より大きなレベルの細分性を得ることができます。基本エントリーの許可は、絶対形式でなければなりません。

ACL エントリーを更新しているときには、0 個以上の基本エントリーを 指定することができます。

3 つの必須の基本 ACL エントリーは、以下の形式を持っています。
u[ser]::perm
g[roup]::perm 
o[ther]::perm	
これらのエントリーは、ファイル許可ビットの所有者、グループ、およびその他のフィールドに対応します。
拡張 ACL 項目の形式は以下のとおりです。
[d[efault]: | f[default]:]u[ser]:uid:[+|^]perm
[d[efault]: | f[default]:]g[roup]:gid:[+|^]perm
ここで、
d[efault]
指定すると、拡張 ACL がディレクトリーのデフォルト ACL を参照します。
f[default]
指定すると、拡張 ACL がファイルのデフォルト ACL を参照します。
u[ser]
拡張 ACL が特定の数値ユーザー ID (UID) またはユーザー名を参照します。
g[roup]
拡張 ACL が特定の数値グループ ID (GID) またはグループ名を参照します。
uid
ユーザー名、または数値ユーザー ID (UID)。
gid
グループ名、または数値グループ ID (GID)。
perm
絶対形式 (プレースホルダーとして - が指定されたストリング rwx、または 8 進形式)、または 相対形式 (+ または ^ 修飾子を使用) のいずれかで指定されたアクセス権。

相対許可設定では、ACL エントリーにつき + または ^ の 1 つだけを使用できます。相対許可を使用するときには、少なくとも r、w または x の 1 つを 持っている必要があります。例えば、+rw または ^rwx です。

ACL 項目の先頭フィールドはオプションです。これは、処理される ACL のタイプ (アクセス、 ディレクトリーのデフォルト、またはファイルのデフォルト) を指定できます。タイプを指定しないと、アクセス ACL しか適用されません。ACL 項目を更新する場合 は、基本 ACL 項目を指定します。ただし、指定した内容が現行設定と異なる場合は、ファイルまたはディレクトリーの 許可ビットが変更されます。

現存しない ACL エントリーに対する許可を相対形式で指定しても、その許可は、あたかも絶対形式で与えられたかのように割り当てられます。許可を指定しなかった場合は、「許可なし」にデフォルト設定されます。例えば、更新するために拡張 ACL エントリーを
user:BILLYJC:+rw 
と指定しても、ユーザー・エントリー BILLYJC が現存しないと、結果のエントリーは以下のようになります。
user:BILLYJC:rw- 
同様に、存在しない拡張 ACL エントリーから許可を除去しようとすると、結果の許可は以下のようになります。
---
すなわち、許可なしです。

ACL および ACL エントリーについての追加情報については、「z/OS UNIX System Services 計画」を参照してください。

オプション

–a
以下のいずれかのエラーまたは警告が発生した場合には、setfacl 処理を打ち切ります。
  1. ファイルまたはディレクトリーの ACL を変更しようとしているときに、setfacl が stat() を実行するが、stat() は固有の理由コードを示して失敗する。
  2. ユーザーが、ディレクトリーでないパス名に対して、ファイルのデフォルト ACL またはディレクトリーのデフォルト ACL を変更しようとした。
  3. 現在のパス名に対してすべての拡張 ACL エントリーを削除しようと試みたが、失敗した。
  4. 現在のパス名に対して拡張 ACL エントリーを設定または変更しようと試みたが、失敗した。
–a を指定しないと、setfacl 処理は 継続します。
–D type
type の ACL のすべての拡張 ACL エントリーを 削除します。アクセス ACL の場合には、これを行うと、3 つの必須基本エントリーだけが 削除されずにそのまま残ります。ファイルのデフォルトまたはディレクトリーのデフォルト ACL の場合には、指定されたタイプの ACL 全体が削除されます。type を以下のいずれかに指定することができます。
a
アクセス ACL
d
ディレクトリーのデフォルト ACL
f
ファイルのデフォルト ACL
e
現行のパス名に適用できるすべての ACL タイプのためのすべての拡張 ACL
–h
シンボリック・リンクをたどらないでください。ACL はシンボリック・リンクと関連していません。したがって、シンボリック・リンクを検出しても、何も起こりません。
–m EntryOrFile
EntryOrFile で指定した ACL エントリーを変更します。EntryOrFile は、コマンド行に直接入力された ACL エントリーのストリングを表します。 EntryOrFile で指定したユーザーまたはグループの ACL エントリーが 存在しない場合には、ACL エントリーが作成されます。EntryOrFile で指定したユーザーまたはグループの ACL エントリーがすでに存在する場合には、ACL エントリーは 置き換えられます。

指定するエントリーは、それぞれの ACL タイプおよび それに関連したユーザーまたはグループの組み合わせに固有でなければなりません。

–M EntryOrFile
EntryOrFile で指定した ACL エントリーを変更します。EntryOrFile は、ACL エントリーを含むファイルを表します。EntryOrFile で指定したユーザーまたはグループの ACL エントリーが 存在しない場合には、ACL エントリーが作成されます。EntryOrFile で指定したユーザーまたはグループの ACL エントリーがすでに存在する場合には、ACL エントリーは 置き換えられます。EntryOrFile である場合、エントリーは stdin から読み取られます。

指定するエントリーは、それぞれの ACL タイプおよび それに関連したユーザーまたはグループの組み合わせに固有でなければなりません。

–q
抑制モードです。setfacl は、以下の条件の場合、すべての警告とエラー・メッセージを抑制します。
  • ファイルまたはディレクトリーの ACL を変更しようとしているときに、setfacl が stat() を実行するが、stat() は固有の理由コードを示して失敗する。
  • ユーザーが、ディレクトリーでないパス名に対して、ファイルのデフォルト ACL またはディレクトリーのデフォルト ACL を変更しようとした。
  • 変更の始まりユーザーが、正規ではないファイルまたはディレクトリーで setfacl を使おうとした。変更の終わり
警告またはエラーを発生させた条件は、戻りコードには影響を与えません。
–s entries
すべての ACL をエントリー 付きで 設定 (置き換え) します。
–S file
すべての ACL を file で指定したエントリー付きで 設定 (置き換え) します。file である場合、エントリーは stdin から読み取られます。
–v
詳細
–x EntryOrFile
EntryOrFile で指定した拡張 ACL エントリーを削除します。EntryOrFile は、コマンド行に直接入力された ACL エントリーのストリングです。 指定したユーザーまたはグループの ACL エントリーが 存在しない場合には、エラーになりません。許可フィールドが EntryOrFile で 指定されていると、このオプションの処理時に、許可フィールドは 無視されます。ユーザーは、基本 ACL エントリー (ファイル所有者、所有権を持ったグループ、その他) を削除することはできません。基本 ACL エントリーを このオプションで指定していると、基本 ACL エントリーは無視されます。拡張 ACL エントリーの削除は、エントリーからのすべての許可の除去と必ずしも同じ結果をもたらすわけではありません。
–X EntryOrFile
EntryOrFile で指定した拡張 ACL エントリーを削除します。EntryOrFile は、ACL エントリーを含むファイルです。指定したユーザーまたはグループの ACL エントリーが 存在しない場合には、エラーになりません。EntryOrFile である場合、エントリーは stdin から読み取られます。許可フィールドが EntryOrFile で 指定されていると、このオプションの処理時に、許可フィールドは 無視されます。ユーザーは、基本 ACL エントリー (ファイル所有者、所有権を持ったグループ、その他) を削除することはできません。基本 ACL エントリーを このオプションで指定していると、基本 ACL エントリーは無視されます。拡張 ACL エントリーの削除は、エントリーからのすべての許可の除去と必ずしも同じ結果をもたらすわけではありません。

  1. ファイル foo の現行アクセス ACL を設定 (置き換え) し、読み取りアクセスと実行アクセスをユーザー Billy にだけ与えるには、以下のようにします。
    setfacl -s user::rwx,group::---,other::---,user:billy:r-x foo

    上記の場合、ファイル許可ビットを変更することがあります。

  2. ファイル foo の現行アクセス ACL を変更して、グループ cartoons の拡張 ACL エントリーを含め、このグループに 読み取りアクセスを与えるには、以下のようにします。
    setfacl -m group:cartoons:+r foo
  3. ディレクトリー Haunted の現行アクセス ACL および ディレクトリーのデフォルト ACL を設定 (置き換え) し、ユーザー user1 および user2 に読み取りおよび検索許可を与え、グループ thegang に読み取り許可を与えるには、以下のようにします。
    setfacl -s "u::rwx,g::---,o::---, ¥
         user:user1:r-x,group:thegang:r--,user:user2:r-x, ¥
         d:user:user1:r-x,d:group:thegang:r--,d:user:user2:r-x" Haunted 
  4. ファイル foo から ACL をコピーして、ファイル bar に同じ ACL を設定するには、以下のようにします。
    getfacl foo | setfacl -S - bar
  5. 現行ディレクトリーにあるすべてのファイルおよびディレクトリーについて、ユーザー user3 の拡張 ACL エントリーのすべてを 削除するには、以下のようにします。
    setfacl -x user:user3,d:user:user3,f:user:user3 *
  6. 現行作業ディレクトリーにあるすべてのファイルおよびディレクトリーについて、拡張 ACL エントリーのすべてを削除するには、以下のようにします。
    setfacl -D e *
  7. ディレクトリーのアクセス ACL を変更して、Haunted ディレクトリーにある すべてのファイルについて、読み取り、書き込みおよび実行アクセスを user1 に 与えるには、以下のようにします。
    setfacl -m user:user1:rwx Haunted
  8. RACF® では、ACL の設定をディレクトリー内のそれぞれのファイルに設定するのではなく、ディレクトリーに設定することをお勧めします。ディレクトリー Haunted にあるファイルだけに 関連した user1 の拡張 ACL エントリーの すべてを検索および削除するには、以下のようにします。
    setfacl -x user:user1 $(find Haunted -type f -acl_user user1)

    setfacl コマンドにより user1setfacl から アクセスを正常に除去していても、user1 に ディレクトリー Haunted の検索許可が与えられている場合、このユーザーは、ファイル許可ビットに基づいて、Haunted にある ファイルへのアクセスを入手することができます。

ローカライズ

setfacl は、以下のローカライズ環境変数を使用します。
  • LANG
  • LC_ALL
  • LC_CTYPE
  • LC_SYNTAX
  • NLSPATH

詳しくは、ローカライズを参照してください。

使用上の注意

  1. setfacl を使用して ACL エントリーの追加、変更、および削除を行うとき、すべての削除操作が最初に 実行されます。すなわち、削除操作は、すべての変更または 追加操作の前に処理されます。
  2. setfacl はアトミック操作と見なすことはできません。 これは、複数の操作が要求されてエラーが起こった場合、エラーが起こる前に操作の一部が処理されている場合があるからです。 -s オプションは、複数操作の要求と見なされることに注意してください。
  3. 変更の始まりsetfacl でサポートされるのは、ディレクトリーと正規のファイルのみです。変更の終わり

終了値

0
成功。
1
以下のいずれかによる失敗。
  • コマンド行オプションが正しくない
  • コマンド行の引数が少なすぎる
  • stdin からの読み取りが複数の場所で試行された
  • 一緒に指定できない setfacl 操作の組み合わせが試行された
2
以下のいずれかによる失敗。
  • 指定されたパス名が存在しない
  • エントリー・ファイルの読み取りを試行中にエラーが起きた
  • ディレクトリーでないパス名に対して、ファイルのデフォルト ACL またはディレクトリーのデフォルト ACL の変更が試行された
  • 変更の始まり指定されたパスは正規のファイルでもディレクトリーでもありませんでした。変更の終わり
3
以下のいずれかによる失敗。
  • パス名からすべての拡張 ACL エントリーを削除できない
  • パス名の ACL エントリーを設定または変更できない
  • ACL エントリーの不適切な構文
  • 正しくない ACL が指定された
  • 十分なメモリーを割り当てられない
  • PATH_MAX を判別できない
  • 読み取り用にエントリー・ファイルを開くことができない
  • エントリー・ファイルが空である

移植性

setfacl について、承認されている POSIX 標準はありません。

関連情報

chmodfindgetfacllsfiletestpaxtest