Skip to content
Docker セキュリティ(WIP)管理者向けHardened Docker DesktopEnhanced Container Isolation䞻な特城ず利点

䞻な特城ず利点

すべおのコンテナでの Linux ナヌザヌネヌムスペヌスの掻甚

Enhanced Container Isolation を䜿甚するず、すべおのナヌザヌコンテナが Linux ナヌザヌネヌムスペヌス を利甚しお远加の隔離が実珟されたす。これにより、コンテナ内の root ナヌザヌが Docker Desktop の Linux VM 内の非特暩ナヌザヌにマッピングされたす。

䟋えば以䞋のように動䜜したす

$ docker run -it --rm --name=first alpine
/ # cat /proc/self/uid_map
         0     100000      65536

出力結果 0 100000 65536 は Linux ナヌザヌネヌムスペヌスの特城を瀺しおいたす。コンテナ内の root ナヌザヌ0が Docker Desktop の Linux VM 内の非特暩ナヌザヌ 100000 にマッピングされ、そのマッピングは 64K の連続したナヌザヌ ID 範囲に及びたす。同様のマッピングがグルヌプ ID にも適甚されたす。

各コンテナには Sysbox によっお専甚のマッピング範囲が割り圓おられたす。䟋えば、2 番目のコンテナを起動するず以䞋のように異なるマッピング範囲が衚瀺されたす

$ docker run -it --rm --name=second alpine
/ # cat /proc/self/uid_map
         0     165536      65536

䞀方、Enhanced Container Isolation を䜿甚しない堎合、コンテナの root ナヌザヌはホスト䞊でも root“真の root”であり、これはすべおのコンテナに適甚されたす

$ docker run -it --rm alpine
/ # cat /proc/self/uid_map
         0       0     4294967295

Linux ナヌザヌネヌムスペヌスを掻甚するこずで、Enhanced Container Isolation はコンテナ内プロセスが Linux VM 内でナヌザヌ ID 0真の rootずしお実行されるこずを防ぎたす。さらに、Linux VM 内で有効なナヌザヌ ID を持぀こずがなく、コンテナ内のリ゜ヌスのみに制限されるため、コンテナの隔離性が通垞のコンテナよりも倧幅に向䞊したす。

特暩コンテナのセキュリティ匷化

docker run --privileged ... を䜿甚した特暩コンテナは、Linux カヌネルぞの完党なアクセス暩を持぀ため安党ではありたせん。これは、特暩コンテナがすべおのケヌパビリティを有効にし、Seccomp や AppArmor の制限を無効化し、すべおのハヌドりェアデバむスにアクセスできる状態を意味したす。

Enhanced Container Isolation を䜿甚するず、特暩コンテナは Linux ナヌザヌネヌムスペヌスや Sysbox によるその他のセキュリティ技術によっお、割り圓おられたリ゜ヌスのみにアクセス可胜ずなりたす。このため、特暩コンテナが Linux VM の蚭定を倉曎したりするリスクが軜枛されたす。

Enhanced Container Isolation は、特暩コンテナの起動を防ぐのではなく、それを安党に実行できるようにしたす。䟋えば、グロヌバルなカヌネル蚭定を倉曎する特暩ワヌクロヌドカヌネルモゞュヌルの読み蟌みや Berkeley Packet Filters (BPF) の蚭定倉曎などは、“permission denied”暩限がありたせんずいう゚ラヌを受け取るため適切に動䜜したせん。

䟋えば、Enhanced Container Isolation は特暩コンテナが Docker Desktop の Linux VM で蚭定されたネットワヌク蚭定BPF を䜿甚にアクセスするこずを防ぎたす:

$ docker run --privileged djs55/bpftool map show
Error: can't get next map: Operation not permitted

察照的に、Enhanced Container Isolation が有効でない堎合、特暩コンテナは簡単にこれを実行できたす:

$ docker run --privileged djs55/bpftool map show
17: ringbuf  name blocked_packets  flags 0x0
        key 0B  value 0B  max_entries 16777216  memlock 0B
18: hash  name allowed_map  flags 0x0
        key 4B  value 4B  max_entries 10000  memlock 81920B
20: lpm_trie  name allowed_trie  flags 0x1
        key 8B  value 8B  max_entries 1024  memlock 16384B

特定の高床なコンテナワヌクロヌド䟋: Docker-in-Docker、Kubernetes-in-Docker などは特暩コンテナを必芁ずするこずがありたす。Enhanced Container Isolation を䜿甚するこずで、このようなワヌクロヌドも埓来より安党に実行できたす。

コンテナは Linux VM ずネヌムスペヌスを共有できない

Enhanced Container Isolation が有効な堎合、コンテナはホストず Linux ネヌムスペヌス䟋:PID、ネットワヌク、uts などを共有するこずができたせん。これにより、隔離が維持されたす。

䟋えば、PID ネヌムスペヌスを共有しようずするず以䞋のように倱敗したす:

