LPIC303 Securityのコマンド整理【setfacl,getfacl】

アウトプットをしないと、歳のせいか覚えが悪くなった自分がいます💦
書籍を読んだだけで暗記できたあの頃が懐かしい・・・

いい加減本腰をいれて勉強しないといけず（人工知能の力を使いながら）整理していきたいと思います。
~~Security系のコマンド覚えるのむずすぎてイライラが止まらない~~

今回はgetfaclとsetfaclコマンドです。

# setfacl
## 目的
UNIX/Linuxシステムにおいてファイルやディレクトリのアクセス制御リスト (ACL) を設定または変更するためのツールです。ACLを使用すると、標準的なファイルパーミッションよりも詳細なアクセス権を設定できます。

前提として、検証用のテストユーザとテストグループを作成していきたいと思います。また検証用のファイルとしてtest.txtを作成しときます。
```
[root@i-00edb02b7c623d04f ~]# useradd test-user
[root@i-00edb02b7c623d04f ~]# groupadd test-group
[root@i-00edb02b7c623d04f ~]# touch test.txt
[root@i-00edb02b7c623d04f ~]# ls -ltr
total 0
-rw-r--r--. 1 root root 0 Jun 30 00:49 test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
```

## オプション
### -m, --modify
ACLエントリを変更します。

test-userに対して読み取り権限と書き込み権限を与えてみたいと思います。
test-userに対してのみrw権限が別で割り当たっていることがわかります。また、maskという欄が表示されていることがわかりますね。これは、ACLの整合性を保つために自動で計算されるようです。
```
[root@i-00edb02b7c623d04f ~]# setfacl -m u:test-user:rw test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rw-
group::r--
mask::rw-
other::r--
```
グループに対してもACLを設定してみます。
getfaclコマンドで権限が与えられているか、mask値が変わっていることを確認します。
```
[root@i-00edb02b7c623d04f ~]# setfacl -m g:test-group:rwx test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rw-
group::r--
group:test-group:rwx
mask::rwx
other::r--
```

### -x, --remove
ACLエントリを削除します。例えば、特定のユーザーのACLを削除する場合などで使うコマンド。

今回は先ほど権限を付与したtest-groupを削除してみたいと思います。
getfaclで確認をしてみたところ、一覧から消えていること。及びmask値も変わっていることがわかります。この辺りは当たり前かもしれませんが便利そうですね。
```
[root@i-00edb02b7c623d04f ~]# setfacl -x g:test-group test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rw-
group::r--
mask::rw-
other::r--
```

### -b, --remove-all
全てのACLエントリを削除します（標準的なパーミッションは影響を受けません）。

これもtest.txtに対して試してみます。
test.txtを作成して、その直後に確認した状態に戻っていますね。
```
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rw-
group::r--
mask::rw-
other::r--
[root@i-00edb02b7c623d04f ~]# setfacl -b test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
```

### -k, --remove-default
デフォルトACLエントリを削除します。

「デフォルトの設定って何だろう？」と思って調べてみると、ディレクトリに対してもACLを設定できるようで、その時にだけ設定できるACLとしてデフォルトACLというのがあるようです。
```
[root@i-00edb02b7c623d04f ~]# mkdir test-dir
[root@i-00edb02b7c623d04f ~]# ls -ltr
total 0
-rw-r--r--. 1 root root 0 Jun 30 00:49 test.txt
drwxr-xr-x. 2 root root 6 Jun 30 02:07 test-dir
[root@i-00edb02b7c623d04f ~]# getfacl test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[root@i-00edb02b7c623d04f ~]# setfacl -d -m u:test-user:rwx,g:test-group:rwx test-dir
[root@i-00edb02b7c623d04f ~]# getfacl test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:test-user:rwx
default:group::r-x
default:group:test-group:rwx
default:mask::rwx
default:other::r-x
```
デフォルトのACLを設定するにはこの後に出てくるsetfacl -dで設定が出来た。
設定したデフォルトACLに対して-kを実行するとデフォルトの設定だけ確かに消えていることが確認できます。
```
[root@i-00edb02b7c623d04f ~]# setfacl -m u:test-user:rwx test-dir
[root@i-00edb02b7c623d04f ~]# getfacl test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
user:test-user:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:test-user:rwx
default:group::r-x
default:group:test-group:rwx
default:mask::rwx
default:other::r-x

[root@i-00edb02b7c623d04f ~]# setfacl -k test-dir
[root@i-00edb02b7c623d04f ~]# getfacl test-dir
# file: test-dir
# owner: root
# group: root
user::rwx
user:test-user:rwx
group::r-x
mask::rwx
other::r-x
```

