Linux ACL の基礎
「Linux プログラミングインタフェース」再び。
輪読やりながら「こんな機能使うのか?」って、みんな文句言いながら読んでいた章。ここで触っとかないと、今後「ACL とか知らねぇ。」ってなりそうなので、まとめておく。
17章 ACL
ACL はユーザもしくはグループ単位でのパーミションを設定可能にするもので、ユーザ、グループ数を制限しません。Linux ではバージョン 2.6 で ACL を導入しました。
refs: https://www.oreilly.co.jp/books/9784873115856/
ACL(access control list) とは
簡単に言うとファイルやディレクトリのパーミッションに +αのアクセス権
を設定できる機能。
ACL を設定すると下記例のように、通常のパーミッション的には root しか読めないファイルに、vagrant ユーザの参照権限を追加することができる。
|
|
|
|
ACL の設定方法
ACL の表示や変更は、getfacl
、setfcal
を使用する。
ACL の表示
123456# getfacl -c acl_fileuser::rw-user:vagrant:r--group::---mask::r--other::---ACL の変更
123setfacl -m user:vagrant:r acl_file #ACLエントリの設定setfacl -x user:vagrant acl_file #ACLエントリの削除setfacl -b acl_file #全ての拡張ACLエントリを削除
ACL の基礎
ACL のテキスト表現
setfacl で指定するパラメータは、以下のような感じで、ACLエントリ(テキスト表現)を,
区切りで並べたものを指定する。
|
|
各ACLエントリは タグ種類:タグ修飾子:パーミッション
といった形式になっていて、上記 ACLを ACLエントリごとにわけると以下のようになる。
ACLエントリ | タグ種類 |
---|---|
u::rw |
ACL_USER_OBJ |
g::r |
ACL_GROUP_OBJ |
o::- |
ACL_OTHER_OBJ |
u:paulh:rw |
ACL_USER |
u:annabel:rw |
ACL_USER |
g:teach:rw |
ACL_GROUP |
m::rwx |
ACL_MASK |
上記 ACL を言葉で説明すると以下のような感じになる。
acl_file に、通常のパーミッション
640
を設定し、追加で paulhユーザ と annabelユーザ、teachグループにrw
のアクセス権を設定する。
タグの種類
タグの種類は、通常のパーミッションに相当する基本ACL
と、追加で設定するイメージの拡張ACL
に分類される。
- 基本ACL
ACL_USER_OBJ
: 従来パーミッションの owner に相当ACL_GROUP_OBJ
: 従来パーミッションの group に相当ACL_OTHER
: 従来パーミッションの other に相当
- 拡張ACL
ACL_USER
: エントリのパーミションをタグ修飾子に指定されたユーザへ適用するACL_GROUP
: エントリのパーミションをタグ修飾子に指定されたグループへ適用するACL_MASK
: グループクラス(ACL_GROUP_OBJ,ACL_USER,ACL_GROUP)で設定されている権限の最大値
ACL の動作確認
準備
ACL はファイルシステムの拡張機能として実装れていて、デフォルトでは無効になっているため、mount オプションで有効にする必要がある。
ここでは、パーティション準備するのが面倒なので、ファイルを loop mount してテスト。
ファイルシステムとなる image ファイルを作成
123# dd if=/dev/zero of=image bs=10M count=1# ls -l image-rw-r--r-- 1 root root 10485760 Jun 28 23:26 imageフォーマット
1# mke2fs -t ext4 -F imageマウント
1234# mkdir acltest# mount -o loop,acl image acltest/# mount | tail -1/home/vagrant/image on /home/vagrant/acltest type ext4 (rw,acl)
動作確認
root オーナのファイル
aclfile
に、vagrant ユーザのrw
を設定1234567891011121314151617# ll aclfile-rw-r--r-- 1 root root 5 Jun 28 23:31 aclfile## setfacl -m user:vagrant:rw aclfile# ll aclfile-rw-rw-r--+ 1 root root 5 Jun 28 23:31 aclfile## getfacl -c aclfileuser::rw-user:vagrant:rw-group::r--mask::rw-other::r--# sudo -u vagrant sh -c "echo vagrant > aclfile"# cat aclfilevagrant- 拡張ACL を設定したので、ls で表示されるパーミッションの横に
+
がつく - root オーナファイルに vagrant ユーザで書き込み可能になる
- 拡張ACL を設定したので、ls で表示されるパーミッションの横に
ACL の削除
基本ACL は削除できない
123456# setfacl -x user:: aclfilesetfacl: aclfile: Malformed access ACL `user:vagrant:r--,group::r--,mask::r--,other::---': Missing or wrong entry at entry 1# setfacl -x groupt:: aclfilesetfacl: aclfile: Malformed access ACL `user::rw-,user:vagrant:r--,mask::r--,other::---': Missing or wrong entry at entry 3# setfacl -x other:: aclfilesetfacl: aclfile: Malformed access ACL `user::rw-,user:vagrant:r--,group::r--,mask::r--': Missing or wrong entry at entry 5拡張ACL の削除。一つでも残っていると ls のパーミッションに
+
。123456789101112131415# setfacl -x user:vagrant aclfile## ls -l aclfile; getfacl -c aclfile-rw-r-----+ 1 root root 5 Jun 29 15:13 aclfileuser::rw-group::r--mask::r--other::---# setfacl -x mask aclfile# ls -l aclfile; getfacl -c aclfile-rw-r----- 1 root root 5 Jun 29 15:13 aclfileuser::rw-group::r--other::---ls で表示されるグループのパーミッションは mask の値
ACLの設定を行っていない状態。グループは
r
。12345# ls -l aclfile; getfacl -c aclfile-rw-r----- 1 root root 5 Jun 29 15:13 aclfileuser::rw-group::r--other::---拡張ACL を設定。
グループのパーミッションは mask の値と一致する。mask の値は、拡張ACLの最大のパーミッションになっている。123456789101112131415161718# setfacl -m user:vagrant:r aclfile# ls -l aclfile; getfacl -c aclfile-rw-r-----+ 1 root root 5 Jun 29 15:13 aclfileuser::rw-user:vagrant:r--group::r--mask::r--other::---# setfacl -m user:harasou:rw aclfile# ls -l aclfile; getfacl -c aclfile-rw-rw----+ 1 root root 5 Jun 29 15:13 aclfileuser::rw-user:vagrant:r--user:harasou:rw-group::r--mask::rw-other::---拡張ACL を全て削除すると、ls の表示は、もともとのグループパーミッション
r
に戻る123456# setfacl -b aclfile# ls -l aclfile; getfacl -c aclfile-rw-r----- 1 root root 5 Jun 29 15:13 aclfileuser::rw-group::r--other::---
所感
なかなか使い所が難しい(運用しづらい)感があるが、例えば、レンサバなどは、各ユーザ権限で基本、ファイルを作成するが、apache ユーザでも読み込みができる必要がある。こういったところで使うとわりとシンプルに権限周りを管理できるのかもしれない。