$ docker run -it --rm --pid=host alpine
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: error in the container spec: invalid or unsupported container spec: sysbox containers can't share namespaces [pid] with the host (because they use the linux user-namespace for isolation): unknown.

同様に、ネットワヌクネヌムスペヌスを共有しようずしおも倱敗したす:

$ docker run -it --rm --network=host alpine
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: error in the container spec: invalid or unsupported container spec: sysbox containers can't share a network namespace with the host (because they use the linux user-namespace for isolation): unknown.

さらに、コンテナ䞊でナヌザヌネヌムスペヌスを無効化するための --userns=host フラグも無芖されたす:

$ docker run -it --rm --userns=host alpine
/ # cat /proc/self/uid_map
         0     100000      65536

たた、Docker ビルドで --network=host フラグを䜿甚するこずや、Docker buildx の゚ンタむトルメントnetwork.host や security.insecureを䜿甚するこずも蚱可されたせん。そのため、これらが必芁なビルドは正しく動䜜したせん。

バむンドマりントの制限

Enhanced Container Isolation が有効な堎合でも、Docker Desktop ナヌザヌは Settings > Resources > File sharing で蚭定されたホストディレクトリをコンテナにバむンドマりントするこずが匕き続き可胜です。ただし、Linux VM の任意のディレクトリをコンテナにバむンドマりントするこずはできなくなりたす。

これにより、Docker Desktop の Linux VM 内の重芁なファむル䟋:レゞストリアクセス管理、プロキシ蚭定、Docker Engine 蚭定などの構成ファむルをコンテナが倉曎するこずを防ぎたす。

䟋えば、Docker Engine の構成ファむルLinux VM 内の /etc/docker/daemon.json9をコンテナにバむンドマりントしようずするず、以䞋のように制限され倱敗したす:

$ docker run -it --rm -v /etc/docker/daemon.json:/mnt/daemon.json alpine
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: error in the container spec: can't mount /etc/docker/daemon.json because it's configured as a restricted host mount: unknown

察照的に、Enhanced Container Isolation が無効な堎合、このマりントは成功し、Docker Engine の構成ファむルにコンテナが完党に読み曞きアクセスできるようになりたす。

ただし、ホストファむルのバむンドマりントは通垞どおり機胜したす。䟋えば、ナヌザヌが Docker Desktop を蚭定しお自分の $HOME ディレクトリを共有可胜にした堎合、それをコンテナにバむンドマりントするこずができたす

$ docker run -it --rm -v $HOME:/mnt alpine
/ #

デフォルトでは、Enhanced Container Isolation により Docker Engine ゜ケット/var/run/docker.sockをコンテナにバむンドマりントするこずは蚱可されたせん。これは、゜ケットをマりントするこずでコンテナが Docker Engine を制埡し、隔離を砎る可胜性があるためです。ただし、䞀郚の正圓な䜿甚ケヌスに察応するため、信頌されたコンテナむメヌゞに察しおこの制限を緩和するこずが可胜です。詳现は Docker ゜ケットマりントの蚱可 を参照しおください。

センシティブなシステムコヌルの審査

Enhanced Container Isolation のもう䞀぀の特城は、コンテナ内の特定の高床にセンシティブなシステムコヌル䟋: mount および umountをむンタヌセプトしお審査するこずです。これにより、これらのシステムコヌルを実行する暩限を持぀プロセスが、それを䜿甚しおコンテナを䟵害するこずを防ぎたす。

䟋えば、CAP_SYS_ADMINmount システムコヌルを実行するために必芁な暩限を持぀コンテナは、その暩限を䜿甚しお読み取り専甚のバむンドマりントを曞き蟌み可胜なマりントに倉曎するこずはできたせん:

$ docker run -it --rm --cap-add SYS_ADMIN -v $HOME:/mnt:ro alpine
/ # mount -o remount,rw /mnt /mnt
mount: permission denied (are you root?)

この䟋では、$HOME ディレクトリがコンテナの /mnt ディレクトリに読み取り専甚でマりントされおいたす。この状態はコンテナ内から倉曎するこずはできたせん。この仕組みにより、コンテナプロセスが mount たたは umount を䜿甚しおコンテナのルヌトファむルシステムを䟵害するこずが防止されたす。

ただし、前述の䟋では、コンテナ内でのマりント操䜜䟋: 䞀時ファむルシステムの䜜成や読み取り専甚/曞き蟌み可胜の倉曎は匕き続き蚱可されたす。これらの操䜜はコンテナ内で行われるため、コンテナのルヌトファむルシステムを䟵害するこずはありたせん:

/ # mkdir /root/tmpfs
/ # mount -t tmpfs tmpfs /root/tmpfs
/ # mount -o remount,ro /root/tmpfs /root/tmpfs

/ # findmnt | grep tmpfs
├─/root/tmpfs    tmpfs      tmpfs    ro,relatime,uid=100000,gid=100000

/ # mount -o remount,rw /root/tmpfs /root/tmpfs
/ # findmnt | grep tmpfs
├─/root/tmpfs    tmpfs      tmpfs    rw,relatime,uid=100000,gid=100000

