Linuxの権限システム - ファイル所有者とグループ属性の操作

# **Linuxの権限システムについて**

### 1. **Linux中の権限体系の紹介**
Linuxシステムでは、すべてがファイルとして扱われます。
ファイルに対して、システムのユーザーは三つの異なる役割、すなわち所有者、グループ、その他のユーザーに分けられます。
そして、これら各役割のユーザーがそのファイルに対して持つ権限も三種類、読み取り、書き込み、実行に分かれます。

```shell
# ファイル権限を確認するコマンド
ls -l filename

# ファイルの所有者を変更する
chown ユーザー名 ファイル名

# ファイルのグループを変更する
chgrp グループ名 ファイル名

# ファイルの権限を変更する
chmod 権限 ファイル名
```

この部分では、Linuxシステム内の権限管理システムの基本的な概念を紹介しました。システム内でのファイル操作やセキュリティ維持において、これらの権限は非常に重要な役割を果たします。上記のコマンド例を使用して、ファイルの所有者、グループ、および権限を管理する方法を理解し、適用することができます。

三つの役割：

| 役割   | 英文表示     | 文字表示 |
|------|----------|------|
| 所有者：オーナー | owner \| OWNER \| user | u    |
| 属组：所属グループ | group \| GROUP        | g    |
| 其它用户：その他のユーザー | other \| OTHER       | o    |

三つの権限：
以下は、提供されたテキストを日本語に翻訳し、整理した内容です:

| 権限       | 英文表示            | 文字表示 | 八進制表示 |
|----------|------------------|------|-------|
| 読み取り権限 | read \| Readable    | r    | 4     |
| 書き込み権限 | write \| Writable   | w    | 2     |
| 実行権限     | execute \| eXcutable | x    | 1     |

### 2. ファイル所有者とグループ属性の操作

#### 2.1 ファイル所有者とグループ属性の操作

`chown` コマンドは、ファイルの所有者を変更することも、ファイルのグループを変更することもできます。

```shell
# 形式：
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

# 使用説明
OWNER # 所有者のみを変更
OWNER:GROUP # 所有者とグループの両方を変更
:GROUP # グループのみを変更、コロンは . でも置き換え可能

# よく使うオプション
-c|--changes # -vオプションと同じだが、更新が成功した情報のみを表示
-f|--silent|--quiet # エラー情報を表示しない
-v|--verbose # 処理過程を表示
--dereference # シンボリックリンクの指し示すファイルを変更し、リンク自体ではない
-h|--no-dereference # シンボリックリンクのファイル自体を変更し、指し示すターゲットファイルではない（現在のシステムでシンボリックリンクのファイル属性を変更できる場合にのみ有効）
--from=user:group # 元の所有者とグループに基づいて変更、ある種のクエリ条件として機能
--no-preserve-root # ルートディレクトリを特別扱いせず、通常のディレクトリとして処理（デフォルト設定なので、ルートディレクトリには操作しないでください）
--preserve-root # "/"上での再帰操作を許可しない
--reference=RFILE # 他のファイルの権限に基づいて操作し、指定されたファイルにそのファイルの所有者とグループ情報をコピー
-R|--recursive # 再帰操作
# -R を使用する際の以下のオプション
-H # 引数がディレクトリへのシンボリックリンクである場合、リンクが指し示すディレクトリのみを変更し、ディレクトリ内のファイルの所有者とグループは変更しない
-L # 遭遇したすべてのシンボリックリンクが指し示すディレクトリを変更
-P # シンボリックリンクが指し示すディレクトリを変更しない
```

