【问题标题】:Docker postgres image: How to restrict access from host network?Docker postgres 图像:如何限制来自主机网络的访问?
【发布时间】:2021-11-11 13:58:36
【问题描述】:

我正在自定义 docker 网络中的 docker 容器中运行 postgres 服务器,我发现我可以使用主机上的psql 访问它。

从安全角度来看,这在我看来是不可取的,因为我认为 docker 网络的目的是隔离对容器的访问。

我的想法是,我会在同一个 docker 网络中的单独容器中运行我的应用程序,并仅在应用程序容器上发布端口。这样,外部世界可以访问应用程序,但不能访问数据库。

我的问题是:为什么 5432 端口在没有我明确指定的情况下被发布到 postgres 容器上的主机,我该如何“取消发布”这个端口?

还有一个相关的问题是:在这种情况下发布端口 5432 是一个安全问题(或至少 不如不发布它安全),我错了吗?

我的容器在这里运行官方 docker 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 地址。

【问题讨论】:

  • 你是用docker run还是docker-compose启动容器?请发布您使用的docker run 命令或docker-compose.yaml
  • 编辑问题以包含docker run 命令
  • 您如何使用psql 访问容器?您可以从其他主机访问它吗?

标签: postgresql docker


【解决方案1】:

postgres 的 Dockerfile 公开了该端口 5432,但这并不意味着它使主机可以访问容器的端口。要将端口公开给主机,您必须使用 -p 标志发布一系列端口或使用 -P 标志发布所有公开的端口。但我没有在你的命令中看到这一点。

您确定您访问的不是本地 postgres 而不是容器 postgres?

或者您是否连接到主机网络?如果 docker 容器设置为 network_mode: 主机或主机类型,则容器中暴露的任何端口也将暴露在 docker 主机上,而不需要 -p 或 -P docker run 选项。

【讨论】:

  • 所有带有服务的端口都可以从主机访问,无论它们是否被暴露和映射。可以找到容器的IP地址,直接访问端口。
  • 既然你提到了,我正在使用的psql 命令包括 docker 分配的 IP 地址作为主机:psql --host=&lt;docker-assigned-ip&gt; --username=&lt;user&gt; --dbname=gepp。因此,鉴于此,我想我真正的问题是如何完全阻止 docker 将 ip 发布到主机网络(而且,这甚至是可取的吗?)。
  • 我在我的机器上运行了相同的命令,但无法通过 psql 访问它。您可以通过附加到 docker 映像的网络 (--net=db) 访问它。
  • 如果 docker 容器设置为 network_mode:host,那么你可能不得不使用 iptables。我不确定我们是否可以从 docker 级别做到这一点。
  • 如果它们位于不同的实例上,它们将无法共享 Docker 网络,除非您手动设置覆盖网络。但在那种环境中,您可以使用 AWS VPC 和安全组来保护网络设置。 (同样在那个环境中,您可以为非 Docker 数据库使用专用主机,或为数据库使用 RDS,同时仍在 Docker 中运行应用程序。)
【解决方案2】:

感谢所有评论和回答的人。我正在回答我自己的问题,并根据我阅读的回复和其他内容总结我的最佳理解。

正如我在问题编辑中提到的,阻止我限制从主机访问容器的原因是主机网络上的 IP 分配。

根据 docker 文档:(https://docs.docker.com/config/containers/container-networking/)

默认情况下,每个 Docker 都会为容器分配一个 IP 地址 它连接到的网络。

在这种情况下,容器在技术上并未“连接”到主机网络,但无论如何在该网络上都有一个 IP。 David 在 cmets 中指出,这只发生在 Linux 上,不会发生在 Windows 或 Mac 上(我没有亲自验证过)。

因此,由于 Docker Linux 中 docker 网络的实现方式,所有正在运行的容器都会向主机发布一个 IP 地址,并且没有办法阻止这种情况。

从安全的角度来说,由于docker主机始终是可信的,所以我的理解是数据库安全主要来自于限制对主机本身的访问(网络和linux账户安全),以及原生数据库凭证安全。 Docker 并没有像我最初认为的那样添加另一个安全层。

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2022-08-02
    • 2021-09-13
    • 2021-11-04
    • 2020-02-17
    • 2022-11-10
    相关资源
    最近更新 更多