hajichan.net technical version

サーバ管理

ACL

ACL (Access Control List) を利用すると、より細かいファイルアクセス制限を設定することが出来ます。通常はowner、group、otherのパーミッション設定しか出来ませんが、この機能を使用すれば、更に特定のユーザやグループに対してのパーミッション設定をすることができます。

ACLの設定にはsetfaclコマンドを、ACLの設定確認にはgetfaclコマンドを使用します。

ACLの設定

ACL設定は、setfaclコマンドで設定します。コマンドの構文と主要なオプションは、以下の通りです。

setfacl -option acl_entries file

【setfaclコマンドオプション】
オプション コマンド
d ACLの設定を削除
m ACLの設定や変更
s ACLの設定を完全に書換

acl_entriesは、以下のような形式でパーミッション設定をします。詳細は、マニュアルを参照下さい。

【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の確認

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
ページのトップへ戻る