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

最新版は、以下に記載しました。
https://hana-shin.hatenablog.com/entry/2022/05/31/221357

#1 アクセス制御リスト(ACL)とは?
ファイルやディレクトリに対するアクセス制御方式には、以下の方式があります。
・任意アクセス制御(DAC)：パミッション(rwx)による方式、ACL(アクセス制御リスト)
・強制アクセス制御(MAC)：[SELinux](https://qiita.com/hana_shin/items/70c93491ebbf4fc1ae12),AppArmor,Smack

本記事では、ACLで使うgetfacl,setfaclコマンドの使い方を説明します。
・setfacl：ファイルやディレクトリにACLを設定する
・getfacl：ファイルやディレクトリに設定されたACLを取得する

ACLは、パミッションによるアクセス方式に比べ、粒度の細かいアクセス制御ができます。

#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンのOS版数は以下のとりです。

```console: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パッケージをインストールします。

```console:インストール
[root@server ~]# yum install acl
```

aclパッケージに含まれているgetfacl,setfaclコマンドの版数を確認します。

```console:版数確認
[root@server ~]# getfacl -v
getfacl 2.2.51
[root@server ~]# setfacl -v
setfacl 2.2.51
```


#4 ACLの設定、削除方法（ユーザ編）
ユーザに対して、ACLの設定、削除をおこなってみます。


##4.1 事前準備
テスト用に使うユーザ(`usere1`,`user2`)とファイルを作成します。

```console:user1の作成
[root@server ~]# useradd user1
```

```console:user2の作成
[root@server ~]# useradd user2
```

```console:ファイルの作成
[root@server ~]# touch /tmp/test.txt
```

##4.2 ファイルの初期状態確認
ファイル所有者、グループはともに`root`であることがわかります。

```cosnole:パミッションの確認
[root@server ~]# ls -l /tmp/test.txt
-rw-r--r--. 1 root root 2  2月 20 17:52 /tmp/test.txt
```

上記で説明したファイルのパミッションが設定されていますが、
ACLはまだ設定されていないことがわかります。

```console:初期状態の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(リード、ライト)を設定します。

```console:user1にリード、ライト権を設定
[root@server ~]# setfacl -m u:user1:rw /tmp/test.txt
```

`test.txt`に`user2`の拡張ACL(リード)を設定します。

```console:user2にリード権を設定
[root@server ~]# setfacl -m u:user2:r /tmp/test.txt
```

ACLを設定すると、パミッションの右端に`+`が表示されます。

```console:パミッションの確認
[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`はリードのみ

```console: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::---
```

##4.4 削除方法(-x)

`test.txt`から`user1`の拡張ACLを削除します。

```console:ACLの削除
[root@server ~]# setfacl -x u:user1 /tmp/test.txt
```

`test.txt`のACLを確認します。
`test.txt`から`user1`の拡張ACLが削除されたことがわかります。

```console: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を削除します。

```console:ACLの削除
[root@server ~]# setfacl -x u:user2 /tmp/test.txt
```

`test.txt`のACLを確認します。
`test.txt`から`user1`と`user2`の拡張ACLが削除されたことがわかります。


```console: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 事前準備

```console:テスト用ファイルの作成
[root@server ~]# touch /tmp/test.txt
```

テスト用に使うグループ(staff)を作成します。

```console:テスト用グループ作成
[root@server ~]# groupadd staff
```

作成したグループを確認します。

```cosnole:追加したグループの確認
[root@server ~]# getent group|grep staff
staff:x:1009:
```


##5.2 設定方法(-m)
`test.txt`に対して、staffグループの拡張ACLを設定します。

```console:グループにrwxを設定
[root@server ~]# setfacl -m g:staff:rw /tmp/test.txt
```

staffグループは、`test.txt`に対してリード・ライトができることがわかります。

```console: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--
group:staff:rw-
mask::rw-
other::r--
```

##5.3 削除方法(-x)

```console:グループのACL削除
[root@server ~]# setfacl -x g:staff /tmp/test.txt
```

```console: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(★印)が設定されていることがわかります。

```console: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を一括削除してみます。

```console:ACLの一括削除
[root@server ~]# setfacl -b /tmp/test.txt
```

`user1`,`user2`の拡張ACLが削除されたことがわかります。

```console: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を再帰的に表示してみます。
まず、テスト用に使うディレクトリを作成します。

```console:テスト用ディレクトの作成
[root@server ~]# mkdir -p dir1/dir2
```

`dir1`,`dir2`のACLを確認します。
`dir1`,`dir2`のACLが表示されていることがわかります。

```console:dir1に対する再帰的な表示
[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を定義したファイルを作成します。

```console:ファイル作成
[root@server ~]# vi acl.txt
[root@server ~]# cat acl.txt
user:user1:rw
user:user2:rwx
```

`file.txt`のACLを確認します。
拡張ACLは、まだ設定されていないことがわかります。

```console:ACLの確認
[root@server ~]# getfacl file.txt
# file: file.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
```

`file.txt`に拡張ACLを設定します。

```console:
[root@server ~]# setfacl -M acl.txt file.txt
```

`file.txt`に設定されているACLを確認します。
`user1`と`user2`の拡張ACLが設定されたことがわかります。

```console: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の許可を与える。

```console:デフォルトACLの設定
[root@server ~]# setfacl -m d:u:user1:rw dir1/
```


`dir1`に設定したデフォルトACLを確認します。
デフォルトACLが設定されたことがわかります。

```console:デフォルト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を削除します。

```console:デフォルトACLの削除
[root@server ~]# setfacl -k dir1
```

`dir1`に設定したデフォルトACLを確認します。

```console:デフォルト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`にはリードを許可します。

```console:拡張ACL設定
[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`に対して、リード・ライトができることがわかります。

```console:user1の確認
[root@server ~]# su - user1
[user1@server ~]$ echo "12345" > /tmp/file.txt
[user1@server ~]$ cat /tmp/file.txt
12345
```

`user2`に切り替えます。

```console:user2に切り替え
[user1@server ~]$ exit
ログアウト
[root@server ~]# su - user2
```

`user2`の`file.txt`に対するリード・ライトを確認します。
`file.txt`のリードはできますが、ライトができないことがわかります。

```console:user2の確認
[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]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5LPIC-Level3-303%E6%95%99%E7%A7%91%E6%9B%B8-%E5%95%8F%E9%A1%8C%E9%9B%86-Version/dp/4295000515)
[【 setfacl 】コマンド（基礎編）――ファイルのアクセス制御リスト（ACL）を設定／削除する](https://www.atmarkit.co.jp/ait/articles/1808/23/news026.html)
[【 setfacl 】コマンド（応用編その1）――デフォルトのアクセス制御リスト（ACL）を設定する](https://www.atmarkit.co.jp/ait/articles/1808/24/news031.html)