Red Hat Training

A Red Hat training course is available for RHEL 8

8.3. Creating a local SELinux policy module

アクティブな SELinux ポリシーに特定の SELinux ポリシーモジュールを追加することで、SELinux ポリシーに関する特定の問題を修正できます。この手順を使用して、Red Hat リリースノート で説明されている特定の既知の問題を修正するか、特定の Red Hat ソリューション を実装できます。

警告

Red Hat が提供するルールのみを使用します。Red Hat は、カスタムルールを使用した SELinux ポリシーモジュールの作成には対応していません。これは、製品サポートの対象範囲 外であるためです。専門家でない場合は、Red Hat の営業担当者に連絡し、コンサルティングサービスを依頼してください。

前提条件

  • 検証用の setools-console パッケージおよび audit パッケージ。

手順

  1. テキストエディターで新しい .cil を開きます。以下に例を示します。

    # vim <local_module>.cil

    ローカルモジュールをより適切に整理するには、ローカル SELinux ポリシーモジュール名で接頭辞 local_ を使用します。

  2. 既知の問題または Red Hat ソリューションからカスタムルールを挿入します。

    重要

    独自のルールを作成しないでください。特定の既知の問題または Red Hat ソリューションで提供されているルールのみを使用します。

    たとえば、SELinux denies cups-lpd read access to cups.sock in RHEL のソリューションを実装するには、以下の規則を挿入します。

    注記

    このサンプルソリューションは、RHBA-2021:4420 で RHEL 用に永続的に修正されました。したがって、このソリューションの特定の手順は更新済みの RHEL 8 システムおよび 9 システムに影響を与えず、構文のサンプルとしてのみ含まれています。

    (allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))

    2 つの SELinux ルール構文 CIL (Common Intermediate Language) および 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;
  3. ファイルを保存してから閉じます。
  4. ポリシーモジュールをインストールします。

    # semodule -i <local_module>.cil
    注記

    semodule -i を使用して作成したローカルポリシーモジュールを削除する場合は、.cil 接尾辞のないモジュール名を参照してください。ローカルポリシーモジュールを削除するには、semodule -r <local_module> を使用します。

  5. ルールに関連するサービスを再起動します。

    # systemctl restart <service-name>

検証

  1. SELinux ポリシーにインストールされているローカルモジュールを一覧表示します。

    # semodule -lfull | grep "local_"
    400 local_module  cil
    注記

    ローカルモジュールの優先順位は 400 であるため、semodule -lfull | grep -v ^100 コマンドを使用して、その値を使用してリストからそれらをフィルター処理することもできます。

  2. 関連する許可ルールを 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 操作が含まれているはずです。

  3. 関連するサービスが SELinux に制限されて実行されていることを確認します。

    1. 関連するサービスに関連するプロセスを特定します。

      $ systemctl status <service-name>
    2. 上記コマンドの出力で一覧表示されたプロセスの SELinux コンテキストを確認します。

      $ ps -efZ | grep <process-name>
  4. サービスが SELinux の拒否を引き起こさないことを確認します。

    # ausearch -m AVC -ts recent
    <no matches>