Парольная защита веб-приложений

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


Поговорим о системе, когда проверка подлинности пользователей осуществляется только с помощью паролей.

Прежде всего, советую прочитать хабратопик Где тонко, там и рвется (закрытый топик для подписчиков блога UI Design and Usability), именно он подтолкнул меня к написанию своего.

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

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

При выборе парольного способа у разработчика остаётся мало возможностей для манёвра.
Для работы у него есть поля:
1. Логин
2. Пароль

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

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

При этом пароль не может быть сложным (см. Где тонко, там и рвется).
Единственное, что может требовать разработчик от пользователей – периодически менять пароль на другой, удобный пользователю.

И, фактически, вся система защиты строится на способе обмена идентификационными данными (далее — просто данными) и политике работы пользователей в системе.

1. Прежде всего – это защищённая передача данных пользователя.
Идеально использование SSL, но, к сожалению, не всегда возможно.

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

2. Использование виртуальной клавиатуры.
Уменьшает возможность перехвата данных кей-логгерами.
спорно: Комментарий.

3. Блокировка пользователя после 7-10 неудачных попыток входа.
Практически исключает взлом пароля путём перебора.

4. Смена идентификатора пользователя в системе (сессии) после аутентификации.
В нашем случае – смена после успешного входа пользователя в систему.

5. Привязка пользователя к текущему клиенту.
Решается посредством привязки к IP и браузеру.
Это сводит к минимуму ущерб от похищения сессии пользователя.

6. В самой сессии со стороны пользователя – никаких данных!
Только её идентификатор.

7. Запрос повторной аутентификации пользователя после N минут неактивности.

8. Система привязки пользователей к конкретным IP/дням/времени работы.
Нечего рядовому менеджеру Кате делать в системе в субботу в 02:23 с IP американской университетской сети :).

9. Принципиальная невозможность работы с системой через прокси-сервера.
Особенно актуально в случае работы без SSL.
К сожалению, в ряде случае отследить невозможно.

10. И Самое Важное – постоянный мониторинг работы системы!
Вход/выход пользователей, блокировки, неверный ввод/перебор пароля, сканирование на уязвимости и так далее, всё в руках паранойи разработчика :)

update: Пункты 4-10 относятся не столько к парольной защите, сколько к безопасности приложения в целом.
+22
4 марта 2007, 16:16
27
mot 5,4

комментарии (53)

0
caston #
1. Простое шифрование по алгоритму md5 и передача...
Если речь идет о шифровании на стороне пользователя, то какие средства для шифрования использовать? Где хранить secret key для hmac? На первый взгляд, притянутая за уши к ssl технология. Все-таки, если есть свой айпи, лучшего решения, чем использует вебмани не найти.

3. Блокировка пользователя после 7-10 неудачных попыток входа.
Практически исключает взлом пароля путём перебора.
Пользователя или его айпи (если речь идет о компаниях с филиалами? Если настоящий захочет зайти?
И пиктокод после трех).

8. Система привязки пользователей к конкретным IP/дням/времени работы.
Понравилось. Вспомнил школу, где нам выдавали машинное время по расписанию уроков.

В принципе, интранет-системы на базе LAMP-а это часть поддержки бизнеса. Например, интернет-магазин интегрированный со складом, бухгалтерией, а не банально присылающий письма, что пришел заказ, и пр. Риск потери информации чреват банкротством или снижением капитализации компании (речь не о нашей стране, где основные риски — "неверный выбор стратегии развития, ценовые и экологические" - мнение РБК-дэйли).
0
mot #
1. Спасибо за (опосредованное) указание на ошибку. Имелось ввиду хеширование.
В данном случае SSL технология позволяет забыть о нюансах использования HMAC со стороны клиента, шифруя данные. Согласен с её "притянутостью".

Secret key для HMAC приходит к пользователю вместе со страницей. Меняется с каждой перезагрузкой страницы.
Со стороны сервера он хранится в сессии. Сессия хранится исключительно в БД.

