【问题标题】:Validate a user requests between servers验证服务器之间的用户请求
【发布时间】:2020-09-11 02:44:33
【问题描述】:

背景:我正在创建一个文件服务器。我在 Nginx 反向代理后面使用 Tomcat。我有一个托管 UI 的主服务器和许多边缘服务器,我希望在其中存储用户上传的文件并返回它们。这是一个私有文件存储,因此只有文件上传者才能下载他们上传的文件。

问题:当用户登录到他们的帐户时,我通过创建会话在主服务器上对用户进行身份验证,并保留它以验证来自用户的进一步请求(常规内容)。此信息不分配给边缘服务器,边缘服务器为任何请求提供文件。那不是我想要的。我只想授权文件所有者下载。

现在,在这里我试图避免 Tomcat 集群,其中边缘和主服务器配置为具有分布式会话的集群。网站支持 SSL。当文件下载请求从已经登录(创建会话)主服务器的用户到达边缘服务器时,有没有办法验证用户的登录状态?

【问题讨论】:

  • 您的信任边界在哪里?您从 main 到 edge 的请求能否仅包含 userId 并且 edge 可以在返回文件之前对其进行验证,或者在不允许给定用户时返回 401 Unauthorized?或者您是否必须使用户文件尽可能安全,即使对有权访问服务器的人(管理员、操作员、员工等)也是如此?
  • 介于两者之间。 userId 太弱了,有人可以猜到。不允许管理员访问文件将需要使用只有文件所有者知道的密钥加密整个文件并在客户端浏览器上解密。我想要它阻止某些人(除了所有者)使用直接喜欢文件的方式通过 Internet 下载它。
  • 你需要以某种方式让边缘服务器安全事务感知...一个带有主服务器私钥加密的会话到期时间的cookie;然后边缘服务器将使用 main 的公钥解密 cookie。

标签: java authentication servlets session-state tomcat8


【解决方案1】:

我看到了几种你可以使用的方法

您可以使用“基于声明的身份验证”或资源访问令牌的形式。

基于声明的身份验证 - 您可以使用例如一个 JWT 令牌,它应该包含一些必要的信息(用户 ID、帐户 ID、授权、到期......),并由共享密钥(在主服务器和文件服务器之间)或来自主服务器的私钥签名。

优势在于,边缘服务器可以根据哈希或签名验证令牌,而无需联系主服务器。缺点是,必须有逻辑来决定用户是否有权访问请求的资源。

见:https://jwt.io/

资源访问令牌 - 一些云存储提供商(AWS S3、IBM 对象存储等)使用的这种方法 - 主站点将返回带有一些额外参数的资源 URL - 例如帐户,随机数,到期,签名。资源(边缘)服务器必须检查过期和签名并提供或拒绝资源

优点是,边缘服务器不关心任何身份验证,身份验证和授权完全在主服务器的范围内。缺点是提供的资源 URL 必须有有限的过期时间。

见:http://s3-expiry.50projects.com/

注意:

  • 设置资源服务器可能无法与主服务器有效通信的条件,您无法检查用户是否已登录,除非使用带有 SLO(单点注销)的 SAML SSO 或带有会话管理的 OIDC

【讨论】:

  • JWT 看起来很有前途,并且还有一个 java 库。谢谢,我可以根据您的回答和@diginoise 构建一个模式来验证边缘服务器上的用户。我会将这个帖子再开放几天,看看是否有人发布了更好的解决方案。谢谢 Gabriel
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2018-08-14
  • 2015-08-27
  • 2015-08-02
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多