[Linux][command] ファイルとディレクトリのパーミッション_chmod, umask, SUID, SGID, Sticky Bit

# アクセス権
| 権限          | 表記 | 番号 | ファイル | ディレクトリ |
|:--------------|:----|:----|:----|:----|
| 読み取り権限  | `r` | 4   |参照|参照|
| 書き込み権限  | `w` | 2   |書き込み|作成、削除|
| 実行権限      | `x` | 1   |実効|移動|


# SUID, SGID, Sticky Bit
- SUID: ファイルの所有者の権限でプログラムが実行される
    - 所有者の実行権限 (`x`) の位置が`s`に変わる
    - 数値で表現するる`4xxx`（例：`4755`）
- SGID: グループの権限でプログラムが実行される
    - グループの実行権限 (`x`) の位置が`s`に変わる
    - 値で表現すると`2xxx`（例：`2755`）
- Sticky Bit: ディレクトリに設定することで、所有者以外はファイルを削除できないようにする（/tmp などで利用）
    - その他（other）の実行権限 (`x`) の位置が`t`に変わる
    - 数値で表現すると`1xxx`（例：`1777`）

## 使用例
### 通常のファイル
```terminal
$ ls -l normal_file
-rw-r--r-- 1 user group 1234 Feb 16 12:00 normal_file
```
| 権限        | 所有者（user） | グループ（group） | その他（other） |
|------------|--------------|--------------|--------------|
| `-rw-r--r--` | 読み取り (`r`), 書き込み (`w`) | 読み取り (`r`) | 読み取り (`r`) |

### SUID（Set User ID）
- 通常のパーミッション:`0755`→`-rwxr-xr-x`
- SUID 設定後:`4755`→`-rwsr-xr-x`

```terminal
$ ls -l suid_file
-rwsr-xr-x 1 root group 1234 Feb 16 12:00 suid_file
```
| 権限        | 所有者（root） | グループ（group） | その他（other） |
|------------|--------------|--------------|--------------|
| `-rwsr-xr-x` | 読み取り (`r`), 書き込み (`w`), 実行 (`s`)（SUID） | 読み取り (`r`), 実行 (`x`) | 読み取り (`r`), 実行 (`x`) |

### SGID（Set Group ID）
- 通常のパーミッション:`0755`→`-rwxr-xr-x`
- SGID 設定後:`2755`→`-rwxr-sr-x`

```terminal
$ ls -l sgid_file
-rwxr-sr-x 1 user staff 1234 Feb 16 12:00 sgid_file
```
 権限        | 所有者（user） | グループ（group） | その他（other） |
|------------|--------------|--------------|--------------|
| `-rwxr-sr-x` | 読み取り (`r`), 書き込み (`w`), 実行 (`x`) | 読み取り (`r`), 実行 (`s`)（SGID） | 読み取り (`r`), 実行 (`x`) |

### Sticky Bit

```terminal
$ chmod 1777 mydir
$ ls -ld mydir
-rwxr-xr-t 2 user user 4096 Feb 16 12:00 mydir
```
 権限        | 所有者（user） | グループ（group） | その他（other） |
|------------|--------------|--------------|--------------|
| `-rwxr-sr-x` | 読み取り (`r`), 書き込み (`w`), 実行 (`x`) | 読み取り (`r`), 実行 (`x`) | 読み取り (`r`), 実行 (`t`) (Sticky Bit) |


# chmodコマンド
~~~terminal:
$ chmod [オプション] 数値または記号 ファイル名
~~~

| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
|           | デフォルト | 設定しない場合、ファイルの権限は変更されない |
| `-R` | recursive | 指定したディレクトリ以下のすべてのファイル・ディレクトリの権限を再帰的に変更 |
| `-v` | verbose | 変更されたファイルの詳細を表示 |
| `-c` | changes | 変更があったファイルのみを表示 |
| `--reference=参照ファイル` | reference | 指定したファイルの権限と同じに設定 |

## 権限設定の構成要素

| 種別 | 記号 | 説明 |
|:--|:--|:--|
| **対象（Who）** | `u` | 所有者（user） |
|  | `g` | 所有グループ（group） |
|  | `o` | その他のユーザー（other） |
|  | `a` | すべて（all: `ugo` と同等） |
| **操作（Action）** | `+` | 権限を追加 |
|  | `-` | 権限を削除 |
|  | `=` | 指定した権限に設定（既存の権限をリセット） |
| **許可（Permission）** | `r` | 読み取り（read） |
|  | `w` | 書き込み（write） |
|  | `x` | 実行（execute） |
|  | `s` | セットユーザーID（setuid）またはセットグループID（setgid） |

