SELinux - AlmaLinux

SELinux とは?

SELinux ( Security-Enhanced Linux ) は、Linux のセキュリティをより強固なものにするため、米国国家安全保障局(NSA)によって開発されました。

多くの Linux では、デフォルトで有効になっておりそのままでは、動かないソフトなどが多いです。

状態

  • Alma
  • Rocky
設定値 内容
enforcing SELinuxは有効
permissive SELinuxは有効だが、アクセス制限は行わず警告を出力
disabled 無効の状態

SELinux の現在の状態を確認するには次のようにコマンドを実行します。

getenforce

SELinux を一時的に無効にするには次のようにコマンドを実行します。

sudo setenforce 0 # 設定値が Permissive の状態
sudo setenforce 1 # 設定値は Enforcing の状態

setenforce コマンドで一時的に無効にした場合は、OS を再起動すると設定ファイルの設定状態になります。

永続的に無効にする

  • Alma
  • Rocky

SELinux の設定ファイルの値を変更すれば、OSを再起動しても無効の状態のままです。

SELinux の設定ファイルのパスは、「 /etc/selinux/config 」です。

SELinux の設定ファイルを vi で開くには次のようにします。

sudo vi /etc/selinux/config

ファイルが開けたら設定ファイルの値を次のように変更します。

# 変更前
SELINUX=enforcing

# 変更後
SELinux=disabled

SELinux の設定ファイルを変更した後、OS を再起動すれば変更後の内容が反映されます。

OS を再起動するには「 sudo reboot 」コマンドを使います。

chocn、restorecon、semanage fcontext

chocn(change context)

chocnコマンドは一時的な変更を行います。

ファイルシステムの再ラベル付けや restorecon コマンドが実行されるとリセットされます。

semanage fcontext

ファイルのSELinuxコンテキストを永続的に変更します。

restorecon

SELinuxコンテキストをデフォルト値に復元するためのコマンドです。

chcon で設定した内容は消えて、コンテキストが元に戻ります

コファイル・ディレクトリのコンテキストを確認

設定されているファイルやディレクトリのコンテキストを確認するには、以下のコマンドを実行します。

ls -alZ

コンテキストは : で区切られた 4 つの項目からなり、それぞれユーザー、ロール、タイプ、機密ラベルとなっています。

項目 内容
SELinuxユーザー unconfined_u 制約のないユーザー
SELinuxロール object_r リソースを管理するための一般的なロール
SELinuxタイプ user_home_t ユーザーのホームディレクトリ内のファイル
セキュリティレベル s0 標準的なセキュリティレベル

SELinuxユーザー、SELinuxロール、SELinuxタイプの確認方法は、以下のコマンドを実行します。

# SELinuxユーザー
sudo semanage user -l

# SELinuxロール
sudo semanage role -l

# SELinuxタイプ
sudo semanage fcontext -l

sudo semanage role -lで、role が見つからない場合、seinfo -rを実行します。もしコマンドが見つからない場合は、以下を実行しインストールします。

sudo dnf -y install setools-console

SELinuxにおけるセキュリティレベル

SELinux のセキュリティレベルは、Multi-Level Security (MLS) や Multi-Category Security (MCS) という概念を含んでいます。

Multi-Level Security (MLS) は、情報の 機密レベル を細かく管理し、ユーザーやプロセスがアクセスできるデータを制限するためのセキュリティモデルです。

  • s0 : 最も低いセキュリティレベル
  • s1 : 機密レベルが高い
  • s2 : 機密情報レベル2(より厳しい制限)
  • s3 : 最高機密レベル(トップシークレット)

Multi-Category Security (MCS)は、カテゴリによるアクセス制御を行います。

c0.c1023は、Multi-Category Security (MCS) のラベルで、cc0 から c1023 までの 1024個のカテゴリ を含むことを示しています。

SELinux コンテキスト、SELinux Boolean値、 SELinux ポリシー

項目 SELinux コンテキスト SELinux Boolean値 SELinux ポリシー
目的 ファイルやプロセスにセキュリティ属性を設定 SELinux の機能を動的にon・offする システム全体のセキュリティルールを定義
構造 user:role:type:levelの形式で指定 論理値(true または false) ルールセットとして書かれたポリシーファイル
役割 特定のアクセス制御を実現するための属性を持つ 特定の機能や動作を一時的に有効化・無効化 どの操作が許可され、どの操作が拒否されるかを決定する
適用範囲 ファイル、プロセス、ネットワークポートなどの特定のリソースに適用 システムレベルでの特定機能や動作に影響 システム全体で適用される全体的なセキュリティモデル

SELinux コンテキスト

以下のコマンドを実行すると、設定されている SELinux コンテキストを確認できます。

# ファイルやディレクトリのSELinuxコンテキストを調べる
ls -Z

# 特定のプロセスのコンテキストを調べる
ps -Z

# ファイルやディレクトリのデフォルトのコンテキストを確認
sudo semanage fcontext -l

SELinux Boolean値

設定されているSELinux Boolean値を調べるには、以下のコマンドを実行します。

getsebool -a

# Booleanの詳細情報(永続性や説明など)を確認
sudo semanage boolean -l

以下を実行するとBoolean値の名前と状態を表示できます。

getsebool -a | awk '{print $1, $NF}'

# 名前だけを表示
getsebool -a | awk '{print $1}'

SELinux ポリシー

SELinuxのポリシーを調べるには、以下のコマンドを実行します。

# 現在使用されているSELinuxポリシーの種類を確認
sestatus

# インストールされているポリシーモジュールを確認
sudo semodule -l