Можно ссылку или подробнее про "решение вебмани"? Подразумевается софт-клиент или что?

2. Блокировку IP считаю бессмысленной, именно пользователя.
В случае блокировки, человек, имеющий права на управление аккаунтами получает уведомление.
Так же, к данному человеку может обратиться и "настоящий пользователь".
Это - безопасно.

3. Если я вас правильно понял, то вы зря недооцениваете привязку к IP/времени.
Благодаря данной возможности и подробному мониторингу реально пресекаются "ненужные действия" пользователя.
В том числе и "вынос" информации за пределы компании.

А неудобства данная мера (будучи один раз настроенной) не приносит никакого.


4. Системы, описанные вами, ещё более сложны. Я говорю о системе с надводной частью (пусть будет интернет-магазин, доступный абсолютно всем) и подводной - доступной только сотрудниками компании.
Если бизнес компании построен исключительно вокруг данной системы - это очень и очень рискованно.

Грамотно написанных текстов о безопасности подобных систем я не встречал.
0
caston #
Мне приходилось делать такую систему более года назад — управление контейнерным стоком в Северном порту южной столицы. Это был пиздец интересный проект. Компания перешла с экселя на эту систему. Более того, потом понадобилась поддержка мультиязычности для филиала компании в Антверпене. Сейчас перевожу на аякс и некоторое подобие гуглшита и обязательно приму во внимание вашу статью. Спасибо)
+1
long #
>хочу рассказать о собственном опыте защиты веб-приложений, используемых на предприятиях/фирмах с ограниченным числом сотрудников.
Если число сотрудников ограничено (пусть и большим числом, но ограниченно) - первой линией обороны должно стать ограничение списка IP. Причем на уровне железа - взломать Cisco несколько сложнее, чем приложение. Например, система газовых аукционов, которую довелось проектировать, разрабатывать и внедрять для Газпрома, жестко ограничена в доступе по списку IP адресов.
0
stealthy #
Честно говоря если Вы пишете о своем личном опыте, то наверное имело бы смысл не абстрактно перечислить возможные методы решения, а описать конкретное решение, реализованное вами. Описать решаемую задачу и архитектуру (подходы) более детально. В данном случае Вы перечислили достаточно очевидные вещи, к тому же малосистематизированные (на мой личный взгляд) и без привязки к конкретным ситуациям. Создается впечатление, что целью топика было притянуть за уши количество методов к числу 10.

Чтобы не быть голословным:
- пункт 2 малоприменим и неудобен в большинстве веб приложений, в то же время в банковской сфере достаточно активно внедряется для защиты пинкодов и прочих банкоматных несложных паролей.
- пункт 3 для защиты приложений в вебе сложноосуществим
- пункт 4 не относится к проблеме аутентификации по логину-паролю, сессия есть следующая фаза работы
- пункт 5 не работает для предприятий с одним IP и типовой настройкой рабочего места (читай "большинства корпоративных юзеров")
- пункт 6 не раскрыт, смысл малопонятен
- пункты 7 и 8 на практике создадут больше проблем, чем повысят защиту. Менеджер Катя будет долго материться в момент демонстрации прототипа системы заказчику находясь в Далласе на слете соучредителей. А требования постоянной смены пароля приведут к записям на липких бумажках и критике системы, что в потенциале приведет к переходу на другой продукт.
- пункты 9 и 10 - фантазия, которая на практике может быть реализована, но не может быть внедрена.

Поэтому еще раз просьба - напишите что же конкретно сделали Вы в рамках своего решения. Тема эта достаточно актуальна и важна для обсуждения в среде профессионалов.

Кстати, есть такая книжка как "Аутентификация", автор Р.Смит. Возможно не лучшая. Но тем, кто интересуется темой но еще не копал - рекомендую. Многие вопросы будут сняты.
0
mot #
< Оправдываюсь>
Если честно, то сначала пунктов было 4. Самые первые 4 пункта.
Но после прочтения своей же статьи, я решил, что меня обвинят в непонимании предмета .

