有人可以通过设置 x-hasura-role 来伪造对 Hasura GraphQL Engine 的请求吗?

Can someone forge a request to Hasura GraphQL Engine by setting x-hasura-role?

如果我理解正确,要使用 JWT 授权 hasura 中的查询或变更,请求本身需要满足一些要求,即:

  1. 请求中显示的 JWT 本身 header
    Authorization: Bearer <token here>
  2. x-hasura-role,在请求中呈现 header(可选)
    x-hasura-role: user
  3. 请求中显示的实际查询或变更 body
myQuery {
  id
  name
  another_field
}

当请求发送到 hasura 端点时,hasura GraphQL 引擎将尝试

  1. 验证 JWT
  2. 检查请求 header 中设置的 x-hasura-role 的值是否存在于 jwt
  3. x-hasura-allowed-role 声明中
  4. 如果满足所有条件,那么GraphQL引擎将检查从x-hasura-role header的值分配的角色是否具有执行来自请求[=54的查询的权限=]

据我了解,这意味着某人可以 'forge' 通过将 x-hasura-role 的值设置为 x-hasura-allowed-roles 声明中存在的其他内容来向 hasura GraphQL 引擎发出请求智威汤逊。例如,如果 x-hasura-allowed-roles 声明是这样的

{
  ...
    'x-hasura-allowed-roles': ['role1','role2'],
    'x-hasura-default-role': 'role1',
    'x-hasura-user-id': username
  }
}

那么这意味着应该只分配给 role1 的人可以执行仅限于 role2 的查询,只需将请求中的 x-hasura-role header 设置为 x-hasura-role: role2

我的理解对吗?如果是,避免这种情况的最佳方法是什么,因为它看起来像是一个安全漏洞?我是否只是将 jwt 的 x-hasura-allowed-roles 声明限制为仅根据我的身份验证服务分配给每个用户的角色?

您的理解似乎是正确的,这不是安全漏洞。

Do I just limit the x-hasura-allowed-roles claim of the jwt to ONLY the role assigned to each user based on my authentication service?

完全正确。在本文档(https://hasura.io/docs/1.0/graphql/manual/auth/authentication/jwt.html)中,关键信息在这里:

The JWT is decoded, the signature is verified, then it is asserted that the current role of the user (if specified in the request) is in the list of allowed roles. If the current role is not specified in the request, then the default role is applied.

因此,您的身份验证服务器发布特定于该用户的允许角色(和默认)列表非常重要; Hasura 似乎支持具有此功能的多角色用户。例如。管理员可能 "sign in as" 具有用户角色,或者用户的角色在应用程序的不同上下文中可能不同。

对于这些字段的更具体定义:

  1. A x-hasura-default-role field: indicating the default role of that user i.e. the role that will be used in case x-hasura-role header is not passed.
  2. A x-hasura-allowed-roles field: a list of allowed roles for the user i.e. acceptable values of the x-hasura-role header.