fapolicydでFedora Server上の未知のソフトウェアを阻止:ホワイトリスティングによるセキュリティ強化

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Root権限だけではシステム保護に不十分な理由

ファイアウォールを多層化し、SELinuxをEnforcingモードで運用し、毎週パッチを適用していても、システムには依然として致命的な隙が存在します。ユーザーやサービスが乗っ取られ、/tmpに未知のスクリプトをダウンロードされ、+x権限を付与して実行されてしまえば、即座にリスクにさらされます。SELinuxは被害を制限できますが、実行(execution)そのものを段階で阻止することこそが、最も徹底的なアプローチです。

重要なプロジェクトでFedoraを2年間使用した経験から、本番環境には実行ファイルに対する「ゼロトラスト」メカニズムが必要だと痛感しました。原則は非常にシンプルです。許可されたものだけが実行され、それ以外はすべて禁止されます。これこそが、Fedora Server上でfapolicyd(File Access Policy Daemon)が真価を発揮する場面です。

なぜ従来の方法では不十分なのか?

設定を行う前に、なぜ古い解決策がプロの攻撃者を阻止するのに失敗しがちなのかを見てみましょう。

1. マウントオプション (noexec)

多くの管理者は/tmp/homenoexecオプションでマウントします。しかし、この手法は簡単にバイパス可能です。攻撃者はpython3 script.pyのようにインタプリタを直接呼び出すか、ld-linux.soを使用してバイナリをロードすることで、簡単に制限をすり抜けることができます。

2. SELinuxポリシー

SELinuxは非常に強力ですが、アプリケーションが実行された後に何ができるかに焦点を当てています。あらゆる場所での実行を阻止するポリシーを書くのは技術的に非常に困難であり、専門家でなければシステムをハングアップさせてしまうリスクもあります。

3. fapolicyd – 現代的なソリューション

このツールはfanotifyを介してカーネル層で動作します。最大の違いは、FedoraのRPMデータベースと直接統合されている点です。デフォルトでdnf経由でインストールされたすべてのソフトウェアを信頼し、外部から手動で持ち込まれたものは自動的にブロックします。

Fedora Serverにおける実用的なメリット

Fedoraにfapolicydを導入することで、管理者はかつてないほどの管理のしやすさを手に入れることができます。システムはRPMのDBを自動的にスキャンし、「正規品」を識別します。

  • パフォーマンス: 通常の運用条件下でのCPU使用率は、通常1%未満です。
  • 信頼性: 「Living off the land」(既存のツールを悪用した破壊活動)攻撃のリスクを90%低減します。
  • 有益な不便さ: 独自のスクリプトを無造作に実行しようとするとブロックされます。サーバーにおいて、この「不便さ」こそが最も価値のあるセキュリティレイヤーとなります。

fapolicydのインストールと設定ガイド

ここでは最新バージョンのFedora Serverでの手順を説明します。sudo権限を持っていることを確認してください。

ステップ1:パッケージのインストール

以下のコマンドを実行してデーモンをインストールします:

sudo dnf install fapolicyd -y

重要な注意点: すぐにサービスを起動しないでください。設定を誤ると、システム管理ツール自体から締め出される可能性があります。

ステップ2:信頼リストの更新

まず、fapolicydがRPMデータベースに基づいて許可されたファイルのリストを同期する必要があります:

sudo fapolicyd-cli --update

その後、サービスを有効化して監視を開始します:

sudo systemctl enable --now fapolicyd

ステータスを確認して、安定して動作しているかチェックします:

sudo systemctl status fapolicyd

ステップ3:動作テスト

/tmpディレクトリに簡単なスクリプトを作成して、どのようにブロックされるか試してみましょう:

echo -e "#!/bin/bash\necho 'Hacker script'" > /tmp/malware.sh
chmod +x /tmp/malware.sh
/tmp/malware.sh

システムはOperation not permittedというエラーを返します。たとえbash /tmp/malware.shコマンドで回避しようとしても、fapolicydはインタプリタも監視しているため、実行を阻止します。

独自アプリケーションをホワイトリストに追加する方法

実際には、RPMに含まれない自作のスクリプトやバイナリが必要になることがあります。元の設定ファイルである/etc/fapolicyd/fapolicyd.rulesを直接編集せず、rules.d内に独自のファイルを作成しましょう。

例:独自の管理ツールを許可する

/opt/admin-tools/sync-dataにあるツールを許可する場合、新しいルールファイルを作成します:

sudo nano /etc/fapolicyd/rules.d/90-admin-tools.rules

以下の行を追加して実行を許可します:

allow perm=any obj=/opt/admin-tools/sync-data

最後に、ルールを再読み込みし、データベースを更新して変更を適用します:

sudo fagenrules --load
sudo systemctl restart fapolicyd

Integrity Checkによる整合性の管理

非常に便利な機能の一つに、SHA256ハッシュ値のチェックがあります。攻撃者はホワイトリストに登録済みのファイルを悪意のあるコードで上書きする可能性があります。これに対抗するため、fapolicydは実行前にファイルのハッシュ値を照合できます。ハッシュ値が宣言と一致しない場合、実行は即座に拒否されます。

自らの設定で締め出されないための運用ノウハウ

導入初期、一時的な実行ファイルを作成するサービスを停止させてしまったことがありました。トラブルを避けるために、以下の3つのルールを適用することをお勧めします:

  1. デバッグモード: 完全に適用する前に、sudo fapolicyd --debugを実行して何がブロックされているかをリアルタイムで観察します。
  2. システムログの確認: 導入後の最初の1週間は、journalctl -u fapolicyd | grep denyコマンドを頻繁に使用してログを確認してください。
  3. パスによるホワイトリストの優先: 信頼できるスクリプトが多数含まれるディレクトリについては、ディレクトリごとホワイトリストに登録しますが、書き込み権限(write permission)を厳格に管理してください。

最後に

Fedora Serverでのfapolicydの使用は、受動的な防御から能動的な制御への転換を意味します。最初はルールの微調整に30〜60分ほどかかるかもしれませんが、未知のソフトウェアがサーバー上で一切実行されないという安心感は、その手間に十分見合う価値があります。

Share: