SELinuxの学習方法を考えてみた。

##学習方法について

- ネットに転がっている文献からの情報収集をする。
 - 完全に理解する必要はない、ざっくり機能把握程度で良い。
 - 本質的な理解は繰り返し学習を行うことで得られるものと割り切る。

- 実際動かしてみる。
 - 自分のイメージが及ぶ範囲でまずは動かしてみる。

全てを理解しようとすると、壁にぶつかりモチベーションが下がるので、自分の力が及ぶ範囲で進めていく。

ここまでの理解度：ほぼ理解ゼロ。 SELinux=Disabledから使ってみよう位の意識変化あり。

##情報収集をする
まずはSELinuxについて、色々調べてみる。

**■SELinuxを使う理由**
FWやIPS/IDSなどの入口対策で防げない攻撃が存在する。

- FW 
 - ルールを満たしていてば、不正な通信も通してしまう。
- IPS/IDS
 - シグネイチャでは未知の攻撃に対応できない。

上記に加えて、システムに重大な脆弱性が見つかった場合に、対応パッチの開発・公開がされるまでシステムは危険な状態になる。
侵入を許してしまった場合にも、被害を最小に抑える事が出来るのがSELinuxを使う理由と理解しました。

ここまでの理解度：SELinuxは内部対策。FW、IPS/IDSとは防御する目的が違うので、従来通り入口対策は必要。入口対策、内部対策を合わせて使っていく。

**■Linuxでのアクセス制御**
Linuxでは一般的に以下の2種類のアクセス制御があります。

- 任意アクセス制御（DAC:Discretionary Access Control）
 - パーミッションを使ってアクセス制御を行う。
 - 設定簡単。
 - rootになったら何でもできる。
 
- 強制アクセス制御（MAC:Mandatory Access control）
 - 任意アクセス制御より、細かな設定ができる。
 - 設定難しい。
 - root権限も制限をかけられる。
 - SELinuxもその一つ。

ここまでの理解度：root権限も制限かけられることが分かった。

**■国内システムではSELinuxはあまり使われてない？**
自分の場合だと以下の様な理由で使ってない。

- SELinux=Disabledと教えられている為、その文化が継承され続けている。<BR>
→そう教わりました。
- 設定が難しい。<BR>
→難しい。
- 導入実績が無い。<BR>
→SELinux=Disabled脳なので、導入する気なし。

**■SELinuxの機能**
基本となる機能は以下になります。

- TE<BR>
 - プロセスがアクセスできるリソースを制限する機能。
   - プロセスにドメインと呼ばれる識別子を付与する。
   - ファイルやディレクトリにはタイプと言われる識別子を付与する。
   - プロセスに付与する。

- ドメイン遷移<BR>
 - 親プロセスと同じ権限を子プロセスに付与するのではなく、最小限の権限で子プロセスを動作させたいときに利用する。
 - 子プロセスに対する権限制限。
 - プロセスに付与する。
- RBAC<BR>
 - ロールにアクセス権を設定する。
 - ロールをSELinuxユーザに付与する。
 - LinuxユーザーにSELinuxユーザーをマッピングする。
 - root権限も制限をかけられる。

ここまでの理解度：理解はできてないがどういう機能があるのか認識した。

##実際に動かしてみよう
**■環境**
CentOS Linux release 7.5.1804 (Core) Minimal

【ユーザ】
root
user1
user2

**■なにをするか？**
自分のイメージが及ぶ範囲でまずは動かしてみる。
以下で検証を進めていきます。

- SELinuxユーザーのマッピング
- 権限による制限をテスト
- rootの権限制限

**■SELinuxユーザーとLinuxユーザーをマッピング**

```
[root@CentOS7 ~]# semanage login -a -s user_u user1
```

- -a オプションは新規レコードを追加
- -s オプションは Linux ユーザーがマッピングされるSELinux ユーザーを指定
 - 構文[-s SELinuxユーザー Linuxユーザ]
　　

表1.SELinux ユーザーの権限