Поэтому я перечислил почти всё, что реально использую для защиты и позже добавил сноску - "update".

Если описывать конкретные решения, то на каждый уйдёт как минимум не меньше места, сколько ушло на все. Согласны? И кто осилит хотя бы половину?
Если тема реально интересна, можно описать реальные решения.
< /Оправдываюсь>

п.2
Чем?

п.3
Тем более не понимаю.
Простым языком:
Есть логин. Есть пароль. Если 10 раз ввели неверный пароль - логин заблокирован.

п.4
Не согласен.
Сессия есть начало работы пользователя с системой вообще.
И тот самый secret key для HMAC хранится именно в ней.
И "отпечаток пользователя" - тоже.

п.5
Понял о чём вы. О работе кучи пользователей через NAT.

Но это совершенно не важно для пункта 5. Привязка работать будет.
Пункт 5 говорит лишь о том, что если у пользователя сессию украдут, то воспользоваться ей не смогут. И ведь реально не смогут.
В вашем же случае становится возможным использование сворованной сессии сослуживцем, при условии работы с одного IP и использовании абсолютно идентичного браузера.
И, согласитесь, это требует вполне конкретных и определённых навыков.

п. 6
Пример: на данный момент я сижу на хабре и имею 7 кук от него. В этих куках лежат разные вещи типа "hbuid 543".
Ничего подобного в куках защищаемого веб-приложения быть не должно. Только имя куки и идентификатор (например "1f3870be274f6c49b3e31a0c6728957f").

п. 7-8
Вы меня не поняли. Читайте статью, что я привёл в голове своего хабротопика.
Там же я написал и комментарий: "Что хотелось бы добавить - имеет смысл проводить с пользователями дружеские беседы для чёткого понимания людьми зачем всё это нужно. Как показывает практика - это реально помогает."

п. 9
Частично согласен.

п. 10
Категорически не согласен.
Любая система, написанная человеком, имеет уязвимости. Невозможность создать полностью безопасной системы.
И мониторинг работы системы позволяет находить проблемы (и в том числе) с безопасностью. Я считаю мониторинг системы «победой малой кровью».


Повторюсь, если тема интересна - можно (сообща) выработать пункты и написать по ним цикл статей с реальными решениями.
+1
stealthy #
п.2 - решения с виртуальными клавиатурами:
- для обеспечения приемлемого уровня защиты требуют установки ActiveX компонентов или java-апплета или еще чего-нибудь в этом роде, поскольку на чистом Javascript+HTML+CSS это все достаточно ненадежно будет работать. Поэтому это либо интранет, либо терминалы.
- в вебе виртуальные клавиатуры непривычны пользователю. Это тоже минус решению, рассчитанному на массу.

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

п.5 - вы сами все написали, остался только один шаг - понять, что в крупных компаниях идентичные по настройкам рабочие места - обычная практика. Поэтому идентификация IP+браузер на деле работать не будет.

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

п.7-8 - я все нормально понял. Рекомендую четко разделять в статьях идеальное и реальное. В теории вы все правильно написали. На практике работать не будет.

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

Возможно, мои мысли будут полезны когда будете писать что-то еще.
0
mot #
п. 2
Никаких ActiveX и прочих проприетарных технологий! :)

Посмотрите как клавиатура реализованна на сайте Яндекса.

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

п. 3
Здесь часть ответа.
Я упорно отказываюсь видеть невозможность блокировки/разблокировки пользователей.

п. 5
Я написал развёрнутый ответ на этот вопрос.
Плюс, вы забываете, что если это крупная компания, сервер будет стоять на её собственной площадке, рядом с сервером почты, интернета и домена. Отсюда вытекает что все пользователи для системы (сервера) будут иметь разный IP.
А если у этой крупной компании 2 - n крупных офисов, то это уже вопрос не работы системы, а настройки связи между офисами компании.

