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