Red Hat Training

A Red Hat training course is available for RHEL 8

7.3. ローカルSELinuxポリシーモジュールの作成

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

警告

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

前提条件

  • 検証用のsetools-consoleauditのパッケージです。

手順

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

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

    重要

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

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

    (allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))

    なお、SELinuxルールの構文は、CIL(Common Intermediate Language)とm4の2種類がありますが、どちらを使っても構いません。例えば、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ポリシーを検索して、関連する許可ルールを探します。

    # sesearch -A --source=<SOURCENAME> --target=<TARGETNAME> --class=<CLASSNAME> --perm=<P1>,<P2>

    ここで <SOURCENAME> (ソース)はソースのSELinuxタイプです。 <ターゲット名> (TARGETNAME)はターゲットの SELinux タイプです。 <CLASSNAME> (クラス名)は、セキュリティクラスまたはオブジェクトクラス名であり <P1><P2>はルールの特定のパーミッションです。

    例えば、RHELのソリューションでは、SELinuxがcups-lpdのcups.sockへの読み取りアクセスを拒否しています。

    # sesearch -A --source=cupsd_lpd_t --target=cupsd_var_run_t --class=sock_file --perm=read
    allow cupsd_lpd_t cupsd_var_run_t:dir { getattr open search };
    allow cupsd_lpd_t cupsd_var_run_t:sock_file { append getattr open read write };

    最後の行には、"open "の操作が含まれているはずです。

  2. 該当するサービスがSELinuxで制限されて実行されていることを確認します。

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

      $ systemctl status <service-name>
    2. 前のコマンドの出力に表示されているプロセスのSELinuxコンテキストを確認します。

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

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