##### 例：所有者を変更
```shell
[root@rocky8 0626]# ll
total 0
-rw-r--r--. 1 root root 0 Jun 26 10:34 a1.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a2.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a3.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a4.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a5.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a6.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a7.txt
# 所有者を変更
[root@rocky8 0626]# chown jose a1.txt # 所有者のみを変更
[root@rocky8 0626]# chown jose. a2.txt # 所有者とグループの両方を変更
[root@rocky8 0626]# chown jose: a3.txt # 所有者とグループの両方を変更
# 確認
[root@rocky8 0626]# ll a1.txt a2.txt a3.txt
-rw-r--r--. 1 jose root 0 Jun 26 10:34 a1.txt
-rw-r--r--. 1 jose jose 0 Jun 26 10:34 a2.txt
-rw-r--r--. 1 jose jose 0 Jun 26 10:34 a3.txt
# ここで使用されるグループは、所有者ユーザーの主グループです
# UIDを使って所有者を変更、UIDでは省略形をサポートしない
[root@rocky8 0626]# chown 1000 a4.txt
[root@rocky8 0626]# chown 1000. a5.txt
chown: invalid user: ‘1000.’
[root@rocky8 0626]# chown 1000: a6.txt
chown: invalid spec: ‘1000:’
[root@rocky8 0626]# ll a4.txt a5.txt a6.txt
-rw-r--r--. 1 jose root 0 Jun 26 10:34 a4.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a5.txt
-rw-r--r--. 1 root root 0 Jun 26 10:34 a6.txt
```

##### 例：グループを変更
```shell
[root@rocky8 0626]# touch b{1..6}.txt
[root@rocky8 0626]# ll b*
-rw-r--r--. 1 root root 0 Jun 26 10:40 b1.txt
-rw-r--r--. 1 root root 0 Jun 26 10:40 b2.txt
-rw-r--r--. 1 root root 0 Jun 26 10:40 b3.txt
-rw-r--r--. 1 root root 0 Jun 26 10:40 b4.txt
-rw-r--r--. 1 root root 0 Jun 26 10:40 b5.txt
-rw-r--r--. 1 root root 0 Jun 26 10:40 b6.txt
# グループ名で変更
[root@rocky8 0626]# chown .jose b1.txt
[root@rocky8 0626]# chown :jose b2.txt
# 確認
[root@rocky8 0626]# ll b1.txt b2.txt
-rw-r--r--. 1 root jose 0 Jun 26 10:40 b1.txt
-rw-r--r--. 1 root jose 0 Jun 26 10:40 b2.txt
# GIDで変更
[root@rocky8 0626]# chown .1000 b4.txt
[root@rocky8 0626]# chown :1000 b5.txt
[root@rocky8 0626]# chown .789 b6.txt
[root@rocky8 0626]# ll b4.txt b5.txt b6.txt
-rw-r--r--. 1 root jose 0 Jun 26 10:40 b4.txt
-rw-r--r--. 1 root jose 0 Jun 26 10:40 b5.txt
-rw-r--r--. 1 root 789 0 Jun 26 10:40 b6.txt
```

##### 例：所有者とグループを同時に変更
```shell
[root@rocky8 0626]# ll c*
-rw-r--r--. 1 root root 0 Jun 26 10:46 c1.txt
-rw-r--r--. 1 root root 0 Jun 26 10:46 c2.txt
-rw-r--r--. 1 root root 0 Jun 26 10:46 c3.txt
-rw-r--r--. 1 root root 0 Jun 26 10:46 c4.txt
-rw-r--r--. 1 root root 0 Jun 26 10:46 c5.txt
[root@rocky8 0626]# chown jose:tom c1.txt
[root@rocky8 0626]# chown jose.123 c2.txt
[root@rocky8 0626]# chown jose:nogroup c3.txt # 存在しないグループはエラーを出す
chown: invalid group: ‘jose:nogroup’
[root@rocky8 0626]# chown 1003.jose c4.txt
[root@rocky8 0626]# chown 123:456 c5.txt
[root@rocky8 0626]# ll c*
-rw-r--r--. 1 jose tom 0 Jun 26 10:58 c1.txt
-rw-r--r--. 1 jose 123 0 Jun 26 10:58 c2.txt
-rw-r--r--. 1 root root 0 Jun 26 10:58 c3.txt
-rw-r--r--. 1 jerry jose 0 Jun 26 10:58 c4.txt
-rw-r--r--. 1 123 456 0 Jun 26 10:58 c5.txt
```

##### 例：ファイルを基に変更
```shell
[root@rocky8 0626]# ll f*
-rw-r--r--. 1 123 456 0 Jun 26 11:02 f1.txt
-rw-r--r--. 1 root root 0 Jun 26 11:02 f2.txt
# ファイルに基づいて変更
[root@rocky8 0626]# chown --reference=f1.txt f2.txt
# 確認
[root@rocky8 0626]# ll f*
-rw-r--r--. 1 123 456 0 Jun 26 11:02 f1.txt
-rw-r--r--. 1 123 456 0 Jun 26 11:02 f2.txt
# 再帰的に変更
chown -R jose.tom dir1/
```