### -d, --default
デフォルトACLエントリを操作します。このオプションはディレクトリに対してのみ有効です。

以下はtest-dirというディレクトリにtest-user及びtest-groupに対してデフォルトのACLを設定している図です。また、test-dir配下にaaa.txtを作成してどのような出力になるのかを確認しています。
test-dirに関しては想定の出力なのですが、aaa.txtに関しては少し想定外でした。
てっきりmaskの再計算がされるのかと思ったのですが、effectiveという出力の通り、権限に制限がかかっている？ことがわかります。
defaultに関してはmaskの再計算はしないようです。
```
[root@i-00edb02b7c623d04f ~]# setfacl -d -m u:test-user:rwx,g:test-group:rwx test-dir
[root@i-00edb02b7c623d04f ~]# getfacl test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:test-user:rwx
default:group::r-x
default:group:test-group:rwx
default:mask::rwx
default:other::r-x

[root@i-00edb02b7c623d04f ~]# touch test-dir/aaa.txt
[root@i-00edb02b7c623d04f ~]# getfacl test-dir/aaa.txt
# file: test-dir/aaa.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx              #effective:rw-
group::r-x                      #effective:r--
group:test-group:rwx            #effective:rw-
mask::rw-
other::r--
[root@i-00edb02b7c623d04f ~]# ls -ltr test-dir/
total 0
-rw-rw-r--+ 1 root root 0 Jun 30 22:11 aaa.txt
```

### -R, --recursive
再帰的にディレクトリ内の全てのファイルとサブディレクトリに対して操作を実行します。

test-dirに対してaaa-dirを作成して、test-dirに対してACLの設定をしていきますが、その際に-Rオプションを指定してみました。
結果として確かにディレクトリとその中のサブディレクトリに対して同じACL設定がされていることがわかります。
```
[root@i-00edb02b7c623d04f ~]# mkdir test-dir/aaa-dir
[root@i-00edb02b7c623d04f ~]# setfacl -d -R -m u:test-user:rwx,g:test-group:rwx test-dir
[root@i-00edb02b7c623d04f ~]# getfacl test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
user:test-user:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:test-user:rwx
default:group::r-x
default:group:test-group:rwx
default:mask::rwx
default:other::r-x

[root@i-00edb02b7c623d04f ~]# getfacl test-dir/aaa-dir/
# file: test-dir/aaa-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:test-user:rwx
default:group::r-x
default:group:test-group:rwx
default:mask::rwx
default:other::r-x
```
消すのも同様にディレクトリとそのサブディレクトリに対して一気に反映させることが出来ました。
```
[root@i-00edb02b7c623d04f ~]# setfacl -k -R test-dir
[root@i-00edb02b7c623d04f ~]# getfacl test-dir
# file: test-dir
# owner: root
# group: root
user::rwx
user:test-user:rwx
group::r-x
mask::rwx
other::r-x

[root@i-00edb02b7c623d04f ~]# getfacl test-dir/aaa-dir/
# file: test-dir/aaa-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
```

### -n, --no-mask
maskエントリを変更しません。通常、setfaclは新しいエントリに基づいてマスクを計算しますが、このオプションを使用すると計算が行われません。

試してみます。
改めてtest.txtを作成しなおしてデフォルトの状態を確認した後、test-userに対して全ての権限を与えてみようとします。-nをつけていないとmaskの再計算が走っておりましたが、このオプションを使うことで実際には読み込み権限しか付与されていないことがわかります。
```
[root@i-00edb02b7c623d04f ~]# touch test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@i-00edb02b7c623d04f ~]# setfacl -n -m u:test-user:rwx test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx              #effective:r--
group::r--
mask::r--
other::r--
```

### -v, --version
  コマンドのバージョン情報を表示します。

実際に試してみました。
```
[root@i-00edb02b7c623d04f ~]# setfacl -v
setfacl 2.3.1
```

### --restore
バックアップファイルからACLを復元します。

バックアップ自体はgetfaclコマンドで取得できるようです。
まず、バックアップを取得してみます。test.txtを再作成して、それに対してtest-userとtest-groupへACLを設定しています。
その後getfaclの出力結果を別のテキストファイルに移しています。
```
[root@i-00edb02b7c623d04f ~]# touch test.txt
[root@i-00edb02b7c623d04f ~]# setfacl -m u:test-user:rwx,g:test-group:rwx test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx
group::r--
group:test-group:rwx
mask::rwx
other::r--

[root@i-00edb02b7c623d04f ~]# getfacl test.txt > bk_test.txt
[root@i-00edb02b7c623d04f ~]# cat bk_test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx
group::r--
group:test-group:rwx
mask::rwx
other::r--
```
この状態でACLを削除します。
```
[root@i-00edb02b7c623d04f ~]# setfacl -b test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
```
バックアップからACLの設定をリストアしてみます。
確かに元に戻っていますね。
```
[root@i-00edb02b7c623d04f ~]# setfacl --restore bk_test.txt
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx
group::r--
group:test-group:rwx
mask::rwx
other::r--
```

