web-dev-qa-db-ja.com

Docker Daemonがホストのルートファイルシステムをコンテナにマウントできないようにする方法

次のコンテナ設定があります。

ベアメタルサーバーに2つのDockerデーモンがインストールされ、実行されています。

  1. Main Docker Daemon 80/443を外部に公開するアプリケーションコンテナを実行します。
  2. Plugin Docker Daemon 80/443を介してアプリケーションと通信する、顧客から提供されたいくつかのコンテナーを実行します。

お客様がPlugin Docker DaemonのAPI(2376)にアクセスできるようにして、お客様が自分のコンテナーをデプロイ/開始/停止できるようにします。顧客はAPI(ホスト(SSH)ではなく)にのみアクセスできます。

私が現在直面している問題は、顧客がdocker run -v /:/Host/root Ubuntu rm -rf /Host/rootのような安全でないことを行うコンテナを実行するとどうなるかです。

私の質問は、Plugin Docker Daemonがルート/または/home/user/の外部にある他のディレクトリをマウントしないようにするにはどうすればよいですか。

  • /home/user/でDocker Daemonを起動するオプションですか?
  • 一部のLSM(LinuxセキュリティモジュールSELinux/Apparmor)マジックを使用して、dockerデーモンがユーザーのホームまたはvar/docker/libsを除く一部またはすべてのホストパスをマウントしないようにできますか?
  • --userns-remapを使用して目標を達成できますか?
  • VM以外に使用できる他のオプションはありますか?

サーバーは完全に単一の顧客に属しています。したがって、セキュリティやデータ漏洩は私の主な懸念事項ではありません。私が本当に防止したいのは、Plugin Daemonの誰かが愚かな何かをしていて、Main Docker Daemonで実行される私のコンテナに影響を与えることです。私は無駄を省き、Dockerのみのワークフローに固執し、VM作成のために追加のワークフローを設定しないでください。

7
Vadimo

SELinuxは、Dockerコンテナー内のボリュームとしてマウントされるように正しくラベル付けされていないものを防止します。証明として、ここでは単一のファイルを使用しており、同じポリシーがディレクトリに適用されます。

$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      30

サンプルファイルの使用:

$ cat sample_script.sh 
echo 'Hello, world'

デフォルトのセキュリティコンテキストは次のとおりです。

$ ls -lrtZ sample_script.sh 
-rw-------. 1 david david unconfined_u:object_r:user_home_t:s0 20 Oct  3 17:18 sample_script.sh

コンテナ内でこのファイルを使用しようとすると、期待どおりに失敗します。

$ docker run -v /home/david/sample_script.sh:/sample_script.sh --rm ubuntu bash sample_script.sh
bash: sample_script.sh: Permission denied

そして、AVC拒否がログに記録されます。

$ Sudo ausearch -m avc -ts recent
time->Mon Oct  3 17:39:28 2016
type=AVC msg=audit(1475512768.444:784): avc:  denied  { read } for  pid=28720 comm="bash" name="sample_script.sh" dev="dm-13" ino=101062112 scontext=system_u:system_r:svirt_lxc_net_t:s0:c457,c992 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0

セキュリティコンテキストを1つのDockerに変更した後、次を使用できます。

$ Sudo chcon -Rt svirt_sandbox_file_t sample_script.sh
$ ls -lrtZ sample_script.sh 
-rw-------. 1 david david unconfined_u:object_r:svirt_sandbox_file_t:s0 20 Oct  3 17:18 sample_script.sh 

これで、コンテナはファイルにアクセスできます。

$ docker run -v /home/david/sample_script.sh:/sample_script.sh --rm ubuntu bash sample_script.sh
Hello, world

DockerとSELinuxの詳細については、Dan Walshによる 公式のRed Hatドキュメント および この記事 を参照してください。

8
dawud