ACL (Access Control List) を利用すると、より細かいファイルアクセス制限を設定することが出来ます。通常はowner、group、otherのパーミッション設定しか出来ませんが、この機能を使用すれば、更に特定のユーザやグループに対してのパーミッション設定をすることができます。
ACLの設定にはsetfaclコマンドを、ACLの設定確認にはgetfaclコマンドを使用します。
ACL設定は、setfaclコマンドで設定します。コマンドの構文と主要なオプションは、以下の通りです。
setfacl -option acl_entries file
オプション | コマンド |
---|---|
d | ACLの設定を削除 |
m | ACLの設定や変更 |
s | ACLの設定を完全に書換 |
acl_entriesは、以下のような形式でパーミッション設定をします。詳細は、マニュアルを参照下さい。
acl_entries | 説明 |
---|---|
u[ser]:uid:permission | uidに指定されたユーザに対するパーミッション設定。uidが省略された場合、所有者に対するパーミッション設定。 |
g[roup]:gid:permission | gidに指定されたグループに対するパーミッション設定。gidが省略された場合、所有者のグループに対するパーミッション設定。 |
o[ther]:permission | その他のユーザに対するパーミッション設定。 |
m[ask]:permission | パーミッションマスクの設定。結局のところ、このマスクで許可させるパーミッションが有効になります。 |
d[efault]:u[ser]:uid:permission | u[ser]:uid:permissionのデフォルト設定をする(主にディレクトリに対して設定をするときに使用します。その配下のACLは継承されます)。 |
d[efault]:g[roup]:gid:permission | g[roup]:gid:permissionのデフォルト設定をする(主にディレクトリに対して設定をするときに使用します。その配下のACLは継承されます)。 |
d[efault]:o[ther]:permission | o[ther]:permissionのデフォルト設定をする(主にディレクトリに対して設定をするときに使用します。その配下のACLは継承されます)。 |
d[efault]:m[ask]:permission | m[ask]:permissionのデフォルト設定をする(主にディレクトリに対して設定をするときに使用します。その配下のACLは継承されます)。 |
またpermissionは、r, w, x, -の組み合わせで指定します。
ACL確認は、getfaclコマンドで確認します。
getfacl file
具体的にはlsコマンドとgetfaclコマンドで設定を確認します。ACLが設定されている場合は、+が付加されます。
$ ls -l a --- -rw-------+ 1 test test 0 Nov 17 11:32 a
getfaclで詳細を確認する。
$ getfacl a --- # file: a # owner: test # group: other user::rw- user:hajime:rw- #effective:--- group::--- #effective:--- mask:--- other:---
ACLを利用したちょっとした例を記載します。testユーザしか読み書き出来ないファイルに対して、test2ユーザも読み書き出来るようにACLを設定してみます。
ユーザIDを確認する。
$ id --- uid=501(test) gid=501(test)
所有者(testユーザ)しか読み書き出来ないファイルを作成する。
$ touch a $ chmod 600 a
このファイルをtest2ユーザにも読み書きさせたい。ACLを設定する。
$ setfacl -m u:test2:rw- a $ ls -l --- -rw-------+ 1 test test 0 Nov 17 11:32 a $ getfacl a --- # file: a # owner: test # group: test user::rw- user:test2:rw- #effective:--- group::--- #effective:--- mask:--- other:---
test2ユーザで書き込めるか確認してみる。
$ id --- uid=502(test2) gid=502(test2) $ vi a --- Permission denied
この設定では、Permission deniedとなってしまう。なぜか?
ここで効いてくるのが、maskの設定です。test2ユーザには、読み書き設定(user:test2:rw-)をしましたが、mask値が許可されてない(mask:---)ので、結局、有効なパーミッションは、---となります(#effective:---)。
再度ACLを設定。今度はmask値を加えてあげます。mask値が設定され、user2ユーザの有効パーミッションがrw-となりました。
$ setfacl -m m:rw- a $ getfacl a --- # file: a # owner: test # group: test user::rw- user:test2:rw- #effective:rw- group::--- #effective:--- mask:rw- other:---
test2ユーザで書き込めるか再度確認してみる。今度は正常に読み書きできた。
$ id --- uid=502(test2) gid=502(test2) $ vi a