隐藏docker容器中的挂载点

隐藏docker容器中的挂载点

我有一个 docker 主机和一个 NFS 服务器,它们共享一个路径,比如 /storage 到 docker 主机。我可以直接在 docker 主机上安装 NFS 共享,或者使用 NFS 卷访问共享上的数据。当然,每个 docker 容器都有多个子文件夹,比如

  • 容器1
    • NFS 上的 vol1 a:/storage/container1/vol1
  • 容器2
    • NFS 上的 vol1 a:/storage/container2/vol1
    • NFS 上的 vol2 a:/storage/container2/vol2
  • 容器3
    • NFS 上的 vol1 a:/storage/container3/vol1
    • NFS 上的 vol2 a:/storage/container3/vol2
  • ...

如果直接通过 docker-compose.yml 使用 NFS 卷:

...
volumes:
  file-vol:
    driver: local
    driver_opts:
      type: "nfs"
      device: ":/storage/container1/vol1"
      o: addr=nfshost,rw,nosuid,noatime,nfsvers=4
...

然后我可以看到正在运行的容器内部mount

:/storage/container1/vol1 on /var/www/html type nfs4 (rw,nosuid,noatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=<dockerhost>,local_lock=none,addr=<nfshost>)

当我用以下方式替换此卷时:

...
volumes:
  file-vol:
    driver_opts:
      type: none
      device: "/srv/storage/container1/vol1"
      o: bind
...

其中 /srv/storage 是通过挂载的 Linux NFS 共享文件夹mount -t nfs nfshost:/storage /srv/storage,然后我得到mount容器内的输出:

<nfshost>:/storage/container1/vol1 on /var/www/html type nfs4 (rw,nosuid,noatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=<dockerhost>,local_lock=none,addr=<nfshost>)

在这两种情况下,我都可以在 docker 容器内看到 NFS 主机和挂载点。一个“坏进程”可能会想到这一点,并尝试挂载 NFS 的不同位置(如 /storage/container2/vol1),并且可以完全访问该位置,因为 Kerberos 不能在这里使用(我认为)。此外,我无法拒绝通过 NFS 服务器访问该位置,因为它来自同一个 IP。此外,所有容器都是从 root 用户启动的(容器通常不是无根的)。

有没有办法拒绝访问容器 1 以在 NFS 服务器上挂载容器 2 卷,或者隐藏文件夹 /var/www/html 是 NFS 挂载点的事实?

答案1

NFS:/storage/storage您的 Docker 主机上挂载。

/storage从 而不是挂载卷NFS:/storage/

相关内容