|ユーザー　　　　　　　　　|ロール　　　　　　　　　|ドメイン　　　　　　　　　|X Window System　　　　　　　　　　　|su または sudo　　　　　　　|ホームディレクトリーおよび /tmp (デフォルト) で実行|ネットワーキング|
|------|------|------|------|------|------|------|
|sysadm_u|sysadm_r|sysadm_t|はい|su および sudo|はい|はい|
|staff_u|staff_r|staff_t|はい|sudo のみ|はい|はい|
|user_u|user_r|user_t|はい|いいえ|はい|はい|
|guest_u|guest_r|guest_t|いいえ|いいえ|いいえ|いいえ|
|xguest_u|xguest_r|xguest_t|はい|いいえ|いいえ|Firefox のみ|

・参考
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-targeted_policy-confined_and_unconfined_users

**■マッピング情報の確認**
user1にuser_uが割り当てられている事を確認。

また、「\__default\__」行に関しては、LinuxユーザーにSELinuxユーザーをマッピングしない場合に割り当てられるデフォルト値になります。
「unconfined_u」は制限なしユーザー。

```
[root@CentOS7 ~]# semanage login -l

ログイン名                SELinux ユーザー         MLS/MCS 範囲           サービス

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
user1                user_u               s0                   *
```

**■権限制限さているか確認**
user1からuser2へsu出来ない事を確認。

```
[user1@CentOS7 ~]$ su - user2
パスワード:
su: 認証失敗
```
SELinuxユーザーのマッピング解除。

- -d オプションはレコード削除

```
[root@CentOS7 ~]# semanage login -d user1
[root@CentOS7 ~]# semanage login -l

ログイン名                SELinux ユーザー         MLS/MCS 範囲           サービス

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
```

suできること確認。

```
[user1@CentOS7 ~]$ su - user2
パスワード:
最終ログイン: 2018/12/14 (金) 21:48:33 JST日時 pts/0
[user2@CentOS7 ~]$
```

**■rootの一般ユーザー化、user_uを割り当ててみる**

```
[root@CentOS7 ~]# semanage login -a -s user_u root
[root@CentOS7 ~]# semanage login -l

ログイン名                SELinux ユーザー         MLS/MCS 範囲           サービス

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 user_u               s0-s0:c0.c1023       *
system_u             user_u               s0-s0:c0.c1023       *   
```

**■制限がかかって/rootの.bash～ファイルへの許可がなくなった。**
rootにも強力な権限で制限できてしまう事が確認できた。
rootを一般ユーザーレベルまで権限を落とすと、SELinuxの設定が出来なくなる為、SELinux設定権限を付けた管理用ユーザーが必要な事が分かった。

完全理解はしてないが、rootユーザーが単純に一般ユーザーになったと言うより、SELinuxの権限により一般ユーザー的な権限が割り当てられ、root管理のファイルにアクセスが出来なくなった様に見える。

```
-bash-4.2# pwd
/root
-bash-4.2# ll -a
ls: .bash_logout にアクセスできません: 許可がありません
ls: .bash_profile にアクセスできません: 許可がありません
ls: .bashrc にアクセスできません: 許可がありません
ls: .cshrc にアクセスできません: 許可がありません
ls: .tcshrc にアクセスできません: 許可がありません
ls: anaconda-ks.cfg にアクセスできません: 許可がありません
ls: .bash_history にアクセスできません: 許可がありません
ls: dead.letter にアクセスできません: 許可がありません
-bash-4.2# id
uid=0(root) gid=0(root) groups=0(root) context=user_u:user_r:user_t:s0
-bash-4.2#
-bash-4.2#
-bash-4.2# cd /home/user1
-bash: cd: /home/user1: 許可がありません
-bash-4.2#
-bash-4.2# semanage login -a -s sysadm_u root
libsemanage.semanage_make_sandbox: Could not copy files to sandbox /etc/selinux/targeted/tmp. (Permission denied).
OSError: Permission denied
-bash-4.2#
```
##学習できたこと
- SELinuxユーザーのマッピング方法
- SELinuxユーザーのマッピング解除方法
- root権限制限
- rootを一般ユーザー化する場合は、SELinux管理用のユーザーを作ったほうが良い