Privileged(特権)ではない方法で、必要な分だけセキュリティを緩める
背景
Privileged(特権)を持った Docker コンテナは root 権限を備えたコンテナであり、 2021 年の Docker では Linux のセキュリティコンピューティングモード(secure computing mode; seccomp)と呼ばれる機構で制限がかけられている。 現在は 300 以上あるシステムコールのうち 44 が制限されている。
どのように制限をかけるか簡単に確認してみた。
環境
docker-compose の実行は Ubuntu Studio 21.04 コンテナは gentoo/stage3-amd64
docker-compose.yml に追加
- 制限する profile.json の雛形をダウンロード
- 雛形を修正
- docker-compose.yml 修正
- docker-compose を起動し直し
手順
wget https://raw.githubusercontent.com/moby/moby/master/profiles/seccomp/default.jsondefault.json を確認する。このリストはホワイトリストで、このリストに含まれていない場合、ブロックされる。 つまり「何か権限が足りない場合」、「このリストに追加」したい。
ただ 2021/08/04 に確認した所、 CAP_SYS_PTRACE に process_vm_readv は追加されていたので、 一旦、修正は加えず、 profile.json を持ちいて起動するように docker-compose.yml を修正して起動する。
docker-compose の修正
version: "3"
services:
distcc:
build:
context: ./
container_name: 'distcc'
security_opt: # <= security_opt を追加
- seccomp:default.json # <= docker-compose.ymlと同じディレクトリにjsonファイルを置いた
command: >
bash -c "/bin/bash"
volumes:
- ./make.conf:/etc/portage/make.conf発生していたエラー
/var/tmp/portage/sys-libs/glibc-2.33-r1/work/build-x86-x86_64-pc-linux-gnu-nptl/elf/sln /var/tmp/portage/sys-libs/glibc-2.33-r1/work/build-x86-x86_64-pc-linux-gnu-nptl/elf/symlink.list
* /var/tmp/portage/sys-apps/sandbox-2.18/work/sandbox-2.18/libsandbox/trace.c:do_peekstr():134: failure (Operation not permitted):
* ISE:do_peekstr:process_vm_readv(104259, 0x00007ffe29debd20{0x00007fd68a110010, 0x535}, 1, 0x00007ffe29debd30{0x00000000ff9a1acb, 0x535}, 1, 0) failed: Operation not permitted
/bin/sh: line 1: 89178 Aborted make -r PARALLELMFLAGS="" -C /var/tmp/portage/sys-libs/glibc-2.33-r1/work/glibc-2.33 objdir=`pwd` install↑ この ↓ の部分が気になる
ISE:do_peekstr:process_vm_readv(104259, 0x00007ffe29debd20{0x00007fd68a110010, 0x535}, 1, 0x00007ffe29debd30{0x00000000ff9a1acb, 0x535}, 1, 0) failed: Operation not permittedprocess_vm_readv という権限が許可されていなかった。
参考
Privileged(特権)を持った Docker コンテナは root 権限を備えたコンテナ
cgroups、AppArmor、SECcompなど、セキュリティを追加する他の隔離機能が放棄される、あるいは無効化されることにも注意が必要です。Privileged だとこの点も注意したい。ユーザー観点だと無効化された方が直感的には正しい(動くようになったので) ただ運用観点だと cgroups で制限かけたのに解除される、という構図になりそう。
Linux の BPF : (2) seccomp での利用
Linux 2.6.12 (2005) から seccomp は導入されていた。
docker での セキュリティコンピューティングモード(secure computing mode; seccomp)
Seccomp security profiles for Docker
docker による seccomp の説明
The default seccomp profile provides a sane default for running containers with seccomp and disables around 44 system calls out of 300+.
It is moderately protective while providing wide application compatibility. The default Docker profile can be found here.設定ファイルの雛形がここにある
seccomp プロファイルを使って docker のシステムコールを制御
コンパクトな seccomp の設定を作るのに参考にさせてもらった。 最初はここにある、デフォルトの json ファイルを修正していたが、見通しが悪いので、シンプルなものから始めた方が良さそう。
process_vm_readv
このシステムコールはプロセスのアドレス空間間でデータを転送するのに用いる。