紹介

このポストの目的は AppArmor というものに気付いている人を増やしたいのと Ubuntu ユーザー に AppArmor を使うのを勧めることです。Although there are portions of this post that may seem quite technical, it is not my intent to give a full technical review of the workings of AppArmor or compare AppArmor to alternate options, such as SELinux.

Novell のサイトからの引用

  • AppArmor is designed to provide easy-to-use application security for both servers and workstations. Novell AppArmor is an access control system that lets you specify per program which files the program may read, write, and execute. AppArmor secures applications by enforcing good application behavior without relying on attack signatures, so it can prevent attacks even if they are exploiting previously unknown vulnerabilities.

AppArmor はセキュリティツールで、”リスク”のあるアプリケーションによるシステムアクセスを制限し、限定するため管理する name-based 強制アクセス制御です。”リスク”のあるアプリケーションはサーバー・クライアントアプリケーションともにネットワークへのアクセスを含んでいます。このポストでは、例として Firefox を使うでしょう。

The goal is to apply application specific rules or "profiles" to "confine" Firefox, or any other application, to only the directories, files, and posix 1003.1e draft capabilities needed for normal functioning. In the event Firefox is compromised, Apparmor's confinement helps to prevent the compromising of the system as a whole.

AppArmor は強力なプログラムです。 “confine”モードのプログラムでは、 AppArmor はルートユーザーの活動でさえも制限することができます。AppArmor は SELinux の代替を目指し、より簡単に使えることを目指しています。

AppArmor はアプリケーションのためにプロファイルを書くことによって設定します。プロファイルは一度に一つのアプリケーションに書かれ、一般的に対象となるアプリケーションはネットワークにアクセスします。アプリケーションのアクセスを制限するためのプロファイルはテキストファイルです。制限とは標準の Linux のパーミッションに追加するものです。例えば、you can not give access to a directory or file with AppArmor if such access violates the permissions.

想像しよう。例えば、あなたのブラウザー Firefox が(コードの欠陥のために)乗っとられた。またこうも想像できる。クラッカーが Firefox を使ってあなたのホームディレクトリーやシステムファイルにアクセスしようとしたら、誰かがシステムファイルを読んだり変更したりや勝手なコードを実行することを可能にするだろう。 This hypothetical flaw in Firefox then leads to an escalation of privileges and root access is obtained.

“伝統的な”セキュリティモデルは(例えば Firefox のセキュリティアップデートのように)コードの欠陥の補修によって、問題を直してきた。たぶんウイルススキャナーやルートキットのような HIDS のための新しいルールが生じたのだろう。(?)

このモデルの問題はZero Day Attack として知られる攻撃への防御がないことです。AppArmor はシステムにもう1つのチェックを加えます。質問ですが、Firefox がシステムファイルにアクセスしたり、変更したりするべきでしょうか? AppArmor は Firefox を制限し、 もし新たな脆弱性が存在したら AppArmor は特権の拡大を防ぐのを助けます。

私は ここ で AppArmor のプロファイルの収集をしています。 追加的な貢献を歓迎します。 (PM me if interested).

参照

Ubuntu での AppArmor

初期状態では、 AppArmor はほとんど何もしません。 (and thus with this post I am hoping to change that ...). Ubuntu 8.04 のデフォルトでは、 AppArmor は CUPS のみを保護します。(Ubutu 9.04 はデフォルトで7つのプロファイルを含みます。:dhclient-script (listed twice), dhclient3, cupsd, tcpdump, cups-pdf, nm-dhcp-clinet.action {basically cpus, dhclient, and tcpdump} ).

追加的な AppArmor-profiles をインストールすることが出来ます。 いくつかの追加的なアプリケーションを起動したとしても、プロファイルを書いたり、カスタマイズするべきでしょう。Firefox を例として説明します。

以下のコマンドで追加のプロファイルをインストールできます :

sudo apt-get install apparmor-profiles

追加のプロファイルをインストールしても、デフォルトでは complain モードです。(?)(手動でアクティブにする必要があります。)

プロファイルは /etc/apparmor.d に入れられています。

Ubuntu の AppArmor はプロファイル違反を /var/log/messages に記録します。

AppArmor は kernel standard securityfs mechanism をプロファイルの読み込みとモニターに使います。

securityfs は /sys/kernel/security にマウントされています。 /sys/kernel/security/apparmor/profiles は 現在の読み込まれているプロファイルの設定を表現する仮想ファイルです。

