docker - 微服务架构下docker容器之间的认证,内部调用绕过JWT auth

标签 docker authentication microservices

我有以下 docker 架构,使用 docker compose 编排:

  • Service1:前端应用,React 应用
  • Service2:ExpressJS 服务器
  • Service3:Django 服务器

这三个应用程序通过 HTTP API 调用相互通信。谁可以调用谁没有限制。每个应用程序都对外暴露

用户在前端应用程序 (Service1) 上进行身份验证,它解析一个 JWT,该 JWT 稍后可以传递给每个其他后续调用,然后每个其他服务都有一个身份验证层来验证 JWT 调用。

我的问题是:我们如何在没有任何用户事件(没有 JWT)的情况下验证从 Service2Service3 的调用?

这是 cron 或维护工作所必需的。

我的第一个解决方案是在我们的 docker-compose 中创建一个带有固定子网的 docker 网络,如下所示:

networks:
  our-network:
    ipam:
      driver: default
      config:
        - subnet: "172.100.100.0/24"

然后,在 Service2Service3 中,我允许来自该子网的 API 调用未经身份验证。 我担心这可能是一个安全问题,想知道是否有更好的解决方案。

最佳答案

JWT token 通常使用属于 token 发行者的私钥签名。将 JWT token 作为 issuer claim 是一种很好的做法.

JWT token 通常可以通过两种方式进行验证:

  • 调用电话 OAuth token introspection endpoint发行人的 - 但这增加了更多的延迟
  • 使用来自颁发者的缓存公钥进行本地验证 - 难以添加注销功能

如果您使用缓存解决方案,不会增加太多延迟,JWT 发行者必须实现 OpenID Discovery endpoint包括对 JWKS endpoint 的引用发行人发布其公钥的地方。

如果您使用 Kubernetes,则可以将边车与 OpenPolicyAgent 结合使用为应用程序进行 token 验证。开发人员在每个应用程序中实现 token 验证功能并不是那么有趣,因此这是一个有趣的替代方案。您还可以使用此解决方案轻松添加授权规则。

How would we validate calls from Service2 to Service3 without any user activity (without JWT)?

当 Service2 收到来自用户的请求时,使用 JWT 进行身份验证 - 它代表用户向 Service3 发出请求,因此它也应该将 JWT token 传递给 Service3 - 以便 Service3 可以操作和只使用属于用户的资源,例如从数据库中获取。这可以在没有用户干预的情况下完成(直到 JWT 过期)。

This is required for crons or maintenance jobs

对于代表用户执行的作业,通常需要存储具有较长到期时间的 JWT token ,例如在数据库中。通常这可以由用户撤销,并且通常在 3 个月左右后过期,然后用户可能需要再次进行身份验证(或超过 3 个月 - 取决于您的需要)。重要的是,此类 token 具有较低的权限,通常只有作业所需的权限。

关于docker - 微服务架构下docker容器之间的认证,内部调用绕过JWT auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64075416/

相关文章:

python - 如何在 python 3 中禁用 SSL 身份验证

asp.net - 使用 RabbitMQ 或 SignalR 的微服务架构

microservices - 为什么每个微服务都有自己的数据库?

java - AuthenticationMechanism 使用 JSON 而不是 HTML 返回 401 的有效负载

ios - 适用于 iOS 的 Linkedin Mobile SDK - 回调超时

java - import de.codecentric.boot.admin.server.config.EnableAdminServer无法解析

docker - Docker:如何在Windows 8.1上找到本地主机的密码

docker - 有没有办法标记 docker 镜像中的前一层或恢复提交?

docker - Kubernetes - 在一个 pod 中创建两个容器

docker - 未知主机异常