Linuxのセキュリティモデル

# Linuxのセキュリティモデル

## リソースの割り当て：

- **認証（Authentication）**：ユーザーの身元を確認するプロセス。
- **認可（Authorization）**：異なるユーザーに異なるアクセス権を設定するプロセス。
- **監査（Accounting/Audition）**：システムの利用に関する追跡・記録を行うプロセス。

Linuxシステムでは、ユーザーがログインに成功すると、システムは自動的にトークン（token）を割り当てます。これにはユーザー識別情報やグループメンバーシップなどの情報が含まれます。

## 3A認証（AAA認証）：

ネットワークデバイス向けのネットワークアクセスコントロール戦略に関するセキュリティモデルです。

### 例：
```shell
# 監査用のログインログ
# rocky8.5 の場合
[root@rocky8 ~]# cat /var/log/secure
Jun 25 07:50:35 rocky8 polkitd[965]: Registered Authentication Agent for unix-session:c1 (system bus name :1.52 [/usr/bin/gnome-shell], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Jun 25 07:51:52 rocky8 sshd[2413]: Accepted password for root from 10.0.0.1 port 53734 ssh2
Jun 25 07:51:52 rocky8 systemd[2420]: pam_unix(systemd-user:session): session opened for user root by (uid=0)
Jun 25 07:51:52 rocky8 sshd[2413]: pam_unix(sshd:session): session opened for user root by (uid=0)

# centos7 で間違ったパスワードを使ってリモート接続を試みた後のログ
[root@centos7 ~]# cat /var/log/secure
Jun 25 09:58:18 centos7 sshd[16194]: Nasty PTR record "10.0.0.1" is set up for 10.0.0.1, ignoring
Jun 25 09:58:21 centos7 unix_chkpwd[16196]: password check failed for user (root)
sshd[16194]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.0.0.1 user=root
Jun 25 09:58:21 centos7 sshd[16194]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jun 25 09:58:24 centos7 sshd[16194]: Failed password for root from 10.0.0.1 port 55301 ssh2
Jun 25 09:58:25 centos7 sshd[16194]: error: Received disconnect from 10.0.0.1 port 55301:0: [preauth]
Jun 25 09:58:25 centos7 sshd[16194]: Disconnected from 10.0.0.1 port 55301 [preauth]

# ubuntu20.04.4 の場合
root@ubuntu20:~# cat /var/log/auth.log
Jun 25 09:53:58 ubuntu20 systemd-logind[871]: Watching system buttons on /dev/input/event1 (AT Translated Set 2 keyboard)
Jun 25 09:55:29 ubuntu20 sshd[1238]: Accepted password for jose from 10.0.0.1 port 55262 ssh2
Jun 25 09:55:29 ubuntu20 sshd[1238]: pam_unix(sshd:session): session opened for user jose by (uid=0)
Jun 25 09:55:30 ubuntu20 systemd-logind[871]: New session 1 of user jose.
Jun 25 09:55:30 ubuntu20 systemd: pam_unix(systemd-user:session): session opened for user jose by (uid=0)
Jun 25 09:55:37 ubuntu20 sudo: jose : TTY=pts/0 ; PWD=/home/jose ; USER=root ; COMMAND=/bin/bash
Jun 25 09:55:37 ubuntu20 sudo: pam_unix(sudo:session): session opened for user root by jose(uid=0)
```

このログファイルはLinuxシステム上でのユーザーの認証（ログイン試行結果）、認可（アクセス許可）、および監査（システムの使用に関する情報）を記録しています。例えば、SSH を使ったリモートからのログイン試行や、sudo コマンドを使った権限昇格の様子が確認できます。これらのログはセキュリティ監査や異常が発生したときの原因調査などに重要です。

安全なシステムの運用にはこれらのログ情報の定期的な監視と適切な管理が不可欠です。また、認証に関しては強力なパスワードポリシーや多要素認証などが有効ですし、認可の段階では、必要最小限の権限をユーザーに付与する原則（最小権限の原則）が推奨されています。
## 1.1 ユーザー

Linuxシステムはマルチユーザーシステムであり、複数のユーザーが同時に存在することができ、各ユーザー間は互いに隔離されています。
Linuxシステムでは、各ユーザーはユーザーID（UID）によって一意に識別されます。

具体的には以下の通りです：

- **管理者：**
  - `root`, UIDは0

- **一般ユーザー：**
  - UIDは1-60000まで自動割り当てされます

- **システムユーザー：**
  - CentOS 6以前：UIDは1-499まで
  - CentOS 7以降：UIDは1-999まで
  - デーモンプロセスがリソースを取得する際の権限割り当てに使用されます

- **ログインユーザー：**
  - CentOS 6以前：UIDは500以上
  - CentOS 7以降：UIDは1000以上
  - ユーザーが対話式ログインを使用するために割り当てられます

Linuxでは、`root`以外のユーザーは一般ユーザーであり、そのユーザーIDは1-60000の範囲です。
| ユーザータイプ       | ユーザー名     | ユーザーID (uid)                | 機能                                                              |
|---------------|------------|-------------------------------|-----------------------------------------------------------------|
| スーパーアドミニストレータ | root (変更可)  | 0                               | スーパーアドミニストレータとしての全権限                         |
| 普通ユーザー（システムユーザー） | --         | 1-499 (CentOS6以前), 1-999 (CentOS7以降)     | バックエンドプログラム用に使用され、nginx、mysqlなどのサービスが該当 |
| 普通ユーザー（ログインユーザー）  | --         | 500+ (CentOS6以前), 1000+ (CentOS7以降) | 対話式ログインを行うユーザー用                                     |