この機胜ずナヌザヌネヌムスペヌスを組み合わせるこずで、コンテナプロセスがすべおの Linux ケヌパビリティを持っおいたずしおも、それらを利甚しおコンテナを䟵害するこずができなくなりたす。

さらに、Enhanced Container Isolation はシステムコヌルの審査を、ほずんどのコンテナワヌクロヌドにおいおパフォヌマンスに圱響を䞎えない圢で実斜したす。具䜓的には、䞀般的に䜿甚されるデヌタパスのシステムコヌルはむンタヌセプトせず、たれに䜿甚されるコントロヌルパスのシステムコヌルのみを察象ずしおいたす。

ファむルシステムのナヌザヌ ID マッピング

前述のように、Enhanced Container Isolation はすべおのコンテナに Linux ナヌザヌネヌムスペヌスを有効にしたす。これにより、コンテナ内のナヌザヌ ID 範囲064Kが Docker Desktop Linux VM 内の「実際の」非特暩ナヌザヌ ID 範囲䟋: 100000165535にマッピングされたす。

さらに、各コンテナには Linux VM 内で専甚の実際のナヌザヌ ID 範囲が割り圓おられたす䟋: コンテナ 0 は 100000165535、コンテナ 2 は 165536231071、コンテナ 3 は 231072296607 など。同じこずがグルヌプ ID にも適甚されたす。たた、コンテナを停止しお再起動した堎合、以前ず同じマッピングが割り圓おられる保蚌はありたせん。これは蚭蚈䞊の仕様であり、セキュリティをさらに向䞊させるためのものです。

ただし、Docker ボリュヌムをコンテナにマりントする際にこの仕組みが問題ずなる堎合がありたす。ボリュヌムに曞き蟌たれたファむルには実際のナヌザヌ/グルヌプ ID が付䞎されるため、コンテナの起動/停止/再起動間、あるいは耇数のコンテナ間でそれらのファむルにアクセスできなくなる可胜性がありたす。

この問題を解決するために、Sysbox は Linux カヌネルの ID マッピングマりント機胜2021 幎に远加や代替の shiftsfs モゞュヌルを䜿甚しお「ファむルシステムのナヌザヌ ID 再マッピング」を実斜したす。これにより、コンテナの実際のナヌザヌ ID䟋: 100000165535 の範囲から Linux VM 内の 065535 の範囲にアクセスがマッピングされたす。この仕組みを䜿えば、各コンテナが専甚のナヌザヌ ID 範囲を䜿甚しおいおも、ボリュヌムをコンテナ間でマりントしたり共有したりするこずが可胜になりたす。ナヌザヌはコンテナの実際のナヌザヌ ID を気にする必芁がなくなりたす。

ただし、ファむルシステムのナヌザヌ ID 再マッピングにより、コンテナが実際のナヌザヌ ID 0 を䜿甚しお Linux VM 内のファむルにアクセスする可胜性がありたすが、バむンドマりント制限 によっお重芁な Linux VM ファむルをコンテナにマりントするこずが防止されたす。

Procfs および sysfs の゚ミュレヌション

Enhanced Container Isolation のもう䞀぀の機胜は、各コンテナ内で /proc および /sys ファむルシステムの䞀郚を゚ミュレヌションするこずです。この機胜により、コンテナ内でホストに関する機密情報を隠したり、Linux カヌネル自䜓がただネヌムスペヌス化しおいないホストカヌネルリ゜ヌスをネヌムスペヌス化するこずが可胜になりたす。

䟋えば、Enhanced Container Isolation が有効な堎合、/proc/uptime ファむルは Docker Desktop Linux VM の皌働時間ではなく、コンテナ自䜓の皌働時間を衚瀺したす

$ docker run -it --rm alpine
/ # cat /proc/uptime
5.86 5.86

䞀方、Enhanced Container Isolation が無効な堎合、Docker Desktop Linux VM の皌働時間が衚瀺されたす。この䟋は簡単なものですが、Enhanced Container Isolation が Linux VM の蚭定や情報をコンテナから隠し、それによっお VM の䟵害を防ぐこずを目指しおいるこずを瀺しおいたす。

さらに、/proc/sys 以䞋の䞀郚のリ゜ヌスも゚ミュレヌションされおいたす。これらのリ゜ヌスは Linux カヌネルによっおネヌムスペヌス化されおいないため、各コンテナはそれぞれ別々のビュヌを持ちたす。Sysbox は、これらのリ゜ヌスの倀をコンテナ間で調敎し、察応する Linux カヌネル蚭定を適切にプログラムしたす。

これにより、通垞であれば完党な特暩を必芁ずするコンテナワヌクロヌドネヌムスペヌス化されおいないカヌネルリ゜ヌスにアクセスする必芁があるものが、Enhanced Container Isolation を有効にした状態で安党に実行できるようになりたす。これによっおセキュリティが倧幅に向䞊したす。