保护在 MacOS 上 Docker 中的 0.0.0.0 本地运行的 Flask/Celery 应用程序的本地主机端口

2024-04-18

我的应用程序有一个 Flask 后端和一个 Angular/Electron 前端。该应用程序在 Mac Catalina 上本地运行。 Flask、Celery 和 Redis 位于单独的 docker 容器中,而前端位于 Docker 外部。 Flask 容器正在侦听端口 0.0.0.0:5078。我已将 CORS 策略设置为仅允许前端发送来自“127.0.0.1:4200”的消息。无需互联网连接。后端容器将由前端通过模拟终端命令来启动。我将在非技术用户的 Catalina MacBook 上远程安装该应用程序。

问题:根据Docker 可能会将端口暴露给世界 https://www.jeffgeerling.com/blog/2020/be-careful-docker-might-be-exposing-ports-world, 谨防 Docker 中暴露端口 https://www.tripwire.com/state-of-security/devops/psa-beware-exposing-ports-docker/ and Docker 未被 macOS 防火墙阻止 https://github.com/docker/for-mac/issues/729,这种使用 0.0.0.0:5078 是一种安全威胁。如何解决此威胁,例如通过阻止到此端口的任何外部连接?

这是一些 python 3.8 代码

# imports: waitress, flask_cors, blueprint
cors = CORS(blueprint, resources={r"/*": {"origins":["http://127.0.0.1:4200"]}})
if __name__ == "__main__":
      serve(flask_app, host= '0.0.0.0', port=5078, threads=8)

这是 Dockerfile:

FROM python:3.8.3-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
ENV BUILD_DEPS="build-essential" \
    APP_DEPS="curl libpq-dev"

RUN apt-get update \
  && apt-get install -y ${BUILD_DEPS} ${APP_DEPS} --no-install-recommends \
  && pip install --default-timeout=10000 -r requirements.txt

ARG FLASK_ENV="development"
ENV FLASK_ENV="${FLASK_ENV}" \
    FLASK_APP="back5x.api.app" \
    PYTHONUNBUFFERED="true"\
    FLASK_DEBUG=1
COPY  . .

RUN ["chmod", "+x", "/app/docker-entrypoint.sh"]
ENTRYPOINT ["/app/docker-entrypoint.sh"]
EXPOSE 5078
CMD ["python", "main.py"]

和 docker-compose:

version: "3.8"
services:
  redis:
 #    ...

  web:
    build:
      context: "."
      args:
        - "FLASK_ENV=development"
    depends_on:
      - "redis"
      - "worker"
    env_file:
      - ".env"
    environment:
      FLASK_DEBUG: 1
      FLASK_APP: back5x.api.app.py
    healthcheck:
      test: "${DOCKER_HEALTHCHECK_TEST:-curl localhost:5078/healthy}"
        ...
    ports:
      - "5078:5078"
    restart: "unless-stopped"
    volumes:
       - ".:/app"

  worker: #celery worker
    ...
volumes:
  redis: {}

Tried:我发现的基于 Docker 的解决方案使用 Linux iptables,例如禁止从 Docker for Mac 上的 Docker 容器出站 https://stackoverflow.com/questions/49419092/disallow-egress-from-docker-containers-on-docker-for-mac以及上面的参考资料。所以我将这些添加到 Dockerfile 中:

RUN apt-get install -y iptables  --no-install-recommends   #after pip install
RUN iptables -N DOCKER-USER   #after COPY . .
RUN iptables -I FORWARD -j DOCKER-USER
RUN iptables -A DOCKER-USER -j RETURN
RUN iptables -I DOCKER-USER -i eth0 ! -s 0.0.0.0 -j DROP

没有中间三行,我得到了无法找到 DOCKER-USER 的错误;和他们在一起,我必须以根身份运行。我尝试过特权模式app_cap,但由于我是 Docker 新手,所以我还没有让它工作。

我还研究了在 Mac 的 PF 防火墙中定义规则来阻止到相关端口的外部连接。但是,这对于将使用我的应用程序的人来说并不理想。安装付费的“Little Snitch”应用程序也有类似的情况。

在走这条路之前,是否有基于代码或基于 Docker 的解决方案? (或者也许有一个适当的命令来启动后端?)


可行的解决方案基于 David Maze 和 Matt 的评论以及此question https://stackoverflow.com/questions/43814411/i-am-running-2-images-with-docker-compose-and-i-am-having-trouble-hitting-the-lo。这些是步骤:

  1. Open 适用于 Mac 的 Docker, 优先 and Docker引擎. Add "ip": "127.0.0.1"到 json 配置文件。
  2. In the docker 撰写, set ports to "127.0.0.1:5078:5078"为了web服务。
  3. 保留 Dockerfile 和 python 代码与之前一样:即,flask 主机仍然是0.0.0.0

据我检查,来自 Electron 的本地主机 4201 的消息已通过。另外,跑步 netstat -anvp tcp | awk 'NR<3 || /LISTEN/表明端口不安全0.0.0.0.5078不再暴露在外面。 `

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保护在 MacOS 上 Docker 中的 0.0.0.0 本地运行的 Flask/Celery 应用程序的本地主机端口 的相关文章

