4 ポリシーの管理

ポリシー・ルールおよびその仕組みの詳細は、「ポリシー・ルールについて」を参照してください。

ポリシー・ルールのリスト

fapolicydによって使用されているポリシー・ルールをリストするには、次を実行します:

sudo fapolicyd-cli -l

このコマンドからの出力は、次のようになります:

-> %languages=application/x-bytecode.ocaml,application/x-bytecode.python,application/java-archive,text/x-java,application/x-java-applet,application/javascript,text/javascript,text/x-awk,text/x-gawk,text/x-lisp,application/x-elc,text/x-lua,text/x-m4,text/x-nftables,text/x-perl,text/x-php,text/x-python,text/x-R,text/x-ruby,text/x-script.guile,text/x-tcl,text/x-luatex,text/x-systemtap
1. allow perm=any uid=0 : dir=/var/tmp/
2. allow perm=any uid=0 trust=1 : all
3. allow perm=open exe=/usr/bin/rpm : all
4. allow perm=open exe=/usr/bin/python3.9 comm=dnf : all
5. deny_audit perm=any pattern=ld_so : all
6. deny_audit perm=any all : ftype=application/x-bad-elf
7. allow perm=open all : ftype=application/x-sharedlib trust=1
8. deny_audit perm=open all : ftype=application/x-sharedlib
9. allow perm=execute all : trust=1
10. allow perm=open all : ftype=%languages trust=1
11. deny_audit perm=any all : ftype=%languages
12. allow perm=any all : ftype=text/x-shellscript
13. deny_audit perm=execute all : all
14. allow perm=open all : all

ルールには番号が付けられています。fapolicydがデバッグ・モードで実行されると、出力にはイベントに対して適用されているルール番号が表示されます。この情報を使用し、新しいポリシー・ルールを挿入して既存のポリシーを変更する必要があるかどうかを決定し、そのルールをポリシー階層内のどこに配置する必要があるかを決定できます。デバッグの詳細は、「デバッグおよび許可モード」を参照してください。

このリストをコンパイル済ルールと比較して、ルールをfapolicydにリロードする必要があるかどうかを確認できます。

sudo cat /etc/fapolicyd/compiled.rules

「ポリシー・ルールの確認とロード」を参照してください。

ポリシー・ルールの作成

デフォルトのポリシーが制限されすぎてアプリケーションの実行を妨げている場合は、カスタム・ポリシー・ルールの作成が必要になる場合があります。カスタム・ポリシー・ルールを作成して、アプリケーションおよびファイルへのアクセスをさらに制限することもできます。ルールは、「ポリシー・ルールについて」およびfapolicyd.rules(5)マニュアル・ページで説明されている規則に従って/etc/fapolicyd/rules.dディレクトリに追加できます。

ルールの一般的な形式は次のとおりです:

decision perm subject : object
  • decision: イベントを許可するか拒否するか、およびそのアクションを記録するかどうか。値は、allowdenyallow_auditdeny_auditallow_syslogdeny_syslogallow_logまたはdeny_logです。
  • perm: オブジェクトを開いたとき、実行したとき、またはオブジェクトのアクティビティに対してトリガーするかどうかなど、ファイルに適用される権限のタイプ。値は、openexecuteまたはanyです。権限が指定されていない場合、デフォルト値はopenです。
  • subject: 権限および決定が適用されるオブジェクトに対してアクションを実行するアクター。この値は、すべてのアクターに対してallに設定できますが、特定のUID、GIDまたは別の実行可能ファイルに制限することもできます。値は、allauiduidgidsessionidpidppidtrustcommexedirdevicepatternです。詳細は、fapolicyd.rules(5)マニュアル・ページを参照してください。
  • object: 決定が適用されるファイルまたはアプリケーション。この値は、特定のファイルへのパス、ファイルのMIMEタイプ、または信頼データベース内のファイルの一致など、様々な方法で指定できます。値は、allpathdirdeviceftypetrustsha256hashです。詳細は、fapolicyd.rules(5)マニュアル・ページを参照してください。

1つのルールに対して複数のサブジェクト・ディレクティブとオブジェクト・ディレクティブを指定できます。たとえば、ファイル・パス、MIMEタイプおよびファイル・サイズをルールのオブジェクトとして照合できます。

ルールを作成して、カンマ区切りリストの整数または文字列の形式でキーと一連の値で構成されるマクロ(セット)を生成することもできます。セット・ルールにはパーセント(%)記号が接頭辞として付けられ、接頭辞としてパーセント(%)記号が付いたキーを指定することでルールの作成時に、そのセットを参照できます。セット・ルールの形式は次のとおりです:

%key=value1,value2

