Ubuntuではセキュリティ対策の一環としてAppArmorを採用しています。AppArmorを使えば、任意のプログラムに対して、意図しないファイルやデバイスのアクセスを阻害したり、サブプロセスに対するセキュリティ制約をかけたりできます。今回はあまり意識することのないものの、知っておくといつか役に立つかもしれない、実際に役に立つ時はあまり来てほしくないAppArmorについて紹介しましょう。
AppArmorとMACとLSMと
「AppArmor」
まずはAppArmorの特徴となる/etc/
)
/usr/bin/evince {
(中略)
/ r,
/**/ r,
(中略)
owner @{HOME}/** rw,
owner /media/** rw,
いちばん最初の/usr/
」
このように
次にAppArmorが提供する
AppArmorのfoo.
)r--------
」less foo.
」sudo
で任意のコマンドを実行できる場合はsudo less foo.
」
最後の
enforcedとcomplainingとステータス
AppArmorには主に次のような3種類のモードが存在します。
- enforced
(適用) モード:プロファイルで許可されていない処理を行おうとした場合は、エラー扱いにしログに残す - complaining
(学習) モード:プロファイルで許可されていない処理を行う場合、ログに残すものの、エラー扱いにはしない - unconfined
(非制限) モード:何も制限しない
実際には上記以外にも、拒否した際にそのタスクを終了させる
complainingモードについては、
これらのモードはプロファイル単位で設定します。つまりプロファイルのロード時に、enforcedモードかcomplainingモードを指定するわけです。ちなみにapparmor-utilsパッケージに含まれる、aa-enforce
やaa-complain
コマンド、aa-unconfined
を利用すると、バイナリ・
Ubuntuの場合、システムの起動時に設定済みのプロファイルを一通りロードするようになっています。具体的に関係するファイルやディレクトリは次のとおりです。
/etc/
apparmor. d /usr/
sbin/ apparmor_ parser /etc/
apparmor/ parser. conf /usr/
lib/ apparmor/ /usr/
bin/ aa-enabled /usr/
bin/ aa-exec /usr/
bin/ aa-features-abi /usr/
sbin/ aa-remove-unknown /usr/
sbin/ aa-status /usr/
sbin/ aa-teardown
まず最初に/etc/
」force-complain
」disable
」
このプロファイルを起動時にロードするのが/usr/
」parser.
で変更できますが、挙動を変えることはあまりありません。/usr/
などにはsystemdのapparmor./usr/
」
aa-FOO
なコマンドは、AppArmorの挙動を確認したり、稼働中に変更したりするコマンドです。またapparmor-utils
パッケージをインストールするとさらにいくつかのコマンドが追加されます。たとえばAppArmorが有効化されているかは次のコマンドで確認できます。
$ aa-enabled Yes
さらにファイルやプロセスのプロファイルへの適用状態はaa-status
で確認できます。
$ sudo aa-status apparmor module is loaded. 113 profiles are loaded. 55 profiles are in enforce mode. /snap/snapd/20290/usr/lib/snapd/snap-confine /snap/snapd/20290/usr/lib/snapd/snap-confine//mount-namespace-capture-helper /snap/snapd/20671/usr/lib/snapd/snap-confine /snap/snapd/20671/usr/lib/snapd/snap-confine//mount-namespace-capture-helper /usr/bin/evince (中略) 1 profiles are in complain mode. /usr/sbin/sssd 0 profiles are in prompt mode. 0 profiles are in kill mode. 57 profiles are in unconfined mode. /bin/toybox (中略) 13 processes have profiles defined. 13 processes are in enforce mode. /usr/sbin/cups-browsed (2092) /usr/sbin/cupsd (1392) (中略) 0 processes are in complain mode. 0 processes are in prompt mode. 0 processes are in kill mode. 0 processes are unconfined but have a profile defined. 0 processes are in mixed mode.
aa-status
の実行結果には、上から順番に次のような情報が含まれています。
- カーネルのapparmor機能が有効化されているかどうか
- プロファイルの総数
- enforcedなプロファイルの対象となっているコマンドのファイルパス
- complainingなプロファイルの対象となっているコマンドのファイルパス
- prompt/
killモードになっているプロファイルのコマンドのファイルパス (基本的に0になる) - unconfinedモード
(プロファイルが用意されていない) コマンドのファイルパス - プロファイルが設定されているプロセスの数
- enforcedなプロファイルの対象となっているプロセスの実行パス
- complainingなプロファイルの対象となっているプロセスの実行パス
- prompt/
killモードになっているプロファイルのプロセスの実行パス (基本的に0になる) - プロファイルが設定されているけれどもunconfinedなプロセスの実行パス
- mixedモードになっている
(complainingとenforcedが混じり合っている) プロセスの実行パス
基本的にはenforce/
」
AppArmorの有効化・無効化
Ubuntuの場合、AppArmorは最初から有効化されています。前の項目にあるように、起動時に必要なプロファイルをロードすることで、適切な設定がされた状態になっています。普通にUbuntuを使う限りにおいて、これを変更する必要はありません。しかしながら、何らかの理由でどうしても無効にしたい場合があるでしょう。AppArmorを無効化するにはいくつかの方法が存在します。
もし常に無効化したい場合は、systemdのapparmor.
を止めてしまうのが確実です。
$ sudo systemctl stop apparmor.service $ sudo systemctl disable apparmor.service
これにより次回の起動時からプロファイルはロードされなくなり、すべてのプロセスがunconfinedモードとして動作します。ただしカーネル側のAppArmorの機能自体は存在するため、任意のプロファイルをあとからロードすることは可能です。
もしカーネルの機能も含めて無効化したいのであれば、/etc/
のGRUB_
にapparmor=0
」sudo update-grub
」/sys/
」
特定のプロファイルのみを無効化したい場合は、apparmor_
コマンドでプロファイルをアンロードできます。
$ sudo apparmor_parser -R /etc/apparmor.d/プロファイル名
たとえば/etc/
」
audit deny @{HOME}/.* mrwkl,
これはホームディレクトリのドットファイルのmmap・
$ sudo tcpdump -w ~/.test.log -i eno1 tcpdump: /home/shibata/.test.log: Permission denied $ journalctl -r | grep apparmor| head -1 (略) apparmor="DENIED" operation="mknod" class="file" profile="tcpdump" name="/home/shibata/.test.log" (略)
上記のようにsudo apparmor_
」tcpdump
を実行すると、エラーにならないことから、プロファイルがアンロードされたことがわかるでしょう。再ロードはsudo apparmor_
」
単にプロファイルの中身を書き換えてそれを反映したいのであれば、次のように実行してください。
$ sudo apparmor_parser -r /etc/apparmor.d/プロファイル名
大文字の-R
-r
sudo systemctl reload apparmor.
」
ここまでUbuntuにおいてはAppArmorとその設定