Рекомендации по обеспечению безопасности REST API / веб-службы [закрыто]


при разработке REST API или службы существуют ли какие-либо установленные рекомендации по обеспечению безопасности (аутентификация, авторизация, управление удостоверениями) ?

при создании SOAP API у вас есть WS-Security в качестве руководства, и по этой теме существует много литературы. Я нашел меньше информации о защите конечных точек REST.

хотя я понимаю, что REST намеренно не имеет спецификаций, аналогичных WS-* я надеюсь, что лучшие практики или рекомендации появились закономерности.

любое обсуждение или ссылки на соответствующие документы были бы очень признательны. Если это имеет значение, мы будем использовать WCF с сериализованными сообщениями POX/JSON для наших REST API/Services, построенных с использованием v3.5 платформы .NET Framework.

18 762

18 ответов:

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

хорошая вещь о HTTP Basic является то, что практически все библиотеки HTTP поддерживают его. В этом случае вам, конечно же, потребуется SSL, потому что отправка паролей открытого текста по сети почти повсеместно является плохой вещью. Основные предпочтительнее переваривать при использовании SSL, потому что даже если вызывающий абонент уже знает, что требуются учетные данные, Digest требует дополнительного цикла для обмена значением nonce. С Basic абоненты просто отправляют учетные данные в первый раз.

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

нет никаких стандартов для отдыха, кроме HTTP. Там созданы службы отдыха. Я предлагаю вам взглянуть на них и понять, как они работают.

например,мы позаимствовали много идей из сервиса Amazon S3 REST при разработке наших собственных. Но мы решили не использовать более продвинутую модель безопасности, основанную на сигнатурах запросов. Более простой подход-HTTP Basic auth over SSL. Вы должны решить, что лучше работает в вашем ситуация.

кроме того, я очень рекомендую книгу RESTful Web Services от О'Рейли. В нем объясняются основные концепции и приводятся некоторые передовые методы. Как правило, вы можете взять модель, которую они предоставляют, и сопоставить ее с вашим собственным приложением.

вы также можете взглянуть на OAuth, новый открытый протокол для авторизации на основе маркеров, специально предназначенный для HTTP-API.

Это очень похоже на подход flickr и помните молоко API "rest" (не обязательно хорошие примеры API restful, но хорошие примеры подхода на основе маркеров).

Я немного удивлен, что SSL с клиентскими сертификатами еще не упоминался. Конечно, этот подход действительно полезен только в том случае, если вы можете рассчитывать на сообщество пользователей, идентифицируемых сертификатами. Но ряд правительств / компаний действительно выдают их своим пользователям. Пользователю не нужно беспокоиться о создании еще одной комбинации имени пользователя / пароля, и идентификатор устанавливается на каждом соединении, поэтому связь с сервером может быть полностью без состояния, без пользователя требуются сеансы. (Не подразумевая, что любые / все другие упомянутые решения требуют сеансов)

все в этих ответах упустили из виду истинное управление доступом / авторизацию.

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

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

чтобы определить и реализовать эти детальные авторизации, вам нужно будет использовать язык управления доступом на основе атрибутов, называемый XACML, язык разметки расширяемого управления доступом.

другие стандарты вот для следующего:

  • OAuth: id. Федерация и делегирование полномочий, например, разрешение службе действовать от моего имени на другой службе (Facebook может отправлять сообщения в мой Twitter)
  • SAML: Identity federation / web SSO. SAML очень много о том, кто пользователь.
  • стандарты WS-Security / WS -*: они сосредоточены на связи между службами SOAP. Они специфичны для формата обмена сообщениями уровня приложения (SOAP) и имеют дело с аспектами например, надежность, безопасность, конфиденциальность, целостность, атомарность, событийность... Ни один из них не охватывает контроль доступа, и все они специфичны для SOAP.

XACML является технологическим агностиком. Он может быть применен к java-приложениям, .NET, Python, Ruby... веб-службы, API REST и многое другое.

следующие интересные ресурсы:

есть большой контрольный список, найденный на Github:

проверка подлинности

  • не изобретайте колесо в аутентификации, генерации токенов, хранении паролей. Используйте стандарты.

  • использовать Max Retry и тюремные функции В логине.

  • шифрование всех конфиденциальных данных.

