最新版は、以下に記載しました。
https://hana-shin.hatenablog.com/entry/2022/05/31/221357
#1 アクセス制御リスト(ACL)とは?
ファイルやディレクトリに対するアクセス制御方式には、以下の方式があります。
・任意アクセス制御(DAC):パミッション(rwx)による方式、ACL(アクセス制御リスト)
・強制アクセス制御(MAC):SELinux,AppArmor,Smack
本記事では、ACLで使うgetfacl,setfaclコマンドの使い方を説明します。
・setfacl:ファイルやディレクトリにACLを設定する
・getfacl:ファイルやディレクトリに設定されたACLを取得する
ACLは、パミッションによるアクセス方式に比べ、粒度の細かいアクセス制御ができます。
#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンのOS版数は以下のとりです。
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@server ~]# uname -r
3.10.0-957.el7.x86_64
#3 インストール方法
aclパッケージをインストールします。
[root@server ~]# yum install acl
aclパッケージに含まれているgetfacl,setfaclコマンドの版数を確認します。
[root@server ~]# getfacl -v
getfacl 2.2.51
[root@server ~]# setfacl -v
setfacl 2.2.51
#4 ACLの設定、削除方法(ユーザ編)
ユーザに対して、ACLの設定、削除をおこなってみます。
##4.1 事前準備
テスト用に使うユーザ(usere1
,user2
)とファイルを作成します。
[root@server ~]# useradd user1
[root@server ~]# useradd user2
[root@server ~]# touch /tmp/test.txt
##4.2 ファイルの初期状態確認
ファイル所有者、グループはともにroot
であることがわかります。
[root@server ~]# ls -l /tmp/test.txt
-rw-r--r--. 1 root root 2 2月 20 17:52 /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--
other::r--
##4.3 設定方法(-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
ACLを設定すると、パミッションの右端に+
が表示されます。
[root@server ~]# ls -l /tmp/test.txt
-rw-rw----+ 1 root root 0 1月 8 21:10 /tmp/test.tx
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::---
##4.4 削除方法(-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::---
test.txt
からuser2
の拡張ACLを削除します。
[root@server ~]# setfacl -x u:user2 /tmp/test.txt
test.txt
のACLを確認します。
test.txt
から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--
mask::r--
other::---
#5 ACLの設定、削除方法(グループ編)
グループに対して、ACLの設定、削除をおこなってみます。
##5.1 事前準備
[root@server ~]# touch /tmp/test.txt
テスト用に使うグループ(staff)を作成します。
[root@server ~]# groupadd staff
作成したグループを確認します。
[root@server ~]# getent group|grep staff
staff:x:1009:
##5.2 設定方法(-m)
test.txt
に対して、staffグループの拡張ACLを設定します。
[root@server ~]# setfacl -m g:staff:rw /tmp/test.txt
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
[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::---
拡張ACLを一括削除してみます。
[root@server ~]# setfacl -b /tmp/test.txt
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::---
#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 file.txt
# file: file.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
file.txt
に拡張ACLを設定します。
[root@server ~]# setfacl -M acl.txt file.txt
file.txt
に設定されているACLを確認します。
user1
とuser2
の拡張ACLが設定されたことがわかります。
[root@server ~]# getfacl file.txt
# file: file.txt
# owner: root
# group: root
user::rw-
user:user1:rw-
user:user2:rwx
group::r--
mask::rwx
other::r--
#9 デフォルトACLを設定、削除する方法
dir1ディレクトリに対し、デフォルトACLとして、user1
にrwの許可を与える。
[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 実験
file.txt
に対して、拡張ACLを設定します。
file.txt
に対して、user1
はリード・ライト、user2
にはリードを許可します。
[root@server ~]# setfacl -m u:user1:rw /tmp/file.txt
[root@server ~]# setfacl -m u:user2:r /tmp/file.txt
user1
のfile.txt
に対するリード・ライトを確認します。
file.txt
に対して、リード・ライトができることがわかります。
[root@server ~]# su - user1
[user1@server ~]$ echo "12345" > /tmp/file.txt
[user1@server ~]$ cat /tmp/file.txt
12345
user2
に切り替えます。
[user1@server ~]$ exit
ログアウト
[root@server ~]# su - user2
user2
のfile.txt
に対するリード・ライトを確認します。
file.txt
のリードはできますが、ライトができないことがわかります。
[user2@server ~]$ echo "12345" > /tmp/file.txt
-bash: /tmp/file.txt: 許可がありません
[user2@server ~]$ cat /tmp/file.txt
12345
#Z 参考情報
徹底攻略LPIC Level3 303教科書+問題集[Version 2.0]対応
【 setfacl 】コマンド(基礎編)――ファイルのアクセス制御リスト(ACL)を設定/削除する
【 setfacl 】コマンド(応用編その1)――デフォルトのアクセス制御リスト(ACL)を設定する