セット・ルールの例は、/etc/fapolicyd/rules.d/10-languages.rulesで確認できます。

次のルールの例を使用すると、環境のカスタム・ルールを作成する際にガイドとして役立ちます。

例4-1 信頼できるユーザーのグループがホーム・ディレクトリ内の定義済言語に一致するファイルを実行できるようにするルールの作成

  1. システム・グループを作成し、信頼できるユーザーをそのグループに追加するか、信頼できるユーザーの既存のグループを選択します。この例では、システム管理者にadmグループを使用します。
  2. /etc/fapolicyd/rules.d/50-adm-home-trust.rulesにポリシー・ルール・ファイルを作成し、次の内容を追加します:
    allow perm=any gid=adm : ftype=%languages dir=/home
    deny_log perm=any all : ftype=%languages dir=/home
    次の2つのルールが定義されています:
    • グループadm内のすべてのユーザーに、/homeディレクトリ内のファイル(/etc/fapolicyd/rules.d/10-languages.rulesに設定されたlanguagesに記述されているタイプ)に対するすべての権限を付与します。
    • /homeディレクトリ内のファイル(languagesマクロに記述されているタイプ)に対するすべての権限をすべてのユーザーに対して拒否します。deny_logルールにより、イベントが監査ログとシステム・ログの両方に追加されます。
  3. 新しいルールをコンパイルしてロードします。
    sudo fagenrules --load

    詳細は、「ポリシー・ルールの確認とロード」を参照してください。

  4. ルールが有効であることを確認します。
    1. admグループのユーザーとして、次の内容を含むテスト実行可能ファイルを$HOME/test_fapolicyd.pyに作成します:

      #/usr/bin/python3
      print("Test succeeded")
    2. ファイル・モードを実行可能ファイルに設定します:

      chmod +x $HOME/test_fapolicyd.py
    3. ファイルを実行します:
      $HOME/test_fapolicyd.py
      次のような出力結果が表示されます。
      Test succeeded
    4. admグループ内にないユーザーとして、同じステップを繰り返します。テスト・スクリプトを実行すると、次の出力が表示されます:

      bash: ./test_fapolicyd.py: Operation not permitted
      監査が構成されている場合は、次のように監査ログ内のエントリを確認できます:
      sudo ausearch --start today -m fanotify
      次のような出力が表示されます。
      ...
      time->Fri Jan  5 12:05:39 2024
      type=PROCTITLE msg=audit(1704456339.181:406): proctitle="bash"
      type=PATH msg=audit(1704456339.181:406): item=0 name="./test_fapolicyd.py" inode=68153551 
        dev=fc:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unconfined_u:object_r:user_home_t:s0 
        nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
      type=CWD msg=audit(1704456339.181:406): cwd="/home/guest"
      type=SYSCALL msg=audit(1704456339.181:406): arch=c000003e syscall=257 success=no exit=-1 
        a0=ffffff9c a1=555d4b74e050 a2=0 a3=0 items=1 ppid=46725 pid=46765 auid=1000 uid=1001 
        gid=1001 euid=1001 suid=1001 fsuid=1001 egid=1001 sgid=1001 fsgid=1001 tty=pts0 ses=3 
        comm="bash" exe="/usr/bin/bash" 
        subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)
      type=FANOTIFY msg=audit(1704456339.181:406): resp=2

例4-2 ユーザーが信頼できるアプリケーションを実行できるようにするルールの作成

