SELinuxカスタムポリシーをマスターする:「Permission Denied」で安易にセキュリティをオフにしないために

Security tutorial - IT technology blog
Security tutorial - IT technology blog

「Permission Denied」の恐怖と、やってはいけない悪習

午前2時、サーバーが500エラーを吐き出しました。ログを確認すると、chmod 777chownで適切にユーザー設定したはずなのに、忌々しいPermission Deniedの文字が。窮地に立たされた多くのシステム管理者は、つい反射的にsetenforce 0を実行してしまいがちです。これは便利ではありますが、鍵が回りにくいからといって、家の玄関ドアを取り外してしまうような非常に危険な行為です。

SELinux(Security-Enhanced Linux)は、本来「誠実だが少し融通の利かないボディーガード」のような存在です。無効化するのではなく、カスタムポリシー(Custom Policies)を作成することで、アプリケーションをスムーズに動作させつつ、機密データを安全に保つことができます。Red Hatのレポートによると, SELinuxは、たとえハッカーがプロセスのroot権限を奪取したとしても、権限昇格攻撃の最大90%を阻止できる能力を持っています。

SELinux競合への対処法の比較

アプリケーションがSELinuxによってブロックされた場合、通常3つの選択肢があります。なぜカスタムポリシーがプロフェッショナルな手法なのかを見ていきましょう。

1. Permissiveモード (setenforce 0)

  • 実態: これは「降伏」を意味します。アプリケーションはすぐに動作しますが、最も深い層のセキュリティが無効化されます。
  • リスク: Webサーバーにリモートコード実行(RCE)の脆弱性があった場合、ハッカーは何の障壁もなくシステムファイル全体を閲覧できてしまいます。

2. SELinux Booleansの使用

  • 実態: 非常に安全で、setseboolコマンドを通じて簡単に使用できます。
  • 制限: Apacheによるメール送信やデータベース接続の許可など、一般的なシナリオにしか対応できません。自社開発のアプリケーション(インハウスアプリ)の場合、これらのBooleanだけでは不十分なことが多いです。

3. カスタムポリシーの作成(根本的な解決策)

  • 実態: 最小権限の原則(Least Privilege)を適用します。アプリケーションは、許可された動作のみを行うことができます。
  • 評価: 設定に5〜10分ほど追加で時間はかかりますが、それと引き換えに本番環境での絶対的な安心感が得られます。

実践シナリオ:アプリケーションが「壁」を越える必要があるとき

例えば、/var/logではなく/opt/myapp/logsディレクトリにログを書き込む必要がある Python アプリがあるとします。デフォルトでは、SELinuxはこれを異常な動作と見なしてブロックします。この時、カスタムポリシーを作成することが、OSに対して「このPythonプロセスにのみ、特定のディレクトリへの書き込みを許可し、他は禁止し続ける」と命令する唯一の方法です。

システムを操作する前に、管理者アカウントに強力なパスワードが設定されていることを確認してください。私はよくToolcraft.appのパスワード生成ツールを使用して、32文字のランダムな文字列を作成しています。このツールはブラウザ上で100%動作するため、パスワードがインターネット経由で送信される心配はありません。

カスタムポリシーを導入する5つのステップ

ここでは、SELinuxによって設定ファイルの読み取り権限がブロックされているmyappというサービスを例に処理を進めます。

ステップ1:Permissiveモードで証拠を収集する

SELinuxを完全にオフにしないでください。アプリケーションを中断させることなく違反ログを収集するために、「記録」モードに切り替えます。

# Permissiveモードに切り替え
sudo setenforce 0

# 現在のモードがpermissiveであることを確認
sestatus

ステップ2:動作を再現する

アプリケーションを実行し、すべての機能(ファイルの読み取り、ネットワーク接続、ログの書き込みなど)をテストします。SELinuxは、ブロックされたすべての動作を/var/log/audit/audit.logに密かに記録します。

ステップ3:audit2allowでログを分析する

audit2allowツールは、ログをスキャンしてセキュリティポリシーを自動的に作成してくれます。

# 管理ツール一式をインストール
sudo yum install policycoreutils-python-utils -y

# アプリケーションに不足している権限をプレビュー
sudo grep "myapp" /var/log/audit/audit.log | audit2allow -m myapp_custom

表示された権限が妥当であれば、モジュールのパッケージ化に進みます:

sudo grep "myapp" /var/log/audit/audit.log | audit2allow -M myapp_custom

結果として、すぐに使用可能な myapp_custom.pp(ポリシーパッケージ)ファイルが生成されます。

ステップ4:新しいポリシーを有効化する

作成したポリシーを、以下のコマンドでLinuxカーネルにロードします:

sudo semodule -i myapp_custom.pp

ステップ5:セキュリティを再び強化する

システムを最も厳格な保護状態に戻すことを忘れないでください。

sudo setenforce 1

# すべてがスムーズに動作することを確認するために、アプリケーションを再チェック

ヒント:ファイルコンテキストによる迅速なエラー修正

エラーの原因がポリシーではなく、ファイルのラベル付けの間違いであることもよくあります。例えば、NginxのWebディレクトリを新しいドライブに移動した場合は、以下のコマンドを使用して標準のラベルを再割り当てします:

# 新しいディレクトリにラベルを割り当て
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"

# 変更を即座に適用
sudo restorecon -Rv /data/www

結びに

SELinuxカスタムポリシーをマスターすれば、単にsetenforce 0と打ち込むだけの管理者から一線を画すことができます。セキュリティは、強力な管理者パスワードの作成から各プロセスのアクセス権限の厳格化まで、多層的なプロセスです。鉄壁のLinuxシステムを構築できることを願っています!

Share: