ファイル・アクセス・ポリシー・デーモンの構成
fapolicydが信頼できるソースとポリシー・ルールを使用してファイル・アクセスを制御する方法について学習します。
ファイル・アクセス・ポリシー・デーモン(fapolicyd)は、実行権限のあるアプリケーションを制限することでシステムの保護に役立てるために使用できるサービスです。このサービスは、SELinuxなどの他のセキュリティ関連サービスを補完するために使用できます。ファイルとアプリケーションがシステムにどのようにインストールされているか、およびそれらが信頼されているかどうかには関係しないSELinuxとは異なり、fapolicydは、アプリケーションが信頼できるかどうか、およびシステムにどのようにインストールされているかに基づいてポリシー決定を実装します。
fapolicydは、fanotifyカーネルAPIを使用してファイル・システム・イベントをモニターします。ファイルがアクセスされると、fapolicydは、信頼データベースに対してファイルをチェックし、一連のポリシー・ルールを評価することによって、イベントを続行できるかどうかを決定します。ファイルが信頼データベースになく、ポリシー・ルールによってアクションが拒否された場合、イベントはブロックされ、EACCESSの「権限が拒否されました」エラーがユーザーに返されます。
fapolicydは、DNFプラグインを使用して、DNFによってインストールされたファイルを信頼データベースに自動的に追加します。このアプローチは、システムに適切にインストールされたファイルを評価する際に、fapolicydをより効率的にするのに役立ちます。ファイルはSHA-256ハッシュに基づいて評価できるため、信頼データベースに追加された後に変更することはできません。オプションで、DNFによってインストールされていないファイルの信頼データベースにファイルを追加できます。ファイルを手動で追加した後、またはDNFフレームワークの外部でrpmコマンドを使用してファイルをインストールする場合は、データベースをリロードする必要があります。
fapolicydによってキャッシュが使用され、パフォーマンスの向上、ルールの処理および頻繁なイベントのデータベース参照の実行に要する時間の短縮に役立ちます。
fapolicydルールでは、イベントの監査に使用できるロギング・オプションを定義します。デフォルトのポリシーでは、ausearchコマンドを使用して表示できる監査ログが使用されます。ポリシー・ルールを変更して、システム・ログまたは監査ログとシステム・ログの両方にログを記録し、デバッグに役立てることができます。
fapolicydの詳細は、https://github.com/linux-application-whitelisting/fapolicydを参照してください。
信頼データベースについて
fapolicydは、信頼データベースを使用して、システムによって信頼されているファイルを効率的に検索します。ファイルが信頼データベースにない場合、fapolicydは処理ポリシー・ルールに戻り、イベントを許可するかどうかを決定します。
信頼データベースは、インストールされているRPMパッケージについてfapolicydが収集する情報と、構成ファイルを使用して手動で追加される情報にパーティション化されます。
信頼データベースには、RPMデータベースから情報をコピーすることで、システムにインストールされているファイルに関する情報が自動的に移入されます。fapolicydが起動されるか、更新が実行されると、RPMデータベースにリストされているすべてのファイルの信頼データベースが更新されます。新しいパッケージがインストールされるか、DNFを使用してパッケージが更新されると、信頼データベースも自動的に更新されます。パッケージ・データの追跡はfapolicyd-dnf-pluginによって処理され、DNFの更新またはインストールについてfapolicydデーモンに通知します。
RPMコマンドを使用してパッケージを直接インストールする場合、fapolicyd RPMデータベースは更新されず、システムのフリーズが発生する可能性があります。この場合、信頼データベースをリフレッシュする際に便利です。詳細は、「信頼データベースのリフレッシュ」を参照してください。
Administrators can also add files to the trust database manually when files are installed or added to the system outside of the usual DNF and RPM packaging mechanisms, such as compiling binaries from source, or when using the Python pip utility, Ruby's gem utility, Node.js's npm utility, or Perl's CPAN tooling.
信頼データベースでは、RPMデータベースに属しているために信頼されるファイルと、信頼データベースに手動で追加されたために信頼されるファイルという2つのタイプの信頼が区別されます。たとえば、RPMデータベースから信頼されるエントリのタイプは、rpmdbです:
rpmdb /usr/bin/dnf-3 2092 0a53d05260ba7ed4573...7ec64816e3ad49a2078c84836aeb7833e
信頼データベースに手動で追加されるファイルのタイプは、filedbです。次に例を示します:
filedb /home/user/demo.bin 140468 e38cd120c925...46c9cd1aa83e44e697f0f3393d98b305
データベースには、ファイルへのパス、ファイルのサイズ(バイト)およびファイルのSHA-256ハッシュも格納されます。ファイル・サイズおよびSHA-256ハッシュを使用して、ファイルに対してさらに整合性チェックを実行し、システムが悪意のあるアクティビティに対してより制限的で堅牢になります。整合性チェックを有効にすると、特定の場所にあるファイルを変更することによって、fapolicydで作業しているユーザーに対して保護できますが、システム・デッドロックのリスクが高まるため、整合性チェックのためにfapolicydを構成することはお薦めしません。整合性チェックは、デフォルトではfapolicydで無効になっています。詳細は、「信頼の不一致のチェック」および「信頼データベースのエントリのリスト」を参照してください。
信頼データベース内の信頼できるファイルの処理はキャッシュされ、個々のポリシー・ルールの処理よりはるかに高速です。したがって、DNFの外部でシステムで使用可能な特定のアプリケーションまたはファイルを信頼するためにfapolicydが必要な場合は、それらのルールを定義するよりも、それらを信頼ファイル・データベースに追加する方が効率的です。ユーザー権限またはグループ権限に関するカスタム・ルールが必要な場合のみ、個々のファイルのポリシー・ルールを追加します。
ポリシー・ルールについて
ポリシー・ルールは、信頼データベース内に明示的にリストされていないファイルをfapolicydが処理する方法を制御します。ポリシー・ルールを使用して、信頼データベース内にあるファイルのシステムでの動作をさらに制限することもできます。ポリシー・ルールを使用して、fapolicydの制限を厳しくしたり緩くしたりできます。ポリシー・ルールを定義して、指定したシナリオの特定のアプリケーションを許可または拒否する例外を作成できます。たとえば、特定のユーザーまたはグループに対してアプリケーションを明示的に許可するが、それ以外のすべてのユーザーに対してアプリケーションを拒否するルールを作成できます。
fapolicydパッケージには、次の2つのポリシー・ルール・セットが含まれています:- known-libsポリシー
known-libsポリシーはデフォルトのルール・セットであり、既知のアプリケーションまたはライブラリの実行のみを許可することによってシステムを保護するように設計されています。このポリシーは、Elfバイナリ、pythonプログラムおよびシェル・スクリプトを信頼できるアプリケーションおよびライブラリに対して実行できるため、少し許容度がより高くなります。
- restrictiveポリシー
restrictiveポリシーは、known-libsポリシーとほとんど同じルールを提供しますが、信頼データベース内にないアプリケーションまたはライブラリの実行を妨げる、より制限的なルールがいくつか含まれています。このポリシーは、信頼されていない実行可能ファイルを実行する可能性をブロックします。
これらのポリシーのルールは、/usr/share/fapolicyd/sample-rules/に含まれます。known-libsポリシーに適用されるルールは、パッケージのインストール時に/etc/fapolicyd/rules.d/にコピーされ、アクティブになります。各ポリシーに適用されるファイルについては、/usr/share/fapolicyd/sample-rules/README-rulesで説明します。
fapolicydは、自然なソート順序に基づいてルールを処理するため、ルール・ファイルには、次の接頭辞規則に従って名前が付けられます:
10-: 他のルールで使用できるマクロの定義。20-: dracutがカーネルのinitramfsファイルをビルドする場合や、DNFが更新のために特定のツールを実行する必要がある場合など、システム・クリティカル・アクティビティに対してfapolicydを処理するルール。30-: プログラムの起動方法を示すアクセス・パターンを識別するルール。デフォルト・ルールは、実行時リンカー(ld.so)によって起動されるプログラムをチェックします。40-: ELFライブラリおよび信頼できるELFバイナリ実行可能ファイルに対して信頼できるルールであっても、不正な形式のELFファイルが実行されないようにするルールなどのELFバイナリファイルのルール。50-: 特定のプログラムを実行したり、特定のファイルにアクセスする際に信頼するユーザーまたはグループを設定するルール。60-: アプリケーションが信頼データベースにない場合の特定のアプリケーションにアクセスするためのルール。70-: Python、Perl、PHP、Ruby、Luaなどの様々なプログラミング言語またはスクリプト言語に関連するルール。80-: 高度なアクセス制御が必要になる可能性のある信頼できるアプリケーションのルール。90-: 一般的なキャッチオール許可および拒否ルール。
ルールは、実行時にfapolicyd読取りを行う/etc/fapolicyd/compiled.rules内の単一のファイルにコンパイルされます。
ルール構造の詳細は、fapolicyd.rules(5)マニュアル・ページを参照してください。