При разработке REST API или службы существуют ли лучшие рекомендации по работе с безопасностью (аутентификация, авторизация, управление идентификацией)?
При создании SOAP API вы используете WS-Security в качестве руководства, и по этой теме имеется много литературы. Я нашел меньше информации о защите конечных точек REST.
Хотя я понимаю, что REST намеренно не имеет спецификаций, аналогичных WS- *, я надеюсь, что появились лучшие практики или рекомендуемые шаблоны.
Любое обсуждение или ссылки на соответствующие документы будут очень благодарны. Если это имеет значение, мы будем использовать WCF с сериализованными сообщениями POX / JSON для наших REST API / Services, созданных с использованием v3.5 .NET Framework.
Ответы:
Как сказал tweakt, Amazon S3 - хорошая модель для работы. Их подписи запросов действительно имеют некоторые функции (такие как включение метки времени), которые помогают защитить от случайного и злонамеренного воспроизведения запроса.
Приятной особенностью HTTP Basic является то, что практически все библиотеки HTTP поддерживают его. Конечно, в этом случае вам потребуется SSL, потому что отправка незашифрованных паролей по сети - это почти всегда плохо. Basic предпочтительнее Digest при использовании SSL, потому что даже если вызывающий абонент уже знает, что требуются учетные данные, для обмена одноразовым значением в Digest требуется дополнительная передача в оба конца. При использовании Basic звонящие просто отправляют учетные данные в первый раз.
Как только личность клиента установлена, авторизация становится проблемой внедрения. Однако вы можете делегировать авторизацию другому компоненту с существующей моделью авторизации. Опять же, хорошая вещь в Basic - это то, что ваш сервер заканчивается незашифрованной копией пароля клиента, которую вы можете при необходимости просто передать другому компоненту в вашей инфраструктуре.
источник
"sending plaintext passwords over the net is almost universally a bad thing"
- Можете ли вы уточнить на «почти»? Когда это не плохая идея?Для REST нет никаких стандартов, кроме HTTP. Там есть установленные службы REST. Я предлагаю вам взглянуть на них и почувствовать, как они работают.
Например, мы заимствовали много идей из сервиса Amazon S3 REST при разработке собственной. Но мы решили не использовать более продвинутую модель безопасности, основанную на сигнатурах запросов. Более простой подход - HTTP Basic auth over SSL. Вы должны решить, что лучше всего работает в вашей ситуации.
Кроме того, я настоятельно рекомендую книгу RESTful Web Services от O'reilly. Он объясняет основные концепции и предоставляет некоторые передовые практики. Вы можете взять модель, которую они предоставляют, и сопоставить ее с вашим собственным приложением.
источник
Возможно, вы также захотите взглянуть на OAuth , новый открытый протокол для авторизации на основе токенов, специально предназначенный для http apis.
Это очень похоже на подход, принятый flickr, и помните, что apis молока "rest" (не обязательно хорошие примеры успокоительного apis, но хорошие примеры подхода, основанного на токене).
источник
На Github найден отличный контрольный список :
Аутентификация
Не изобретайте колесо в аутентификации, генерации токенов, хранении паролей. Используйте стандарты.
Использование
Max Retry
и тюрьма функции в логине.Используйте шифрование на всех конфиденциальных данных.
JWT (веб-токен JSON)
Используйте случайный сложный ключ (JWT Secret), чтобы сделать грубое форсирование токена очень сложно.
Не извлекайте алгоритм из полезной нагрузки. Принудительно использовать алгоритм в бэкэнде (HS256 или RS256).
Сделать срок действия токена (
TTL
,RTTL
) как можно короче.Не храните конфиденциальные данные в
JWT
полезной нагрузке, они могут быть легко декодированы.OAuth
Всегда проверяйте на
redirect_uri
стороне сервера, чтобы разрешить только URL из белого списка.Всегда пытайтесь обменять на код, а не на токены (не разрешайте
response_type=token
).Использование параметра состояния со случайной хэш , чтобы предотвратить
CSRF
наOAuth
процесс аутентификации.Определите область по умолчанию и проверьте параметры области для каждого приложения.
Доступ
Ограничьте количество запросов (регулирование), чтобы избежать атак DDoS / brute-force.
Используйте HTTPS на стороне сервера, чтобы избежать MITM (Man In the Middle Attack)
Используйте
HSTS
заголовок с SSL, чтобы избежать атаки SSL Strip.вход
Используйте правильный метод HTTP в соответствии с операцией:
GET
(чтение),POST
(создание),PUT/PATCH
(замена / обновление) иDELETE
(для удаления записи) и ответьте,405 Method Not Allowed
если запрошенный метод не подходит для запрошенного ресурса.Проверьте тип содержимого по
Accept
заголовку запроса (согласование содержимого), чтобы разрешить только ваш поддерживаемый формат (напримерapplication/xml
,application/json
и т. Д.), И отвечайте406 Not Acceptable
ответом, если он не совпадает.Validate
content-type
из размещены данные , как вы принимаете (напримерapplication/x-www-form-urlencoded
,multipart/form-data
,application/json
и т.д.).Проверяйте пользовательский ввод, чтобы избежать распространенных уязвимостей (например, XSS, SQL-инъекция, удаленное выполнение кода и т. Д.).
Не используйте конфиденциальные данные (учетные данные, пароли, маркеры безопасности или ключи API) в URL-адресе, но используйте стандартный
Authorization
заголовок.Используйте службу API-шлюза для включения кэширования,
Rate Limit
политик (например, Quota, Spike Arrest, Concurrent Rate Limit) и динамического развертывания ресурсов API.обработка
Проверьте, все ли конечные точки защищены за аутентификацией, чтобы избежать прерывания процесса аутентификации.
Следует избегать использования собственного идентификатора ресурса. Используйте / me / orders вместо / user / 654321 / orders.
Не увеличивайте автоматически идентификаторы. Вместо этого используйте UUID.
Если вы анализируете XML-файлы, убедитесь, что синтаксический анализ сущностей не включен, чтобы избежать XXE (атака внешней сущности XML).
Если вы анализируете XML-файлы, убедитесь, что расширение сущностей не включено, чтобы избежать бомбардировки Billion Laughs / XML с помощью экспоненциальной атаки на расширение сущностей.
Используйте CDN для загрузки файлов.
Если вы имеете дело с огромным количеством данных, используйте Workers and Queues для максимально возможной обработки в фоновом режиме и быстрого возврата ответа, чтобы избежать блокировки HTTP.
Не забудьте выключить режим DEBUG .
Вывод
Отправить
X-Content-Type-Options: nosniff
заголовокОтправить
X-Frame-Options: deny
заголовокОтправить
Content-Security-Policy: default-src 'none'
заголовокУдалить заголовки отпечатков пальцев -
X-Powered-By
,Server
иX-AspNet-Version
т. Д.Принудительно
content-type
за ваш ответ, если вы вернетесь,application/json
то ваш тип контента ответаapplication/json
.Не возвращайте конфиденциальные данные, такие как учетные данные, пароли, токены безопасности.
Верните правильный код состояния в соответствии с выполненной операцией. (например
200 OK
,400 Bad Request
,401 Unauthorized
,405 Method Not Allowed
и т.д.).источник
Я немного удивлен тем, что SSL с клиентскими сертификатами еще не упоминался. Конечно, этот подход действительно полезен только в том случае, если вы можете рассчитывать на сообщество пользователей, идентифицируемых сертификатами. Но ряд правительств / компаний выдают их своим пользователям. Пользователю не нужно беспокоиться о создании еще одной комбинации имени пользователя и пароля, и идентичность устанавливается для каждого соединения, поэтому связь с сервером может быть полностью без сохранения состояния, пользовательских сеансов не требуется. (Не подразумевать, что любые / все другие упомянутые решения требуют сессий)
источник
Каждый в этих ответах упустил из виду истинный контроль доступа / авторизацию.
Если, например, ваши API-интерфейсы REST / веб-службы предназначены для публикации / получения медицинских карт, вы можете определить политику контроля доступа о том, кто может получить доступ к данным и при каких обстоятельствах. Например:
Для определения и реализации этих детальных авторизаций вам потребуется использовать язык управления доступом на основе атрибутов, называемый XACML, расширяемый язык разметки управления доступом.
Другие стандарты здесь для следующего:
XACML не зависит от технологий. Его можно применять к Java-приложениям, .NET, Python, Ruby ... веб-службам, API-интерфейсам REST и многим другим.
Следующие интересные ресурсы:
источник
Я использовал OAuth несколько раз, а также использовал некоторые другие методы (BASIC / DIGEST). Я искренне предлагаю OAuth. Следующая ссылка - лучший учебник, который я видел по использованию OAuth:
http://hueniverse.com/oauth/guide/
источник
Один из лучших постов, которые я когда-либо встречал, касающийся безопасности, поскольку он касается REST, закончился на 1 RainDrop . MySpace API использует OAuth также для обеспечения безопасности, и у вас есть полный доступ к их пользовательским каналам в коде RestChess, с которым я провел много исследований. Это было demo'd на Mix, и вы можете найти пост здесь .
источник
Спасибо за отличный совет. В итоге мы использовали специальный HTTP-заголовок для передачи идентификационного токена от клиента в службу, чтобы подготовиться к интеграции нашего RESTful API с будущей платформой Zermatt Identity от Microsoft. Я описал проблему здесь и наше решение здесь . Я также воспользовался советом tweakt и купил RESTful Web Services - очень хорошую книгу, если вы создаете RESTful API любого рода.
источник
OWASP (Open Web Application Security Project) имеет несколько шпаргалок, охватывающих все аспекты разработки веб-приложений. Этот проект является очень ценным и надежным источником информации. Что касается услуг REST, вы можете проверить это: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet
источник
Я бы порекомендовал OAuth 2/3. Вы можете найти больше информации на http://oauth.net/2/
источник
Я много искал о безопасности restful ws, и мы также использовали токен через cookie от клиента к серверу для аутентификации запросов. Я использовал Spring Security для авторизации запросов в сервисе, потому что мне приходилось аутентифицировать и авторизовать каждый запрос на основе указанных политик безопасности, которые уже были в БД.
источник
Тот факт, что мир SOAP довольно хорошо покрыт стандартами безопасности, не означает, что он по умолчанию безопасен. Во-первых, стандарты очень сложны. Сложность - не очень хороший друг для уязвимостей безопасности и реализации, таких как атаки с использованием подписи XML являются здесь эндемичными.
Что касается среды .NET я не помогу, но «веб - сервисам здания с Java» (кирпич с ~ 10 авторами) сделала помощь мне много в понимании WS- * архитектуры безопасности и, в особенности, его причуда.
источник
Сам REST не предлагает никаких стандартов безопасности, но такие вещи, как OAuth и SAML быстро становятся стандартами в этой области. Однако аутентификация и авторизация - это лишь малая часть того, что вам нужно учитывать. Многие из известных уязвимостей, связанных с веб-приложениями, очень сильно относятся к REST apis. Вы должны учитывать проверку ввода, взлом сеанса, неуместные сообщения об ошибках, внутренние уязвимости сотрудников и так далее. Это большая тема.
источник
Я хочу добавить (в соответствии с stinkeymatt), самое простое решение было бы добавить SSL-сертификаты на ваш сайт. Другими словами, убедитесь, что ваш URL-адрес HTTPS: //. Это покроет вашу транспортную безопасность (удар за доллар). С URL-адресами RESTful идея состоит в том, чтобы сделать его простым (в отличие от WS * security / SAML), вы можете использовать oAuth2 / openID connect или даже Basic Auth (в простых случаях). Но вам все равно понадобится SSL / HTTPS. Пожалуйста, проверьте безопасность ASP.NET Web API 2 здесь: http://www.asp.net/web-api/overview/security (Статьи и видео)
источник
В результате @Nathan получил простой заголовок HTTP, а некоторые из них назвали OAuth2 и клиентские SSL-сертификаты. Суть в том, что ... ваш REST API не должен обрабатывать безопасность, так как это действительно должно выходить за рамки API.
Вместо этого следует установить уровень безопасности, будь то заголовок HTTP за веб-прокси (распространенный подход, такой как SiteMinder, Zermatt или даже Apache HTTPd), или такой сложный, как OAuth 2.
Главное, чтобы запросы работали без какого-либо взаимодействия с конечным пользователем. Все, что нужно, это убедиться, что соединение с REST API аутентифицировано. В Java EE у нас есть понятие а,
userPrincipal
которое можно получить наHttpServletRequest
. В дескрипторе развертывания также указывается, что шаблон URL может быть безопасным, поэтому код REST API больше не нужно проверять.В мире WCF я бы использовал
ServiceSecurityContext.Current
текущий контекст безопасности. Вам необходимо настроить приложение так, чтобы оно требовало аутентификации.Есть одно исключение из заявления, которое я имел выше, и это использование одноразового номера для предотвращения повторов (которые могут быть атаками или кто-то просто отправляет одни и те же данные дважды). Эта часть может быть обработана только на прикладном уровне.
источник
Что касается безопасности веб-приложений, вам следует взглянуть на OWASP ( https://www.owasp.org/index.php/Main_Page ), в котором представлены листы для различных атак безопасности. Вы можете включить как можно больше мер для защиты своего Приложения. Что касается безопасности API (авторизация, аутентификация, управление идентификацией), существует несколько способов, как уже упоминалось (Basic, Digest и OAuth). В OAuth1.0 есть петли, поэтому вы можете использовать OAuth1.0a (OAuth2.0 не получил широкого распространения из-за проблем со спецификацией)
источник
Это было давно, но вопрос все еще актуален, хотя ответ мог бы немного измениться.
API-шлюз будет гибким и легко настраиваемым решением. Я проверил и использовал KONG немного и мне очень понравилось то, что я увидел. KONG предоставляет собственный API REST администратора, который вы можете использовать для управления пользователями.
Express-gateway.io является более новым и также является шлюзом API.
источник