保护在 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 应用程序的本地主机端口 的相关文章

  • 使用端口 80 (Ubuntu / Linode) 运行 Node.js 的最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在设置我的第一个Node js服务器上的cloud Linux node我对以下细节还很陌生Linux admin 顺便说一句 我并没有尝试
  • 以编程方式设置文本后,自动链接检测在 NSTextView 中不起作用

    我有一个启用了自动链接检测的 NSTextView 当我以编程方式设置文本时 myTextView setString http google com 它不会自动显示链接 如果我在文本视图中输入任何内容 它将添加链接 我希望它添加链接 不得
  • 使用 docker stack 部署主机环境变量

    我想知道是否有一种方法可以使用从部署容器的主机获取的环境变量 而不是从容器所在的主机获取的环境变量docker stack deploy命令被执行 例如想象以下docker compose yml在三节点 Docker Swarm 集群上启
  • 无法将调试器从 Visual Studio 2019 连接到本地 docker Linux 容器

    因此 我在本地计算机上使用 docker compose 在 docker 容器上运行了简单的 hello world net core 应用程序设置 问题是当我尝试使用 Debug gt Attach to Process gt Conn
  • Spring Security 实体字段级安全

    我有一个 Spring MVC 应用程序 它提供了一个视图 其中显示了来自Customer实体 例如姓名 地址 电话号码等 该应用程序具有各种角色 例如ROLE USER and ROLE ADMIN 用户具有ROLE USER只能看到客户
  • Docker compose 绑定失败:端口已分配

    我一直在尝试将 Socketio 服务器从 EC2 转移到 Docker 我已经能够通过网络 http 客户端连接到套接字 但通过 iOS 或 Android 直接连接到套接字似乎是不可能的 我读到问题之一可能是使用 Docker 时暴露的
  • 检测可可上的鼠标右键单击

    我正在尝试在我的原型中管理鼠标事件精灵套件 game 我从问题中使用了以下方法SO q https stackoverflow com questions 17473176 how to detect right and left clic
  • 在 Cocoa 中声明对象时,我应该将它们设置为 nil 吗?

    假设我想创建一个实例NSString 根据另一个变量的值初始化为某个值 通常情况下 我会这样做 NSString string if foo 1 string Foo is one else string Foo is not one 然而
  • Docker容器CPU使用率监控

    根据 docker 的文档 我们可以通过以下方式获取 docker 容器的 CPU 使用率码头工人统计命令 CPU 列将给出容器正在使用的主机 CPU 的百分比 假设我限制容器使用 50 的主机单个 CPU 我可以通过 cpus 0 5 选
  • 如何尽可能快地输出固定缓冲区?

    示例代码 include
  • Mac OS 上的 pybluez 安装错误

    我尝试安装pybluez使用以下命令 pip install pybluez sudo easy install pybluez 但对于这两个命令我最终都会出错 环境 Mac OSX 10 9 1 Python 2 7 点日志 cc fno
  • 更改 NSTextView 中空格字符的宽度

    我正在尝试制作一个阅读器应用程序来帮助有阅读困难的女孩 一些研究表明 仅仅改变文本 背景和阴影的颜色确实可以帮助孩子们摆脱困境 所以我试图让她这样做 它只是一个带有按钮的大 NSTextView 因此她可以更改字体大小 颜色 背景颜色 阴影
  • 如何使用 GWT 检测操作系统?

    Basically what I want to know is to find out if my GWT application is running on a MacOS or any other operating system t
  • 如何在 microk8s 中使用本地 docker 镜像?

    我一直在使用 minikube 在本地测试 Kubernetes 在 minikube 中 我们可以使用本地 docker 镜像eval minikube docker env 命令 我开始探索microk8s 在我运行 Ubuntu 18
  • Phonegap 之类的 Mac App Store 平台? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用phonegap 在iOS 本机应用程序中运行我的HTML JS 代码 有没有办法在 Mac
  • 使用 docker 卷持久化数据库

    我正在尝试将 postgres 数据保存在 docker 容器中 以便您一旦docker compose down and docker compose up d您不会丢失上一次会话的数据 我无法让它做很多事情 将容器拉下来然后再次备份会定
  • Kubernetes 1.8 支持的 Docker 版本

    我要将我的 Kubernetes 集群升级到该版本1 8 7 有谁知道哪个 docker 版本与其最兼容 这是我在 Kubernetes 官方页面上找到的 但我想它可能是针对最新的 k8s 版本的 1 9 在每台计算机上安装 Docker
  • 如何将 Jinja 与 Twisted 一起使用?

    我正在计划使用 Python 与 Twisted Storm 和 Jinja 一起开发一个讨论软件 问题是 Jinja 不是为 Twisted 或异步套接字库而设计的 并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因
  • OSX AudioUnit SMP

    我想知道是否有人有编写利用多核处理器和 或对称多处理的 HAL AudioUnit 渲染回调的经验 我的场景如下 子类型的单个音频组件kAudioUnitSubType HALOutput 连同它的渲染回调 负责附加合成n具有独立的单独变化
  • 在 Swift 中将进程标准输出重定向到 Apple 系统日志工具

    我正在为 macOS 构建一个启动子进程的 Swift 应用程序 该子进程将有用的信息记录到stdout 我在 Xcode 控制台中看到它 我现在想要实现的是重定向子流程stdout到Apple Log Facility 以便我们可以在部署

随机推荐

  • 如何在不关闭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 外