はじめに
ファイルやディレクトリの権限を操作するコマンドchmodと似たコマンドにsetfacl(set file access control lists)があります。本記事ではコマンドの違いを実例付きで分かりやすく説明しました。
環境情報
- RHEL 7.5
chmodはオーナーとグループでしか制御できない
以下の記事にもある通りでchmodでは読み取り(r) 書き込み(w) 実行(x)をファイルオーナーとファイルグループに対して指定します。
一方で「rootユーザが作ったファイルを一時的に特定個人ユーザに書き込み権限を与えたい」と思った際にchmodの世界で考えると
- オーナーをそのユーザにする
- グループをそのユーザの属するグループにする
- Otherに書き込み権限を与える
といった本来実施したい効用以外が発生する操作をする必要があります。
拡張ACL
setfaclでは特定のユーザーやグループに対してファイルごとのアクセス制限(拡張ACL)が可能です。
コマンドは以下のパスに存在し
$ which setfacl /usr/bin/setfacl
一般ユーザでも利用可能です。
$ ls -l /usr/bin/setfacl -rwxr-xr-x. 1 root root 37608 xx /usr/bin/setfacl
詳細は以下で確認できますが
$ man setfacl
今回は上記で述べた「rootユーザが作成したファイルを特定ユーザtestuserにのみ書き込み権限を与えるハンズオンを記載します。
特定ユーザにのみ権限を付与する流れ
rootユーザがファイルを作成すると以下のような権限のため
# touch hoge # ls -l .. -rw-r--r-- 1 root root 0 .. hoge
個人ユーザであれば読み取りはOKで書き込みはNGです。
$ cat hoge $ echo a > hoge -bash: hoge: Permission denied
拡張ACLの権限確認はgetfacl hogeでできます。操作前の実行結果は以下。
# file: hoge # owner: root # group: root user::rw- group::r-- other::r--
ここでtestuserに書き込み権限を与える設定は以下で実施すると
# setfacl -m u:testuser:w hoge
ls -lにて+マークが付与され
$ ls -l ... -rw-rw-r--+ 1 root root 0 .. hoge
testuserに書き込み権限が付与されていることが分かります。
$ getfacl hoge # file: hoge # owner: root # group: root user::rw- user:testuser:-w- group::r-- mask::rw- other::r--
一点注意で、上記設定を入れるとtestuserは本来持っていた読み取り権限がなくなってしまいます。拡張ACLの設定が優先されることが原因のためsetfacl -m u:testuser:rw hoge
と実施すれば読み取り権限も付与できます。
終わりに
以下のようにbオプションを用いれば設定した拡張ACLは全て削除できます。
# setfacl -b hoge # ls -l ... -rw-r--r-- 1 root root .. hoge
chmodでできない細かい制御を入れる際には重宝するコマンドなので、覚えておくと役立つと思います。
以上、ご参考になれば幸いです。