5.4. Creating a local SELinux policy module
アクティブな SELinux ポリシーに特定の SELinux ポリシーモジュールを追加することで、SELinux ポリシーに関する特定の問題を修正できます。この手順を使用して、Red Hat リリースノート で説明されている特定の既知の問題を修正するか、特定の Red Hat ソリューション を実装できます。
Red Hat が提供するルールのみを使用します。Red Hat は、カスタムルールを使用した SELinux ポリシーモジュールの作成には対応していません。これは、製品サポートの対象範囲 外であるためです。専門家でない場合は、Red Hat の営業担当者に連絡し、コンサルティングサービスを依頼してください。
前提条件
-
検証用の
setools-console
パッケージおよびaudit
パッケージ。
手順
テキストエディターで新しい
.cil
を開きます。以下に例を示します。# vim <local_module>.cil
ローカルモジュールをより適切に整理するには、ローカル SELinux ポリシーモジュール名で接頭辞
local_
を使用します。既知の問題または Red Hat ソリューションからカスタムルールを挿入します。
重要独自のルールを作成しないでください。特定の既知の問題または Red Hat ソリューションで提供されているルールのみを使用します。
たとえば、SELinux denies cups-lpd read access to cups.sock in RHEL のソリューションを実装するには、以下の規則を挿入します。
(allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))
このサンプルソリューションは、RHBA-2021:4420 で RHEL 用に永続的に修正されました。したがって、このソリューションの特定の手順は更新済みの RHEL 8 システムおよび 9 システムに影響を与えず、構文のサンプルとしてのみ含まれています。
2 つの SELinux ルール構文 (Common Intermediate Language (CIL) と m4) のどちらかを使用できます。たとえば、CIL の
(allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))
は、m4 の以下と同じになります。module local_cupslpd-read-cupssock 1.0; require { type cupsd_var_run_t; type cupsd_lpd_t; class sock_file read; } #============= cupsd_lpd_t ============== allow cupsd_lpd_t cupsd_var_run_t:sock_file read;
- ファイルを保存してから閉じます。
ポリシーモジュールをインストールします。
# semodule -i <local_module>.cil
semodule -i
を使用して作成したローカルポリシーモジュールを削除する場合は、.cil
接尾辞のないモジュール名を参照してください。ローカルポリシーモジュールを削除するには、semodule -r <local_module>
を使用します。ルールに関連するサービスを再起動します。
# systemctl restart <service-name>
検証
SELinux ポリシーにインストールされているローカルモジュールをリスト表示します。
# semodule -lfull | grep "local_" 400 local_module cil
ローカルモジュールの優先順位は
400
であるため、semodule -lfull | grep -v ^100
コマンドを使用して、その値を使用してリストからそれらをフィルター処理することもできます。関連する許可ルールを SELinux ポリシーで検索します。
# sesearch -A --source=<SOURCENAME> --target=<TARGETNAME> --class=<CLASSNAME> --perm=<P1>,<P2>
<SOURCENAME>
はソースの SELinux の種類、<TARGETNAME>
はターゲットの SELinux の種類、<CLASSNAME>
はセキュリティークラスまたはオブジェクトクラスの名前、そして<P1>
と<P2>
はルール固有の権限です。たとえば、SELinux denies cups-lpd read access to cups.sock in RHEL ソリューションの場合は、以下を行います。
# sesearch -A --source=cupsd_lpd_t --target=cupsd_var_run_t --class=sock_file --perm=read allow cupsd_lpd_t cupsd_var_run_t:sock_file { append getattr open read write };
最後の行には、
read
操作が含まれているはずです。関連するサービスが SELinux に制限されて実行されていることを確認します。
関連するサービスに関連するプロセスを特定します。
$ systemctl status <service-name>
上記コマンドの出力でリスト表示されたプロセスの SELinux コンテキストを確認します。
$ ps -efZ | grep <process-name>
サービスが SELinux の拒否を引き起こさないことを確認します。
# ausearch -m AVC -i -ts recent <no matches>
-i
オプションは、数値を人間が判読できるテキストに解析します。
関連情報