JWT (JSON Web Токен)

  • используйте случайный сложный ключ (секрет JWT), чтобы сделать грубое принуждение токена очень сложным.

  • не извлекайте алгоритм из полезной нагрузки. Принудительно введите алгоритм в бэкэнд (HS256 или RS256).

  • сделать срок действия токена (TTL,RTTL) как можно короче.

  • не храните конфиденциальные данные в JWT полезная нагрузка, ее можно расшифровать легко.

OAuth

  • всегда проверять redirect_uri на стороне сервера, чтобы разрешить только белый список URL-адресов.

  • всегда старайтесь обменять на код, а не токены (не позволяйте response_type=token).

  • используйте параметр состояния со случайным хэшем, чтобы предотвратить CSRF на OAuth процесс проверки подлинности.

  • определите область по умолчанию и проверьте область параметры для каждого приложения.

открыть

  • ограничить запросы (дросселирование), чтобы избежать DDoS / грубой силы атак.

  • используйте HTTPS на стороне сервера, чтобы избежать MITM (Man In the Middle Attack)

  • использовать HSTS заголовок с SSL, чтобы избежать атаки SSL-полосы.

Input

  • использовать правильный метод HTTP в соответствии с операцией:GET (читать), POST (создать)PUT/PATCH (заменить/обновить), и DELETE (чтобы удалить запись), и ответить с 405 Method Not Allowed если запрашиваемый метод не подходит для запрошенного ресурса.

  • проверка типа содержимого по запросу Accept заголовок (согласование содержимого), чтобы разрешить только ваш поддерживаемый формат (например,application/xml,application/json, etc) и ответить с 406 Not Acceptable ответ, если не соответствие.

  • проверка content-type опубликованных данных, как вы принимаете (например,application/x-www-form-urlencoded,multipart/form-data,application/json, etc).

  • проверка пользовательского ввода во избежание распространенных уязвимостей (например, XSS, SQL-инъекция, удаленное выполнение кода и т. д.).

  • не используйте конфиденциальные данные (учетные данные, пароли, маркеры безопасности или ключи API) в URL-адресе, но используйте стандартный Authorization заголовок.

  • использовать API Служба шлюза для включения кэширования,Rate Limit политики (например, квота, арест Спайка, ограничение параллельной скорости) и динамически развертывать ресурсы API.

обработка

  • Проверьте, защищены ли все конечные точки за аутентификацией, чтобы избежать нарушенного процесса аутентификации.

  • пользователь ID ресурса следует избегать. Используйте/me / orders вместо /пользователей/654321/заказы.

  • не увеличивайте идентификаторы автоматически. Вместо этого используйте UUID.

  • если вы анализируете XML-файлы, убедитесь, что разбор сущностей не включен, чтобы избежать XXE (XML external entity attack).

  • если вы анализируете XML-файлы, убедитесь, что расширение сущности не включено, чтобы избежать Billion Laughs/XML bomb с помощью экспоненциальной атаки расширения сущности.

  • использовать CDN для файла загрузит.

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

  • не забудьте включить DEBUG режим выкл.

выход

  • отправить .

  • отправить X-Frame-Options: deny заголовок.

  • отправить .

  • удалить отпечатки пальцев заголовки -X-Powered-By,Server,X-AspNet-Version etc.

  • силу content-type для вашего ответа, если вы вернетесь application/json тогда ваш ответ content-type application/json.

  • не возвращайте конфиденциальные данные, такие как учетные данные, пароли, маркеры безопасности.

  • возвращает правильный код состояния согласно чтобы операция завершилась. (например,200 OK,400 Bad Request,401 Unauthorized,405 Method Not Allowed и т. д.).

Я использовал OAuth несколько раз, а также использовал некоторые другие методы (BASIC/DIGEST). Я всем сердцем предлагаю Оаут. Следующая ссылка-лучший учебник, который я видел при использовании OAuth:

http://hueniverse.com/oauth/guide/

