AppArmorの使い方について記載します。
Table of Contents
1 AppArmorのインストール
AppArmorをインストールします。
$ sudo apt install -y apparmor apparmor-utils \ apparmor-profiles apparmor-profiles-extra $ sudo systemctl enable apparmor
aa-enforceを実行すると下記のエラーが出るのでディレクトリを作成します。
$ # ERROR: Include file /var/lib/snapd/apparmor/snap-confine not found $ sudo mkdir -p /var/lib/snapd/apparmor/snap-confine
カーネルパラメータを追加して再起動します。
$ . /etc/default/grub $ V="${GRUB_CMDLINE_LINUX} apparmor=1 security=apparmor" $ sudo sed -e "s;^GRUB_CMDLINE_LINUX=.*;GRUB_CMDLINE_LINUX=\"${V}\";g" \ -i /etc/default/grub $ sudo grub-mkconfig -o /boot/grub/grub.cfg $ sudo reboot
再起動後、プロファイルを有効にします。
$ find /etc/apparmor.d -type f -exec sudo aa-enforce {} \; $ sudo systemctl reload apparmor
2 AppArmorの状態を表示
aa-statusでAppArmorの状態を表示します。 Enforce modeはプロファイルが許可しない動作をブロックします。Complain modeはプロファイルが許可しない動作をブロックせずにログに残します。例えば/usr/bin/evinceはAppArmorによって制御されます(AppArmorはPathベースのMACです)。なお、このプロファイルの一覧にないPathは特に制限を受けません。
$ sudo aa-status apparmor module is loaded. 54 profiles are loaded. 54 profiles are in enforce mode. /usr/bin/evince /usr/bin/evince-previewer /usr/bin/evince-previewer//sanitized_helper /usr/bin/evince-thumbnailer /usr/bin/evince-thumbnailer//sanitized_helper /usr/bin/evince//sanitized_helper /usr/bin/irssi /usr/bin/pidgin /usr/bin/pidgin//launchpad_integration /usr/bin/pidgin//sanitized_helper /usr/bin/totem /usr/bin/totem-audio-preview /usr/bin/totem-video-thumbnailer <snip>
2.1 プロファイルの状態変更
aa-enforceでEnforceモードにします。
$ sudo aa-enforce /etc/apparmor.d/<profile>
aa-complainでComplainモードにします。
$ sudo aa-complain /etc/apparmor.d/<profile>
2.2 プロファイルの有効化・無効化
apparmor_parser -Rで無効化します。 disableディレクトリにシンボリックリンクを作成することで、AppArmor起動時に無効化します。
$ sudo apparmor_parser -R /etc/apparmor.d/<profile> $ sudo ln -s /etc/apparmor.d/<profile> /etc/apparmor.d/disable/
apparmor_parser -rで有効化します。 disableディレクトリにシンボリックリンクを削除することで、AppArmor起動時に有効化します。
$ sudo apparmor_parser -r /etc/apparmor.d/<profile> $ sudo rm -f /etc/apparmor.d/disable/<profile>
3 プロファイルの作成
/bin/catを/bin/mycatというファイル名でコピーします。 /bin/mycat向けにプロファイルを作成していきます。
$ sudo cp /bin/cat /bin/mycat
aa-genprofで雛形を作成します。Fを押して終了します。なお、aa-genprofをそのまま動かしつつ、他のターミナルで/bin/mycatを一通り操作することで、/var/log/syslogにログが溜まっていき、Sを押してアクションを許容するかどうかを決定してプロファイルの雛形を作成することもできます。
$ sudo aa-genprof /bin/mycat <snip> Profiling: /bin/mycat [(S)can system log for AppArmor events] / (F)inish <snip>
雛形は以下の通りです。
$ sudo cat /etc/apparmor.d/bin.mycat # Last Modified: Tue Jun 13 16:38:23 2017 #include <tunables/global> /bin/mycat { #include <abstractions/base> /bin/mycat mr, }
雛形を以下のように変更します。 /fooはファイルとして扱われ、/bar/はディレクトリとして扱われる点に注意してください。
$ sudo cat /etc/apparmor.d/bin.mycat # Last Modified: Tue Jun 13 16:38:23 2017 #include <tunables/global> /bin/mycat { #include <abstractions/base> /bin/mycat mr, # /foo is file and /bar/ is directory. /etc/hostname r, # /etc/hostname can be read. /etc/dpkg/* r, # Files in /etc/dpkg can be read but directory cannot. /etc/apt/** r, # All file and directory in /etc/apt can be read. }
プロファイルをEnforceにします。
$ sudo aa-enforce /etc/apparmor.d/bin.mycat Setting /etc/apparmor.d/bin.mycat to enforce mode.
/bin/mycatの実行結果は以下の通りです。 read権限を与えたパス以外はPermission deniedになります。
$ mycat /etc/passwd > /dev/null mycat: /etc/passwd: Permission denied $ mycat /etc/hostname > /dev/null $ mycat /etc/dpkg/dpkg.cfg > /dev/null $ mycat /etc/dpkg/dpkg.cfg.d/force-unsafe-io > /dev/null mycat: /etc/dpkg/dpkg.cfg.d/force-unsafe-io: Permission denied $ mycat /etc/apt/apt.conf.d/00CDMountPoint > /dev/null $