特定のアプリケーションの実行を許可するルールの作成は、信頼データベースにアプリケーションを追加するよりも効率的ではありません。詳細は、「信頼ファイル・データベースへのファイルの追加」を参照してください。ファイル・アクセスをより明示的に制御する必要がある場合のみ、特定のファイルへのルールを追加します。この例では、信頼できるbashシェル・バイナリのみを使用して実行できる特定のバイナリ・アプリケーションを実行する機能を制御するルールが作成されます。

  1. /etc/fapolicyd/rules.d/80-trustapp.rulesにポリシー・ルール・ファイルを作成し、次の内容を追加します:
    allow_log perm=execute exe=/usr/bin/bash trust=1 : path=/opt/external/app.bin ftype=application/x-executable trust=0

    このルールでは、信頼できるbashシェルがパス/opt/external/app.binで信頼できないアプリケーションを実行しようとした場合(そのファイルがMIMEタイプapplication/x-executableの場合)、アクションが許可されます。決定がallow_logに設定されているため、ルールが機能していることを確認したときにアクションが記録されます。ルールを確認したら、決定をallowに変更できます。

    ヒント:

    ルールの記述時にファイルのMIMEタイプを確認するには、fapolicyd-cli --ftype /path-to-fileコマンドを実行します

    ファイルのMIMEタイプとファイルのロード方法を指定することによって、ルールが適切に制限されます。オプションで、ファイルのSHA-256ハッシュに基づいてより制限的なルールを作成できます。これにより、ファイルが変更された場合にルールが適用されなくなります:

    • ファイルのSHA-256ハッシュを取得します。
      sha256sum /opt/external/app.bin|awk '{print $1}'
    • SHA-256ハッシュを使用して、次のようにルールをリライトします:
      allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=340e...74f3cdd3babb

      sha256hashの値を、前のコマンドの実行で取得した値に設定します。

  2. 新しいルールをコンパイルしてロードします。
    sudo fagenrules --load

    詳細は、「ポリシー・ルールの確認とロード」を参照してください。

  3. ルールが有効であることを確認します。
    Bashシェルから標準ユーザーとして/opt/external/app.binを実行しようとすると、正しく実行されます。ルールの決定はallow_logであるため、fapolicydログを表示してアクション内のルールを確認できます。たとえば、次を実行します:
    sudo journalctl -S today -u fapolicyd|tail

    次のように、ルールが適用されていることが出力されます:

    Jan 05 14:22:36 ro-ansible-ol8 fapolicyd[45792]: rule=13 dec=allow_log 
      perm=execute auid=1000 pid=50439 exe=/usr/bin/bash : path=/opt/app.bin 
      ftype=application/x-executable trust=0

ポリシー・ルールの確認とロード

ルールが追加または変更された場合は、fapolicydが使用するコンパイル済ルール・セットとの整合性をチェックし、それらをfapolicydにロードする必要があります。

  1. /etc/fapolicyd/rules.d内のルールと/etc/fapolicyd/compiled.rules内のコンパイル済ルールとの間に不整合がないか確認します。
    sudo fagenrules --check

    /etc/fapolicyd/rules.dのルールが更新され、再コンパイルおよびロードが必要な場合、出力は次のようになります:

    /sbin/fagenrules: Rules have changed and should be updated
  2. /etc/fapolicyd/rules.dのルールをコンパイルし、それらをfapolicydにロードするには、次を実行します:
    sudo fagenrules --load

    変更を有効にするために、fapolicydを再起動する必要はありません。

  3. ルールをリストして、変更がfapolicydに正しくロードされたことを確認します。
    sudo fapolicyd-cli  -l

デフォルト・ポリシー・ロギングの変更

fapolicydとともに含まれているデフォルトのポリシー・ルールは、拒否の場合のみ監査ログに記録するように構成されます。この構成は本番システムに適していますが、これらのログに格納されている情報はデバッグのために制限される場合があります。イベントの最終決定に使用されるルールを追跡する必要がある場合は、デバッグ・モードでfapolicydを実行するか、ルールを変更して情報をシステム・ログに出力します。デバッグ・モードでのfapolicydの実行の詳細は、「デバッグおよび許可モード」を参照してください。

ポリシー・ルールの決定によって、情報をログに記録するかどうか、およびその情報をログに記録する方法が識別されます。デフォルトでは、拒否決定の場合、fapolicydパッケージに含まれるルールはdeny_auditの決定タイプを使用します。すべてのdeny_audit決定タイプをdeny_logに変更して、監査ログとシステム・ログの両方に情報を記録できます。

ロギングを拡張するには:

  1. /etc/fapolicyd/rules.dのすべてのルールを更新して、deny_auditdeny_logに置き換えます。
    sudo bash -c 'for i in /etc/fapolicyd/rules.d/*; do sed -i "s/deny_audit/deny_log/g" $i; done'

    許可ルールのロギングを有効にすることもできますが、有効にすると詳細出力になり、パフォーマンスに大きな影響を与える可能性があります。

  2. ルールが更新されていることを確認します。
    sudo fagenrules --check
  3. 新しいルールをロードします。
    sudo fagenrules --load
  4. ルールをレビューして、変更がfapolicydに正しくロードされていることを確認します。
    sudo fapolicyd-cli  -l | grep 'deny_log'

イベントがfapolicydによって拒否され、決定がdeny_logに設定されている場合、次のようなエントリがシステム・ログに表示されます:

fapolicyd[1478]: rule=13 dec=deny_log perm=execute auid=1000 pid=5361 exe=/usr/bin/bash : 
   path=/home/user/demo.bin ftype=application/x-executable trust=0

出力には、イベントを拒否する最終決定を行うためにfapolicydが使用したルールのルール番号が含まれていることに注意してください。

fapolicydのシステム・ログ・エントリを表示するには、次を実行します:

sudo journalctl -S today -u fapolicyd