我有一个 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/
。