# 具体的なポリシールールを確認
sesearch -A
コマンド 内容 使用例
sestatusSELinuxの状態やポリシータイプを確認するsestatus
getseboolSELinux Boolean値を確認するgetsebool -a
setseboolSELinux Boolean値を確認するsetsebool <Boolean名> <on/off>
ls -Zファイルやディレクトリのセキュリティコンテキストを確認するls -Z
chcon一時的にセキュリティコンテキストを変更するchcon -t <タイプ> <ファイル名>
restorecon元のデフォルトコンテキストに戻すrestorecon <ファイル名>
semodule -lインストール済みのポリシーモジュール一覧を表示するsemodule -l
semodule -iSELinuxポリシーモジュールをインストールまたは更新するsemodule -i <モジュール名>
semanage booleanBoolean値の永続性や説明を確認するsemanage boolean -l
sesearchSELinuxポリシー内のルールを検索するsesearch -A

sesearchコマンド

sesearchコマンドを利用することで、SELinuxのポリシー設定を検索することができます。

コマンドを実行するには、インストールが必要です。

sudo dnf -y install setools-console

エラーログ

SELinux のアクセス拒否のログは「 /var/log/audit/audit.log 」や「 /var/log/messages 」に出力されます。

正規表現でログを見つけるには、「 SELinux is preventing 」や「 denied 」を grepコマンドで調べます。

「 /var/log/audit/audit.log 」の場合は、"denied" を抽出します。

grep "denied" /var/log/audit/audit.log

「 /var/log/messages 」の場合は、"SELinux is preventing" を抽出します。

grep "SELinux is preventing" /var/log/messages

以下のようにすれば、アクセス拒否ログを監視することができます。

tail -f /var/log/audit/audit.log | grep "denied"
tail -f /var/log/messages | grep "SELinux is preventing"

SELinux のエラーログの確認

SELinux のログは、「 journalctl 」コマンドで確認することができます。journalctlは、Linux の systemd によって管理されるログを閲覧・管理するためのコマンドです。

SELinux のログを確認するには、journalctl -xe | grep SELinuxを実行します。

エラーがあった場合、以下のようなログが確認できます。

5月 21 21:06:19 localhost.localdomain setroubleshoot[980]: SELinux により、/usr/bin/lsmd による getattr アクセスが、ファイル /usr/bin/passt-repair で拒否されました。 完全な SELinux メッセージを見るには、sealert -l 96302691-bdb1-45bb-acdb-1fc739f33f20を実行します

sealert -l 96302691-bdb1-45bb-acdb-1fc739f33f20を実行することで詳細な内容が確認できます。

sealertは SELinux に関連するエラーや拒否されたアクセスの詳細な情報を提供するコマンドです。

sealert -l 96302691-bdb1-45bb-acdb-1fc739f33f20
SELinux により、/usr/bin/lsmd による getattr アクセスが、ファイル /usr/bin/passt-repair で拒否されました。

*****  プラグイン catchall (100. 信頼性) による示唆   *************************************

lsmd に、 passt-repair file の getattr アクセスがデフォルトで許可されるべきと考える場合。
このようにします: バグとして報告してください。
ローカルのポリシーモジュールを生成すると、
 このアクセスを許可することができます。
そして、以下を実行します:
以下を実行して、このアクセスを許可します:
# ausearch -c 'lsmd' --raw | audit2allow -M my-lsmd
# semodule -X 300 -i my-lsmd.pp


追加情報:
ソースコンテキスト                     system_u:system_r:lsmd_t:s0
ターゲットコンテキスト                   system_u:object_r:passt_repair_exec_t:s0
ターゲットオブジェクト                   /usr/bin/passt-repair [ file ]
ソース                           lsmd
ソースパス                         /usr/bin/lsmd
ポート                           <不明>
ホスト                           localhost.localdomain
ソース RPM パッケージ                 libstoragemgmt-1.10.1-1.el9.x86_64
ターゲット RPM パッケージ               passt-0^20250217.ga1e48a0-1.el9.x86_64
SELinux Policy RPM            selinux-policy-targeted-38.1.53-5.el9_6.noarch
ローカルポリシー RPM                  selinux-policy-targeted-38.1.53-5.el9_6.noarch
Selinux 有効化                   True
ポリシータイプ                       targeted
強制モード                         Enforcing
ホスト名                          localhost.localdomain
プラットフォーム                      Linux localhost.localdomain
                              5.14.0-570.12.1.el9_6.x86_64 #1 SMP
                              PREEMPT_DYNAMIC Tue May 13 06:11:55 EDT 2025
                              x86_64 x86_64
通知カウント                        5
最初の画面                         2025-05-21 18:56:46 JST
最後の画面                         2025-05-21 21:06:15 JST
ローカル ID                       96302691-bdb1-45bb-acdb-1fc739f33f20

生の監査メッセージ
type=AVC msg=audit(1747829175.145:24): avc:  denied  { getattr } for  pid=728 comm="lsmd" path="/usr/bin/passt-repair" dev="dm-0" ino=68274551 scontext=system_u:system_r:lsmd_t:s0 tcontext=system_u:object_r:passt_repair_exec_t:s0 tclass=file permissive=0


type=SYSCALL msg=audit(1747829175.145:24): arch=x86_64 syscall=newfstatat success=no exit=EACCES a0=ffffff9c a1=56238fba9850 a2=7ffc8f528ee0 a3=100 items=0 ppid=1 pid=728 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm=lsmd exe=/usr/bin/lsmd subj=system_u:system_r:lsmd_t:s0 key=(null)

Hash: lsmd,lsmd_t,passt_repair_exec_t,file,getattr

[user@localhost ~]$ ^C
[user@localhost ~]$ sudo ausearch -c 'lsmd' --raw | audit2allow -M my-lsmd
[sudo] user のパスワード:
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行してください。

semodule -i my-lsmd.pp