Может кто-нибудь подделать запрос к Hasura GraphQL Engine, установив x-hasura-role? - PullRequest
0 голосов
/ 01 апреля 2020

Если я правильно понимаю, чтобы авторизовать запрос или мутацию в hasura с использованием JWT, есть несколько требований, которые должны быть выполнены в самом запросе, а именно:

  1. Сам JWT, представлен в заголовке запроса
    Authorization: Bearer <token here>
  2. x-hasura-role, представлен в заголовке запроса (необязательно)
    x-hasura-role: user
  3. Фактический запрос или мутация, представленная в теле запроса
myQuery {
  id
  name
  another_field
}

Когда запрос затем отправляется на конечную точку hasura, механизм hasQL GraphQL попытается

  1. Проверить JWT
  2. Проверьте, существует ли значение x-hasura-role, установленное в заголовке запроса, внутри x-hasura-allowed-role утверждений jwt
  3. Если все условия выполнены, то механизм GraphQL проверит, выполняет ли роль, присваивается из значения x-hasura-role заголовок имеет разрешение на выполнение запроса из тела запроса

Насколько я понимаю, это означает, что кто-то может «подделать» запрос к хасуре Гра Механизм phQL, установив значение x-hasura-role на что-то еще, что существует внутри утверждения x-hasura-allowed-roles JWT. Например, если утверждение 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 заголовок в запросе на x-hasura-role: role2

Правильно ли мое понимание? Если это так, как лучше всего избежать этой ситуации, поскольку она выглядит как уязвимость безопасности? Должен ли я ограничить требование x-hasura-allowed-roles jwt ТОЛЬКО ролью, назначенной каждому пользователю на основе моей службы аутентификации?

1 Ответ

1 голос
/ 01 апреля 2020

Ваше понимание кажется правильным и не является уязвимостью безопасности.

Могу ли я ограничить требование x-hasura-allowed-roles для jwt ТОЛЬКО ролью, назначенной каждому пользователю на основе моей службы аутентификации ?

Совершенно верно. В этой документации (https://hasura.io/docs/1.0/graphql/manual/auth/authentication/jwt.html) ключевая информация находится здесь:

JWT декодируется, подпись проверяется, затем утверждается, что текущая роль Пользователь (если указан в запросе) находится в списке разрешенных ролей. Если текущая роль не указана в запросе, то применяется роль по умолчанию.

Поэтому важно, чтобы ваш сервер авторизации выполнил список разрешенных ролей (и по умолчанию), указанных c для этого пользователь; Похоже, что Hasura поддерживает многофункционального пользователя с этой функцией. Например, администратор может «войти в систему» ​​с ролью пользователя, или роль пользователя может отличаться в разных контекстах приложения.

И для более подробного c определения этих полей:

  1. A x-hasura-default-role поле: указывает роль этого пользователя по умолчанию, т.е. роль, которая будет использоваться в случае, если заголовок x-hasura-role не пройден.
  2. A x-hasura-allowed-roles поле: список разрешенных ролей для пользователя, т.е. допустимых значений заголовка x-hasura-role.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...