「AppArmor」の版間の差分
(同期) |
Kusanaginoturugi (トーク | 投稿記録) (→インストール: 翻訳文が重複していたので古い方を採用) |
||
(5人の利用者による、間の18版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category:セ |
+ | [[Category:アクセス制御]] |
[[Category:カーネル]] |
[[Category:カーネル]] |
||
+ | [[bs:AppArmor]] |
||
[[en:AppArmor]] |
[[en:AppArmor]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
+ | {{Related|セキュリティ}} |
||
{{Related|TOMOYO Linux}} |
{{Related|TOMOYO Linux}} |
||
{{Related|SELinux}} |
{{Related|SELinux}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
[[Wikipedia:AppArmor|AppArmor]] は[[Wikipedia:ja:強制アクセス制御|強制アクセス制御]] (MAC) のシステムです。[[Wikipedia:ja:Linux_Security_Modules|Linux Security Modules]] (LSM) 上に実装されています。 |
[[Wikipedia:AppArmor|AppArmor]] は[[Wikipedia:ja:強制アクセス制御|強制アクセス制御]] (MAC) のシステムです。[[Wikipedia:ja:Linux_Security_Modules|Linux Security Modules]] (LSM) 上に実装されています。 |
||
+ | |||
+ | 他の LSM と同じように、AppArmor はデフォルトの任意アクセス制御 (DAC) を置き換えるというよりも補完するものです。そのため、プロセスに最初から持っている権限よりも高い権限を与えることはできません。 |
||
+ | |||
+ | Ubuntu や SUSE などのディストリビューションはデフォルトで AppArmor を使用しています。RHEL (とその派生) は正しく機能させるのにユーザー空間における設定が必要になる SELinux を使っています。SELinux は全てのファイル・プロセス・オブジェクトにラベルを貼るため非常に柔軟性があります。しかしながら SELinux の設定は非常に複雑で、ファイルシステムが SELinux に対応していなければなりません。それに比べて AppArmor はファイルパスを使用するため簡単に設定することができます。 |
||
+ | |||
+ | AppArmor は外部・内部からの脅威に対してオペレーティングシステムやアプリケーションを防護します。アプリケーションごとにルールセットを決めることでゼロデイ攻撃からも身を守ることができます。セキュリティポリシーによって個々のアプリケーションがアクセスできるシステムリソースは厳格に定められます。何もプロファイルが設定されていない場合、デフォルトでアクセスは拒否されます。AppArmor に付属しているデフォルトポリシーは少ない数しかありません。高度な静的解析・学習ツールを使用することで、非常に複雑なアプリケーションでも問題なく動作するような AppArmor ポリシーを数時間で作成できます。 |
||
+ | |||
+ | ポリシー違反が発生するとシステムログにメッセージが残ります。また、AppArmor ではデスクトップにポップアップを表示することで、リアルタイムにユーザーに通知するように設定することもできます。 |
||
== インストール == |
== インストール == |
||
− | === カーネル === |
||
+ | AppArmor は[[カーネル#公式パッケージ|公式でサポートしているカーネル]]で利用できます。 |
||
− | カーネルをコンパイルするときに、以下のオプションを使用する必要があります: |
||
+ | |||
+ | AppArmor を制御するためのユーザースペースツールやライブラリは {{Pkg|apparmor}} パッケージで[[インストール]]できます。起動時に全ての AppArmor プロファイルをロードするには、{{ic|apparmor.service}} を[[有効化]]してください。 |
||
+ | |||
+ | 起動時にデフォルトのセキュリティモデルとして AppArmor を有効にするには、以下の[[カーネルパラメータ]]を設定: |
||
+ | |||
+ | lsm=landlock,lockdown,yama,apparmor,bpf |
||
+ | |||
+ | {{Note|{{ic|1=lsm=}} カーネル・パラメータは、Linux セキュリティ・モジュールの初期化順序を設定します。カーネルに設定された {{ic|1=lsm=}} 値は {{ic|1=zgrep CONFIG_LSM= /proc/config.gz}} で、現在の値は {{ic|cat /sys/kernel/security/lsm}} です。 |
||
+ | * {{ic|apparmor}} がリストの最初の "major" モジュールであることを確認してください。[https://www.kernel.org/doc/html/latest/admin-guide/LSM/index.html] 有効な値とその順序の例については、 [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/security/Kconfig security/Kconfig] を参照してください。 |
||
+ | * {{ic|capability}} は常に自動的に含まれるため、{{ic|1=lsm=}} では省略する必要があります。 |
||
+ | }} |
||
+ | |||
+ | === カスタムカーネル === |
||
+ | |||
+ | [[カーネル#コンパイル|カーネルをコンパイル]]するとき、以下のオプションを設定する必要があります: |
||
+ | |||
CONFIG_SECURITY_APPARMOR=y |
CONFIG_SECURITY_APPARMOR=y |
||
− | CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE=1 |
||
− | CONFIG_DEFAULT_SECURITY_APPARMOR=y |
||
CONFIG_AUDIT=y |
CONFIG_AUDIT=y |
||
+ | AppArmor Linux セキュリティモデルをデフォルトで有効にし、カーネルパラメータで設定する必要を無くすには、さらに {{ic|CONFIG_LSM}} オプションを設定し、リストの最初の "major" モジュールとして {{ic|apparmor}} を指定します。 |
||
− | {{ic|CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE}} と {{ic|CONFIG_DEFAULT_SECURITY_APPARMOR}} を使うかわりに、[[カーネルパラメータ|カーネルブートパラメータ]]を設定することもできます: {{ic|apparmor=1 security=apparmor}}。 |
||
+ | CONFIG_LSM="landlock,lockdown,yama,apparmor,bpf" |
||
− | AUR には AppArmor が有効になっているカーネルが存在します: {{AUR|linux-apparmor}}{{Broken package link|{{aur-mirror|linux-apparmor}}}}。ただし、2015年5月現在、このカーネルはやや古くなっています。 |
||
+ | == 使用方法 == |
||
− | === ユーザースペースツール === |
||
+ | === 現在の状態を表示 === |
||
− | AppArmor を制御するためのユーザースペースツールとライブラリは [[AUR]] の {{AUR|apparmor}} パッケージに入っています。 |
||
+ | AppArmor が有効になっているか確認するには: |
||
− | このパッケージは以下のサブパッケージに分かれています: |
||
− | * apparmor (メタパッケージ) |
||
− | * apparmor-libapparmor |
||
− | * apparmor-utils |
||
− | * apparmor-parser |
||
− | * apparmor-profiles |
||
− | * apparmor-pam |
||
− | * apparmor-vim |
||
+ | {{hc|$ aa-enabled| |
||
− | 起動時に AppArmor プロファイルをロードするための systemd ユニットが {{AUR|apparmor}} パッケージに含まれています: |
||
+ | Yes |
||
− | # systemctl enable apparmor |
||
+ | }} |
||
+ | ロードされている状態を表示するには {{ic|apparmor_status}} を使用: |
||
− | === テスト === |
||
+ | {{hc|# apparmor_status| |
||
− | 再起動後、次のコマンドを root で使うことで AppArmor が本当に有効になってるかテストできます: |
||
+ | apparmor module is loaded. |
||
− | # cat /sys/module/apparmor/parameters/enabled |
||
+ | 44 profiles are loaded. |
||
− | Y |
||
+ | 44 profiles are in enforce mode. |
||
− | (Y=有効, N=無効, no such file = カーネルに該当モジュールなし) |
||
+ | ... |
||
+ | 0 profiles are in complain mode. |
||
+ | 0 processes have profiles defined. |
||
+ | 0 processes are in enforce mode. |
||
+ | 0 processes are in complain mode. |
||
+ | 0 processes are unconfined but have a profile defined. |
||
+ | }} |
||
+ | === プロファイルの解析 === |
||
− | {{Note|AppArmor はカーネルモジュールをビルド・インストールするので、カーネルをアップデートするたびに再ビルドする必要があります。}} |
||
+ | プロファイルをロード・アンロード・リロード・確認するには {{ic|apparmor_parser}} を使います。デフォルトでは enforce モードで新しいプロファイルをロードするようになっており ({{ic|-a}})、{{ic|-C}} スイッチを使うことで complain モードでロードできます。既存のプロファイルを上書きするには {{ic|-r}} オプションを、プロファイルを削除するには {{ic|-R}} を使います。各操作では複数のプロファイルを指定できます。詳しくは {{man|8|apparmor_parser}} の man ページを参照してください。 |
||
− | == 無効化 == |
||
− | 一時的に AppArmor を無効化するには、[[カーネルパラメータ|カーネルブートパラメータ]]に {{ic|apparmor=0 security=""}} を追加します。 |
||
+ | === ロードの無効化 === |
||
− | もしくは次のコマンドを実行することで現在のセッションにおいてのみ無効化できます: |
||
− | # systemctl stop apparmor.service |
||
+ | 全てのプロファイルをアンロードすることで現在のセッションで AppArmor が無効化されます: |
||
− | == 新しいプロファイルの作成 == |
||
− | {{ic|aa-genprof}} を使って新規プロファイルを作成するには、{{Pkg|audit}} パッケージの {{ic|auditd.service}} を動作させる必要があります。作成した後は無駄なのでサービスを停止 (そして {{ic|auditd.service}} を消去) してください。 |
||
+ | # aa-teardown |
||
− | == セキュリティについての考察 == |
||
− | === リンクによるパスベースの MAC の迂回 === |
||
+ | 次の起動時に AppArmor プロファイルがロードされないようにしたい場合は {{ic|apparmor.service}} を[[無効化]]してください。カーネルが AppArmor をロードしないようにするには、[[カーネルパラメータ]]から {{ic|1=apparmor=1 security=apparmor}} を削除します。 |
||
− | 標準の POSIX セキュリティモデルでは、ハードリンクを使うことで AppArmor は迂回できるようになっています。ただし、現在カーネルにはこの脆弱性を塞ぐ機能が備わっており、Ubuntu など他のディストリビューションのようにカーネルにパッチを適用する必要はなくなっています。 |
||
+ | == 設定 == |
||
− | 詳しくは[[セキュリティ#リンクの TOCTOU 攻撃を防止する]]を見て下さい。 |
||
+ | |||
+ | === 監査とプロファイルの作成 === |
||
+ | 新しいプロファイルを作成するには、 [[Audit フレームワーク]] を実行する必要があります。これは、Arch Linux がデフォルトで [[systemd]] を採用し、ファイルへの kernel logging を行わないためです。AppArmor は、ユーザー空間の auditd デーモンからカーネル監査ログを取得し、プロファイルを構築できます。 |
||
+ | |||
+ | 新しい AppArmor プロファイルは、{{man|8|aa-genprof}} または {{man|8|aa-autodep}} を使用して作成できます。プロファイルは最初に ''complain mode'' で作成されます。このモードでは、ポリシー違反は報告されるだけで、強制されません。ルールは、{{pkg|apparmor}} パッケージの {{man|8|aa-logprof}} ツールによってインタラクティブに作成されます。最後に、{{man|8|aa-enforce}} を使用して、プロファイルを ''enforce mode'' に設定する必要があります。このモードでは、対応するプロファイルのルールによって定義されたポリシーが適用されます。必要に応じて、{{man|8|aa-logprof}} を繰り返し実行してルールを追加したり、{{man|8|aa-apprait}} を使用してプロファイルを警告モードに戻すことができます。これらのツールの使用方法の詳細については、 [https://gitlab.com/apparmor/apparmor/wikis/Profiling_with_tools AppArmor wiki-Profiling with tools] を参照してください。 |
||
+ | |||
+ | {{man|8|aa-logprof}} には ''deny'' ルールも用意されていますが、これは基本的な AppArmor ロジックによれば、ルールによって明示的に許可されていないものはすべて禁止されているため、厳密には必要ではありません。ただし、''deny'' 規則には2つの目的があります。 |
||
+ | |||
+ | # ''deny'' ルールは ''allow'' ルールよりも優先されます。重要なフォルダやファイルへのアクセスをブロックするために、{{ic|/etc/apparmor.d/abstractions}} にある多くの [https://man.archlinux.org/man/extra/apparmor/apparmor.d.5.en##include_mechanism abstractions] でよく使用されます。これにより、誤って作成された許可ルールによってプロファイルが過度に許可されることがなくなります。 |
||
+ | #''allow'' ルールは、logging を無効にし、以降の ''aa-logprof'' の実行ノイズを減らします。''deny'' ルールは ''complain mode'' でも適用されることを覚えておくことが重要です。 アプリケーションが苦情モードでも適切に動作しない場合、プロファイルまたは拒否ルールをチェックしてください。 |
||
+ | |||
+ | また、手動でプロファイルを作成することもできます。詳細については、 [https://gitlab.com/apparmor/apparmor/wikis/Profiling_by_hand AppArmor wiki-Profiling by hand] を参照してください。 |
||
+ | |||
+ | === プロファイルの構文 === |
||
+ | |||
+ | プロファイルは人間が読める形式のテキストファイルとなっており {{ic|/etc/apparmor.d/}} に保存されます。バイナリを実行時にどう扱うかを記述します。基本的なプロファイルは以下のようになります: |
||
+ | |||
+ | {{hc|/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, |
||
+ | } |
||
+ | }} |
||
+ | |||
+ | {{ic|@}} 記号が前に付くテキストは abstraction ({{ic|/etc/apparmor.d/abstractions/}}) や tunable ({{ic|/etc/apparmor.d/tunables/}}) あるいはプロファイルによって定義される変数を表します。{{ic|#include}} は他のプロファイルふを直接読み込みます。後ろに文字がいくつか付いているパスは [https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference#file-access-rules アクセス権限] です。[https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference#apparmor-globbing-syntax AppArmor の globbing 構文] を使用したパターンマッチングが行われます。 |
||
+ | |||
+ | ほとんどのユースケースは以下のステートメントで表すことができます: |
||
+ | |||
+ | * {{ic|r}} — read: データの読み込み。 |
||
+ | * {{ic|w}} — write: ファイルの作成・削除・編集と拡張。 |
||
+ | * {{ic|m}} — memory map executable: ファイルを実行可能とメモリマップ。 |
||
+ | * {{ic|x}} — execute: ファイルを実行。[https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference#execute-rules 修飾子] を付ける必要があります。 |
||
+ | |||
+ | 上記の権限は任意アクセス制御 (DAC) によって与えられる権限を上回ることはできません。 |
||
+ | |||
+ | 詳しいガイドは {{man|5|apparmor.d}} の man ページや [https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference ドキュメント] を見てください。 |
||
+ | |||
+ | == ヒントとテクニック == |
||
− | == Tips and tricks == |
||
=== DENIED アクション時にデスクトップ通知を表示 === |
=== DENIED アクション時にデスクトップ通知を表示 === |
||
− | AppArmor が "DENIED" ログエントリを残したときにデスクトップに通知を表示したい場合、以下のようにして通知デーモンを起動してください: |
||
− | # aa-notify -p --display $DISPLAY |
||
− | 上記のデーモンはマシンを起動するたびに実行する必要があります。 |
||
+ | 通知デーモンは AppArmor によってプログラムのアクセスが拒否されたときにデスクトップ通知を表示します。{{ic|aa-notify}} デーモンをログイン時に自動的に起動するには以下の手順に従ってください。 |
||
− | == その他 == |
||
− | AppArmor は他の LSM と同じように、デフォルトの任意アクセス制御を置き換えるというよりは補足するものです。そのため、任意アクセス制御の段階よりも強力な権限をプロセスに与えることは出来ません。 |
||
+ | [[Audit フレームワーク]]をインストール・有効化してください。{{ic|audit}} [[グループ|ユーザーグループ]]にユーザーを追加することで {{ic|/var/log/audit}} の監査ログを読み込めるようにします: |
||
− | Ubuntu や SUSE など多数のディストリビューションは AppArmor をデフォルトで使用しています。RHEL (やその亜種) は SELinux を使っています。SELinux は正しく動作させるためにユーザースペースでの工夫が必要となります。また、SELinux は適切に設定するのが大変難しいというのも周知です。 |
||
+ | # groupadd -r audit |
||
− | 例を上げると、新しい Flash の脆弱性が考えられます: 悪意のあるウェブサイトにアクセスしたとき、AppArmor は脆弱性があるプラグインから個人情報にアクセスされることを防ぐことができます。ほとんどのブラウザで、プラグインのプロセスは簡単に分離することができます。 |
||
+ | # gpasswd -a <username> audit |
||
+ | {{ic|audit}} グループを {{ic|auditd.conf}} に追加: |
||
− | AppArmor のプロファイルは (大抵) {{ic|/etc/apparmor.d}} に簡単に読めるテキストファイルとして保存されます。 |
||
+ | {{hc|/etc/audit/auditd.conf|2= |
||
+ | log_group = audit |
||
+ | }} |
||
+ | {{Tip|{{ic|wheel}} や {{ic|adm}} など既存のシステムグループを使用することもできます。}} |
||
− | ポリシーが侵害された場合システムログにメッセージが残り、多くのディストリビューションでは DBUS と連携してデスクトップ上に警告メッセージとしてリアルタイムで表示します。 |
||
+ | {{Pkg|python-notify2}} と {{Pkg|python-psutil}} を [[インストール]] します。 |
||
− | == 参照 == |
||
− | * 公式ページ |
||
− | ** カーネル: https://apparmor.wiki.kernel.org/ http://wiki.apparmor.net/ |
||
− | ** ユーザースペース: https://launchpad.net/apparmor |
||
+ | 以下のコンテンツで [[デスクトップランチャー]] を作成します。 |
||
− | * http://www.kernel.org/pub/linux/security/apparmor/AppArmor-2.6/ |
||
+ | |||
− | * http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference |
||
+ | {{hc|~/.config/autostart/apparmor-notify.desktop|2= |
||
+ | [Desktop Entry] |
||
+ | Type=Application |
||
+ | Name=AppArmor Notify |
||
+ | Comment=Receive on screen notifications of AppArmor denials |
||
+ | TryExec=/usr/bin/aa-notify |
||
+ | Exec=/usr/bin/aa-notify -p -s 1 -w 60 -f /var/log/audit/audit.log |
||
+ | StartupNotify=false |
||
+ | NoDisplay=true |
||
+ | }} |
||
+ | |||
+ | 再起動して {{ic|aa-notify}} デーモンが稼働しているか確認: |
||
+ | |||
+ | $ pgrep -ax aa-notify |
||
+ | |||
+ | {{Note|システムの設定によっては多数の通知が表示されます。}} |
||
+ | |||
+ | 詳しくは {{man|8|aa-notify}} を参照。 |
||
+ | |||
+ | === プロファイルをキャッシュして AppArmor の起動を高速化 === |
||
+ | |||
+ | AppArmor は設定されたプロファイルをバイナリ形式に翻訳する必要があるため、プロファイルのロードにはしばらく時間がかかります。煩わしいことに起動時間がかなり伸びてしまいます。AppArmor の起動時間は以下のコマンドで確認できます: |
||
+ | |||
+ | $ systemd-analyze blame | grep apparmor |
||
+ | |||
+ | AppArmor プロファイルのキャッシュを有効化するには、以下をアンコメント: |
||
+ | |||
+ | {{hc|/etc/apparmor/parser.conf|2= |
||
+ | ## Turn creating/updating of the cache on by default |
||
+ | write-cache |
||
+ | }} |
||
+ | |||
+ | デフォルトのキャッシュ場所を変更するには以下を追加: |
||
+ | |||
+ | {{hc|/etc/apparmor/parser.conf|2= |
||
+ | cache-loc=/path/to/location |
||
+ | }} |
||
+ | |||
+ | {{Note|2.13.1 からデフォルトのキャッシュ保存場所は {{ic|/var/cache/apparmor/}} となっています。以前は {{ic|/etc/apparmor.d/cache.d/}} でした。}} |
||
+ | |||
+ | 再起動して AppArmor の起動時間が変化したか確認してください: |
||
+ | |||
+ | $ systemd-analyze blame | grep apparmor |
||
+ | |||
+ | == トラブルシューティング == |
||
+ | |||
+ | === Samba SMB/CIFS サーバーを起動できない === |
||
+ | |||
+ | [[Samba#AppArmor におけるパーミッションの問題]] を参照 |
||
+ | |||
+ | === aa-logprof でイベントが捕捉されない === |
||
+ | |||
+ | [[Audit フレームワーク]] のログに特殊文字 {{ic|0x1d}} [https://github.com/linux-audit/audit-userspace/issues/3] が含まれる場合があります。[https://gitlab.com/apparmor/apparmor/-/issues/271 AppArmor バグレポート] がありますが、回避策として次を実行します。 |
||
+ | |||
+ | # aa-logprof -f <(sed 's/\x1d.*//' < /var/log/audit/audit.log) |
||
+ | |||
+ | == 参照 == |
||
+ | * [https://gitlab.com/apparmor/apparmor/wikis/home AppArmor wiki] |
||
− | * http://ubuntuforums.org/showthread.php?t=1008906 (チュートリアル) |
||
+ | * [https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference AppArmor Core Policy Reference] — プロファイルで利用できるオプションの詳しい解説 |
||
− | * https://help.ubuntu.com/community/AppArmor |
||
+ | * [https://ubuntuforums.org/showthread.php?t=1008906 Ubuntu Tutorial] — 利用可能なユーティリティとプロファイルの作成に関する概要 |
||
− | *{{Bug|21406}} |
||
+ | * [https://help.ubuntu.com/community/AppArmor Ubuntu Wiki] — 基本的なコマンドの一覧 |
||
− | * http://stuff.mit.edu/afs/sipb/contrib/linux/Documentation/apparmor.txt |
||
+ | * [https://gitlab.com/apparmor/apparmor/wikis/AppArmor_versions AppArmor Versions] — バージョンの概要とリリースノートのリンク |
||
− | * http://wiki.apparmor.net/index.php/Kernel_interfaces |
||
+ | * [https://gitlab.com/apparmor/apparmor/wikis/Kernel_interfaces Kernel Interfaces] — AppArmor カーネルモジュールの低レベルインターフェイス |
||
− | * http://wiki.apparmor.net/index.php/AppArmor_versions |
||
+ | * [[wikipedia:Linux Security Modules]] — AppArmor が使用している Linux カーネルモジュール |
||
− | * http://manpages.ubuntu.com/manpages/oneiric/man5/apparmor.d.5.html |
||
+ | * [https://doc.opensuse.org/documentation/leap/security/single-html/book.security/index.html#part.apparmor AppArmor in openSUSE Security Guide] |
||
− | * http://manpages.ubuntu.com/manpages/oneiric/man8/apparmor_parser.8.html |
||
− | * http://wiki.apparmor.net/index.php/Distro_CentOS |
||
− | * http://bodhizazen.net/aa-profiles/ |
||
− | * https://wiki.ubuntu.com/ApparmorProfileMigration |
||
− | * [[wikipedia:ja:Linux_Security_Modules]] |
||
− | * http://wiki.apparmor.net/index.php/Gittutorial |
2023年6月2日 (金) 15:24時点における最新版
関連記事
AppArmor は強制アクセス制御 (MAC) のシステムです。Linux Security Modules (LSM) 上に実装されています。
他の LSM と同じように、AppArmor はデフォルトの任意アクセス制御 (DAC) を置き換えるというよりも補完するものです。そのため、プロセスに最初から持っている権限よりも高い権限を与えることはできません。
Ubuntu や SUSE などのディストリビューションはデフォルトで AppArmor を使用しています。RHEL (とその派生) は正しく機能させるのにユーザー空間における設定が必要になる SELinux を使っています。SELinux は全てのファイル・プロセス・オブジェクトにラベルを貼るため非常に柔軟性があります。しかしながら SELinux の設定は非常に複雑で、ファイルシステムが SELinux に対応していなければなりません。それに比べて AppArmor はファイルパスを使用するため簡単に設定することができます。
AppArmor は外部・内部からの脅威に対してオペレーティングシステムやアプリケーションを防護します。アプリケーションごとにルールセットを決めることでゼロデイ攻撃からも身を守ることができます。セキュリティポリシーによって個々のアプリケーションがアクセスできるシステムリソースは厳格に定められます。何もプロファイルが設定されていない場合、デフォルトでアクセスは拒否されます。AppArmor に付属しているデフォルトポリシーは少ない数しかありません。高度な静的解析・学習ツールを使用することで、非常に複雑なアプリケーションでも問題なく動作するような AppArmor ポリシーを数時間で作成できます。
ポリシー違反が発生するとシステムログにメッセージが残ります。また、AppArmor ではデスクトップにポップアップを表示することで、リアルタイムにユーザーに通知するように設定することもできます。
目次
インストール
AppArmor は公式でサポートしているカーネルで利用できます。
AppArmor を制御するためのユーザースペースツールやライブラリは apparmor パッケージでインストールできます。起動時に全ての AppArmor プロファイルをロードするには、apparmor.service
を有効化してください。
起動時にデフォルトのセキュリティモデルとして AppArmor を有効にするには、以下のカーネルパラメータを設定:
lsm=landlock,lockdown,yama,apparmor,bpf
カスタムカーネル
カーネルをコンパイルするとき、以下のオプションを設定する必要があります:
CONFIG_SECURITY_APPARMOR=y CONFIG_AUDIT=y
AppArmor Linux セキュリティモデルをデフォルトで有効にし、カーネルパラメータで設定する必要を無くすには、さらに CONFIG_LSM
オプションを設定し、リストの最初の "major" モジュールとして apparmor
を指定します。
CONFIG_LSM="landlock,lockdown,yama,apparmor,bpf"
使用方法
現在の状態を表示
AppArmor が有効になっているか確認するには:
$ aa-enabled
Yes
ロードされている状態を表示するには apparmor_status
を使用:
# apparmor_status
apparmor module is loaded. 44 profiles are loaded. 44 profiles are in enforce mode. ... 0 profiles are in complain mode. 0 processes have profiles defined. 0 processes are in enforce mode. 0 processes are in complain mode. 0 processes are unconfined but have a profile defined.
プロファイルの解析
プロファイルをロード・アンロード・リロード・確認するには apparmor_parser
を使います。デフォルトでは enforce モードで新しいプロファイルをロードするようになっており (-a
)、-C
スイッチを使うことで complain モードでロードできます。既存のプロファイルを上書きするには -r
オプションを、プロファイルを削除するには -R
を使います。各操作では複数のプロファイルを指定できます。詳しくは apparmor_parser(8) の man ページを参照してください。
ロードの無効化
全てのプロファイルをアンロードすることで現在のセッションで AppArmor が無効化されます:
# aa-teardown
次の起動時に AppArmor プロファイルがロードされないようにしたい場合は apparmor.service
を無効化してください。カーネルが AppArmor をロードしないようにするには、カーネルパラメータから apparmor=1 security=apparmor
を削除します。
設定
監査とプロファイルの作成
新しいプロファイルを作成するには、 Audit フレームワーク を実行する必要があります。これは、Arch Linux がデフォルトで systemd を採用し、ファイルへの kernel logging を行わないためです。AppArmor は、ユーザー空間の auditd デーモンからカーネル監査ログを取得し、プロファイルを構築できます。
新しい AppArmor プロファイルは、aa-genprof(8) または aa-autodep(8) を使用して作成できます。プロファイルは最初に complain mode で作成されます。このモードでは、ポリシー違反は報告されるだけで、強制されません。ルールは、apparmor パッケージの aa-logprof(8) ツールによってインタラクティブに作成されます。最後に、aa-enforce(8) を使用して、プロファイルを enforce mode に設定する必要があります。このモードでは、対応するプロファイルのルールによって定義されたポリシーが適用されます。必要に応じて、aa-logprof(8) を繰り返し実行してルールを追加したり、aa-apprait(8) を使用してプロファイルを警告モードに戻すことができます。これらのツールの使用方法の詳細については、 AppArmor wiki-Profiling with tools を参照してください。
aa-logprof(8) には deny ルールも用意されていますが、これは基本的な AppArmor ロジックによれば、ルールによって明示的に許可されていないものはすべて禁止されているため、厳密には必要ではありません。ただし、deny 規則には2つの目的があります。
- deny ルールは allow ルールよりも優先されます。重要なフォルダやファイルへのアクセスをブロックするために、
/etc/apparmor.d/abstractions
にある多くの abstractions でよく使用されます。これにより、誤って作成された許可ルールによってプロファイルが過度に許可されることがなくなります。 - allow ルールは、logging を無効にし、以降の aa-logprof の実行ノイズを減らします。deny ルールは complain mode でも適用されることを覚えておくことが重要です。 アプリケーションが苦情モードでも適切に動作しない場合、プロファイルまたは拒否ルールをチェックしてください。
また、手動でプロファイルを作成することもできます。詳細については、 AppArmor wiki-Profiling by hand を参照してください。
プロファイルの構文
プロファイルは人間が読める形式のテキストファイルとなっており /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.d(5) の man ページや ドキュメント を見てください。
ヒントとテクニック
DENIED アクション時にデスクトップ通知を表示
通知デーモンは AppArmor によってプログラムのアクセスが拒否されたときにデスクトップ通知を表示します。aa-notify
デーモンをログイン時に自動的に起動するには以下の手順に従ってください。
Audit フレームワークをインストール・有効化してください。audit
ユーザーグループにユーザーを追加することで /var/log/audit
の監査ログを読み込めるようにします:
# groupadd -r audit # gpasswd -a <username> audit
audit
グループを auditd.conf
に追加:
/etc/audit/auditd.conf
log_group = audit
python-notify2 と python-psutil を インストール します。
以下のコンテンツで デスクトップランチャー を作成します。
~/.config/autostart/apparmor-notify.desktop
[Desktop Entry] Type=Application Name=AppArmor Notify Comment=Receive on screen notifications of AppArmor denials TryExec=/usr/bin/aa-notify Exec=/usr/bin/aa-notify -p -s 1 -w 60 -f /var/log/audit/audit.log StartupNotify=false NoDisplay=true
再起動して aa-notify
デーモンが稼働しているか確認:
$ pgrep -ax aa-notify
詳しくは aa-notify(8) を参照。
プロファイルをキャッシュして AppArmor の起動を高速化
AppArmor は設定されたプロファイルをバイナリ形式に翻訳する必要があるため、プロファイルのロードにはしばらく時間がかかります。煩わしいことに起動時間がかなり伸びてしまいます。AppArmor の起動時間は以下のコマンドで確認できます:
$ systemd-analyze blame | grep apparmor
AppArmor プロファイルのキャッシュを有効化するには、以下をアンコメント:
/etc/apparmor/parser.conf
## Turn creating/updating of the cache on by default write-cache
デフォルトのキャッシュ場所を変更するには以下を追加:
/etc/apparmor/parser.conf
cache-loc=/path/to/location
再起動して AppArmor の起動時間が変化したか確認してください:
$ systemd-analyze blame | grep apparmor
トラブルシューティング
Samba SMB/CIFS サーバーを起動できない
Samba#AppArmor におけるパーミッションの問題 を参照
aa-logprof でイベントが捕捉されない
Audit フレームワーク のログに特殊文字 0x1d
[2] が含まれる場合があります。AppArmor バグレポート がありますが、回避策として次を実行します。
# aa-logprof -f <(sed 's/\x1d.*//' < /var/log/audit/audit.log)
参照
- AppArmor wiki
- AppArmor Core Policy Reference — プロファイルで利用できるオプションの詳しい解説
- Ubuntu Tutorial — 利用可能なユーティリティとプロファイルの作成に関する概要
- Ubuntu Wiki — 基本的なコマンドの一覧
- AppArmor Versions — バージョンの概要とリリースノートのリンク
- Kernel Interfaces — AppArmor カーネルモジュールの低レベルインターフェイス
- wikipedia:Linux Security Modules — AppArmor が使用している Linux カーネルモジュール
- AppArmor in openSUSE Security Guide