Ubuntu では、プロファイルを管理、書き込みする GUI ツールはありません。だから コマンドラインツールと設定ファイルの編集をします。設定ファイルはテキストファイルで、少し読めばとても簡単に理解できます。

プロファイル

プロファイルは /etc/apparmor.d に入れられています。

プロファイルは制限しようとするアプリケーションのフルパスの最初の / は消されほかの / は . に変換された名前です。Firefox は少しややこしくて /usr/bin/firefox は/usr/bin/firefox-3.0にリンクされて、/usr/lib/firefox-3.0.4/firefox.sh にリンクされています。(Ubuntu 9.04 Alpha の場合)

  1. /usr/lib/firefox-3.0.4/firefox.sh

  2. usr.lib.firefox-3.0.4.firefox.sh になり

  3. /etc/!AppArmor.d/usr.lib.firefox-3.0.4.firefox.sh として保存される。

詳細は後ほど

Enforcement

一度プロファイルを定義するとアプリケーションを起動したときに自動的に有効になります。complain と enforce 2 つのモードがあります。

complain

complain モードでは AA(AppArmor?) はアプリケーションを制限しませんが、アプリケーションを監視し、プロファイル違反を記録します。私はこれをテストモードだと思っています。

enforce

enforce モードでは AA(AppArmor?) はアプリケーションを監視し、プロファイル違反を記録します。違反があれば、アクセスを禁止します。(?)

Start / Stop AppArmor

書式 : /etc/init.d/apparmor {start|stop|restart|try-restart|reload|force-reload|status|kill}

Start
sudo /etc/init.d/apparmor start
Stop
sudo /etc/init.d/apparmor stop
Reload
sudo /etc/init.d/apparmor reload
Show status
sudo /etc/init.d/apparmor status

以下同じ

便利な AppArmor のコマンド

メモ: “|” = "or" です。つまり geprof または aa-gprof を表わしています。

引用元 : Novell AppArmor Guide http://webapp5.rrz.uni-hamburg.de/SuSe-Dokumentation/manual/sles-manuals_en/manual/sec.aaquick.cmdline.html

genprof | aa-genprof

Generate or update a profile. When running, you must specify a program to profile. If the specified program is not an absolute path, genprof searches the $PATH variable. If a profile does not exist, genprof creates one using autodep.

構文
sudo genprof application
sudo genprof firefox
  • /etc/apparmor.d/usr.lib.firefox-3.0.4.firefox.sh に Firefox のプロファイルを作ります。

autodep | aa-autodep

Guess basic AppArmor profile requirements. autodep creates a stub profile for the program or application examined. The resulting profile is called approximate because it does not necessarily contain all of the profile entries that the program needs to be confined properly.

complain | aa-complain

Set an AppArmor profile to enforce mode from complain mode.

構文
complain rule
sudo complain firefox

enforce | aa-enforce

Set an AppArmor profile to enforce mode from complain mode. 

構文
enforce rule
sudo enforce firefox

unconfined | aa-unconfined

Output a list of processes with open tcp or udp ports that do not have AppArmor profiles loaded. 

logprof | aa-logprof

Manage AppArmor profiles. logprof is an interactive tool used to review the learning or complain mode output found in the AppArmor syslog entries and to generate new entries in AppArmor profiles.

Translation: search your logs for problems and use this information to modify the firefox profile.

apparmor_parser

これはプロファイルのカーネルへの読み出し(一般的には再読み出しに使われ再読み出し)のために使われます。プロファイルを編集した後に使ってください。 :

sudo apparmor_parser -r /etc/apparmor.d/<profile>

"<profile>" の所はリロードするプロファイルに置き換えてください。

AppArmor の再起動でも出来ます(再読み出しと同じ)

/etc/init.d/apparmor restart

プロファイルの分析

プロファイルの分析

ここからが肝心な部分です。

AppArmor のもとで制限するアプリケーションは /etc/!AppArmor.d ディレクトリーの中にプロファイルを与えられます。

Each profile is named after the application to which it applies, パス中の / は . に変えられます。(最初の / は消されます。)

つまり、 /usr/lib/firefox-3.0.4/firefox.sh は usr.lib.firefox-3.0.4.firefox.sh になります。

プロファイルはテキストファイル以上のものではありません。プロファイルは コマンドライン(OpenSUSE では YaST という GUI のツールがありますが、 Ubuntu では GUI のツールはありません。) のツールユーザーによって作られたりします。プロファイルはエディター(gedit, nano, vim など)で見たり、手作業で管理(チューンアップ)できます。I will walk you through generating a profile for firefox in the next post.