#### 2.2 ファイルのグループ情報を設定するchgrp

`chgrp` コマンドは、ファイルのグループのみを変更することができます。

```shell
# 形式：
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

# よく使うオプション
-c|--changes # -vオプションと同じだが、更新が成功した情報のみを表示
-f|--silent|--quiet # エラー情報を表示しない
-v|--verbose # 処理過程を表示
--dereference # シンボリックリンクの指し示すファイルを変更し、リンク自体ではない
-h|--no-dereference # シンボリックリンクのファイル自体を変更し、指し示すターゲットファイルではない（現在のシステムでシンボリックリンクのファイル属性を変更できる場合にのみ有効）
--no-preserve-root # ルートディレクトリを特別扱いせず、通常のディレクトリとして処理（デフォルト設定なので、ルートディレクトリには操作しないでください）
--preserve-root # "/"上での再帰操作を許可しない
--reference=RFILE # 他のファイルの権限に基づいて操作し、指定されたファイルにそのファイルの所有者とグループ情報をコピー
-R|--recursive # 再帰操作
# -R を使用する際の以下のオプション
-H # 引数がディレクトリへのシンボリックリンクである場合、リンクが指し示すディレクトリのみを変更し、ディレクトリ内のファイルの所有者とグループは変更しない
-L # 遭遇したすべてのシンボリックリンクが指し示すディ
レクトリを変更
-P # シンボリックリンクが指し示すディレクトリを変更しない
```

##### 例：グループを変更
```shell
[root@rocky8 0626]# touch g{1..6}.txt
[root@rocky8 0626]# ll g*
-rw-r--r--. 1 root root 0 Jun 26 11:10 g1.txt
-rw-r--r--. 1 root root 0 Jun 26 11:10 g2.txt
-rw-r--r--. 1 root root 0 Jun 26 11:10 g3.txt
-rw-r--r--. 1 root root 0 Jun 26 11:10 g4.txt
-rw-r--r--. 1 root root 0 Jun 26 11:10 g5.txt
-rw-r--r--. 1 root root 0 Jun 26 11:10 g6.txt
# グループを変更
[root@rocky8 0626]# chgrp jose g1.txt
[root@rocky8 0626]# chgrp jose g2.txt
# 確認
[root@rocky8 0626]# ll g1.txt g2.txt
-rw-r--r--. 1 root jose 0 Jun 26 11:10 g1.txt
-rw-r--r--. 1 root jose 0 Jun 26 11:10 g2.txt
# GIDで変更
[root@rocky8 0626]# chgrp 1000 g3.txt
[root@rocky8 0626]# chgrp 1000 g4.txt
[root@rocky8 0626]# ll g3.txt g4.txt
-rw-r--r--. 1 root 1000 0 Jun 26 11:10 g3.txt
-rw-r--r--. 1 root 1000 0 Jun 26 11:10 g4.txt
```

##### 例：再帰的にグループを変更
```shell
[root@rocky8 0626]# mkdir dir2
[root@rocky8 0626]# touch dir2/h{1..3}.txt
[root@rocky8 0626]# chgrp -R jose dir2
# 確認
[root@rocky8 0626]# ls -lR dir2
dir2:
total 0
-rw-r--r--. 1 root jose 0 Jun 26 11:15 h1.txt
-rw-r--r--. 1 root jose 0 Jun 26 11:15 h2.txt
-rw-r--r--. 1 root jose 0 Jun 26 11:15 h3.txt
```

##### 例：ファイルを基にグループを変更
```shell
[root@rocky8 0626]# touch i1.txt i2.txt
[root@rocky8 0626]# chgrp jose i1.txt
[root@rocky8 0626]# chgrp --reference=i1.txt i2.txt
# 確認
[root@rocky8 0626]# ll i1.txt i2.txt
-rw-r--r--. 1 root jose 0 Jun 26 11:20 i1.txt
-rw-r--r--. 1 root jose 0 Jun 26 11:20 i2.txt
```