Хранение aws cognito JWT-ключа в javascript-интерфейсе небезопасно? - PullRequest
0 голосов
/ 24 мая 2018

Я просматривал файлы javascript на веб-сайте, чтобы найти нужную конечную точку, во время которой я нашел такую ​​строку.

DASHBOARD_API_Token=eyJraWQiOiJVS2paTnB3SWdBK292QzB3RWdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Когда я декодировал вышеупомянутый JWT, я обнаружил такие объекты, как kid, username, useremail, iss = http://cognito -idp.us-east-1.amazonaws.com / {pool-id}

Я прочитал несколько ресурсов Amazon, которые сообщают, что можно получить учетные данные aws с помощью вышеуказанного токена.Учитывая, что у меня есть только токен jwt, что возможно, и нужно ли обращаться на веб-сайт, чтобы отозвать текущий токен?

1 Ответ

0 голосов
/ 24 мая 2018

Ну, AWS Cognito - довольно интересный зверь, когда дело доходит до его токенов JWT и того, что вы можете с ними делать.

Во-первых, когда вы аутентифицируете пользователя по Cognito User Pool, вы получаете 3 разных токена: AccessToken, IdToken и RefreshTokenAccessToken, и IdToken действительны ровно 1 час (и вы не можете их изменить).Вот почему вы получаете RefreshToken, который вы можете использовать для получения новой пары AccessToken и IdToken, вызывая, например, InitiateAuth .RefreshToken по умолчанию действует в течение 30 дней, но вы можете изменить его в настройках своего пула пользователей Cognito.

AccessToken

Это самый мощный токен, предоставляемый Cognito.Если у вас есть действительный AccessToken, вы можете вызвать несколько довольно чувствительных API Cognito.

Один очень удивительный пример - вы можете вызвать DeleteUser API, указав AccessToken, и он полностью удалит вашу учетную запись из Cognito User Pool.Самое приятное здесь то, что разработчик приложения не может помешать вам сделать это, если у вас есть действительный AccessToken.Разработчики AWS говорят , что "это по замыслу".Это была одна из самых веских причин, по которой мы решили не передавать Cognito Access Token на внешний интерфейс приложения.

Говоря о полезной нагрузке AccessToken, единственное потенциально уязвимое утверждение - client_id, которое содержитCognito Client Id, который использовался для аутентификации пользователя.Если у этого клиента нет клиентского секрета (который, вероятно, следует рассматривать в первую очередь как недостаток безопасности), тогда client_id можно использовать для вызова довольно широкого спектра API Cognito.Однако Cognito считает client_id общедоступной информацией.Все остальные претензии считаются публичными, полный список претензий вы можете посмотреть здесь .

IdToken

Содержит информацию об игроке.Он может содержать некоторую личную информацию об игроке в зависимости от того, какие стандартные утверждения и пользовательские атрибуты были настроены в вашем пуле пользователей Cognito, однако также возможно подавить или переопределить эти утверждения с помощью Pre Token Generation LambdaTrigger .Использование этого триггера позволяет скрыть или замаскировать атрибуты игрока, которые считаются чувствительными и не должны появляться в IdToken.

Насколько я знаю, вы не можете использовать IdToken для вызова Cognito API.

RefreshToken

Может использоваться только для запроса новых AccessToken и IdToken, не может использоваться для вызова API Cognito.В нашем конкретном случае использования нам пришлось избегать передачи RefreshToken во внешний интерфейс приложения, поскольку его можно использовать для получения AccessToken против общедоступного Cognito API (что означает, что мы не можем помешать пользователю сделать это).

Использование токенов Cognito для получения учетных данных AWS

Это возможно только в том случае, если Cognito User Pool был явно интегрирован с Cognito Identity Pool (что предполагает, что разработчики приложений знали, что они делали).При обмене токенами Cognito JWT вы получаете временные учетные данные AWS с разрешениями, привязанными к определенной роли IAM, настроенной в Cognito Identity Pool.Это абсолютно законный поток и предполагаемое поведение.Более того, если Cognito Identity Pool настроен для разрешения неаутентифицированного доступа, вы даже можете получить временные учетные данные AWS без использования токенов Cognito JWT (но они будут привязаны к другой, предположительно, более строгой роли IAM).

Использование Cognitoтокены с API Gateway

Ресурсы AWS API Gateway могут быть интегрированы с Cognito User Pools.В зависимости от способа интеграции вы можете использовать AccessToken или IdToken из интегрированного пула пользователей Cognito.

Отзыв токенов

Вы можете отозвать все токены, выпущенные для вашегоучетную запись в Cognito User Pool путем вызова GlobalSignOut API и предоставления действительного AccessToken.Поскольку этот API является общедоступным, вам не нужно связываться с веб-сайтом, если у вас есть действительный AccessToken.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...