プロファイルは4つのセクション #include, capability entries, rules, hats から構成されます。

# include

#include は sourcing や libraries に似ていて、一般的な制限のリストを作ります。Rather then writing this list over and over in profiles, you can keep it in a common location and incorporate it into a profile with an #include. When you update the common list, all your profiles are updated.

Capability entries

英語では permission checking と言います。

ギークの言葉では :

Capabilities statements are simply the word capability followed by the name of the POSIX.1e capability as defined in the capabilities(7) man page.

興味があるなら capabilities(7) man page を読んでください。

Rules

基本的にファイルやディレクトリに適用するパーミッションの設定があります。構文は設定したいパスの後にルールです。

[path] [rules]

path

パスの中には Glob や special characters が使えます。

*  Substitutes for any number of characters, except /.

** Substitutes for any number of characters, including /.

?  Substitutes for any single character, except /.

[ abc ] Substitutes for the single character a, b, or c.

[ a-c ] Substitutes for the single character a, b, or c.

{ ab,cd } Expand to one rule to match ab and another to match cd.
[ ^a ] Substitutes for any character except a.

ファイルのルール:

r = read
w = write
l = link
k = lock
a = append

実行可能(アプリケーション)のルール:

ix = inherit = Inherit the parent's profile.
px = requires a separate profile exists for the application, with environment scrubbing.
Px = requires a separate profile exists for the application, without environment scrubbing.

ux and Ux = Allow execution of an application unconfined, with and without environmental scrubbing. (use with caution if at all).

m = allow executable mapping.

詳細な説明は AppArmor(5) を参照してください。

例(man page より)

