我在一个定制的码头网络中的一个码头容器中运行一个postgres服务器,我发现我可以从主机上使用psql
访问它。
从安全的角度来看,这似乎是不可取的,因为我认为码头网络的目的是隔离对容器的访问。
我的想法是,我会在同一个码头网络中的一个单独的容器中运行我的应用程序,并且只在应用程序容器上发布端口。这样,应用程序可以从外部世界访问,但数据库不能访问。
我的问题是:为什么在没有我明确指定的情况下,5432端口被发布到postgres容器上,我如何“取消”这个端口?
还有一个相关的问题是:在这种情况下,发布端口5432是一个安全问题(或者至少比不发布端口更安全),这是错误的吗?
我的容器正在运行正式的停靠者postgres映像:https://hub.docker.com/_/postgres/
谢谢你的帮助!
编辑:下面是用于运行容器的docker命令:
docker run -d --restart=always --name=db.geppapp.com -e "POSTGRES_USER=<user>" -e "POSTGRES_PASSWORD=<password>" -e "POSTGRES_DB=gepp" -v "/mnt/storage/postgres-data:/var/lib/postgresql/data" --net=db postgres
编辑2:我最初的问题并不完全正确,因为docker实际上并没有将端口5432发布到主机,而是在用psql
连接到postgres时将容器的IP地址指定为主机,如下所示:
psql --host=<docker-assigned-ip> --username=<user> --dbname=gepp
因此,阻止我限制从主机访问容器的事情实际上是将IP地址分配给主机网络上的容器。
发布于 2021-09-21 08:19:56
感谢所有评论和回答的人。在回答我自己的问题时,我根据我所读到的答复和其他内容,总结了我最好的理解。
正如我在编辑对我的问题中提到的,阻止我限制从主机访问容器的事情是主机网络上的IP分配。
根据船坞文档:(https://docs.docker.com/config/containers/container-networking/)
默认情况下,
为容器所连接的每个Docker网络分配一个IP地址。
在这种情况下,容器在技术上不是“连接”到主机网络,而是在该网络上有一个IP。David在评论中指出,这只发生在Linux上,而不是在Windows或Mac上(我个人还没有验证这一点)。
因此,由于码头网络在docker中的实现方式,所有正在运行的容器都会向主机发布IP地址,因此无法阻止这种情况。
从安全的角度来看,因为停靠主机总是可信的,我的理解是数据库安全性主要来自于限制对主机本身的访问(网络和linux帐户安全),以及本地数据库凭据安全性。Docker并没有像我最初想的那样添加另一个安全层。
发布于 2021-09-16 07:10:06
postgres的Dockerfile公开了该端口5432,但这并不意味着它使主机可以访问容器的端口。要将端口公开给宿主,必须使用-p标志来发布一系列端口,或者使用-P标志来发布所有公开的端口。但我看不出你的命令。
您确实没有访问本地postgres而不是容器postgres吗?
或者您是否连接到主机网络?如果码头容器设置为network_mode:主机或主机类型,则容器中公开的任何端口也将在对接主机上公开,而不需要-p或-P停靠器运行选项。
https://stackoverflow.com/questions/69210727
复制相似问题