п. 7-8
Лично у меня это работает на практике.
Не так страшен чёрт, как его малюют :)

п. 10
Да почему после аутентификации?? (кстати не путаем с авторизацией)
Если вы (система) видите что пользователь пытается аутентифицироваться в нетипичное время, меняя IP каждые 3-5 неудачных попыток входа, с тех же IP прошло сканирование на типичные уязвимости - это не повод для принятия некоторых мер?
Мониторинг после аутентификации и авторизации - естесственно. Но он применим и во время.

Спасибо за замечания, постараюсь учесть.
0
stealthy #
Пожалуй последний мой комментарий, а то спорить можно до бесконечности, а на теоретическую часть тратить время скучно. Все таки хотелось бы о конкретных примерах поговорить.

по п.5 - особенно если это крупная компания, ее веб-сервер (как пример) будет стоять на хостинге где-нибудь на М9. Так что идентификация по IP не работает. А если это интранет система, то парольная авторизация там несет на порядок меньшие угрозы, и акцент на защите там совсем другой, поскольку возможности сисадмина совсем другие (+намного шире полномочия).
0
kappa #
Почему не раздать людям сертификаты и не забыть про парольную аутентификацию? Если это интранет, то это легко.

См. https://light.webmoney.ru
0
stealthy #
Вы сами говорите - если это интранет. Кроме того, данный процесс (раздача и использование) весьма непрост с организационной точки зрения. Технически же - все достаточно просто. А вот в промышленных объемах чтобы это организовать - это уже проблема и для большинства CIO и большинства сисадминов.
0
norguhtar #
Электронные ключи решают эту проблему. Кстати у вас тут еще одного механизма авторизации нет. К сожалению он пока работает только под IE. Я говорю про SPANEGO.
0
kappa #
На, это не очень просто, но, по-моему, проще 10 пунктов, о которых говорится в статье. А в качестве условия там написано "веб-приложений, используемых на предприятиях/фирмах с ограниченным числом сотрудников", то есть всё-таки интранет.
0
kappa #
На=Да
0
mot #
К сожалению это не только интранет.
Так как большинство руководящих сотрудников не привязано к офису.
0
kappa #
Сертификат поставить в браузер на ноутбуке.
0
norguhtar #
лучше электронные ключи. Существенно надежней и безопасней.
0
kappa #
Что вы имеете в виду? Где в браузере поддержка электронных ключей?
0
norguhtar #
В браузере имеется поддержка движка шифрования. А уже сами движки поддерживают эти ключи.
0
stealthy #
Самое смешное, что ключ украсть или потерять проще чем обычный пароль.
0
norguhtar #
Что самое смешное этот ключ существует в одном экземпляре и в случае потери позвонить админу, чтобы он отозвал ключ минутное дело. В случае же если сертификат лежит на диске его можно в тихую скопировать и про это никто не узнает. К тому же кроме ключа обазательно должна быть парольная авторизация.
0
stealthy #
позвонить админу - решение для небольшой компании. для большой - процесс замены, выдачи новых ключей и т.п. - это уже нормальная такая организационная задача. плюс набор технических средств недешевых типа лицензионных серверов и все такое.
0
norguhtar #
вам шашечки или ехать ? :)
0
Junior #
Все проще. Делать доступным сервис блокировки своего аккаунта по своему же ключу. Вору делать это нет смысла, а "растеряхе" - действительно минутное дело.
0
oogl #
учим матчасть ;)
0
mot #
Я честно прочитал статью по ссылке. "Матчасти" там не увидел вообще. Каких-либо расхождений с моей статьёй тоже.
Да и вообще, мы здесь не о специфике работы интернет-банка говорим, ведь правда?

