Каковы потенциальные проблемы с этой схемой безопасности WebService? - PullRequest
5 голосов
/ 30 сентября 2008

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

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

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

Заголовок безопасности выглядит примерно так (код C # - обрезан, чтобы проиллюстрировать основную концепцию):

public sealed class SecurityHeader : SoapHeader
{
    public string UserId;     // Encrypted   
    public string Password;   // Encrypted; Just realized this field isn't necessary [thanks CJP]

    public DateTime TimeStamp;   // Used for calculating header Expiry
    public string SecurityToken;
}

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

SecurityToken основан на соленом хеше UserId, Password и TimeStamp. Соль меняется каждый день, чтобы предотвратить повторы.

Единственная проблема, которую я вижу, заключается в том, что у пользователя может быть разрешение на доступ к веб-службе A, но не к веб-службе B. Если он вызывает A и получает токен безопасности, как он сейчас стоит, это означает, что B пропустит его если он использует тот же токен. Я должен изменить его так, чтобы маркер безопасности действовал только от веб-службы к веб-службе, а не от пользователя к веб-службе, т.е. Должно быть в порядке, если пользователь вызывает A, который вызывает B, но не OK, если пользователь вызывает Службу A, а затем Службу D. Обходным путем является назначение общего ключа (или набора ключей) для логически связанных служб. (т.е. если клиент может сделать A, то логически он может сделать также B).

В качестве альтернативы мне придется кодировать весь набор разрешений пользователя как часть заголовка безопасности. Мне придется выяснить, какие будут накладные расходы.

Edit:

Несколько человек упоминали, что смотрели на другие схемы безопасности, такие как WS-Security, SAML и т. Д. У меня уже есть. На самом деле, я получил идею от WS-Security. Проблема заключается в том, что другие схемы не обеспечивают необходимую мне функциональность (кэширование информации об авторизации и защита от повторов без промежуточной базы данных). Если кто-то знает схему, которая это делает, я с радостью воспользуюсь ею. Кроме того, это не об аутентификации. Это обрабатывается другим механизмом, не зависящим от меня.

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

Ответы [ 4 ]

4 голосов
/ 02 октября 2008

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

Причина проста: безопасность (в частности, криптография) очень, очень сложна, и ее почти невозможно понять правильно. Используйте надежный, понятный и проверенный инструмент.

См. http://www.oasis -open.org / committees / tc_home.php? Wg_abbrev = wss для получения дополнительной информации о WS-Security.

Большинство фреймворков (.NET / JavaEE и т. Д.) Будут иметь встроенную поддержку (до некоторой степени) для WS-Security.

Если вы считаете, что ваша схема в некотором смысле лучше, чем стандарты, я предлагаю вам записать ее в виде статьи и представить ее для рецензирования (вместе с эталонной реализацией), но НЕ используйте ее для обеспечения безопасности. применение.

РЕДАКТИРОВАТЬ, чтобы ответить на OP Edit: Я думаю, вы немного путаете роли Аутентификации и Авторизации, что легко сделать ...

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

Авторизация - это процесс, при котором вы берете аутентифицированного отправителя и применяете некоторый набор разрешений, чтобы вы могли ограничить область доступа. Как правило, фреймворки по умолчанию не выполняют авторизацию, вы должны либо включить ее, создав некоторую форму ACL, либо расширив некоторый интерфейс типа «Security Manager».

По сути, идея заключается в том, что уровень аутентификации сообщает вам, кто пытается получить доступ к странице A, и оставляет за вами право решать, имеет ли это лицо право доступа к странице A.

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

2 голосов
/ 02 октября 2008

Хорошо, замените мои старые ответы, надеюсь, лучшим.

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

Кстати, я не знаю достаточно криптографии, чтобы сказать, достаточно ли безопасно добавлять секретную соль + хеш (хотя кажется, что все в порядке); Я почти уверен, что безопасно HMAC с секретным или закрытым ключом. Вращающиеся ключи - это хорошая идея, поэтому у вас все еще есть мастер-ключ и выдается новый ключ подписи.

Другие проблемы, связанные с вашим подходом, заключаются в том, что (а) вы жестко программируете логику хеширования в каждой службе и (б) службы могут захотеть получить более подробные данные из службы авторизации, чем просто ответ да / нет. Например, вы можете захотеть, чтобы служба авторизации вставляла в заголовок, что этот пользователь принадлежит ролям A и B, а не C.

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

На данном этапе мы обсуждаем реализацию единого входа. Вы уже знаете о WS-Security спецификациях. Этот заголовок, который я описал, очень похож на утверждение SAML .

Вот статья об использовании WS-Security и SAML для единого входа.

Теперь я не знаю, нужно ли вам все это ... есть и промежуточные решения. Например, служба авторизации может подписать оригинальный блок имени пользователя; если вы беспокоитесь о производительности открытого / частного шифрования и у вас все в порядке, когда вы делитесь секретными ключами, вы можете также использовать секретный ключ для подписи вместо открытых / закрытых ключей.

1 голос
/ 30 сентября 2008

Лично я не вижу, чтобы у вас возникали какие-либо проблемы, если у вас есть централизованная базовая структура для поддержки проверки значений SecurityToken.

0 голосов
/ 05 октября 2008

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

  • Вы говорите о службе аутентификации, а не о службе авторизации. Просто чтобы убедиться, что вы знаете, о чем говорите ...?
  • Во-вторых, вам нужно разделить соль (что не секрет) и ключ (который есть). У вас должен быть хеш с ключами (например, HMAC) вместе с солью (или соленый хеш с ключами. Походит на бутерброд.). Соль, как отмечалось, не является секретной, но должна быть изменена ДЛЯ КАЖДОГО ЖЕЛЕЗА и может быть включена в заголовок; ключ ДОЛЖЕН быть секретным, и менять его каждый день - это хорошо. Конечно, убедитесь, что вы используете надежный хеш (например, SHA-256), правильные методы управления ключами и т. Д. И т. Д.

Опять же, я призываю вас пересмотреть свои собственные, но если вам придётся выходить самостоятельно ...

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