AppArmor
関連記事
AppArmor は強制アクセス制御 (MAC) のシステムです。Linux Security Modules (LSM) 上に実装されています。
他の LSM と同じように、AppArmor はデフォルトの任意アクセス制御 (DAC) を置き換えるというよりも補完するものです。そのため、プロセスに最初から持っている権限よりも高い権限を与えることはできません。
Ubuntu や SUSE などのディストリビューションはデフォルトで AppArmor を使用しています。RHEL (とその派生) は正しく機能させるのにユーザー空間における設定が必要になる SELinux を使っています。SELinux は全てのファイル・プロセス・オブジェクトにラベルを貼るため非常に柔軟性があります。しかしながら SELinux の設定は非常に複雑で、ファイルシステムが SELinux に対応していなければなりません。それに比べて AppArmor はファイルパスを使用するため簡単に設定することができます。
AppArmor は外部・内部からの脅威に対してオペレーティングシステムやアプリケーションを防護します。アプリケーションごとにルールセットを決めることでゼロデイ攻撃からも身を守ることができます。セキュリティポリシーによって個々のアプリケーションがアクセスできるシステムリソースは厳格に定められます。何もプロファイルが設定されていない場合、デフォルトでアクセスは拒否されます。AppArmor に付属しているデフォルトポリシーは少ない数しかありません。高度な静的解析・学習ツールを使用することで、非常に複雑なアプリケーションでも問題なく動作するような AppArmor ポリシーを数時間で作成できます。
ポリシー違反が発生するとシステムログにメッセージが残ります。また、AppArmor ではデスクトップにポップアップを表示することで、リアルタイムにユーザーに通知するように設定することもできます。
目次
インストール
カーネル
カーネルをコンパイルするとき、以下のオプションを設定する必要があります:
CONFIG_SECURITY_APPARMOR=y CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE=1 CONFIG_DEFAULT_SECURITY_APPARMOR=y CONFIG_AUDIT=y
上記の変数が上書きされないように、コンフィグファイルの一番下に変数を記述するようにしてください。
CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE
や CONFIG_DEFAULT_SECURITY_APPARMOR
を設定する代わりに、次のカーネルブートパラメータを設定しても効果があります: apparmor=1 security=apparmor
。
ユーザースペースツール
AppArmor を制御するためのユーザースペースツールとライブラリは AUR の apparmor パッケージに入っています。
このパッケージは以下のサブパッケージに分かれています:
- apparmor (メタパッケージ)
- apparmor-libapparmor
- apparmor-utils
- apparmor-parser
- apparmor-profiles
- apparmor-pam
- apparmor-vim
起動時に AppArmor プロファイルをロードするには apparmor.service
を有効化してください。
テスト
再起動後、次のコマンドを root で使うことで AppArmor が本当に有効になってるかテストできます:
# cat /sys/module/apparmor/parameters/enabled
Y
(Y=有効, N=無効, no such file = カーネルに該当モジュールなし)
無効化
現在のセッションにおいてのみ AppArmor を無効化するには、apparmor.service
を停止してください。無効化すると次の起動時に実行されなくなります。
また、カーネルブートパラメータに apparmor=0 security=""
を追加することで AppArmor が必要とするカーネルモジュールを無効化することもできます。
設定
監査とプロファイルの作成
aa-genprof
を使って新規プロファイルを作成するには、audit パッケージの auditd.service
を動作させる必要があります。Arch Linux は systemd を使用しておりデフォルトではファイルにカーネルログを出力しないためです。Apparmor はユーザー空間の auditd デーモンからカーネルの監査ログを取得してプロファイルを作成することができます。カーネルの監査ログを取得するには、ルールを作成して動作させたいアプリケーションを監視する必要があります。大抵のルールは auditctl(8) で設定することができます:
# auditctl -a exit,always -F arch=b64 -S all -F path=/usr/bin/chromium -F key=MonitorChromium
詳しくは Audit フレームワーク#ルールの追加を読んでください。
プロファイルの構文
プロファイルは人間が読める形式のテキストファイルとなっており /etc/apparmor.d/
に保存されます。バイナリを実行時にどう扱うかを記述します。基本的なプロファイルは以下のようになります:
/etc/apparmor.d/usr.bin.test
#include <tunables/global> profile test /usr/lib/test/test_binary { #include <abstractions/base> # Main libraries and plugins /usr/share/TEST/** r, /usr/lib/TEST/** rm, # Configuration files and logs @{HOME}/.config/ r, @{HOME}/.config/TEST/** rw, }
@
記号が前に付くテキストは abstraction (/etc/apparmor.d/abstractions/
) や tunable (/etc/apparmor.d/tunables/
) あるいはプロファイルによって定義される変数を表します。#include
は他のプロファイルふを直接読み込みます。後ろに文字がいくつか付いているパスは アクセス権限 です。AppArmor の globbing 構文 を使用したパターンマッチングが行われます。
ほとんどのユースケースは以下のステートメントで表すことができます:
r
— read: データの読み込み。w
— write: ファイルの作成・削除・編集と拡張。m
— memory map executable: ファイルを実行可能とメモリマップ。x
— execute: ファイルを実行。修飾子 を付ける必要があります。
上記の権限は任意アクセス制御 (DAC) によって与えられる権限を上回ることはできません。
詳しいガイドは ドキュメント を見てください。
プロファイルの解析
プロファイルをロード・アンロード・リロード・確認するには apparmor_parser
を使います。デフォルトでは新しいプロファイルをロードするようになっており (-a
)、既存のプロファイルを上書きするには -r
オプションを、プロファイルを削除するには -R
を使います。各操作では複数のプロファイルを指定できます。詳しくは apparmor_parser(8) の man ページを参照してください。
セキュリティについての考察
リンクによるパスベースの MAC の迂回
標準の POSIX セキュリティモデルでは、ハードリンクを使うことで AppArmor は迂回できるようになっています。ただし、カーネルには以下の設定で脆弱性を防ぐ機能が備わっています [1]:
/usr/lib/sysctl.d/50-default.conf
... fs.protected_hardlinks = 1 fs.protected_symlinks = 1
Ubuntu などのようにカーネルにパッチをあてる方法は必ずしも必要とされません。
ヒントとテクニック
DENIED アクション時にデスクトップ通知を表示
通知デーモンは AppArmor によってプログラムのアクセスが拒否されたときにデスクトップ通知を表示します。ブートされるたびにパラメータを指定してスクリプトを起動する必要があります:
# aa-notify -p -f /var/log/audit/audit.log --display $DISPLAY
デーモンは監査イベントに依存しており、-f
を使うことでログ出力されるテキストファイルを指定できます。systemd がファイルにログ出力しないように auditd.service
を有効化してログファイルを aa-notify
に渡してください。動作させるのに特殊な監査イベントは必要ありません。したがってオーバーヘッドはプロファイルを作成することに比べれば少なくなっています。
プロファイルのキャッシュ
AppArmor は設定されたプロファイルをバイナリ形式に翻訳する必要があるため、プロファイルのロードにはしばらく時間がかかります。煩わしいことに起動時間がかなり伸びてしまいます。
そのような問題を解決するため AppArmor では /etc/apparmor.d/cache/
にプロファイルをキャッシュすることができます。ただしキャッシュはデフォルトで無効になっているため apparmor_parser
で手動でキャッシュする必要があります。キャッシュに書き込むには -W
を使用し (-T
で既存のプロファイルを上書き)、-r
でプロファイルをリロードします。他の引数についてはプロファイルの解析を見てください。
参照
- AppArmor wiki
- AppArmor Core Policy Reference — プロファイルで利用できるオプションの詳しい解説
- Ubuntu Tutorial — 利用可能なユーティリティとプロファイルの作成に関する概要
- Ubuntu Wiki — 基本的なコマンドの一覧
- AppArmor Versions — バージョンの概要とリリースノートのリンク
- apparmor.d(5) — AppArmor の設定ディレクトリの構造
- apparmor_parse(8) — プロファイルをロード・アンロード・キャッシュ・出力する AppArmor のユーティリティ
- Kernel Interfaces — AppArmor カーネルモジュールの低レベルインターフェイス
- Apparmor Profile Migration — Emergence of profiles
- wikipedia:Linux Security Modules — AppArmor が使用している Linux カーネルモジュール
- Launchpad プロジェクトページ
- FS#21406 — AppArmor の導入に関する議論