# getfacl
## 目的
Linux/UNIXシステムにおいてファイルやディレクトリのアクセス制御リスト (ACL) を表示するためのツールです。

## オプション
### -a, --access
ディレクトリのデフォルトACLではなくアクセスACLをリストします。
```
[root@i-00edb02b7c623d04f ~]# mkdir test-dir
[root@i-00edb02b7c623d04f ~]# setfacl -d -R -m u:test-user:rwx,g:test-group:rwx te
st-dir
```
この時の出力結果を確認してみます。-aを指定するのとしないとで出力結果が異なりますね。-aを指定しておくと、defaultの設定を出力させないで表示させることが出来るってイメージですかね？
```
[root@i-00edb02b7c623d04f ~]# getfacl -a test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[root@i-00edb02b7c623d04f ~]# getfacl test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:test-user:rwx
default:group::r-x
default:group:test-group:rwx
default:mask::rwx
default:other::r-x
```

### -d, --default
デフォルトACLエントリを表示します（ディレクトリにのみ有効）。

実際に使ってみます。
こちらはデフォルトACLのみ表示させるということになると思います。
```
[root@i-00edb02b7c623d04f ~]# getfacl -d test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
user:test-user:rwx
group::r-x
group:test-group:rwx
mask::rwx
other::r-x
```

### -e, --all-effective
有効な権限をすべて表示します。

このオプションを使うとeffectiveが表示されます。これを使うのと使わないの、どちらがいいんだろう・・・
```
[root@i-00edb02b7c623d04f ~]# getfacl -e test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx              #effective:rwx
group::r--                      #effective:r--
group:test-group:rwx            #effective:rwx
mask::rwx
other::r--
```

### -n, --omit-header
出力からヘッダーを除きます。

実際に試してみます。
userとgroupのところがtest-user、test-groupという名前ではなくIDで表示されていることがわかります。
これはわかりにくい気がする💦
```
[root@i-00edb02b7c623d04f ~]# getfacl -n test.txt
# file: test.txt
# owner: 0
# group: 0
user::rw-
user:1001:rwx
group::r--
group:1002:rwx
mask::rwx
other::r--
```
### -R, --recursive
再帰的にディレクトリ内のすべてのファイルとディレクトリのACLを表示します。

```
[root@i-00edb02b7c623d04f ~]# getfacl -R test-dir/
# file: test-dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:test-user:rwx
default:group::r-x
default:group:test-group:rwx
default:mask::rwx
default:other::r-x

# file: test-dir//aaa.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx              #effective:rw-
group::r-x                      #effective:r--
group:test-group:rwx            #effective:rw-
mask::rw-
other::r--
```

### -s, --skip-base
基本のアクセス権を表示しません。

と記載があったのですが、私の環境では出力に違いはありませんでした。
getfaclのバージョンを上げることで解消することがいいようですが、、、
確認まではしていません。
```
[root@i-00edb02b7c623d04f ~]# touch example.txt
[root@i-00edb02b7c623d04f ~]# setfacl -m u:test-user:rw- example.txt
[root@i-00edb02b7c623d04f ~]# setfacl -m g:test-group:rw- example.txt
[root@i-00edb02b7c623d04f ~]# getfacl example.txt
# file: example.txt
# owner: root
# group: root
user::rw-
user:test-user:rw-
group::r--
group:test-group:rw-
mask::rw-
other::r--

[root@i-00edb02b7c623d04f ~]# getfacl -s example.txt
# file: example.txt
# owner: root
# group: root
user::rw-
user:test-user:rw-
group::r--
group:test-group:rw-
mask::rw-
other::r--
```

### --tabular
タブ区切りで出力します。

実際に出力結果の差分を確認してみます。
個人的にこのオプションを付けた方がラインが揃って見やすいような気がしました。
```
[root@i-00edb02b7c623d04f ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:test-user:rwx
group::r--
group:test-group:rwx
mask::rwx
other::r--

[root@i-00edb02b7c623d04f ~]# getfacl --tabular test.txt
# file: test.txt
USER   root        rw-
user   test-user   rwx
GROUP  root        r--
group  test-group  rwx
mask               rwx
other              r--
```