アクセス制御リスト

提供: ArchWiki
ナビゲーションに移動 検索に移動

アクセス制御リスト (Access control list; ACL) はファイルシステムにより柔軟性のあるパーミッション機構を追加します。ACL は UNIX のファイルパーティションを補助するように設計されています。ACL を使うことで、任意のユーザやグループに任意のディスクリソースへのパーミッションを与えることができます。

インストール

acl パッケージは systemd の依存パッケージであるため、すでにインストールされているはずです。

ACL の有効化

ACL を有効化するには、ファイルシステムを acl オプションでマウントする必要があります。fstab を使えばオプションを永続化させることができます。

ファイルシステムのデフォルトマウントオプションによっては acl オプションが既に有効になっているかもしれません。Btrfs と Ext2/3/4 ファイルシステムでは、すでに有効になっています。以下のコマンドを使うことで、ext2/3/4 でフォーマットされたパーティションのオプションを確認できます:

# tune2fs -l /dev/sdXY | grep "Default mount options:"
Default mount options:    user_xattr acl

また、デフォルトのマウントオプションがオーバーライドされていないことも確認してください。/proc/mounts の関連する行に noacl とある場合、ACL が無効化されています。

ファイルシステムのデフォルトマウントオプションは、コマンド tune2fs -o オプション パーティション で設定できます。例えば:

# tune2fs -o acl /dev/sdXY

外部ドライブの場合、/etc/fstab のエントリではなくデフォルトのマウントオプションを使うと非常に便利です。なぜなら、そのようなパーティションは他の Linux マヒンでも acl オプションでマウントされるからです。すべてのマシンで /etc/fstab を編集する必要は無くなります。

ノート:
  • ext2/3/4 ファイルシステムの作成時に acl はデフォルトのマウントオプションとして指定されます。この設定は /etc/mke2fs.conf から変えられます。
  • デフォルトのマウントオプションは /proc/mounts には記載されません。

使用法

ACL の設定

setfacl コマンドで ACL を変更できます。

ヒント:
  • --test フラグを追加すれば、パーミッションを変更せずに (つまり、ドライラン) ファイル/ディレクトリのパーミッションの変更を一覧表示できます。
  • すべてのファイルやディレクトリに再帰的に操作を適用するには、-R/--recursive を引数に追加してください。

ユーザに対するパーミッションを設定する (user はユーザ名あるいはユーザ ID):

# setfacl -m "u:user:permissions" <file/dir>

グループに対するパーミッションを設定する (group はグループ名あるいはグループ ID):

# setfacl -m "g:group:permissions" <file/dir>

その他に対するパーミッションを設定する:

# setfacl -m "other:permissions" <file/dir>

すべての新しく作成されるファイルやディレクトリが親ディレクトリのエントリを継承するようにする (これは、そのディレクトリにコピーされるファイルには影響しません):

# setfacl -dm "entry" <dir>

特定のエントリを削除する:

# setfacl -x "entry" <file/dir>

デフォルトのエントリを削除する:

# setfacl -k <file/dir>

すべてのエントリを削除する (所有者、グループ、そしてその他のユーザのエントリは保持されます):

# setfacl -b <file/dir>
この記事またはセクションの正確性には問題があります。
理由: --mask オプションに関する以前のノート (setfacl(1) から引用されたもの) は不正確であると判断されました。しかし、以下の新しいノートも正しくないようです。詳細は、この問題に関する 英語版の議論ページ を参照してください。 (議論: トーク:アクセス制御リスト#)
ノート: setfacl のデフォルトの挙動では、--mask エントリが明示的に与えられない限り、ACL マスクエントリが再計算されます。マスクエントリは、ユーザ (所有者以外) とグループに対して許可される最大のパーミッションを示します。明示的に設定されていない限り、これはデフォルトグループのパーミッションと一致します。これが何を意味するかを明確にするために、あるディレクトリを所有するグループが r-x パーミッションを持つと仮定しましょう。rwx パーミッションを持つ ACL ユーザやグループを追加すると、このユーザあるいはグループの実効 (effective) パーミッションは r-x となります。その理由は、ACL をサポートしないシステムから来たファイルが、ACL をサポートするシステム上で利用可能になったとしても、問題が生じないようにするためです。

ACL の表示

パーミッションを表示するには、以下を実行してください:

# getfacl <file/dir>

サンプル

abc という名前のファイルに対するユーザ johnny のパーミッションを設定:

# setfacl -m "u:johnny:rwx" abc

パーミッションを確認:

# getfacl abc
# file: abc
# owner: someone
# group: someone
user::rw-
user:johnny:rwx
group::r--
mask::rwx
other::r--

ユーザ johnny のパーミッションを変更:

# setfacl -m "u:johnny:r-x" abc

パーミッションを確認:

# getfacl abc
# file: abc
# owner: someone
# group: someone
user::rw-
user:johnny:r-x
group::r--
mask::r-x
other::r--

すべての ACL エントリを削除:

# setfacl -b abc

パーミッションを確認:

# getfacl abc
# file: abc
# owner: someone
# group: someone
user::rw-
group::r--
other::r--

ls コマンドの出力

特定のファイルに ACL が存在するかどうかは ls -l の出力で Unix のパーミッションの後に + (プラス記号) があるかどうかで見分けられます。

$ ls -l /dev/audio
crw-rw----+ 1 root audio 14, 4 nov.   9 12:49 /dev/audio
$ getfacl /dev/audio
getfacl: Removing leading '/' from absolute path names
# file: dev/audio
# owner: root
# group: audio
user::rw-
user:solstice:rw-
group::rw-
mask::rw-
other::---

プライベートなファイルに実行権限を付与する

ウェブサーバーなどのプロセスに、ユーザのホームディレクトリにあるファイルへのアクセス権を与える方法を以下で説明します (システム全体に対してアクセス権を与えてセキュリティを犠牲にしたりはしません)。

このセクションでは、ウェブサーバは http ユーザとして実行していて、geoffrey のホームディレクトリ /home/geoffrey へのアクセスを与えたいと仮定します。

まず、http ユーザに実行権限を与えます:

# setfacl -m "u:http:--x" /home/geoffrey
ノート: ディレクトリに対する実行権限は、プロセスがディレクトリのコンテンツを確認できるようにするために必要です。

これで http ユーザが /home/geoffrey 内のファイルにアクセスできるようになったので、other にアクセス権は必要ありません:

# chmod o-rx /home/geoffrey

getfacl を使って変更を確認してください:

$ getfacl /home/geoffrey
getfacl: Removing leading '/' from absolute path names
# file: home/geoffrey
# owner: geoffrey
# group: geoffrey
user::rwx
user:http:--x
group::r-x
mask::r-x
other::---

上記の出力で、other は如何なるパーミッションも持っていませんが、http ユーザは依然として (ホームディレクトリ下の) ファイルにアクセスできることが分かります。ゆえに、セキュリティが向上したはずです。

特定のディレクトリやファイルへの書き込みアクセス権を http ユーザに与えたい場合は、以下を実行してください:

# setfacl -dm "u:http:rwx" /home/geoffrey/project1/cache

参照

翻訳ステータス: このページは en:Access Control Lists の翻訳バージョンです。最後の翻訳日は 2023-05-10 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。