5.4. Creating a local SELinux policy module
既知の問題に関連する問題を修正したり、特定の Red Hat ソリューションを実装したりするために、特定のローカル SELinux ポリシーモジュールを作成して追加します。細心の注意を払い、Red Hat が直接提供するルールのみを適用してください。
アクティブな SELinux ポリシーに特定の SELinux ポリシーモジュールを追加することで、SELinux ポリシーに関する特定の問題を修正できます。この手順を使用して、Red Hat リリースノート に記載されている特定の既知の問題を修正したり、特定の Red Hat ソリューション を実装したりできます。
Red Hat が提供するルールだけを使用してください。Red Hat では、カスタムルールを使用した SELinux ポリシーモジュールの作成はサポートしていません。これは、製品サポートの対象範囲 外であるためです。専門家でない場合は、Red Hat の営業担当者に連絡し、コンサルティングサービスを依頼してください。
前提条件
-
検証用の
setools-consoleパッケージおよびauditパッケージ。
手順
テキストエディターで新しい
.cilを開きます。以下に例を示します。# vi <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 で {ProductShortName} 用に永続的に修正されました。したがって、このソリューションに固有の手順の部分は、更新済みの {ProductShortName} 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>はルール固有の権限です。たとえば、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オプションは、数値を人間が判読できるテキストに変換します。