Linuxの権限システム - アクセスコントロールリスト（ACL）

# アクセス制御リスト（ACL）について

ACLは、従来のrwx権限体系では実現できなかった、より細かい粒度での権限管理を実現します。CentOS7以降のバージョンでは、デフォルトでACLが有効なxfsおよびext4ファイルシステムが作成されますが、CentOS7以前では、手動でACLを有効にする必要があります。

## ACLの機能

- ユーザーやグループ単位で個別の権限を設定できる。
- CentOS7以降では、デフォルトでxfsおよびext4ファイルシステムにACL機能が含まれる。
- それ以前のバージョンでは、次のコマンドを使用してACLを有効にする必要がある。

```shell
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
```

ACLが適用される順序は、所有者、カスタムユーザー、所属グループ|カスタムグループ、その他の人となります。

## ACL関連のコマンド

- `setfacl` コマンドによりACL権限を設定できます。
- `getfacl` コマンドにより設定されたACL権限を確認できます。

**主なオプション:**
- `-m|--modify=acl`：ACL権限を変更
- `-M|--modify-file=file`：ファイルからルールを読み取る
- `-x|--remove=acl`：ファイルのACL権限を削除
- `-X|--remove-file=file`：ファイルからルールを削除
- `-b|--remove-all`：ファイルに設定されたすべてのACL権限を削除
- `-k|--remove-default`：デフォルトのACLルールを削除
- `--set=acl`：新しいルールで古いルールを置き換える（元のACL項目を削除し、新しいもので置き換える）
- `--set-file=file`：ファイルから新しいルールを読み取る
- `--mask`：mask値を再計算
- `-n|--no-mask`：mask値を再計算しない
- `-d|--default`：ディレクトリにデフォルトのACLを設定
- `-R|--recursive`：再帰的に実行
- `-L|--logical`：シンボリックリンクが指す実際のファイルにACLを適用（-Rと併用）
- `-P|--physical`：シンボリックリンク指すファイルにACLを適用しない（-Rと併用）

**例:**

```shell
echo "abcd" > f1
ll f1
# otherユーザーが読み取り可能
su - mage -c "cat /tmp/f1"
# mageユーザーにはいかなる権限も設定しない
setfacl -m u:mage:- f1
getfacl f1
# ファイルを確認すると、小さな+マークが表示される
ll f1
# mageは読み取り不可
su - mage -c "cat /tmp/f1"
# 他のotherユーザーjerryは読み取り可能
su - jerry -c "cat /tmp/f1"
# jerryは書き込み不可
su - jerry -c "echo 1234 >> /tmp/f1"
# jerryに書き込み権限を追加
setfacl -m u:jerry:rw f1
getfacl f1
# 書き込み可能
su - jerry -c "echo 1234 >> /tmp/f1"
su - jerry -c "cat /tmp/f1"
```

**グループにACLを追加する例:**

```shell
setfacl -m g:tom:rwx f1
getfacl f1
```

**ファイルからACLをコピーする例:**

```shell
getfacl f1 > acl_file
setfacl --set-file=acl_file f2
getfacl f1 f2
```

**ACL権限を削除する例:**

```shell
setfacl -x u:mage f1
setfacl -x g:tom f1
getfacl f1
```

**ファイル上のすべてのACL権限を削除する例:**

```shell
setfacl -b f1
getfacl f1
```

**「--set」による置き換えの例:**

```shell
setfacl --set u::rw,u:jerry:-,g::-,o::- f2
getfacl f2
```

## mask権限について

- maskは、所有者（owner）とその他（other）を除く、ユーザーやグループの最大権限を制限します。
- maskはユーザーやグループの実際に効果的な権限（Effective Permission）を決定するために使用されます。
- maskの設定範囲内でのみ、ユーザーやグループの設定が有効になります。

**例:**

```shell
setfacl -m mask::rx file
```

#### ユーザーに対するアクセス権限の追加

特定のユーザーに対し、ファイルやディレクトリへの追加アクセス権を設定することができます。

```shell
# ユーザー'mage'にファイル'f1'への読み書き権限を追加
setfacl -m u:mage:rw f1
```

#### グループに対するアクセス権限の追加

特定のグループに対しても、ファイルやディレクトリへの追加アクセス権を設定することが可能です。

```shell
# グループ'tom'にファイル'f1'への読み書き実行権限を追加
setfacl -m g:tom:rwx f1
```

#### ACL 権限の確認

`getfacl` コマンドを使用して、ファイルやディレクトリの現在の ACL 権限設定を表示します。

```shell
# ファイル'f1'の現在の ACL 権限を表示
getfacl f1
```

#### ACL 権限の削除

特定のユーザーやグループの ACL 権限を削除することができます。

```shell
# ユーザー'mage'のファイル'f1'に対する ACL 権限を削除
setfacl -x u:mage f1
# グループ'tom'のファイル'f1'に対する ACL 権限を削除
setfacl -x g:tom f1
```

#### ファイル上のすべての ACL 権限を削除

ファイルやディレクトリからすべての ACL 権限を削除することもできます。これは、ACLを完全にリセットしたい場合に便利です。

```shell
# ファイル'f1'からすべての ACL 権限を削除
setfacl -b f1
```

#### デフォルト ACL の設定

ディレクトリにデフォルト ACL を設定することにより、そのディレクトリ内に新しく作成されるすべてのファイルやサブディレクトリに自動的に ACL を適用させることができます。

```shell
# ディレクトリ'dir1'に対して、新たに作成されるファイルに自動的に適用されるデフォルトACLを設定
setfacl -d -m u:mage:rw dir1
```

これらの ACL コマンドをマスターすることで、ファイルシステム上でのアクセス権限をより精密に制御することができるようになります。Linux システムでのセキュリティ管理やアクセス制御において、ACL は非常に強力なツールです。

以上が ACL に関する概要、コマンド操作例、及びその注意点となります。