SELinuxを使ってみよう ～こいつのせいでポート開放でハマった話 ～



## はじめに
この記事はロボP Advent Calendar 2018の10日目の記事です。

設定の面倒臭さやポート開放が上手くいかないとの理由で
鯖構築の入門書ではしばしば厄介者として扱われるSElinux君...
意図的に無効化している鯖の管理者は多いと思われるが（自分もその一人だった）
今回はSElinuxとあえて向き合って活用していくという趣旨で書いてみようかと

## そもそもSElinuxとは
Linuxカーネルに組み込まれているセキュリティ強化機能、
アプリケーションなどのサブジェクトがファイルなどのオブジェクトにアクセスする際に
カーネル内のポリシー実行サーバがサブジェクトとオブジェクトの権限リストのAVC(Access Vector Cache)を見て、
拒否or許可の判別を行っている。


## 開発環境
VirtualBox 5.2.10
CentOS 7.5
## セットアップ
・まずは現在の状態確認（有効化されてるか）

```
[t.uranus@lilienne ~]$ getenforce
Disabled
```
|モード |概要 |
|---|---|---|
|enforcing |SElinuxの機能が有効　|
|disabled  |SElinuxの機能が無効|
|permissive|アクセス制限は無効だが、警告は出力してくれる　|

・disabledまたはpermissiveだった人↓
 configを弄ってSElinuxを有効化します。enforcingだった人は飛ばして結構です。

```bash:/etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled   //←変更前
SELINUX=enforcing　//←変更後
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are pr$
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted // ※1
```

※1 
SELINUXTYPE=tergetedの場合→対象となるネットワークデーモンのみ保護
SELINUXTYPE=strictの場合→すべてのデーモンを含む完全な保護

一般的にはtergetedでOKです。
tergetdのデフォルトで保護されるデーモン↓
dhcpd，httpd, mysqld, named, nscd, ntpd, portmap, postgres, snmpd, squid, syslogd, winbind

一旦rebootすると設定が反映されます。

## 使い方
今回はSELinux絡みで結構多いトラブル「ポート開放が上手くいかない問題」にスポットを当てて解説
sshのポートを変更しようとfirewalldにポートを追加しsshdを再起動しようとすると...

```
[t.uranus@lilienne ~]$ sudo systemctl restart sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.
```

原因はSElinuxが「なんだこのポートは！？ポリシーに載って無いぞ！」と弾いてしまうためである。
ログを確認してみると↓

```
[t.uranus@lilienne ~]$ sudo tail /var/log/secure
Dec  9 21:54:08 lilienne sshd[4406]: error: Bind to port 22022 on 0.0.0.0 failed: Permission denied.
Dec  9 21:54:08 lilienne sshd[4406]: error: Bind to port 22022 on :: failed: Permission denied.
Dec  9 21:54:08 lilienne sshd[4406]: fatal: Cannot bind any address.
```


例）sshdのポート22番を22022番に変更する場合↓

```
[t.uranus@lilienne ~]$ sudo semanage port -l | grep ssh //←現在のポートを確認する
ssh_port_t                     tcp      22
[t.uranus@lilienne ~]$sudo semanage port -a -t ssh_port_t -p tcp 22022//←SElinuxの設定に新しいポート番号を追加
[t.uranus@lilienne ~]$sudo semanage port -l | grep ssh　//←ポートが追加されたかを確認
ssh_port_t         tcp      22022,22
```


## 終わりに
鯖構築入門者にとって厄介者扱いされることの多いSElinuxも最近は便利なGUIツールも登場し、
設定の敷居が下がってきたため少しでも弄ってみるか...と思っていただければ幸いです。
厳格なセキュリティポリシーの設定が面倒という人はpermissiveで使うことで警告のみとしても利用できるため
まずはSELINUX=permissiveからでも是非SElinuxを活用してみて下さい！

・・・とまさかアドカレでSElinux扱うやつなんてそうそう居ないだろ...と高を括って意気揚々と本記事を書いたところ
居たんですよ...2年前に...
![DqZiIowUUAANVEe.jpg](https://qiita-image-store.s3.amazonaws.com/0/320285/54cace86-7cab-e491-e2dc-c78e23422a13.jpeg)


本記事の筆を置いたところで偶然にも発見してしまったため、興味の有る方は是非こちらもご覧下さい。↓↓
突貫工事の本記事よりかなり参考になります。

https://qiita.com/chi9rin/items/af532d0dd9237cc65741
SELinux を使おう．使ってくれ．

## 参考文献
・Linux高信頼サーバ構築ガイド シングルサーバ編　2009年