SELinux とは?
SELinux ( Security-Enhanced Linux ) は、Linux のセキュリティをより強固なものにするため、米国国家安全保障局(NSA)によって開発されました。
多くの Linux では、デフォルトで有効になっておりそのままでは、動かないソフトなどが多いです。
SELinux ( Security-Enhanced Linux ) は、Linux のセキュリティをより強固なものにするため、米国国家安全保障局(NSA)によって開発されました。
多くの Linux では、デフォルトで有効になっておりそのままでは、動かないソフトなどが多いです。
設定値 | 内容 |
---|---|
enforcing | SELinuxは有効 |
permissive | SELinuxは有効だが、アクセス制限は行わず警告を出力 |
disabled | 無効の状態 |
SELinux の現在の状態を確認するには次のようにコマンドを実行します。
getenforce
SELinux を一時的に無効にするには次のようにコマンドを実行します。
sudo setenforce 0 # 設定値が Permissive の状態
sudo setenforce 1 # 設定値は Enforcing の状態
setenforce コマンドで一時的に無効にした場合は、OS を再起動すると設定ファイルの設定状態になります。
SELinux の設定ファイルの値を変更すれば、OSを再起動しても無効の状態のままです。
SELinux の設定ファイルのパスは、「 /etc/selinux/config 」です。
SELinux の設定ファイルを vi で開くには次のようにします。
sudo vi /etc/selinux/config
ファイルが開けたら設定ファイルの値を次のように変更します。
# 変更前
SELINUX=enforcing
# 変更後
SELinux=disabled
SELinux の設定ファイルを変更した後、OS を再起動すれば変更後の内容が反映されます。
OS を再起動するには「 sudo reboot 」コマンドを使います。
chocnコマンドは一時的な変更を行います。
ファイルシステムの再ラベル付けや restorecon コマンドが実行されるとリセットされます。
ファイルのSELinuxコンテキストを永続的に変更します。
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 のセキュリティレベルは、Multi-Level Security (MLS) や Multi-Category Security (MCS) という概念を含んでいます。
Multi-Level Security (MLS) は、情報の 機密レベル を細かく管理し、ユーザーやプロセスがアクセスできるデータを制限するためのセキュリティモデルです。
Multi-Category Security (MCS)は、カテゴリによるアクセス制御を行います。
c0.c1023は、Multi-Category Security (MCS) のラベルで、cc0 から c1023 までの 1024個のカテゴリ を含むことを示しています。
項目 | SELinux コンテキスト | SELinux Boolean値 | SELinux ポリシー |
---|---|---|---|
目的 | ファイルやプロセスにセキュリティ属性を設定 | SELinux の機能を動的にon・offする | システム全体のセキュリティルールを定義 |
構造 | user:role:type:levelの形式で指定 | 論理値(true または false) | ルールセットとして書かれたポリシーファイル |
役割 | 特定のアクセス制御を実現するための属性を持つ | 特定の機能や動作を一時的に有効化・無効化 | どの操作が許可され、どの操作が拒否されるかを決定する |
適用範囲 | ファイル、プロセス、ネットワークポートなどの特定のリソースに適用 | システムレベルでの特定機能や動作に影響 | システム全体で適用される全体的なセキュリティモデル |
以下のコマンドを実行すると、設定されている SELinux コンテキストを確認できます。
# ファイルやディレクトリのSELinuxコンテキストを調べる
ls -Z
# 特定のプロセスのコンテキストを調べる
ps -Z
# ファイルやディレクトリのデフォルトのコンテキストを確認
sudo semanage fcontext -l
設定されているSELinux Boolean値を調べるには、以下のコマンドを実行します。
getsebool -a
# Booleanの詳細情報(永続性や説明など)を確認
sudo semanage boolean -l
以下を実行するとBoolean値の名前と状態を表示できます。
getsebool -a | awk '{print $1, $NF}'
# 名前だけを表示
getsebool -a | awk '{print $1}'
SELinuxのポリシーを調べるには、以下のコマンドを実行します。
# 現在使用されているSELinuxポリシーの種類を確認
sestatus
# インストールされているポリシーモジュールを確認
sudo semodule -l
# 具体的なポリシールールを確認
sesearch -A
コマンド | 内容 | 使用例 |
---|---|---|
sestatus | SELinuxの状態やポリシータイプを確認する | sestatus |
getsebool | SELinux Boolean値を確認する | getsebool -a |
setsebool | SELinux Boolean値を確認する | setsebool <Boolean名> <on/off> |
ls -Z | ファイルやディレクトリのセキュリティコンテキストを確認する | ls -Z |
chcon | 一時的にセキュリティコンテキストを変更する | chcon -t <タイプ> <ファイル名> |
restorecon | 元のデフォルトコンテキストに戻す | restorecon <ファイル名> |
semodule -l | インストール済みのポリシーモジュール一覧を表示する | semodule -l |
semodule -i | SELinuxポリシーモジュールをインストールまたは更新する | semodule -i <モジュール名> |
semanage boolean | Boolean値の永続性や説明を確認する | semanage boolean -l |
sesearch | SELinuxポリシー内のルールを検索する | sesearch -A |
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 のログは、「 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