Безопасность схем аутентификации REST

Фон:

Я разрабатываю схему аутентификации для веб-службы REST. Это «на самом деле» не обязательно должно быть безопасным (это скорее личный проект), но я хочу сделать его максимально безопасным в качестве упражнения / обучения. Я не хочу использовать SSL, так как не хочу хлопот и, в основном, затрат на его настройку.

Эти SO-вопросы были особенно полезны для начала:

Я думаю об использовании упрощенной версии аутентификации Amazon S3 (мне нравится OAuth, но он кажется слишком сложным для моих нужд). Я добавляю в запрос случайно сгенерированный одноразовый номер, предоставленный сервером, чтобы предотвратить повторное воспроизведение. атаки.

Чтобы ответить на вопрос:

И S3, и OAuth полагаются на подписание URL-адреса запроса вместе с несколькими выбранными заголовками. Ни один из них не подписывает тело запроса для запросов POST или PUT. Разве это не уязвимо для атаки «человек посередине», которая сохраняет URL-адрес и заголовки и заменяет тело запроса любыми данными, которые хочет злоумышленник?

Похоже, я могу защититься от этого, включив хэш тела запроса в строку, которая подписывается. Это безопасно?


person dF.    schedule 18.01.2009    source источник
comment
Amazon S3 может включать Content-MD5 как часть строки заголовка, чтобы предотвратить описанную вами атаку MITM.   -  person laz    schedule 22.01.2009
comment
MD5 - это очень слабая хеш-функция, и ее использование уже много лет не приветствуется: en.wikipedia.org/ вики / MD5. В настоящее время используйте SHA2. MD5 - это помада на свинье с кризисом идентичности.   -  person Henrik    schedule 30.08.2012
comment
Startcom предоставляет бесплатные сертификаты SSL, которые не выдают предупреждений о сертификатах в основных браузерах.   -  person Plato    schedule 08.08.2013
comment
@Henrik MD5 слабый, но хеш содержимого станет бесполезным через несколько минут ... гораздо быстрее, чем кто-либо (ну, 99,99999% людей) сможет его использовать на практике.   -  person Sean Anderson    schedule 24.03.2014
comment
@SeanKAnderson Не обязательно, туннельная атака может быть возможна с использованием eprint.iacr.org/2006/105 .pdf - поскольку запросы создаются компьютером, для них можно будет профилировать и создавать автоматические эксплойты.   -  person Henrik    schedule 28.03.2014
comment
@SeanKAnderson (напыщенная речь: мне кажется абсурдным, как люди говорят о 99.99999% s, когда интернет находится в осаде шпионских агентств, которые автоматизировали МНОГО атак уже в 2008 году - это такой странный способ справиться с реальной проблемой - Неаа, не проблема, бабушка не сможет его взломать.   -  person Henrik    schedule 28.03.2014
comment
@Plato: сертификаты Startcom не доверяют запуску Chrome с версией 57 если ваш сайт не входит в топ 1M Alexa (или Chrome v58 с Alexa Top 500K).   -  person Voicu    schedule 03.08.2017
comment
спасибо @Voicu я был очень шокирован, увидев объявление Google о том, что startcom фальсифицировал сертификаты в прошлом году   -  person Plato    schedule 03.08.2017
comment
@Plato В наши дни я бы порекомендовал LetsEncrypt для бесплатных сертификатов SSL   -  person shuttle87    schedule 30.05.2018


Ответы (6)


В предыдущем ответе SSL упоминался только в контексте передачи данных и фактически не касался аутентификации.

Вы действительно спрашиваете о безопасной аутентификации клиентов REST API. Если вы не используете аутентификацию клиента TLS, SSL сам по себе НЕ является жизнеспособным механизмом аутентификации для REST API. SSL без аутентификации клиента только аутентифицирует сервер, что не имеет значения для большинства REST API, потому что вы действительно хотите аутентифицировать клиента.

Если вы не используете аутентификацию клиента TLS, вам нужно будет использовать что-то вроде схемы аутентификации на основе дайджеста (например, настраиваемую схему Amazon Web Service) или OAuth 1.0a или даже аутентификацию HTTP Basic (но только через SSL).

Эти схемы подтверждают, что запрос был отправлен кем-то ожидаемым. TLS (SSL) (без аутентификации клиента) гарантирует, что данные, отправленные по сети, останутся нетронутыми. Это отдельные, но взаимодополняющие проблемы.

Для тех, кто заинтересован, я подробно остановился на вопросе SO о схемах аутентификации HTTP. и как они работают.

person Les Hazlewood    schedule 11.05.2012
comment
Точно. Единственное, что SSL проверяет в том, что касается вашего API, - это то, что вызов, с которым он имеет дело, не был испорчен на маршруте. API до сих пор не знает, кто с ним разговаривает и должен ли он вообще иметь доступ. - person Tim Gautier; 18.07.2012
comment
Хороший ответ. Я также рекомендовал бы взглянуть на эти прекрасные ресурсы .. owasp.org/index.php/Web_Service_Security_Cheat_Sheet и owasp.org/index.php/REST_Security_Cheat_Sheet (ПРОЕКТ) - person dodgy_coder; 19.11.2012
comment
Незначительный момент, но использование SSL также имеет дополнительное преимущество в предотвращении подслушивания и атак посредника. - person dodgy_coder; 19.11.2012
comment
@Les Hazlewood Не могли бы вы объяснить, как аутентификация HTTP Basic через Https может помочь определить, что сервер знает, с кем он разговаривает? - person Spring; 26.12.2012
comment
@Les Hazlewood здесь я задал ему вопрос; tnx stackoverflow.com / questions / 14043397 / - person Spring; 26.12.2012
comment
@Spring Я отправлю ответ на упомянутый вопрос в ближайшее время (где-то сегодня). - person Les Hazlewood; 26.12.2012
comment
@Les Hazlewood Я был бы рад, если бы вы также взглянули на эту stackoverflow.com/questions/14041496/ - person Spring; 26.12.2012
comment
@Spring ответил на ваш первый вопрос! - person Les Hazlewood; 27.12.2012
comment
@Les Hazlewood, потрясающее спасибо! с нетерпением жду вашего другого ответа, так что я надеюсь, что эта вещь наконец прояснится для меня! - person Spring; 27.12.2012

REST означает работу со стандартами Интернета, а стандартом «безопасной» передачи в Интернете является SSL. Все остальное будет немного напуганным и потребует дополнительных усилий по развертыванию для клиентов, которым должны быть доступны библиотеки шифрования.

После того, как вы перейдете на SSL, для аутентификации в принципе не потребуется ничего особенного. Вы можете снова перейти к веб-стандартам и использовать HTTP-аутентификацию Basic (имя пользователя и секретный токен, отправляемые вместе с каждым запросом), поскольку это намного проще, чем сложный протокол подписи, и по-прежнему эффективен в контексте безопасного соединения. Вам просто нужно быть уверенным, что пароль никогда не выходит за рамки обычного текста; поэтому, если пароль когда-либо будет получен через обычное текстовое соединение, вы можете даже отключить пароль и отправить электронное письмо разработчику. Вы также должны убедиться, что учетные данные нигде не регистрируются после получения, так же как вы не регистрируете обычный пароль.

HTTP Digest - более безопасный подход, поскольку он предотвращает передачу секретного токена; вместо этого это хэш, который сервер может проверить на другом конце. Хотя это может быть излишним для менее чувствительных приложений, если вы приняли меры, упомянутые выше. В конце концов, пароль пользователя уже передается в виде обычного текста, когда он входит в систему (если вы не выполняете какое-то необычное шифрование JavaScript в браузере), а также их файлы cookie при каждом запросе.

Обратите внимание, что с API-интерфейсами клиенту лучше передавать токены - случайно сгенерированные строки - вместо пароля, с которым разработчик входит на веб-сайт. Таким образом, разработчик должен иметь возможность войти на ваш сайт и сгенерировать новые токены, которые можно использовать для проверки API.

Основная причина использования токена заключается в том, что его можно заменить, если он скомпрометирован, тогда как если пароль скомпрометирован, владелец может войти в учетную запись разработчика и делать с ним все, что захочет. Еще одним преимуществом токенов является то, что вы можете выдавать несколько токенов одним и тем же разработчикам. Возможно, потому, что у них есть несколько приложений, или потому, что им нужны токены с разными уровнями доступа.

(Обновлено, чтобы охватить последствия установления соединения только по протоколу SSL.)

person mahemoff    schedule 28.01.2009
comment
Поразмыслив над этим некоторое время и реализовав первую версию, я склонен согласиться ... - person dF.; 13.10.2009
comment
Я думаю, вы можете получить сертификат GoDaddy ssl примерно за 30 долларов в год. Я был шокирован, увидев, сколько стоят сертификаты Verisign SSL (600 долларов в год или около того, если я правильно помню?). Но вариант GoDaddy вполне осуществим. - person Brian Armstrong; 05.04.2010
comment
Поскольку мы очень небольшая команда и не слишком много исследовали это заранее, мы «упали» на SSL по умолчанию в недавнем развертывании REST. Теперь нас спрашивает другое подразделение о лучших практиках в отношении REST, похоже, что SSL - это общий консенсус. Кстати - Давай, Майк [Mahemoff] !!! - person Big Rich; 31.03.2011
comment
Если вы не используете взаимную аутентификацию SSL / TLS и сертификат, используемый пользователем / клиентом, не является доверенным на сервере, значит, вы не аутентифицировали пользователя на сервере / в приложении. Вам нужно будет сделать что-то еще для аутентификации пользователя на сервере / в приложении. - person Pauld; 04.08.2011
comment
Это будет означать, что любой сайт, требующий аутентификации, будет принудительно использовать SSL-трафик. Разве это не сложно с точки зрения вычислительной мощности сервера? - person rybosome; 05.08.2011
comment
Райан: SSL-шифрование в наши дни требует очень крошечной вычислительной мощности по сравнению с тем, что вы использовали бы для генерации ответа с помощью инфраструктуры веб-приложений, такой как Django или Rails и т. Д. - person Cameron Walsh; 28.10.2011
comment
сертификаты от startcom бесплатны и широко признаны. cacert.org - открытая альтернатива с меньшим признанием - person Dima Tisnek; 01.03.2012
comment
Это не решает вопрос об аутентификации. - person Sam Stainsby; 12.10.2012
comment
К вашему сведению, если вы используете движок приложений Google для своей службы (написанный с помощью jvm, python или go), вы получаете SSL, включенный по умолчанию ... скажите, что ваша служба работает на myservice.appspot.com, тогда все, что вы делаете, это добавляете https :// впереди. - person dodgy_coder; 19.11.2012

Или вы можете использовать известное решение этой проблемы и использовать SSL. Самоподписанные сертификаты бесплатны, и это личный проект, верно?

person wowest    schedule 28.01.2009
comment
Самоподписанные сертификаты бесплатны, но, AFAIK, вам все равно нужен статический IP-адрес. - person dF.; 31.01.2009
comment
@dF не требуется наличия статического IP-адреса, за исключением определенных лицензионных требований, связанных с коммерческой оплатой сертификатов. - person Chris Marisic; 01.06.2011
comment
Если у вас есть контроль над хранилищами сертификатов на обоих концах (клиент и сервер), это может быть жизнеспособным вариантом, но ... управление сертификатами и их распространение, вероятно, намного сложнее в производственной среде, чем в среде разработки. Обязательно осознайте сложность этой альтернативы, прежде чем переходить к ней. - person aled; 12.05.2014

Если вам требуется хэш тела в качестве одного из параметров в URL-адресе, и этот URL-адрес подписан с помощью закрытого ключа, то атака «злоумышленник посередине» сможет только заменить тело содержимым, которое будет генерировать такой же хеш. По крайней мере, сейчас это легко сделать с хеш-значениями MD5, а когда SHA-1 не работает, вы понимаете.

Чтобы защитить тело от подделки, вам потребуется подпись тела, которую атака «злоумышленник посередине» вряд ли сможет взломать, поскольку они не будут знать закрытый ключ, который генерирует подпись. .

person ZaDDaZ    schedule 28.01.2009
comment
Придумать строку, которая будет генерировать тот же хеш md5, что и действительный контент, может быть намного проще, чем должно быть, но придумать злобную версию действительного содержимого, которое хеширует то же значение, все еще непомерно сложно. Вот почему md5 больше не используется для хэшей паролей, но по-прежнему используется для проверки загрузок. - person Tim Gautier; 18.07.2012

Фактически, исходная аутентификация S3 действительно позволяет подписывать контент, хотя и со слабой подписью MD5. Вы можете просто применить их необязательную практику включения заголовка Content-MD5 в HMAC (строка, которая должна быть подписана).

http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

Их новая схема аутентификации v4 более безопасна.

http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

person djsadinoff    schedule 10.03.2013

Помните, что ваши предложения затрудняют взаимодействие клиентов с сервером. Им необходимо понять ваше инновационное решение и соответствующим образом зашифровать данные. Эта модель не очень подходит для общедоступного API (если вы не amazon \ yahoo \ google ..).

В любом случае, если вам нужно зашифровать содержимое тела, я бы посоветовал вам проверить существующие стандарты и решения, такие как:

Шифрование XML (стандарт W3C)

Безопасность XML

person LiorH    schedule 18.01.2009