## 使用例

```terminal
# 所有者に実行権限を追加
$ chmod u+x script.sh

# すべてのユーザーに読み取り権限を追加
$ chmod a+r file.txt

# 所有グループとその他のユーザーから書き込み権限を削除
$ chmod go-w config.conf

# 所有者の権限を読み取り・書き込みのみに設定
$ chmod u=rw file.txt

# 所有者にセットユーザーIDを設定
$ chmod u+s program
```

# umaskコマンド
~~~terminal:
$ umask [オプション]
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| default | user mask | - 新しく作成されるファイルやディレクトリのデフォルトのパーミッション(umask値)を表示する |
| `-S` | symbolic | - 記号表記（`u=rwx,g=rx,o=rx` など）で現在のumask値を表示する |


## 基本的な動作  
umaskは「許可しないパーミッション」を指定するため、実際のパーミッションは**デフォルトのパーミッション**からumask値を引くことで決定されます。

- **ファイルのデフォルトパーミッション**: `666` (rw-rw-rw-)  
- **ディレクトリのデフォルトパーミッション**: `777` (rwxrwxrwx)  
- **実際のパーミッション** = **デフォルトパーミッション** - **umask値**

## umask値の計算例  

### **umask 022 の場合**
#### **ファイルの場合**
1. **デフォルトパーミッション**: `666` (rw-rw-rw-)  
2. **umask値**: `022` (---w--w--)  
3. **適用後のパーミッション**: `644` (rw-r--r--)  

#### **ディレクトリの場合**
1. **デフォルトパーミッション**: `777` (rwxrwxrwx)  
2. **umask値**: `022` (---w--w--)  
3. **適用後のパーミッション**: `755` (rwxr-xr-x)  

---

### **umask 027 の場合**
#### **ファイルの場合**
1. **デフォルトパーミッション**: `666` (rw-rw-rw-)  
2. **umask値**: `027` (---w--wx)  
3. **適用後のパーミッション**: `640` (rw-r-----)  

#### **ディレクトリの場合**
1. **デフォルトパーミッション**: `777` (rwxrwxrwx)  
2. **umask値**: `027` (---w--wx)  
3. **適用後のパーミッション**: `750` (rwxr-x---)  

## 主なumask値の設定例  

| umask値 | ファイルのパーミッション | ディレクトリのパーミッション | 説明 |
|:--|:--|:--|:--|
| `000` | `666` (rw-rw-rw-) | `777` (rwxrwxrwx) | **全ユーザーが読み書き・実行可能**（セキュリティリスクあり） |
| `022` | `644` (rw-r--r--) | `755` (rwxr-xr-x) | **一般的な設定**（所有者は書き込み可、他は読み取りのみ） |
| `027` | `640` (rw-r-----) | `750` (rwxr-x---) | **グループのみアクセス可、他のユーザーはアクセス不可** |
| `077` | `600` (rw-------) | `700` (rwx------) | **所有者のみアクセス可能**（セキュリティ重視） |  



# Ping-t
全般
- [3675](https://mondai.ping-t.com/question_subjects/31/question_sessions/32581786/progressing_questions/499228228?result=true)

umask
- [3257_umask](https://mondai.ping-t.com/question_subjects/31/question_sessions/31509922/progressing_questions/482817767)
- [3308_umask](https://mondai.ping-t.com/question_subjects/31/question_sessions/31763145/progressing_questions/486763768)
- [37144_umask](https://mondai.ping-t.com/question_subjects/31/question_sessions/30892897/progressing_questions/473298360)

chmod
- [3554_chmod a=rx, u+w](https://mondai.ping-t.com/question_subjects/31/question_sessions/32163062/progressing_questions/492736593)
- [3556_chmod 644, chmod u=rw,go=r](https://mondai.ping-t.com/question_subjects/31/question_sessions/31140772/progressing_questions/477192459)
- [3558_chmod g+s, chmod 2755_SGID](https://mondai.ping-t.com/question_subjects/31/question_sessions/30870646/progressing_questions/472924559)
- [3559_chmod o+t, chmod 1755_Sticky Bit](https://mondai.ping-t.com/question_subjects/31/question_sessions/32527688/progressing_questions/498427210)
- [3699_パーミッション](https://mondai.ping-t.com/question_subjects/31/question_sessions/30870646/progressing_questions/472924557)
- [3717_パーミッション](https://mondai.ping-t.com/question_subjects/31/question_sessions/30892897/progressing_questions/473298362)