А если брать во внимание то, что автор рекомендует банк № 3, то предлагается всем пользователям раздать по конверту с кодами? :)
0
oogl #
Я оставил эту ссылку из-за фразы "При этом пароль не может быть сложным", для того чтобы показать варианты решения.
P.S. а в чём проблема раздать конверты(или мыло, или просто файлец) с кодами, если так и так надо выдать пароль? Или пароль передаётся каким-то другим мистическим способом?
0
dreikanter #
Привязка к IP и блокировка по IP плохо применимы в вебе. IP может быть динамическим (в случае diulup-а, например), кроме того, за одним IP могут жить несколько пользователей. И блокировкой такого IP можно отключить не один хост, а сегмент сети неопределённых размеров. Список вариантов защиты хороший, но для полноты картины не помешало бы уточнение случаев, когда каждый из них применим.
Пункт 4 можно развить: смену ID для сессий залогиненых пользователей можно делать не однократно после логина (если у вас это имелось ввиду), но и с заданным периодом. Теоретически это должно повысить сложность подмены SID.
0
mot #
У меня нет ни слова по блокировку IP. Более того,я считаю её бессмысленной.

Привязка к IP - да.
В случае диал-апа пользователю после дисконнекта приходится заново коннектиться к провайдеру, ведь так?
Так вот пусть заново соединится и с корпоративным веб-приложением.

Конечно можно развить, это статья - пробный камень. Она вообще ни на что не претендует )
0
stealthy #
Я не сталкивался на практике, но про привязку к ИП меня всегда терзали смутные сомнения насчет эффективности... Я понимаю, вероятность перезахода под нужным ИП на диалапе другим пользователем мала... Но она есть.
0
p1uton #
Если сильно заботится о безопасности, можно поставить и VPN.
–1
NaFigator #
Как раз планирую написать статью "VPN как угроза корпоративной безопасности" ;)
0
p1uton #
Может лучше "Защита информации как угроза безопасности информации" :)
–2
NaFigator #
Да нет, я не про это :)
Речь о том, что исходящий PPTP обычно не блокируется компаниями, а это позволяет устанавливать полноценный туннель куда бы то ни было стандартными средствами Windows XP.
–1
NaFigator #
Забыли одну важную вещь, практически панацею в некоторых случаях - это обычные таймауты.
0
mot #
А как же пункт 7?
–2
NaFigator #
Таймаут после успешной авторизации, увеличивающийся таймаут после неуспешных попыток... Просто как дополнение :)
0
mot #
Ага, понял, спасибо :)
+1
DorBer #
На малых предприятиях все решается гораздо проще. Читал статью, где человек купил горсть мышек со сканером отпечатков пальцев.
Чтобы предотвратить кражу паролей можно использовать так называемые "Графические пароли": http://www.vipkonsalt.ru/index.php?ids=3…
Их реализация не настолько сложна, как может показаться.
0
caston #
Вот это действительно качественно. Спасибо за ссылку.
0
mot #
По графическим паролям - я полностью согласен!
Я писал в статье "... парольная защита – не единственный способ проверки подлинности ...".

Если вы имели реальный опыт внедрения (или есть ссылки) - с большим удовольствием бы почитал!
0
norguhtar #
кстати графические пароли можно с системой одноразовых паролей совместить.
0
DorBer #
Опыт внедрения - скоро будет. В данный момент ведется разработка второй версии одного городского портала, на котором будут внедряться новые, а также хорошо забытые старые технологии. Если к тому времени наберу достаточно кармы, обязательно все расскажу.

На данный момент есть наработки по вычислению и отсеиванию роботов при регистрации, например, на форумах. Скорее всего большинство из этого уже кто-то придумал, но во всяком случае один из простейших способов я удачно применяю на своих проектах. Если интересно могу поделиться.
0
oogl #
Кстати, раз пошла такая пьянка с привязкой к IP, к браузеру, невозможность для клиентов работать через прокси... Не проще-ли тогда написать своего клиента для юзверей?
0
Busla #
Очень меня смущает второй пункт.
Какое же это усиление безопасности, если по сути печатать пароль большими буквами на экране?!
Тем более, что множество общедоступных шпионов снимают данные не только с клавиатуры.

