【失敗】Raspberry PiでSELinuxを有効にする。

# はじめに

今回は、Raspberry PiのRaspbianにSELinuxを導入します。
タイトルにあるように失敗したのですが、一応記録に残しておきます。

# 環境

今回使用した環境は以下の通りです。

### その1

MacBook Pro (Retina, 13-inch, Late 2013)
macOS 10.14.2
VMware Fusion 11.0.2
Debian Stretch with Raspberry Pi Desktop 2018-11-26

### その2

Raspberry Pi 3 Model B
Raspbian Stretch with desktop 2018-11-13

環境1は比較用です。特に断りが無い限り、両方の環境で操作を行っています。

# SELinuxパッケージのインストール

Raspbianは、Debianを元にしたパッケージなので、[ここ](https://debian-handbook.info/browse/stable/sect.selinux.html)を参考に必要なパッケージをインストールします。

### 環境その1

特に問題なくインストール完了。

```bash
pi@raspberry-vm1:~ $ sudo apt-get install selinux-basics selinux-policy-default auditd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  checkpolicy gawk libauparse0 libsigsegv2 m4 policycoreutils policycoreutils-dev policycoreutils-python-utils python3-audit python3-decorator python3-ipy python3-networkx python3-scipy python3-selinux python3-semanage python3-sepolgen python3-sepolicy python3-setools python3-yaml selinux-policy-dev selinux-utils setools
提案パッケージ:
  audispd-plugins gawk-doc m4-doc python-networkx-doc python-scipy-doc logcheck syslog-summary setools-gui
以下のパッケージが新たにインストールされます:
  auditd checkpolicy gawk libauparse0 libsigsegv2 m4 policycoreutils policycoreutils-dev policycoreutils-python-utils python3-audit python3-decorator python3-ipy python3-networkx python3-scipy python3-selinux python3-semanage python3-sepolgen python3-sepolicy python3-setools python3-yaml selinux-basics selinux-policy-default selinux-policy-dev selinux-utils setools
アップグレード: 0 個、新規インストール: 25 個、削除: 0 個、保留: 1 個。
15.3 MB のアーカイブを取得する必要があります。
この操作後に追加で 65.4 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
(省略)

pi@raspberry-vm1:~ $ sudo sestatus
SELinux status:                 disabled
```

### 環境その2

いろいろと警告やエラーが発生。特にauditdのインストールに失敗。

```bash
pi@raspberrypi1:~ $ sudo apt-get install selinux-basics selinux-policy-default auditd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  checkpolicy libauparse0 m4 policycoreutils policycoreutils-dev policycoreutils-python-utils python3-audit python3-decorator python3-ipy python3-networkx python3-scipy python3-selinux python3-semanage python3-sepolgen python3-sepolicy python3-setools python3-yaml selinux-policy-dev selinux-utils setools
提案パッケージ:
  audispd-plugins m4-doc python-networkx-doc python-scipy-doc logcheck syslog-summary setools-gui
以下のパッケージが新たにインストールされます:
  auditd checkpolicy libauparse0 m4 policycoreutils policycoreutils-dev policycoreutils-python-utils python3-audit python3-decorator python3-ipy python3-networkx python3-scipy python3-selinux python3-semanage python3-sepolgen python3-sepolicy python3-setools python3-yaml selinux-basics selinux-policy-default selinux-policy-dev selinux-utils setools
アップグレード: 0 個、新規インストール: 23 個、削除: 0 個、保留: 0 個。
14.1 MB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 59.2 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
(省略)
auditd (1:2.6.7-2) を設定しています ...
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Job for auditd.service failed because the control process exited with error code.
See "systemctl status auditd.service" and "journalctl -xe" for details.
invoke-rc.d: initscript auditd, action "start" failed.
● auditd.service - Security Auditing Service
   Loaded: loaded (/lib/systemd/system/auditd.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2018-12-21 06:59:09 JST; 35ms ago
     Docs: man:auditd(8)
           https://people.redhat.com/sgrubb/audit/
  Process: 8294 ExecStartPost=/sbin/augenrules --load (code=exited, status=1/FAILURE)
  Process: 8293 ExecStart=/sbin/auditd -n (code=exited, status=1/FAILURE)
 Main PID: 8293 (code=exited, status=1/FAILURE)

12月 21 06:59:09 raspberrypi1 systemd[1]: Starting Security Auditing Service...
12月 21 06:59:09 raspberrypi1 augenrules[8294]: /sbin/augenrules: No change
12月 21 06:59:09 raspberrypi1 auditctl[8305]: Error - audit support not in kernel
12月 21 06:59:09 raspberrypi1 systemd[1]: auditd.service: Main process exited, code=exited, s…ILURE
12月 21 06:59:09 raspberrypi1 systemd[1]: Failed to start Security Auditing Service.
12月 21 06:59:09 raspberrypi1 systemd[1]: auditd.service: Unit entered failed state.
12月 21 06:59:09 raspberrypi1 systemd[1]: auditd.service: Failed with result 'exit-code'.
Hint: Some lines were ellipsized, use -l to show in full.
dpkg: パッケージ auditd の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
(省略)
policycoreutils (2.6-3) を設定しています ...
selinux-autorelabel-mark.service is a disabled or a static unit, not starting it.
(省略)
selinux-policy-default (2:2.20161023.1-9) を設定しています ...
Updating selinux default policy (this step might take a moment)...libsemanage.semanage_direct_install_info: abrt module will be disabled after install due to default enabled status.
libsemanage.semanage_direct_install_info: certwatch module will be disabled after install due to default enabled status.
(以下同様＆省略)
処理中にエラーが発生しました:
 auditd
E: Sub-process /usr/bin/dpkg returned an error code (1)

pi@raspberrypi1:~ $ sudo sestatus
SELinux status:                 disabled
```

# SELinuxの有効化

とりあえず続けます。

### 環境その1

selinux-activateコマンドを実行して、指示通りOSを再起動するだけです。
/.autorelabelファイルが作成されているので、起動時にファイルシステムの再ラベル付けが行われます。

```bash
pi@raspberry-vm1:~ $ sudo selinux-activate
Activating SE Linux
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Linux イメージを見つけました: /boot/vmlinuz-4.9.0-8-amd64
Found initrd image: /boot/initrd.img-4.9.0-8-amd64
完了
SE Linux is activated.  You may need to reboot now.

pi@raspberry-vm1:~ $ ls -la /.autorelabel 
-rw-r--r-- 1 root root 0 12月 21 07:15 /.autorelabel

pi@raspberry-vm1:~ $ sudo shutdown -r now
```

```bash
pi@raspberry-vm1:~ $ sudo sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             default
Current mode:                   permissive
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      30
```

### 環境その2

どうやら、RaspbianのKernelにSELinuxが組み込まれていないのが原因のようです。
解決するには、Kernelの再ビルドが必要なため、今回はここまでです。

# 参考

The Debian Administrator's Handbook
[14.5. Introduction to SELinux](https://debian-handbook.info/browse/stable/sect.selinux.html)