【Linux】Linuxのパーミッションを理解する

# はじめに
今回はLInuxのパーミッションについて学んだことをまとめていきたいと思います！

パーミッションの理解には
- ファイルオーナー
- グループ
- パーミッション
- スーパーユーザ
について知る必要があるので順番に解説していきます！

## ファイルオーナーとは？
Linux で扱われるすべてのファイルには、**所有者（ファイルオーナー）**が設定されています。ファイルのオーナーは、ファイルへのアクセス権限（パーミッション）を自由に設定することができます。

### 所有者の確認方法
`ls -l`コマンドを使用すると、ファイルやディレクトリの所有者（オーナー）を確認できます。

```bash
ls -l
```

```
drwxr-xr-x@ 12 [所有者]  [グループ]  384 Sep 10 08:41 memos
```
上記の[所有者]の部分にファイルオーナー名が表示されます。

## グループとは？
**グループ**とは、複数のユーザをまとめた集合のことです。例えば、複数のユーザを「groupA」というグループに所属させ、そのグループに対してアクセス権限を付与することで、同じ役割を持つユーザに一括して権限を設定することができます。

```
drwxr-xr-x@ 12 [所有者]  [グループ]  384 Sep 10 08:41 memos
```
さっきの`ls -l`の例でいうと上記の[グループ]の部分にグループ名が表示されます。

## パーミッションとは？
**パーミッション**とは、誰に対してどのような操作を許可するかを定義する情報のことです。

`ls -l`コマンドの結果の先頭に表示される3文字ごとのブロックは、ファイルのパーミッションを表しています。

### パーミッションの構造
```
drwxr-xr-x@ 12 [所有者]  [グループ]  384 Sep 10 08:41 memos
```
例えば上記の例だといかの　意味になります

- **ファイル種別**:
  - `d` はディレクトリを表します（`-`ならファイル、`l`ならシンボリックリンク）
  
- **パーミッション**:
  - 所有者（オーナー）: `rwx` → 読み取り・書き込み・実行のすべてを許可。
  - グループ: `r-x` → 読み取りと実行を許可、書き込みは不可。
  - その他ユーザ: `r-x` → 読み取りと実行を許可、書き込みは不可。

### パーミッションの文字の意味
- `r`: 読み取り権限 (Read)
- `w`: 書き込み権限 (Write)
- `x`: 実行権限 (Execute)

## パーミッションの設定方法

### `chmod` コマンド
パーミッションは、**ファイルオーナー**もしくは**スーパーユーザ**のみ変更することができます。`chmod` コマンドには2つの指定方法があって **シンボルモード**と**数値モード**があります

### シンボルモードでの指定

```bash
chmod [ugoa][+-=][rwx] [ファイル名]
```

| 記号 | 意味         |
| ---- | ------------ |
| u    | オーナー     |
| g    | グループ     |
| o    | その他ユーザ |
| a    | ugo すべて   |

#### 演算子の意味
| 記号 | 意味              |
| ---- | ----------------- |
| +    | 権限を追加        |
| -    | 権限を取り除く    |
| =    | 権限を指定通りにする |

#### 例:
- オーナーの書き込み権限を追加：
  ```bash
  chmod u+w hoge.txt
  ```
- その他ユーザの実行権限を禁止：
  ```bash
  chmod o-x hoge.txt
  ```
- グループとその他ユーザに読み取り権限を付与：
  ```bash
  chmod go=r hoge.txt
  ```

### 数値モードでの指定

```bash
chmod [8進数の数値] [ファイル名]
```

#### 各権限の数値対応表
| 記号         | 数値 |
| ------------ | ---- |
| r (読み取り) | 4    |
| w (書き込み) | 2    |
| x (実行)     | 1    |

#### 例:
パーミッション `rwxr-xr-x` を指定する場合、以下のように数値で表します。

- 所有者: `rwx` → `4+2+1 = 7`
- グループ: `r-x` → `4+1 = 5`
- その他ユーザ: `r-x` → `4+1 = 5`

この場合、`chmod 755 ファイル名` で設定できます。

こう見ると数値モードの方が短くかけて使い勝手が良さそうですね笑

## スーパーユーザとは？
**スーパーユーザ**は、管理者権限を持つ特別なユーザです。
通常は `root` ユーザとも呼ばれます
システム全体にアクセスできるため、本来削除ができないように権限が制御されているファイルも削除することもできてしまいます。そういったファイルを消すとLinuxシステムが壊れてしまったりするので注意が必要です。

### スーパーユーザができること
- システム設定の変更
- ファイルやディレクトリのアクセス権限の変更
- すべてのファイルに対する読み込み・書き込み・削除・実行

## スーパーユーザになる方法

### `su` コマンド
スーパーユーザになるには、`su` コマンドを使用します。

```bash
su
```
`-`オプションを付けると、スーパーユーザの環境が初期化されます！
つまりログインしているユーザの環境変数とか引き継がずにできるということです

```bash
su -
```

スーパーユーザの環境に入ると、プロンプトが `$` から `#` に変わります(ただし設定で変えられていたりすると異なる場合がある)

### スーパーユーザを終了する
スーパーユーザ状態を終了するには、`exit` コマンドを使います。

```bash
exit
```

## `sudo` コマンド

### `sudo`の使い方
`sudo` は、1つのコマンドに対してスーパーユーザの権限で実行する際に使用します。

```bash
sudo [コマンド名]
```

### `sudo` と `su` の違い
- `su`: スーパーユーザのセッションが続くため、コマンドを複数連続して実行できる。
- `sudo`: 指定した1つのコマンドのみスーパーユーザ権限で実行し、その後は一般ユーザに戻る。

### `sudoers`ファイル
`/etc/sudoers` ファイルを編集することで、誰がどのコマンドを実行できるかを管理します。

#### 例:
```bash
hoge ALL=(ALL) ALL
```
この設定は、`hoge` ユーザがすべてのコマンドを実行できることを示します。

#### sudoers ファイルの編集
`sudoers` ファイルを編集する際は、`visudo` コマンドを使用することが推奨されるようです`visudo` を使用することで、ファイル保存前に文法チェックが行われ、安全に編集ができます。
使わないと、文法がおかしくても設定を上書きされてしまいます。
`visudo`を使ったとしても文法チェックでエラーがでたときに`Q`を入力してしまうと誤りがあっても強制的に保存されてしまうため注意がいるようです。

```bash
sudo visudo
```
ただ、そもそもsudoersファイルなどは編集しない方が良いみたいですね。
間違った設定とかしてしまうと再度スーパーユーザになれなくなってしまうこともあるみたいなので

## su と sudo どちらを使うべきか？
- 基本的には `sudo` を使用する方が安全なようです。
理由はシンプルに`su` コマンドを使用するとスーパーユーザの状態が長く続くため、誤操作のリスクが高まるからですね。
- ただし、`sudo` がデフォルトで使用できない環境や、設定が難しい場合には `su` を使用することもあるみたいです。

# まとめ
以上Linuxのパーミッションについてでした。
例えばsshキーとか作る時、適切な権限をファイルに付与したりする理由とか、今まで何となくしか理解してなかった権限や設定について理解できたように思います。

## 参考書籍

https://www.sbcr.jp/product/4815624316/