Чисто гипотетически: если давать пользователям не короткие логин + пароль, а длинные, но легко запоминающиеся фразы - поговорки, слова из песен, стихов? А вместе с ключевой фразой снимать таймауты в наборе букв. Если менеджер Катя (© stealthy) всегда набирала 2мя пальцами, а тут вдруг "запорхала по клавиатуре всеми десятью" - повод задуматься ..или навставлять дюлей за copy-paste :D
0
stealthy #
В теории все красиво. Да только менеджер Катя (© mot) может после корпоратива попробовать залогиниться в нажратом состоянии чтобы почту проверить, да и попасть от системы безопасности под раздачу из-за неожиданно увеличенных промежутков между попаданиями по клавишам :).

А с длинными фразами это конечно хорошо, только память у человека не резиновая. И набор длинной фразы для многих пользователей, которые медленно печатают да еще и с ошибками - это очень сложно будет. Тем паче что набор пароля как правило скрыт (звездочками).
0
Busla #
И прально - работа в нажратом состоянии бросает тень на репутацию компании! :-))

Память-то ладно. Как говорится - "из песни слова не выкинешь", а вот с набором вслепую явно будут сложности. Согласен :(
0
stealthy #
Про память - это вы зря :). У меня есть люди среди знакомых, которые ни одной цитаты без ошибки воспроизвести не могут. Из любой песни или стиха. Получается что-то типа "буря мглою небо кроет вихри снежные вертя".
0
mot #
Согласен по спорности второго пункта.

Способ снятия данных с вирт. клавиатуры - слежение за отображением информации на экране?
Или запоминание передвижения/кликов мыши?
0
stealthy #
Шпионить я так понимаю нынче можно только типа через видеокамеру через плечо (на это есть защита в виде мониторов с ограниченным углом обзора) или пытаться снять побочные излучения (что в реальной жизни только у шпиёнов получалось).

Поэтому виртуальная клавиатура - это для определенных применений очень хорошая защита. Те же движения мыши бесполезно перехватывать, поскольку у тебя кнопки в которые нужно тыкать меняются местами при каждом входе. Антифрауд системы для банкоматов еще дополнительно (знаю такое решение английской фирмы одной) красят кнопки для каждого юзера персонализированно, чтобы он привык к личной своей картинке на экране. И типа когда ему хацкер подсунет левый экран, типа "введи ка пароль" - он сразу понял что цвета то не его.
0
bubuq #
HMAC?! (потрясённо). И как у вас это работатает? Какой броузер это поддерживает?
И как выглядит менеджмент ключей в этой технологии, поделитесь?
Клиенты все, как зайки, субмитят свои ключи на сервер, перед тем, как авторизоваться?
Причём делают это на дискетках, в оффлайне?
И потом эти дискетки вставляют каждый раз, когда нужно установить сессию? И хранят под подушкой?
Только не скажите сейчас, что у вас клиентский ключ для HMAC один на всех. Не разрушайте мою веру в людей.

И кстати, в чём трудности использования SSL, технологии, которая поддерживатеся всеми клиентами и серверами?
0
mot #
Да-да, были мысли внедрить это именно так как вы описывали, в теории было красиво :)

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

Если имеет место двусторонний перехват данных - то никакого толку (в случае достаточной квалификации взломщика) от данной системы нет. Если односторонний, от клиента к серверу (а часто его осуществить проще) - толк есть.

На клиенте это реализованно с помощью библиотеки Paul Johnston'a.

Трудности использования SSL в моём случае (а статья именно о моём опыте) - чисто организационные.
0
gulevich #
уже сам наверное пожалел, что написал, да?

нормальная статья!

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