2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AppArmorでApache用のプロファイル作る

Last updated at Posted at 2022-01-17

AppArmorとは

プログラムごとにファイルアクセス、システムコール等の制限(強制アクセス制御 MAC)を行うLinuxモジュールで、ubuntuには最初から入っている。
アプリの作り込みが甘い、ApacheやPHP等のゼロデイで任意コード実行される、等仮にあっても変な場所へアクセスするのを外的に防いでくれる。
多層防御のために重要で、是非設定しておきたい。
※例えば脆弱性によるWebShell設置などは当然パーミッション設定でも防ぐべきだが、仮にそこが漏れてもAppArmorで書き込み許可していなければ弾いてくれる

制限ルールは「プロファイル」として実行ファイルごとに作る。
少なくともubuntu 20.04ではApache用プロファイルはout of the boxの形では無いが、共通部分はパーツとして用意してくれているので、これと学習ツールを使ってプロファイルを作る。
難しそうだが実は割と簡単にできる。
(おそらく環境により必要なルールが変わるので、デフォルトを用意しても制限キツすぎて脳死で除外されるか、ガバガバで無意味になるかにしかならないと思う)

なお、apacheから他のプログラムを呼び出すような場合も、親プロセスのルールを継承させることもできるし、別プロファイルに切り替えることもできるため、問題なく使える。

インストール

そのものはubuntuに一体で入っているが、ツールはインストール必要。

sudo apt install auditd apparmor-utils

プロファイル作成

まずaa-genprofを使って実際のプログラムの挙動からルールを自動生成、その後に手でよしなに修正する。

Step 1 自動生成

sudo aa-genprof /usr/sbin/apache2 で学習状態に入るので、apacheにアクセスして色々なアクセスを実施。
起動時のみアクセスするファイルなどもあるので、別ターミナルでapacheの停止・起動もしておく。
終わったら (S)can を指定して今までの挙動から提案されるルールを取捨選択していく。
終わったら(F)で終了。

  • 可能ならファイル単位ではなくワイルドカードでフォルダ単位指定をしてシンプルに(Globを選ぶ)
    • /var/www/html/myproject/** r など
  • 権限は最小限に。書き込み(w)、実行(x)は特に。
    • /var/www/html/myproject/logs/* rwk のように必要な箇所だけ付与
  • 一般的に使われるルールの固まり(abstractions)が用意されており、これが使そうなら提示してくれるので可能ならそれを選ぶ (中身は/etc/apparmor.d/abstractions/にある)

Step 2 手修正

Step1で出来たルールが/etc/apparmor.d/usr.sbin.apache2に出来ているので、globで纏めたり、広すぎる許可を狭めたりの手調整を行う。
ターゲットやrwxk等の権限設定の書き方は公式ドキュメントを参照。

またフラグ attach_disconnected を追加したほうが良さそう。パス解決時に頭に/があるものとして見てくれるもので、無いとパス解決が上手くいかずDENIEDになる処理があった。

profile /usr/sbin/apache2 flags=(attach_disconnected) { #←このflags=(...)を追加

作ったプロファイルの読み込み

sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.apache2

以降 修正した場合の反映もこれ

設定適用

  • 強制モード (enforce mode)
    • プロファイルで許可していないものは単純にアクセス禁止する。本番は当然こちら。
  • 不平/学習モード (complaion mode)
    • 不許可アクセスのログだけ取得して実行は妨げない。いきなり禁止が怖い場合はこちらでしばらく動かしてみて、aa-logprofでログをスキャンして問題ないか確認する。
sudo aa-enforce /usr/sbin/apache2 #強制モード
または
sudo aa-complain /usr/sbin/apache2 #不平モード/学習モード(止めずにログだけ出す)

sudo systemctl restart apache2 #apacheも再起動しないと反映されない模様

sudo aa-status #設定状況の確認 complain/enforce modeにapacheが入っているのを確認する

確認

適当にfile_get_content()で許可している場所、許可してない場所のデータを読み込み、前者だけが読み込めることを確認する。

ログ確認

auditd入れてあれば/var/log/audit/audit.logにログが出る。
無い場合はsyslogに吐かれる。
問題があった場合はaa-logprofでポリシーをアップデート →ドキュメント

SIEM(Wazuh)へのログ送信

(Wazuh 4.2時点)デフォルト設定でaudit.logから読み込んでくれる。
ただしパーミッションエラーのアラートレベルは低いようなのでアラート飛ばしたい場合は注意。
アラートレベル変更方法

補足

apache用にmod_apparmorというものも有るが、上記の通り別に無くても問題ない。
ハット機能を使って事細かく設定できるようなので、設定を詰めたい場合は便利だと思う。

参考

AppArmor wiki
ubuntu wiki
mod_apparmor

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?