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>.cilsemodule -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>はルール固有の権限です。たとえば、Red Hat ナレッジベースソリューション 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オプションは、数値を人間が判読できるテキストに解析します。