「ls -l」の出力内容を理解する




ファイルパーミッションについて：SUID/SGID/Sticky Bitの解説

`ls -l`コマンドは、ファイルやディレクトリの詳細情報を表示する際によく使いますが、正直どんな情報が出力されているのかわかっていませんでした...

それではいけないと思い、出力結果の各項目を一度調べ上げて整理してみました。
もし間違いなどあればご指摘ください<(_ _)>


## `ls -l`の出力例

まずそもそも`ls -l`の出力内容から見ていきたいと思います

```bash
drwxrwsr-x 2 root staff 4096 Sep  8 10:15 shared_directory
-rwsr-xr-x 1 root root  136 Sep  8 10:10 suid_program
-rwxr-sr-x 1 root staff  523 Sep  8 10:12 sgid_program
drwxrwxr-t 3 root users 4096 Sep  8 10:00 sticky_directory
```

一番最後がファイル名なのはわかるのですが、それ以外が何を指しているのか、パッと見ただけではわからないですね、、、

---

## 1. ファイルの種類とパーミッション

最初の列に表示される文字列は、ファイルの種類とパーミッションを表しています。この部分が非常に重要です！

```
drwxrwxrwx
```

この10文字で構成されたフィールドは、以下の3つの部分に分かれます。

1. **1文字目**: ファイルの種類
   - `d`: ディレクトリ
   - `-`: 通常のファイル
   - `l`: シンボリックリンク

2. **2～4文字目**: 所有者（user）の権限
   - `r`: 読み取り権限 (read)
   - `w`: 書き込み権限 (write)
   - `x`: 実行権限 (execute)

3. **5～7文字目**: グループ（group）の権限
   - `r`: 読み取り権限
   - `w`: 書き込み権限
   - `x`: 実行権限

4. **8～10文字目**: その他のユーザー（others）の権限
   - `r`: 読み取り権限
   - `w`: 書き込み権限
   - `x`: 実行権限


加えて、**SUID、SGID、Sticky Bit**が設定されている場合は特別な動作が可能になり、その設定位置はそれぞれ次のようになります
- SUID：4文字目
- SGID：7文字目
- Sticky Bit：10文字目


これらについても整理していきます！



### SUID（Set User ID）

#### 機能
SUID（Set User ID）は、プログラムが実行されると、そのファイルの所有者の権限で一時的に実行されるようにします。通常、ユーザーは自分の権限でファイルを実行しますが、SUIDが設定されている場合は、そのファイルの所有者の権限で実行されます。

よくある例としては、所有者がrootになっているファイルのSUIDがセットされていれば、root権限をもっていなくても実行できてしまいます(;^ω^)

#### 表示
- 実行権限がある場合: `s`
- 実行権限がない場合: `S`

#### 具体例

以下の例では、4文字目が`s`になっていますね。
`suid_program`はSUIDが設定されており、所有者`root`の権限で実行されます。
```bash
-rwsr-xr-x 1 root root  136 Sep  8 10:10 suid_program
```


次は実行権限のない例をみておきますと、以下は4文字目に`S`が入っていますので、所有者は実行権限を持たないです。
ただ、以下の例だと読み書きはできる設定になっています
```
-rwSr--r-- 1 root root 136 Sep  8 10:10 suid_file
```


### SGID（Set Group ID）

#### 機能
SGID（Set Group ID）は、ファイルが実行されると、そのファイルのグループの権限で実行されます。また、SGIDが設定されたディレクトリでは、作成されたファイルがそのディレクトリのグループに自動的に所属します。

#### 表示
- 実行権限がある場合: `s`
- 実行権限がない場合: `S`

#### 具体例

以下の例では7文字目に`s`があるので、`sgid_program`は`staff`グループの権限で実行されます。
```bash
-rwxr-sr-x 1 root staff  523 Sep  8 10:12 sgid_program
```

あわせて、実行権限のない例をみておくと以下になります。
```
-rw-r-Sr-- 1 root staff 523 Sep  8 10:12 sgid_file
```


### Sticky Bit

#### 機能
Sticky Bitが設定されたディレクトリ内では、そのディレクトリにファイルを作成したユーザーとrootのみがそのファイルを削除できるようになります。
これにより、共有ディレクトリ内で他のユーザーが作成したファイルを勝手に削除することを防ぐことができます。

