アクセス制御リスト
アクセス制御リスト (Access Control List, ACL) はファイルシステムに柔軟性のあるパーミッション機構を追加します。UNIX
のファイルパーティションを補助する形で設計されています。ACL を使うことであらゆるディスクリソースのパーミッションをあらゆるユーザーやグループに与えることが可能です。
インストール
必要パッケージである acl は systemd の依存パッケージであるため、既にインストールされているはずです。
設定
ACL の有効化
ACL を有効にするには、ファイルシステムを acl
オプションでマウントする必要があります。fstab を使えばオプションを永続化させることができます。
ファイルシステムのデフォルトマウントオプションによっては acl
オプションが既に有効になっているかもしれません。Btrfs ではデフォルトで有効であり、ext ファイルシステムでも有効になっていることがあります。以下のコマンドを使って ext* でフォーマットするときのパーティションのオプションを確認してください:
# tune2fs -l /dev/sdXY | grep "Default mount options:"
Default mount options: user_xattr acl
そしてデフォルトのマウントオプションが上書きされていないかも確認してください。/proc/mounts
の適当な行に noacl
と記述されていればオプションが変更されています。
ファイルシステムのデフォルトマウントオプションは tune2fs -o option partition
コマンドを使って設定できます、例えば:
# tune2fs -o acl /dev/sdXY
特に外部ドライブに設定するときは、他の Linux マシンからも acl
オプションを使ってパーティションをマウントすることがある場合、/etc/fstab
にエントリを記述するよりもデフォルトマウントオプションを使うほうが便利です。全てのマシンの /etc/fstab
を編集する必要がなくなります。
ACL の設定
ACL を修正するには setfacl
コマンドを使います。パーミッションを追加するには setfacl -m
を使います。
ユーザーにパーミッションを追加:
# setfacl -m "u:username:permissions"
または:
# setfacl -m "u:uid:permissions"
グループにパーミッションを追加:
# setfacl -m "g:groupname:permissions"
または:
# setfacl -m "g:gid:permissions"
すべてのパーミッションを削除:
# setfacl -b
個別のエントリを削除:
# setfacl -x "entry"
パーミッションを確認するには、次を使用:
# getfacl filename
サンプル
"abc" という名前のファイルに対するユーザー johny のパーミッションを設定:
# setfacl -m "u:johny:rwx" abc
パーミッションの確認:
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- user:johny:rwx group::r-- mask::rwx other::r--
ユーザー johny のパーミッションを変更:
# setfacl -m "u:johny:r-x" abc
パーミッションを確認:
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- user:johny: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::---
ウェブサーバーにプライベートなファイルの実行権限を与える
ウェブサーバーなどのプロセスに、ユーザーのホームディレクトリにあるファイルへのアクセス権を与える方法を以下で説明します。全てのファイルにアクセスする権限を与えるのではなく制限をかけることでセキュリティを担保しています。
このセクションでは、例として、ウェブサーバーを実行するユーザーは webserver
で、アクセスできるようにするのは geoffrey
のホームディレクトリである /home/geoffrey
と仮定します。
The first step is granting execution permission to webserver
so it can access geoffrey
's home:
# setfacl -m "u:webserver:--x" /home/geoffrey
Remeber: Execution permissions to a directory are necessary for a process to list the directories content.
Since webserver
is now able to access files in /home/geoffrey
, other
s do no longer need access:
# 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:webserver:--x group::r-x mask::r-x other::---
As the above output shows, other
s no longer have any permissions, but webserver
still is able to access the files, thus security might be considered increased.
参照
- Man ページ -
man getfacl
- Man ページ -
man setfacl
- An old but still relevant (and thorough) guide to ACL