SELinuxについてのメモ


SELinux ドキュメント（4章5章）をざっと読んで気になる点をまとめました。

# ドキュメントの所在

[Security Enhanced Linux]
(https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/index.html)

# SELinuxって？

- Linuxのセキュリティを強化する仕組みで、カーネルに追加される
- 米国国家安全保障局 (National Security Agency) が開発した

# SELinuxのセキュリティの仕組み

- プロセスとファイルの全てに、タイプでラベル付けを行う。
- タイプはプロセスのドメインを定義しており、プロセスはドメイン毎に互いに分離している。
- SELinuxポリシールールは、タイプに基づきプロセスがファイルと対話する方法とプロセス同士が対話する方法を定義する。
- プロセスは、アクセスを許可するポリシールールが定義されている場合のみ、当該ファイル又はプロセスへアクセスできる。
 
# セキュリティチェックのフロー

1. Linuxの既存のアクセス管理(DAC:任意アクセス制御)(chownやchmodで管理しているアレ)がチェックする.
2. SELinuxのルールをチェックする 

# SELinuxの動作例

```sh
ls -Z /var/www/html
system_u:system_r:httpd_sys_conten_t:s0
```

httpd_sys_content_tラベルが、httpdプロセスがこのファイルにアクセスできることを表す.

rootユーザーでtouch /var/www/html/testfileとすると
親ディレクトリのラベルを引き継ぐ

```sh
ls -Z /var/www/html/testfile
unconfined_u:object_r:httpd_sys_content_t:s0
wget http://localhost/testfile # sucess
```

testfileのラベルを変更するとリード権限があっても、アクセスできなくなる。

```sh
chcon -t samba_share_t /var/www/html/testfile
wget http://localhost/test/file # forbidden
```

この場合/var/log/audit/autit.logにエラーログが記録される。

# 関連ファイル

## ログファイル

/var/log/audit/autdit.log


拒否されたさいのログなどが記録される。

## 設定ファイル

### SELinuxの有効無効を設定する

/etc/selinux/config

以下の設定でSELinuxの有効、無効を設定できる。

```sh
SELINUX=稼働モード
```

- enforcing ･･･SELinuxポリシー適用
- permissive ･･･SELinuxポリシーは適用するがアクセス拒否等はせず、ログは記録する。
- disable ･･･ 無効。ファイルへのラベル付けが無効になったり、後々色々弊害でるようなので避けたい方が良い。

# ツールのインストール

自分の環境(CentOS6.5)には入っていなかったため、yumでインストｰルしました。

```bash
yum -y install policycoreutils-python
```


# SELinuxの状態設定

## 状態確認
```sh
getenforce
```

enforcing, permissive, disableのいずれかがかえる

## 状態表示

```sh
sestatus
```

SELinuxのステータスを表示する

## 一時的にenforingとpermissiveを切り替える

```sh
setenforce 1 # enforingにする
setenforce 0 # permissiveにする
```

## 設定項目の一覧表示

```sh
semanage boolean -l
```

各設定項目のon/offを確認でき、設定項目の説明も表示される。

```sh
getsebool -a
```

ブール値の一覧表示。（ただし説明は表示されない）

## 項目の設定

```sh
setsebool boolean-name x
```

指定した項目のブール値を変更する。


# ラベルの確認の仕方

## プロセスの場合

```sh
ps -Z
```

プロセスは実行されると、シェルのドメインからプロセスのドメインに移行します。(例ではpasswdならpasswd_tドメインへ）

## ファイルの場合

```sh
ls -Z
```

# ラベル付けのルール

※ 重要
ファイルやディレクトリーは移動よりコピーした方が、正しいラベリング付けが確保される。


## ファイルを新規作成した場合

- ディレクトリを新規作成すると、その親ディレクトリのラベルを引き継ぐ


## ファイルをコピーした場合

- ファイルをcpでオプション指定なしでコピーすると、コピー先のデフォルトのラベリングルールに従って、ラベリングされる。（デフォルトでは、コピー先のラベルが設定される）　ただし既存のファイルがある場合は、そのラベリングを引き継ぐ
- ラベルを保持してコピーする場合は、cp --preserve=contextオプションを利用する

## ファイルを移動した場合

- 移動すると、移動元のファイル・ディレクトリは現在のラベルを維持する。


# ラベルの変更の仕方

## 一時的な変更

```bash
chcon -t type file-name # -Rを付与で再帰的に適用可能
```

ファイルシステムの再ラベル付けやrestoreconにより元に戻る。

## 永続的な変更

```bash
semanage fcontext -a options file-name|dir-name # file_contextのラベルを変更する

restorecon -v file-name | dir-name # 変更を適用する
```

ファイルのラベルを変更をすると、/etc/selinux/targeted/contexts/files/file_context、またはfile_context.localに記録される。ファイルシステムの再ラベリングに利用するsefilesとSELinuxコンテキストを復元するrestoreconはこれらのファイルを読み込む。


# おまけ（注意する点）

- SELinuxをdisableにしてしまうと、ラベル付けすら行われなくなるので、利用しない場合permissiveにした方がよい。
- ファイルにアクセスできない場合は、一時的にpermissiveにしてDAC(chownやchmodで管理しているアクセス権)に問題無いことを確認する。
- ログファイルにて、SELinuxにより問題があるかを確認する。
- SELinuxで管理されているファイルはmvよりもcpした方が良い（コピー先のルールに自動的に変更されるため）。(とあるが･･･mvしたい場合も多々あるんですが)