SELinuxトラブルシュート

株式会社 日立製作所　飯島正人

## はじめに
SELinuxを有効にするといろいろな場面でアクセス拒否が発生します。
このアクセス拒否を回避する方法については、インターネット上で検索するとSELinuxそのものを無効にする方法から`audit2allow`のようなユーティリティを活用するもの、独自の対策を施すものなど様々な対策方法が見つかります。
しかし、1つのリソースに対して2つ以上のプロセスがアクセスするようなケースの紹介は少ないと感じています。
企業のサーバでSELinuxを有効にした場合、業務によるアクセスと運用でのアクセスがあり、1つのリソースに対して双方からのアクセスが発生する場面が容易に推測されます。
本記事では、このようなアクセスが競合する場合のアクセス許可設定についての考え方の一例を紹介します。

## 前提環境と想定するシナリオ
* OSは、CentOS 7.5 を使用
* SELinuxは「有効（`Permissive`または`Enforcing`）」に設定したのみで、特別なアクセス権付与は行っていない状態
* 業務で利用するWebサイトは新規にディレクトリを作成するが、コンテンツファイルのアップロードは開発者がftp接続して更新する運用とします。そのため、Apacheのドキュメントルートとは別の場所にディレクトリを作成します。

今回は、/(ルート)直下に website というディレクトリを作成します。
![website_dir01.png](https://qiita-image-store.s3.amazonaws.com/0/316890/7b50fc16-659e-4869-41ba-139c3da97c2a.png)

## アクセス拒否発生時のログ確認
SELinuxは「有効」に設定したのみで特別なアクセス権付与を行っていないため、以下のタイミングでアクセス拒否が発生します。

* ユーザからのWebアクセス
* 開発者のftpアクセス

アクセス拒否を一覧表示させて確認する場合は、`aureport`コマンドを使用します。

```
# aureport --avc --start MM/DD/YY hh:mm:ss --end MM/DD/YY hh:mm:ss
```

アクセス拒否の詳細内容を確認する場合は、`ausearch`コマンドを使用します。

```
# ausearch -m AVC --start MM/DD/YY hh:mm:ss --end MM/DD/YY hh:mm:ss
```

start、endは、表示されるログを絞り込むオプションで省略も可能。オプションの詳細については、manコマンドで確認してください。

## アクセス拒否の回避方法
`audit2allow`コマンドを使用すると、アクセス拒否を回避するためのアクセス権付与のヒントが得られます。

```
# ausearch -m AVC --start MM/DD/YY hh:mm:ss --end MM/DD/YY hh:mm:ss | audit2allow -a
```

今回のケースでは下記のような回避策のヒントが得られます。

```
#============= ftpd_t ==============
#!!!! WARNING: 'default_t' is a base type.
#!!!! This avc can be allowed using the boolean 'ftpd_full_access'
allow ftpd_t default_t:dir { add_name read write };

#!!!! This avc can be allowed using the boolean 'ftpd_full_access'
allow ftpd_t default_t:file { create getattr lock open write };

#============= httpd_t ==============
#!!!! WARNING: 'default_t' is a base type.
allow httpd_t default_t:file { getattr open read };
```

この内容をそのまま適用すると、httpとftp双方からアクセスすることが可能となるため、アクセス拒否を回避することができます。しかし、この対策内容は、`“default_t”`というタイプを持つディレクトリやファイルすべてに対して、httpアクセス、ftpアクセスが可能となってしまうため、セキュリティが甘くなるという問題が発生します。

`audit2allow`は大変便利であるものの、セキュリティを考慮していないため、必ず設定内容を確認して適用するかどうかを判断する必要がありますので、注意してください。

では、今回のケースではどう対応するのが望ましいか、考え方を整理しましょう。
httpアクセス、ftpアクセスそれぞれの対応策の一例を以下に挙げます。

httpアクセスのみを考慮した場合の対応策

|#|対応策|考察|
|:-:|:--|:--|
|1|“default_t”に対してアクセス権を付与する（audit2allow案）|セキュリティ的に問題あり|
|2|/websiteディレクトリをドキュメントルート配下に移動する|ftpアクセスさせるためには、“httpd_sys_content_t”にftpアクセス権を付与する必要があるが、`“httpd_sys_content_t”`を持つディレクトリ／ファイルすべてにアクセス権が付与されるため、セキュリティ的に問題あり|
|3|/websiteディレクトリのタイプ“default_t”をbooleanによりアクセス許可されているタイプ名に変更する|ftpアクセス不可|
|4|/websiteディレクトリのタイプ`“default_t”`を独自のタイプ名に変更し、かつ、httpd_tがアクセスできる権限を付与する| |

ftpアクセスのみを考慮した場合の対応策

|#|対応策|考察|
|:-:|:---------------------------------------------------------|:---------------------------------|
|1|“default_t”に対してアクセス権を付与する（audit2allow案）|セキュリティ的に問題あり|
|2|boolean`“ftpd_full_access”`を有効にする|ftpアクセスに制限が掛からなくなるため、セキュリティ的に問題あり|
|3|/websiteディレクトリのタイプ“default_t”をbooleanによりアクセス許可されているタイプ名に変更する|httpアクセス不可|
|4|/websiteディレクトリのタイプ`“default_t”`を独自のタイプ名に変更し、かつ、ftpd_tがアクセスできる権限を付与する| |

httpアクセス、ftpアクセスそれぞれの対応策、考察内容から、#4同士の組み合わせを採用します。
具体的には、/websiteディレクトリのタイプ`“default_t”`を独自のタイプ名に変更し、そのタイプに対してhttpd_tとftpd_t両方からアクセスできる権限のみを付与するのが望ましいと考えます。
付与する権限については、`audit2allow`の結果を参考にすると良いでしょう。
![website_dir02.png](https://qiita-image-store.s3.amazonaws.com/0/316890/abd62324-d1ba-c2fc-6f2f-aeb1af4473bc.png)

## おわりに
SELinuxのアクセス拒否対策は、単純にアクセス権を付与するだけでなく、今回ご紹介したようにセキュリティ面も考慮した対策内容を検討するようにしましょう。