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


Справочная информация:

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

эти так вопросы были особенно полезны, чтобы заставить меня начать:

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

чтобы перейти к вопросу:

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

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

6 213

6 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

на самом деле, оригинальный S3 auth тут разрешить подписывать содержимое, хотя и со слабой подписью 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

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

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

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

XML Security