アクセス制御リスト
アクセス制御リスト (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 エントリが明示的に与えられない限り、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
参照
- getfacl(1)
- setfacl(1)
- POSIX Access Control Lists on Linux
- How to set default file permissions for all folders/files in a directory?