Ubuntu 16.10: AppArmorで強制アクセス制御

AppArmorの使い方について記載します。

1 AppArmorのインストール

デフォルトでapparmorはインストールされていますが、utilsやprofileがインストールされていないのでインストールします。

$ sudo apt install -y apparmor-utils \
       apparmor-profiles apparmor-profiles-extra
$ sudo aa-enforce /etc/apparmor.d/*
$ sudo systemctl reload apparmor

2 AppArmorの状態を表示

aa-statusでAppArmorの状態を表示します。Enforce modeはプロファイルが許可しない動作をブロックします。Complain modeはプロファイルが許可しない動作をブロックせずにログに残します。例えば/sbin/dhclientはAppArmorによって制御されます(AppArmorはPathベースのMACです)。なお、このプロファイルの一覧にないPathは特に制限を受けません。

$ sudo aa-status
apparmor module is loaded.
77 profiles are loaded.
77 profiles are in enforce mode.
   /sbin/dhclient
   /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
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/NetworkManager/nm-dhcp-helper
   /usr/lib/chromium-browser/chromium-browser
   /usr/lib/chromium-browser/chromium-browser//browser_java
   /usr/lib/chromium-browser/chromium-browser//browser_openjdk
   /usr/lib/chromium-browser/chromium-browser//chromium_browser_sandbox
   /usr/lib/chromium-browser/chromium-browser//lsb_release
   /usr/lib/chromium-browser/chromium-browser//sanitized_helper
   /usr/lib/chromium-browser/chromium-browser//xdgsettings
<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/pkg-config-hook-config > /dev/null
mycat: /etc/dpkg/dpkg.cfg.d/pkg-config-hook-config: Permission denied
$ mycat /etc/apt/apt.conf.d/00aptitude > /dev/null
$