アクセス制御リスト
アクセス制御リスト (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
を編集する必要は無くなります。
使用法
ACL の設定
setfacl コマンドで ACL を変更できます。
ユーザに対するパーミッションを設定する (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>
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