AppArmor

AppArmor は Linux Security Module (LSM) の一つで、Mandatory access control (MAC) を実現しています。
アプリケーションごとにプロファイルを適用することができ、特定のファイルへのアクセスやシステムコールの呼び出しの制限を行うことができます。

例えば次のようなプロファイルを作成し、有効化することで /home/ubuntu/mybash/etc/hosts の読み込みだけができ、他のファイルへの読み書きができなくなります。

$ cat /etc/apparmor.d/test
#include <tunables/global>

profile test /home/ubuntu/mybash {
    #include <abstractions/base>

    /etc/hosts r,
    /usr/bin/cat ix,
}

$ sudo apparmor_parser -r -W /etc/apparmor.d/test

$ ./mybash
mybash-5.0$ cat /etc/passwd
cat: /etc/passwd: Permission denied
mybash-5.0$ cat /etc/hosts
# Your system has configured 'manage_etc_hosts' as True.
...
127.0.0.1 localhost
...

mybash-5.0$ echo test >> /etc/hosts
mybash: /etc/hosts: Permission denied

Docker コンテナにも default-docker というプロファイル名で適用されており、多層防御の一つとして機能します。1

$ sudo aa-status | grep docker
   docker-default

例えば、 CAP_SYS_ADMIN を付与した場合でも mount コマンドは AppArmor によって実行が防止されますが、AppArmor を外すことで実行することができ、AppArmor が最後の砦として機能していることが確認できます。

$ docker container run --rm -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu:latest bash
root@85c7ea124688:/# mkdir a; mkdir b; mount --bind a b
mount: /b: bind /a failed.

$ docker container run --rm -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu:latest bash
root@110e911e07bc:/# mkdir a; mkdir b; mount --bind a b
root@110e911e07bc:/#

コンテナ上で動くアプリケーションに対応したカスタムプロファイルを作成することで、コンテナをより強固にすることができます。


1. https://github.com/moby/moby/blob/master/contrib/apparmor/template.go

results matching ""

    No results matching ""