один из лучших постов, с которыми я когда-либо сталкивался в отношении безопасности, поскольку он относится к отдыху, закончился в 1 капля. API MySpace использует OAuth также для обеспечения безопасности, и у вас есть полный доступ к их пользовательским каналам в коде RestChess, с которым я провел много исследований. Это была демонстрация в Mix, и вы можете найти сообщение здесь.

Спасибо за отличный совет. В конечном итоге мы использовали пользовательский заголовок HTTP для передачи маркера идентификации от клиента к службе, готовясь к интеграции нашего RESTful API с предстоящей платформой идентификации Zermatt от Microsoft. Я описал проблему здесь и решение здесь. Я тоже взял tweakt советую и купил RESTful Web Services - очень хорошая книга, если вы создаете RESTful API любого добрый.

OWASP (Open Web Application Security Project) имеет несколько шпаргалок, охватывающих все аспекты разработки веб-приложений. Этот проект является очень ценным и надежным источником информации. Что касается услуг отдыха, вы можете проверить это:https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

Я бы рекомендовал OAuth 2/3. Вы можете найти дополнительную информацию по адресу http://oauth.net/2/

тот факт, что мир SOAP довольно хорошо покрыт стандартами безопасности, не означает, что он безопасен по умолчанию. Во-первых, стандарты очень комплекс. Сложность - это не очень хороший друг уязвимостей безопасности и реализации, таких как XML signature wrapping attacks эндемиков здесь.

Что касается среды .NET, я не буду сильно помогать, но "создание веб-служб с помощью Java" (кирпич с ~10 авторов) помог мне большое в понимании архитектуры безопасности WS - * и, особенно, ее причуд.

Я много искал о безопасности restful ws, и мы также закончили с использованием токена через cookie от клиента к серверу для аутентификации запросов . Я использовал spring security для авторизации запросов в службе, потому что мне нужно было аутентифицировать и авторизовать каждый запрос на основе указанных политик безопасности, которые уже были в БД.

сам REST не предлагает никаких стандартов безопасности, но такие вещи, как OAuth и SAML, быстро становятся стандартами в этом пространстве. Однако аутентификация и авторизация-это лишь малая часть того, что вам нужно учитывать. Многие из известных уязвимостей, связанных с веб-приложениями, очень применимы к API REST. Вы должны рассмотреть проверку ввода, сеанс взлома, неподходящие сообщения об ошибках, внутренние уязвимости сотрудников и так далее. Это большая тема.

Я хочу добавить (в соответствии с stinkeymatt), самым простым решением было бы добавить SSL-сертификаты на ваш сайт. Другими словами, убедитесь, что Ваш url-адрес HTTPS://. Это покроет вашу транспортную безопасность (bang for the buck). С RESTful url, идея состоит в том, чтобы держать его простым (в отличие от WS * security / SAML), вы можете использовать OAuth2 / openID connect или даже основной 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 мы имеем понятие a userPrincipal Что можно получить на HttpServletRequest. Он также управляется в дескрипторе развертывания, что шаблон URL может быть безопасным, поэтому код rest API больше не нужно проверять.

в мире WCF я бы использовал ServiceSecurityContext.Current для получения текущего контекста безопасности. Вам нужно настроить вас приложение для проверки подлинности.

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

для обеспечения безопасности веб-приложений, вы должны взглянуть на OWASP (https://www.owasp.org/index.php/Main_Page), который обеспечивает cheatsheets для различных атак безопасности. Вы можете включить как можно больше мер для обеспечения безопасности вашего приложения. Что касается безопасности API (авторизация, аутентификация, управление идентификацией), существует несколько способов,как уже упоминалось (Basic, Digest и OAuth). Есть отверстия петли в OAuth1. 0, так что вы можете использовать OAuth1. 0a (OAuth2. 0 не является широко принят из-за проблем со спецификацией)

Это было некоторое время, но вопрос по-прежнему актуален, хотя ответ, возможно, изменились немного.

шлюз API будет гибким и легко конфигурируемым решением. Я тестировал и использовал Гонконг совсем немного и очень понравилось то, что я видел. KONG предоставляет собственный API REST администратора, который можно использовать для управления пользователями.

Экспресс-шлюз.Ио более свежие, а также шлюз по API.