AppArmor - プログラムを制限されたリソースのセットに制限するためのカーネル拡張。
DESCRIPTION
AppArmor は、プログラムを制限されたリソースのセットに制限するためのカーネル拡張です。AppArmor の独自のセキュリティモデルは、アクセス制御属性をユーザーではなくプログラムにバインドすることです。
AppArmor の制限は、`apparmor_parser(8)` 経由でカーネルにロードされるプロファイルによって提供され、通常は `apparmor.service` systemd ユニットを使用して次のようにロードされます。
# systemctl start apparmor
# systemctl reload apparmor
AppArmor は、強制モードと、警告または学習モードの 2 つのモードで動作できます。
強制モード - 強制モードでロードされたプロファイルは、プロファイルで定義されたポリシーの強制と、ポリシー違反の試みを syslogd に報告します。
警告モード - 「警告」モードでロードされたプロファイルは、ポリシーを強制しません。代わりに、ポリシー違反の試みを報告します。このモードは、プロファイルの作成に便利です。個々のプロファイルの警告モードを管理するには、`aa-complain(8)` および `aa-enforce(8)` ユーティリティを使用できます。これらのユーティリティは、プログラム名引数を受け取ります。
プロファイルは、通常、/etc/apparmor.d/ のファイルに格納されます。ファイル名は、パス名の / を . に置き換えるという規則に従います (ルート / を除く)。これにより、プロファイルを管理しやすくなります (例: /usr/sbin/nscd プロファイルの名前は usr.sbin.nscd になります)。
プロファイルは、exec(3) 時にプロセスに適用されます (これは、execve(2) システムコールとして表示されます)。プログラムのプロファイルをロードすると、次の exec(3) でそのプログラムが制限されます。すでにプロファイルの下で実行されているプロセスで、カーネル内のプロファイルを別のプロファイルに置き換えると、更新されたプロファイルがそのプロセスに直ちに適用されます。ただし、すでに制限されていない状態で実行されているプロセスを制限することはできません。
AppArmor は、Linux カーネルの securityfs ファイルシステムをサポートし、現在ロードされているプロファイルのリストを提供します。ファイルシステムをマウントするには、次のようにします。
# mount -tsecurityfs securityfs /sys/kernel/security
$ cat /sys/kernel/security/apparmor/profiles
/usr/bin/mutt
/usr/bin/gpg
...
通常、init スクリプトは、まだ実行されていない場合は、securityfs をマウントします。
AppArmor は、制限されたプロセスが実行できる特権操作も制限します。制限されたプロセスは、次のシステムコールを呼び出すことはできません。
create_module(2) delete_module(2) init_module(2) ioperm(2)
iopl(2) ptrace(2) reboot(2) setdomainname(2) sethostname(2) swapoff(2) swapon(2) sysctl(2)
苦情モード
AppArmorは、プロファイルにルールがないリソースへのアクセスを拒否する代わりに、「許可」することができます。 これにより、操作がトリガーされるたびにメッセージがログに記録されます。これは、苦情モードと呼ばれます。 プロファイルに存在するルールは引き続き適用されることに注意してください。したがって、許可ルールは監査メッセージを静かにするか、強制的に表示し、拒否ルールは引き続き拒否と拒否メッセージの抑制を引き起こします(問題が発生した場合は、拒否監査の抑制をオフにしてください)。
苦情モードは、アプリケーションを操作しながら、プロファイルを段階的に開発するために使用できます。 ログに記録されたアクセスはプロファイルに追加できます。その後、アプリケーションをさらに操作して、さらに必要な追加を検出できます。 AppArmorはアクセスを許可するため、アプリケーションはAppArmorが制限されていない場合と同じように動作します。
警告:苦情モードは、セキュリティは提供せず、ログ記録のみを提供します。これは、苦情モードが有効になっている間にのみ有効です。 敵対的な環境で使用しないでください。悪意のある動作がログに記録され、プロファイルに追加される可能性があります。その結果、アプリケーションが使用すべきリソースアクセスとして扱われる可能性があります。
注:苦情モードは、新しいプロファイルまたは空のプロファイルでは非常に多くのログメッセージを生成する可能性がありますが、十分に開発されたプロファイルでは何もログに記録されない場合があります。 苦情モードがログメッセージを大量に生成する場合は、「監査レート制限」を参照してください。
プロファイルとそのすべての子プロファイル、またはプロファイルに含まれている可能性のある帽子プロファイルを苦情モードに設定するには、次を使用します。
aa-complain /etc/apparmor.d/<アプリケーション名>
特定のプロファイルを手動で苦情モードに設定するには、「苦情」フラグを追加し、次にプロファイルをを手動で再ロードします。
profile foo flags=(苦情) { ... }
「苦情」フラグは、プロファイルの子プロファイルまたは帽子プロファイルにも手動で追加する必要があることに注意してください。そうしないと、それらは以前のモードを使用し続けます。
苦情モードをグローバルに有効にするには、次を実行します。
echo -n 苦情 > /sys/module/apparmor/parameters/mode
または、起動時に次を追加します。
apparmor.mode=苦情
カーネルブートパラメータとして。
警告:苦情モードをグローバルに設定すると、すべてのAppArmorセキュリティ保護が無効になります。 これは、デバッグやプロファイル開発中に役立ちますが、個々のプロファイルベースで設定する方が安全です。
エラー
制限されたプロセスが、アクセス許可されていないファイルにアクセスしようとすると、カーネルは監査を通じてメッセージを報告します。
audit(1386511672.612:238): apparmor="DENIED" operation="exec"
parent=7589 profile="/tmp/sh" name="/bin/uname" pid=7605
comm="sh" requested_mask="x" denied_mask="x" fsuid=0 ouid=0
audit(1386511672.613:239): apparmor="DENIED" operation="open"
parent=7589 profile="/tmp/sh" name="/bin/uname" pid=7605
comm="sh" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
audit(1386511772.804:246): apparmor="DENIED" operation="capable"
parent=7246 profile="/tmp/sh" pid=7589 comm="sh" pid=7589
comm="sh" capability=2 capname="dac_override"
プロセスによって要求された権限は、operation=とdenied_mask=で説明されます(ファイルの場合 - 機能などは、わずかに異なるログ形式を使用します)。
「名前」と実行中のプログラムのプロセスIDが報告され、さらに「帽子」がアクティブになっている場合は、プロファイル名とともに区切られて表示されます。
(「名前」は引用符で囲まれています。これは、プロセス名が15バイトに制限されているためです。これは、Berkeleyプロセスアカウンティングで報告されるものと同じです)。
コンパイルモードでロードされたプロファイルの下で実行される制限されたプロセスの場合、強制は行われず、監査に報告されるログメッセージは次のようになります。
audit(1386512577.017:275): apparmor="ALLOWED" operation="open"
parent=8012 profile="/usr/bin/du" name="/etc/apparmor.d/tunables/"
pid=8049 comm="du" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
audit(1386512577.017:276): apparmor="ALLOWED" operation="open"
parent=8012 profile="/usr/bin/du" name="/etc/apparmor.d/tunables/"
pid=8049 comm="du" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
ユーザーランドの auditd が実行されていない場合、カーネルは監査イベントを klogd に送信します。klogd はメッセージを syslog に送信し、syslog はメッセージを KERN 施設を使用して /var/log/audit/audit.log または /var/log/messages にログ記録します。これはローカルの構成によって異なります。
デバッグ
AppArmor は、プロファイルのデバッグに役立つ追加の情報をログ記録するためのいくつかの機能を提供します。
デバッグモードを有効にする
デバッグモードが有効になっている場合、AppArmor は dmesg にいくつかの追加メッセージをログ記録します(監査サブシステム経由ではありません)。たとえば、ログには環境スクラブが適用されたかどうかなどが表示されます。
デバッグモードを有効にするには、次を実行します。
echo 1 > /sys/module/apparmor/parameters/debug
または、起動時に次のように追加します。
apparmor.debug=1
カーネルブートパラメータとして。
拒否監査の抑制をオフにする
デフォルトでは、「拒否」ルールをトリガーする操作はログ記録されません。これは拒否監査の抑制と呼ばれます。
拒否監査の抑制をオフにするには、次を実行します。
echo -n noquiet >/sys/module/apparmor/parameters/audit
または、起動時に次のように追加します。
apparmor.audit=noquiet
カーネルブートパラメータとして。
強制監査モード
AppArmor は、ポリシーで構成されたルールをトリガーするすべての操作についてメッセージをログ記録できます。これは強制監査モードと呼ばれます。
警告!強制監査モードは、単一のプロファイルでも非常に多くのログを生成する可能性があり、グローバルに有効にするとさらに多くのログが生成されます。
特定のプロファイルを強制監査モードに設定するには、「audit」フラグを追加します。
profile foo flags=(audit) { ... }
グローバルに強制監査モードを有効にするには、次を実行します。
echo -n all > /sys/module/apparmor/parameters/audit
または、起動時に次のように追加します。
apparmor.audit=all
カーネルブートパラメータとして。
監査レート制限 auditd が実行されていない場合、追加のログメッセージが多すぎるために失われないように、次のようにレート制限をオフにする必要がある場合があります。
echo 0 > /proc/sys/kernel/printk_ratelimit
ただし、その場合でもカーネルリングバッファーがいっぱいになり、メッセージが失われる可能性があります。
または、auditd が実行されている場合は、auditd(8) および auditd.conf(5) を参照してください。
ファイル
/etc/apparmor.d/
/var/cache/apparmor/
/var/log/audit/audit.log
/var/log/messages
関連項目
apparmor_parser(8), aa_change_hat(2), apparmor.d(5), aa-autodep(1), clean(1), auditd(8), aa-unconfined(8), aa-enforce(1), aa-complain(1), および [https://wiki.apparmor.net]。