# a variable definition
@{HOME} = /home/*/ /root/

# a comment about foo.
/usr/bin/foo {
/bin/mount ux,
/dev/{,u}random r,
/etc/ld.so.cache r,
/etc/foo.conf r,
/etc/foo/* r,
/lib/ld-*.so* x,
/lib/lib*.so* r,
/proc/[0-9]** r,
/usr/lib/** r,
/tmp/foo.pid wr,
/tmp/foo.* lrw,
/@{HOME}/.foo_file rw,

# a comment about foo's subprofile, bar.
^bar {
/lib/ld-*.so* x,
/usr/bin/bar ix,
/var/spool/* rwl,
}
}

Comments :

  1. 変数を使うのは、 /home パーティションを標準でない場所にマウントする必要がある場合だけです。
    • " /@{HOME}/.foo_file"
  2. コメントは # で始めます。
  3. /etc/foo/* r,
    • /etc/foo の中のファイルへのアクセスを許可します。 /etc/** は /etc の中のすべてのサブディレクトリーへのアクセスを許可します。

Hats

While an AppArmor profile is applied to an application, there are times with a sub process of the program may need access differing from the main program. In this event, the sup process may "change hats" or use an alternate sub-profile.

A profile may have more then 1 sub-profile, however the sub-profiles may not have sud-sub profiles (if that makes sense).

現時点では hats を使っているアプリケーションはとても少ない。例えば Apache です。

もっと詳細な説明

man !AppArmor
man !AppArmor.d

プロファイルの作成

デフォルトでは Ubuntu は CUPS のプロファイルしか含んでいません。 以下のコマンドで追加のプロファイルをインストールできます。

sudo apt-get install apparmor-profiles

追加のプロファイル :

usr.sbin.avahi-daemon , usr.sbin.nmbd , bin.ping, sbin.klogd , usr.sbin.nscd , sbin.syslogd , usr.sbin.dnsmasq, usr.sbin.ntpd , sbin.syslog-ng, usr.sbin.identd , usr.sbin.smbd , gdm-guest-session , usr.sbin.mdnsd , and usr.sbin.traceroute

また /etc/!AppArmor.d/abstractions に #includes のための情報を含んでいます。

Note: After you generate a new profile, or edit an existing profile, the profile must be (re)loaded into the kernel and the application to which it applies must be restarted. The can be performed by restarting the application or rebooting.

sudo apparmor_parser -r /etc/apparmor.d/<profile>

"<profile>" の所はリロードするプロファイルに置き換えてください。

約束通り、Firefox のプロファイルを作ります。

はじめに、Firefox を閉じてください。

以下を実行してください。

sudo genprof firefox

これは Firefox のための”基本的な”プロファイルを作成し、Firefox を complain モードにします。You will be able to run Firefox and any violations of the profile will be logged.

Firefox のプロファイルを見直し、あなたの出来ることを追加することを提案します。

Now lets follow the logs while we take Firefox for a spin. 端末を開いて入力してください。

tail -F /var/log/messages

Firefox の AppArmor のプロファイルはすでに complain モードになっています。Firefox を起動し、”普通の活動”をしてください。Firefox を起動したり、終了したり、Web サイトを閲覧したり、ファイルをダウンロードしたり、ローカルのファイルを閲覧したり... など。 This will vary from one setup to another and we do not all use Firefox in the same way.

試行錯誤の期間では、/var/log/messages を見たときたくさんのエラーメッセージを目にするでしょう。Initially you will get an overwhelming number, that is OK, work through the error messages one at at time, modify your profile, quit Firefox, reload your profile and work on the next set of messages.

もし困ったり、何を加えるべきか分からなかったら、aa-logprof を使いましょう。私はまず現在のプロファイルのバックアップを取るべきだと思います。(バックアップは/etc/apparmor.d の外にしてください。)

sudo cp /etc/apparmor.d/user.lib.firefox-3.0.4.firefox.sh /root/user.lib.firefox-3.0.4.firefox.sh

次に、

sudo aa-logprof firefox

This will search your logs and modify your profile on the basis of how you answer the resulting questions.

Note: aa-logprof is a bit unrefined and you should review and edit the resulting changes in the profile manually.

私の最終的なプロファイル(Ubuntu 9.04 Alpha, Firefox 3.0.4)

# Last Modified: Thu Dec 11 21:08:14 2008
#include <tunables/global>
/usr/lib/firefox-3.0.4/firefox.sh {
#include <abstractions/base>
#include <abstractions/bash>
#include <abstractions/consoles>
#Include <abstractions/gnome>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>

network dgram,
network stream,

/bin/dash rix,
/bin/grep rix,
/bin/ps rix,
/usr/bin/basename rix,
/usr/lib/firefox-3.0.4/firefox mrix,
/usr/lib/gamin/gam_server mrix,

/dev/shm/ r,
owner /dev/shm/pulse-* rw,
/etc/ r,
/etc/firefox-3.0/pref/ r,
/etc/firefox-3.0/pref/* r,
/etc/gre.d/ r,
/etc/gre.d/1.9.0.4.system.conf r,
/etc/mime.types r,
/etc/pulse/client.conf r,
/etc/sound/events/gtk-events-2.soundlist r,
/etc/xulrunner-1.9/system-greprefs.js r,
owner /home/** rw,
owner /home/*/.adobe/ rw,
owner /home/*/.adobe/** rw,
owner /home/*/.config/gtk-2.0/** rwk,
owner /home/*/.macromedia/ w,
owner /home/*/.macromedia/** rw,
owner /home/*/.mozilla/** rwk,
owner /home/*/.pulse-cookie rwk,
owner /home/*/.pulse/ w,
owner /home/*/{Desktop,Documents,Downloads}/ rw,
owner /home/*/{Desktop,Documents,Downloads}/** rw,

owner /proc/*/maps r,
/proc/*/mounts/* r,
owner /proc/*/stat r,
/proc/version r,
/usr/local/share/** r,
/usr/share/** r,
/var/lib/dbus/machine-id r,

}

メモ: このプロファイルを使用したとき、ローカルのファイルや / や画像を閲覧できなくなります。

Generating a profile is thus an active process an one where you can learn what "normal functioning" of Firefox entails. There are only really two mistakes you can make:

  1. 制限のしすぎ。極端な場合、(enforce モードにした時に) Firefox が起動しません。
  2. 許可のしすぎ。Keep in mind, however, that before you make a profile Firefox had relatively unfettered access to your system. Also standard Linux permissions still apply.

役に立つ glob:

/home/*/

/usr/share/** r
/usr/local/share/** r

準備が出来たら、Firefox のプロファイルを enforce モードにしてください。ログを見て Firefox を再起動してください。まだ変更を加えないといけないかもしれません。(?)

As with any application, as you use AppArmor you will get a feel for how it works and how to write efficient Profiles.

編集の後にはリロードを忘れないでください。

sudo apparmor_parser -r /etc/apparmor.d/<profile>

または、

/etc/init.d/apparmor restart

また私はこのスレッドを始めたいと思っています。: Share your AppArmor Profiles

UbuntuJapaneseWiki: Nimu/IntroductionToAppArmor (最終更新日時 2012-01-10 11:49:06 更新者 匿名)