## 1.2 ユーザーグループ

Linuxでは、1人または複数のユーザーをユーザーグループに追加できます。グループは0人以上のユーザーを含めることができる集合であり、ユーザーグループはグループID（GID）によって一意に識別されます。

具体的には以下の通りです：

- **管理者グループ：**
  - `root`, GIDは0

- **システムグループ：**
  - CentOS 6以前：GIDは1-499まで
  - CentOS 7以降：GIDは1-999まで
  - デーモンプロセスがリソースを取得する際の権限割り当てに使用されます

- **一般ユーザーグループ：**
  - CentOS 6以前：GIDは500以上
  - CentOS 7以降：GIDは1000以上
  - ユーザーが使用するために割り当てられます

| グループタイプ         | グループ名   | グループID (gid)                  | 機能                                      |
|------------------|----------|---------------------------------|-----------------------------------------|
| スーパーアドミニストレータグループ | root     | 0                               | スーパーアドミニストレータのためのグループ        |
| 普通ユーザーグループ（システムグループ） | --       | 1-499 (CentOS6以前), 1-999 (CentOS7以降) | バックエンドユーザーのためのグループ              |
| 普通ユーザーグループ（一般グループ）   | --       | 500+ (CentOS6以前), 1000+ (CentOS7以降) | ログインユーザーのためのグループ                  |


## 1.3 ユーザーとグループの関係

ユーザーは少なくとも1つのグループに属しており、複数のグループに属することも可能です。
グループには最低0人のユーザーが属しており、複数のユーザーが属することも可能です。

- **ユーザーの主グループ（primary group）：**
  - 私有グループとも呼ばれます。ユーザーは必ず1つの主グループに属し、ユーザーを作成する際には、デフォルトでユーザーと同名のグループが主グループとして作成されます。

- **ユーザーの附加グループ（supplementary group）：**
  - 辅助グループとも呼ばれます。ユーザーは0個以上の附加グループに属することができます。

グループを使用することで、ユーザーを一括して管理することが可能となります。例えばあるグループに権限を付与すると、そのグループに属するすべてのユーザーがそのグループの権限を継承することができます。

- **例：**
```
[root@rocky8 ~]# id jose
uid=1000(jose) gid=1000(jose) groups=1000(jose)
[root@rocky8 ~]# id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
```

## 1.4 セキュリティコンテキスト

Linuxのセキュリティコンテキスト（Context）:

Linuxシステムでは、実行中のプログラム（つまりプロセス）は、プロセスを開始したユーザーの身分で実行されます。プロセスがアクセスできるリソースの権限は、プロセスを実行するユーザーの身分に依存します。

- **まず、プログラムとは何か**
  - プログラムまたはコマンドは、本質的には実行可能なバイナリファイルや実行可能なスクリプトファイルです。
  - サーバー上には多くのファイルが存在していますが、実行可能な特定のバイナリファイルのみがプログラムと呼ばれます。

- **次に、プロセスとは何か**
  - 実行中のプログラムはプロセスです。

- **第三に、プログラム、プロセス、そしてユーザーの関係はどのようなものか**
  - 実行可能なファイルのみがプログラムと呼ばれます。
  - 同じプログラムであっても、実行できるユーザーは限られており、それは現在のユーザーがそのプログラムを実行する権限を持っているかどうかに依存します。
  - ユーザーAがあるプログラムを実行した場合、Aはプロセスを開始し、そのプロセスの発起人はAであり、そのプロセスはAの身分で実行されます。

例えば、交通手段の中で、空を飛ぶことができるものだけが飛行機と呼ばれるように、同じ飛行機であっても、乗ることができる人は限られており、それは飛行機のチケットを持っているか、搭乗券を持っているかどうかに依存します。

- **第四、プロセスのリソースアクセス**
  - プロセスが特定のリソースにアクセスできるかどうかは、プロセスの発起者（ユーザー）によって決まります（プロセス自体のプログラムファイルとは関係ありません）。例えば、プロセスがあるファイルを読み書きする場合、そのプロセス発起者がそのファイルに対する読み書きの権限を持っているかどうかによります。
旅客がファーストクラスに乗るかどうかは旅客自身が決定することであり、飛行機自体とは関係ありません。

  - **例：**
      - `reboot` コマンドはrootユーザーのみが実行可能です。
    ```
    [root@rocky8 ~]# reboot
    Connection closing...Socket close.
    Connection closed by foreign host.
    Disconnected from remote host(rocky8.5-2-153) at 11:19:02.
    Type `help' to learn how to use Xshell prompt.
    ```

      - 一般ユーザーは`reboot`コマンドを実行する権限がありません。
    ```
    [root@rocky8 ~]# su - jose
    [jose@rocky8 ~]$ reboot
    User root is logged in on sshd.
    Please retry operation after closing inhibitors and logging out other users.
    Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
    ```

      - rootユーザーも一般ユーザーも`cat`コマンドは実行可能ですが、特定のファイルにはrootユーザーのみがアクセス可能です。
    ```
    [root@rocky8 ~]# cat /etc/shadow
    root:$6$10pvyo2c4EI8tYh1$PT2yiAT6nrxs9rtjhQFWfDuHyFaV5HARXzn9YZ6wpJKveHccpl5Qolj
    t7iIlmHxWuy//::0:99999:7:::
    bin:*:18700:0:99999:7:::
    daemon:*:18700:0:99999:7:::
    adm:*:18700:0:99999:7:::
    ...
    [jose@rocky8 ~]$ cat /etc/shadow
    cat: /etc/shadow: Permission denied
    ```