RHEL9でSELinuxを無効化する方法

## はじめに

SELinux（Security-Enhanced Linux）は、Linuxのセキュリティをより強固なものにするため、米国国家安全保障局(NSA)によって開発されました。
Red Hat Enterprise Linuxでは標準で有効化されています。

有効化のままだとアプリケーションやミドルウェアが正常に動作しない場合が多く、仕様も難しいため、現場では無効化していることが多いと思います。

今回は、RHEL9でSELinuxの無効化方法が変更されたため、その方法をご紹介します。

## RHEL8からRHEL9へのSELinux無効化の変更点

### RHEL8以前での無効化方法

RHEL8以前では、以下の方法でSELinuxを無効化できました。

```bash
# /etc/selinux/config ファイルを編集
SELINUX=disabled
```

### RHEL9での変更点

RHEL9では、**設定ファイルによる無効化（`SELINUX=disabled`）の動作が変更**され、以下の理由で推奨されなくなりました。

1. **動作の変更**
   - RHEL8まで：`/etc/selinux/config`で`SELINUX=disabled`を設定すると、ブート時にカーネルレベルでSELinuxが完全に無効化されていました。
   - RHEL9から：`SELINUX=disabled`を設定しても、カーネル自体はSELinux機能を有効にしたまま起動し、SELinuxポリシーがロードされない状態となります。

2. **推奨される無効化方法**
   - RHEL9でSELinuxを完全に無効化したい場合は、カーネルパラメータ`selinux=0`を指定する必要があります。
   - 公式には、`grubby`コマンドでカーネルパラメータを追加し、再起動する方法が推奨されています。

**参考リンク**
- [How do I turn SELinux off in Red Hat Enterprise Linux? (Red Hat Customer Portal)](https://access.redhat.com/solutions/3176)

## 実際のRHEL9設定ファイルの内容

実際のRHEL9システムの`/etc/selinux/config`ファイルの内容は以下の通りです。

```bash
# 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.
# See also:
# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux/changing-selinux-states-and-modes_using-selinux#changing-selinux-modes-at-boot-time_changing-selinux-states-and-modes
#
# NOTE: Up to RHEL 8 release included, SELINUX=disabled would also
# fully disable SELinux during boot. If you need a system with SELinux
# fully disabled instead of SELinux running with no policy loaded, you
# need to pass selinux=0 to the kernel command line. You can use grubby
# to persistently set the bootloader to boot with selinux=0:
#
#    grubby --update-kernel ALL --args selinux=0
#
# To revert back to SELinux enabled:
#
#    grubby --update-kernel ALL --remove-args selinux
#
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```
### 設定ファイルの各項目の説明

#### SELinuxの状態設定
```bash
SELINUX=enforcing  # 現在の設定
```

- **enforcing**：SELinuxポリシーが強制される（デフォルト）
- **permissive**：警告のみでポリシーを強制しない
- **disabled**：ポリシーが読み込まれない（RHEL9では完全無効化ではない）

#### SELinuxタイプの設定
```bash
SELINUXTYPE=targeted  # 現在の設定
```

- **targeted**：対象プロセスのみ保護（一般的）
- **minimum**：最小限のプロセスのみ保護
- **mls**：マルチレベルセキュリティ保護

このファイルの注意書きで最も重要な部分は以下です。

```bash
# NOTE: Up to RHEL 8 release included, SELINUX=disabled would also
# fully disable SELinux during boot. If you need a system with SELinux
# fully disabled instead of SELinux running with no policy loaded, you
# need to pass selinux=0 to the kernel command line.
```

翻訳すると、RHEL 8リリースまでにおいては、`SELINUX=disabled` の設定で起動時にSELinuxが完全に無効化されていました。
もしSELinuxが動作する状態ではなく、完全に無効化されたシステムが必要な場合は、カーネルのコマンドラインに `selinux=0` を渡す必要があります。
つまり、設定ファイルを`SELINUX=disabled`にしても完全に無効化できないのです。
SELinuxポリシーが読み込まれていない状態ではあるものの、予期せぬ動作が起こる可能性は残っています。
私も現場で従来通りviで設定ファイルを編集した際、注意書きがあることに気づきました。



## RHEL9での正しいSELinux無効化手順

### grubbyコマンドを使用した無効化

```bash
# 1. grubbyパッケージがインストールされていることを確認（標準でインストールされている）
rpm -q grubby

# 2. カーネルパラメータにselinux=0を追加
grubby --update-kernel ALL --args selinux=0

# 3. システムを再起動
reboot

# 4. 無効化の確認
getenforce
# 出力: Disabled
sestatus
# 出力: SELinux status: disabled
```

## SELinuxの再有効化

SELinuxを再度有効にしたい場合は、以下のコマンドを使用します。

```bash
# selinux=0パラメータを削除
grubby --update-kernel ALL --remove-args selinux

# システムを再起動
reboot

# 有効化の確認
getenforce
# 出力: Enforcing
```

## まとめ

- **RHEL9では`grubby`コマンドが標準的な無効化方法**
- **`/etc/selinux/config`での`SELINUX=disabled`設定は動作が変更され、完全無効化ではない**

以上です。この記事が皆さんのお役に立てれば幸いです。