hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

ACL(アクセス制御リスト)の使い方



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技術ブログ