#### 表示
- 実行権限がある場合: `t`
- 実行権限がない場合: `T`

#### 具体例

`sticky_directory`内のファイルは、ファイルを作成したユーザーまたは`root`のみが削除可能です。
ただ、所有者以外のユーザーでも実行は可能になっています
```bash
drwxrwxr-t 3 root users 4096 Sep  8 10:00 sticky_directory
```


次の例は、削除権限を所有者とrootに限定し、かつその他のユーザーは実行できないように設定できます
```bash
drwxrwxr-T 2 admin users 4096 Aug  1 15:00 /tmp
```


SUID、SGID、Sticky Bitの利用例については末尾の[SUID、SGID、Sticky Bitの利用例](#suid、sgid、sticky-bitの利用例)に記載しますので、ご興味があれば見てみてください！





## 2. リンクの数
次の列は、ファイルのリンクの数（ハードリンクの数）です。ディレクトリの場合は、サブディレクトリや自身へのリンクを含むため、2以上の値になることが多いです。

```
2
```

これは、そのファイルまたはディレクトリが他の場所から参照されている回数です。

## 3. 所有者
次の列は、ファイルの所有者を示しています。通常は、ファイルを作成したユーザー名が表示されます。

```
root
```

これは、ファイルの所有者が`root`ユーザーであることを意味します。

## 4. グループ
次の列は、ファイルの所有グループを示しています。ファイルやディレクトリには所有者だけでなく、グループも存在し、そのグループに属するユーザーがアクセス権を持つ場合があります。

```
staff
```

これは、このファイルやディレクトリが`staff`グループに属していることを意味します。


## 5. ファイルサイズ
次の列は、ファイルのサイズをバイト単位で示しています。ディレクトリの場合は、そのディレクトリ内のエントリの数に基づいたサイズが表示されます。

```
4096
```

これは、ファイルやディレクトリのサイズが4096バイトであることを意味します。

## 6. 最終更新日時
次の列は、ファイルやディレクトリが最後に更新された日時を示しています。通常、ファイルが作成された、修正された、またはアクセスされた日時です。

```
Sep  8 10:15
```

この例では、ファイルが9月8日10:15に最後に変更されたことを意味します。

## 7. ファイル名
最後の列は、ファイルやディレクトリの名前を表示します。

```
file1.txt
```

これは、ファイルの名前が`file1.txt`であることを示しています。





## まとめ

`ls -l`コマンドで表示される情報ってこんなにあったんだ、、、という驚きがありました。。。
特にパーミッションは、ほとんど理解できていなかった（怠惰）ので、勉強になりました！

この記事がどなたかの参考になれば幸いです！



## 参考
### SUID、SGID、Sticky Bitの利用例

以下に、SUID、SGID、Sticky Bitの利用例をそれぞれ3つずつ、指定された形式で説明します。



#### SUIDの利用例

##### 1. パスワードの変更
`passwd`コマンドは、一般ユーザーが自身のパスワードを変更できるようにするため、SUIDが設定されています。このコマンドは、実行時に`root`権限で動作し、システムのパスワードファイルを安全に更新します。
```bash
-rwsr-xr-x 1 root root /usr/bin/passwd
```

##### 2. 管理者権限でのコマンド実行
`sudo`コマンドは、ユーザーが一時的に管理者権限でコマンドを実行できるようにするためにSUIDが設定されています。SUIDによって、通常のユーザーが`root`の権限で特定のタスクを実行できます。
```bash
-rwsr-xr-x 1 root root /usr/bin/sudo
```


#### SGIDの利用例

##### 1. 共有ディレクトリのファイル管理
`/srv/shared`のような共有ディレクトリにSGIDを設定すると、そのディレクトリ内で作成されたファイルは、そのディレクトリのグループに自動的に所属します。これにより、グループ内でのファイル共有が容易になります。
```bash
drwxrwsr-x 3 root shared /srv/shared
```



#### Sticky Bitの利用例

##### 1. 一時ファイルディレクトリ
`/tmp`ディレクトリは、全ユーザーがアクセスできる一時ファイル保存場所です。Sticky Bitが設定されているため、ユーザーは自分のファイルのみ削除でき、他のユーザーのファイルは削除できません。
```bash
drwxrwxrwt 1777 root root /tmp
```