ACL(アクセス制御リスト)の使い方
- 1 ACL(アクセス制御リスト)とは?
- 2 検証環境
- 3 インストール方法
- 4 ユーザのACL設定、削除方法
- 5 グループのACL設定、削除方法
- 6 ACLを一括削除する方法(-b)
- 7 再帰的に表示する方法(-R)
- 8 ファイルを使ってACLを設定する方法(-M)
- 9 デフォルトACLを設定、削除する方法
- 10 実験
- Z 参考情報
1 ACL(アクセス制御リスト)とは?
Linuxのファイルやディレクトリに対するアクセス制御方式には、以下の方式があります。任意アクセス制御方式では、ファイルやディレクトリの所有者自身が、それらに対するアクセス権を設定します。
方式 | 実装 |
---|---|
任意アクセス制御(DAC) | パーミッション(rwx)、ACL(アクセス制御リスト) |
強制アクセス制御(MAC): | SELinux,AppArmor,Smack |
本記事では、ACLで使うgetfacl,setfaclコマンドの使い方を説明します。ACLは、パーミッションによるアクセス方式に比べ、粒度の細かいアクセス制御ができます。
コマンド名 | 概要 |
---|---|
setfacl | ファイルやディレクトリにACLを設定します |
getfacl | ファイルやディレクトリに設定されたACLを取得します |
2 検証環境
CentOS版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
3 インストール方法
aclパッケージをインストールします。
[root@server ~]# yum -y install acl
getfaclコマンドの版数を確認します。
[root@server ~]# getfacl -v getfacl 2.2.51
setfaclコマンドの版数を確認します。
[root@server ~]# setfacl -v setfacl 2.2.51
4 ユーザのACL設定、削除方法
4.1 事前準備
テスト用ユーザ(usere1)を作成します。なお、ユーザの作成、削除方法は、useradd/groupaddコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server ~]# useradd user1
テスト用ユーザ(user2)を作成します。
[root@server ~]# useradd user2
テスト用ファイルを作成します。
[root@server ~]# touch /tmp/test.txt
test.txtのACLを確認します。ACLはまだ設定されていないことがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- group::r-- other::r--
テスト用ファイルの所有者、グループを確認します。ともにrootであることがわかります。
[root@server ~]# ls -l /tmp/test.txt -rw-r--r--. 1 root root 0 5月 31 19:50 /tmp/test.txt
4.2 設定方法(-m)
test.txtに対してuser1のみ、リード/ライトができるようにACLを設定します。
[root@server ~]# setfacl -m u:user1:rw /tmp/test.txt
test.txtに対してuser2のみ、リードができるようにACLを設定します。
[root@server ~]# setfacl -m u:user2:r /tmp/test.txt
test.txtのACLを確認します。test.txtに対して、各ユーザは次のことができることがわかります。
・user1はリード/ライト
・user2はリードのみ
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- user:user1:rw- user:user2:r-- group::r-- mask::rw- other::r--
なお、ACLを設定すると、パーミッションの右端に+が表示されることがわかります。
[root@server ~]# ls -l /tmp/test.txt -rw-rw-r--+ 1 root root 0 5月 31 19:50 /tmp/test.txt
4.3 削除方法(-x)
test.txtからuser1のACLを削除します。
[root@server ~]# setfacl -x u:user1 /tmp/test.txt
test.txtのACLを確認します。test.txtからuser1のACLが削除されたことがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- user:user2:r-- group::r-- mask::r-- other::r--
test.txtからuser2のACLを削除します。
[root@server ~]# setfacl -x u:user2 /tmp/test.txt
test.txtのACLを確認します。test.txtからuser2のACLが削除されたことがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- group::r-- mask::r-- other::r--
5 グループのACL設定、削除方法
グループに対して、ACLの設定、削除をおこなってみます。
5.1 事前準備
テスト用のファイルを作成します。
[root@server ~]# touch /tmp/test.txt
テスト用のグループ(staff)を作成します。
[root@server ~]# groupadd staff
作成したグループを確認します。
[root@server ~]# getent group|grep staff staff:x:1001:
5.2 設定方法(-m)
test.txtに対して、staffグループはリード/ライトできるようにACLを設定してみます。
[root@server ~]# setfacl -m g:staff:rw /tmp/test.txt
ACLを確認します。staffグループは、test.txtに対してリード/ライトができることがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- group::r-- group:staff:rw- mask::rw- other::r--
5.3 削除方法(-x)
[root@server ~]# setfacl -x g:staff /tmp/test.txt
ACLを確認します。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- group::r-- mask::r-- other::r--
6 ACLを一括削除する方法(-b)
test.txtに設定されているACLを確認します。user1,user2のACLが設定されていることがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- user:user1:rw- user:user2:r-- group::r-- mask::rw- other::r--
ACLを一括削除します。
[root@server ~]# setfacl -b /tmp/test.txt
test.txtのACLを確認します。user1,user2のACLが削除されたことがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- group::r-- other::r--
7 再帰的に表示する方法(-R)
ファイルやディレクトリのACLを再帰的に表示してみます。まず、テスト用に使うディレクトリを作成します。
[root@server ~]# mkdir -p dir1/dir2
dir1,dir2のACLを確認します。dir1,dir2のACLが表示されていることがわかります。
[root@server ~]# getfacl -R dir1/ # file: dir1/ # owner: root # group: root user::rwx group::r-x other::r-x # file: dir1//dir2 # owner: root # group: root user::rwx group::r-x other::r-x
8 ファイルを使ってACLを設定する方法(-M)
ACLを定義したファイルを作成します。
[root@server ~]# vi acl.txt [root@server ~]# cat acl.txt user:user1:rw user:user2:rwx
file.txtのACLを確認します。ACLは、まだ設定されていないことがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- group::r-- other::r--
test.txtにACLを設定します。
[root@server ~]# setfacl -M acl.txt /tmp/test.txt
file.txtに設定されているACLを確認します。user1とuser2のACLが設定されたことがわかります。
[root@server ~]# getfacl /tmp/test.txt getfacl: Removing leading '/' from absolute path names # file: tmp/test.txt # owner: root # group: root user::rw- user:user1:rw- user:user2:rwx group::r-- mask::rwx other::r--
9 デフォルトACLを設定、削除する方法
dir1に対し、user1がリード/ライトができるようにデフォルトACLを設定します。
[root@server ~]# setfacl -m d:u:user1:rw dir1/
dir1に設定したデフォルトACLを確認します。デフォルトACLが設定されたことがわかります。
[root@server ~]# getfacl dir1/ # file: dir1/ # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:user:user1:rw- default:group::r-x default:mask::rwx default:other::r-x
ディレクトリ(dir1)に設定されたデフォルトACLを削除します。
[root@server ~]# setfacl -k dir1
dir1に設定したデフォルトACLを確認します。
[root@server ~]# getfacl dir1/ # file: dir1/ # owner: root # group: root user::rwx group::r-x other::r-x
10 実験
test.txtに対して、user1はリード/ライト、user2はリードができるようにACLを設定してみます。
[root@server ~]# setfacl -m u:user1:rw /tmp/test.txt [root@server ~]# setfacl -m u:user2:r /tmp/test.txt
user1のfile.txtに対するリード/ライトを確認します。file.txtに対して、リード/ライトができることがわかります。
[root@server ~]# su - user1 最終ログイン: 2022/05/28 (土) 20:45:07 JST日時 pts/1
テスト用ファイルに書き込みをします。user1はファイルへの書き込みが許可されているので、エラーは発生しません。
[user1@server ~]$ echo "12345" > /tmp/test.txt
テスト用ファイルから読み込みをします。user1はファイルからの読み込みが許可されているので、エラーは発生しません。
[user1@server ~]$ cat /tmp/test.txt 12345
user1からrootに切り替えます。
[user1@server ~]$ exit logout
次に、user2に切り替えます。
[root@server ~]# su - user2
テスト用ファイルに書き込みをします。user2はファイルへの書き込みが禁止されているので、書き込みができません。
[user2@server ~]$ echo "12345" > /tmp/test.txt -bash: /tmp/test.txt: Permission denied
テスト用ファイルから読み込みをします。user2はファイルからの読み込みが許可されているので、ファイルの中身を読み込むことができます。
[user2@server ~]$ cat /tmp/test.txt 12345
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