随机推荐

  • 如何在不关闭vim的情况下重置vim的设置(包括插件,.vimrc文件)?

    我已经使用 vim 两年了 我使用 pathogen 进行插件管理 我在寻找 一种在不关闭 vim 的情况下重置所有 vim 设置 包括插件 vimrc 文件 的方法 是 有什么想法吗 PS 在某些情况下 重新加载 vimrc 与重新打开
  • Android 在其他设备上共享显示

    我正在努力与通过 WiFi 连接的多个表 全部有根 共享平板电脑显示屏 我正在使用以下方法 全部在一个线程内 1 我截屏 Process sh Runtime getRuntime exec su null null OutputStrea
  • 涵盖 .NET 中的 TDD、DDD 和设计模式的书籍

    我想要一本能够真正让我全面了解使用 C TDD ASP NET MVC DDD 和设计模式 例如存储库模式 的现代 ASP NET 开发的书 我非常擅长 C 和 ASP NET MVC 但想填补空白 如果您对涵盖这些主题的一两本书有很好的体
  • 如何更改 graphviz 的默认字体大小?

    我使用 doxygen graphviz 来记录我的代码 graphviz 在生成图像方面做得很好 有什么方法可以更改 graphviz 的默认字体大小吗 默认值为 14 但我想使用 12 更改单个元素 例如节点 子图 边缘等 的字体大小确
  • 具有重复参数(可变参数)的磁铁模式

    是否可以使用磁铁图案 http spray io blog 2012 12 13 the magnet pattern 与可变参数 object Values implicit def fromInt x Int Values implic
  • getattr/setattr/hasattr/delattr 线程安全吗?

    看这个单例实现 if not hasattr Singleton instance with Singleton instance lock if not hasattr Singleton instance Singleton insta
  • Maven 父项目自动化

    我有这个结构 child C 家长 A child B 如果我尝试在没有父级的情况下安装子级 B maven 会抛出一个错误 我知道按照惯例我应该将父级安装在我的存储库中 但是有没有办法让某人拉取子级并在安装过程中安装自动父辈 编辑 我要尽
  • 链接器如何处理跨翻译单元的相同模板实例化?

    假设我有两个翻译单元 foo cpp void foo auto v std vector
  • ant、jar 文件和类路径哦天哪

    我正在尝试重新构建我的构建技术来创建依赖于常见的第 3 方 jar 文件的 Java jar 文件 GlazedLists Apache Commons 等 我一直将它们全部放入 Java JRE dir lib ext 中 这样 JRE
  • React-testing-library 未从样式表渲染计算样式

    基本场景是这样的 我有一个组件width 100 正如样式表中所定义的 因此它应该保留其父组件的宽度 我想计算组件的宽度并将其应用到我的子组件 因为我通过渲染它createPortal我希望它们的宽度相同 这在浏览器中有效 然而 在我的测试
  • 在 WebAPI 中的模型上使用可序列化属性

    我有以下场景 我正在使用 WebAPI 并根据模型将 JSON 结果返回给消费者 我现在有额外的要求 将模型序列化为 base64 以便能够将它们保存在缓存中和 或将它们用于审计目的 问题是当我添加 Serializable 属性到模型 因
  • 检查 Linq-to-xml 中结果是否存在

    我正在使用 Linq to XML 进行简单的 此用户是否已注册 检查 此处没有安全性 只是为桌面应用程序创建注册用户列表 如何处理这样的查询结果 var people from person in currentDoc Descendan
  • 将图像添加到 RichText 元素

    我正在努力实现以下目标 为了实现这一点 我使用富文本 使用它我可以添加多个具有不同样式的文本 但我不知道如何将图像添加到此文本范围 也许还有其他一些因素 您不需要第三方库来实现此目的 在最新的稳定版本中 Flutter 引入了WidgetS
  • Python 解包格式字符串的参数列表

    我有一个根据用户输入动态创建的格式字符串 我正在列表中收集格式字符串的参数 我想知道如何在格式字符串的末尾解压它们 我看到了一些似乎与此相关的问题 但我对 Python 很陌生 我似乎无法将他们的解决方案应用于我的案例 我想做的事情的想法是
  • Bootstrap 4添加垂直分隔管

    您好 我正在尝试在导航链接之间添加一些分隔符 但它不起作用 我尝试添加 nav link after content 但它不起作用或显示在左侧 这是我的代码
  • Angular 6 ag-grid单元格渲染器点击功能

    所以我正在尝试设置 ag grid 但我无法让一件事发挥作用 我想要一个关于行动的专栏 然后我希望它有一个链接或按钮来触发组件文件中的方法 对于列 def 我有以下内容 我究竟做错了什么 headerName Actions cellRen
  • 如何使用(ruby)机架中间件组件设置 cookie?

    我正在为 Rails 应用程序编写一个机架中间件组件 该组件需要有条件地设置 cookie 我目前正在尝试设置cookies 从谷歌搜索看来这应该有效 class RackApp def initialize app app app end
  • 用于 PHP 开发的 Eclipse PDT 与 NetBeans [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于 PHP 开发 Eclipse PDT 与 NetBeans 相比如何 我刚刚买了一台装有 Windows 7 的新电脑 我开始设置
  • 当我读取本地文件时,Ajax 不工作

    好吧 我连续两天都无法解决这个问题 这个例子在这里 http www w3schools com ajax tryit asp filename tryajax xml2 http www w3schools com ajax tryit
  • 保护在 MacOS 上 Docker 中的 0.0.0.0 本地运行的 Flask/Celery 应用程序的本地主机端口

    我的应用程序有一个 Flask 后端和一个 Angular Electron 前端 该应用程序在 Mac Catalina 上本地运行 Flask Celery 和 Redis 位于单独的 docker 容器中 而前端位于 Docker 外