Ответ 1
ЧАСТЬ I: Как войти
Мы предполагаем, что вы уже знаете, как создать HTML-форму с логином и паролем, которая помещает значения в скрипт на стороне сервера для аутентификации. В следующих разделах будут рассмотрены шаблоны для практической аутентификации и как избежать наиболее распространенных ошибок безопасности.
HTTPS или нет HTTPS?
Если соединение уже не является безопасным (то есть туннелируется через HTTPS с использованием SSL/TLS), значения вашей формы входа будут отправлены в виде открытого текста, что позволяет любому, кто прослушивает линию между браузером и веб-сервером, сможет читать входы в систему при их прохождении. через. Этот тип прослушивания телефонных разговоров обычно выполняется правительствами, но в целом мы не будем рассматривать "принадлежащие" провода, кроме как сказать следующее: если вы защищаете что-то важное, используйте HTTPS.
По сути, единственный практический способ защиты от прослушивания телефонных разговоров/перехвата пакетов во время входа в систему заключается в использовании HTTPS или другой схемы шифрования сертификата -based (например, TLS) или проверенной и проверенной схемы запроса -ответа (например, Diffie- Хеллман -based SRP). Любой другой метод может быть легко обойден подслушивающим злоумышленником.
Конечно, если вы хотите стать немного непрактичным, вы также можете использовать некоторую форму схемы двухфакторной аутентификации (например, приложение Google Authenticator, физическая таблица кодов "холодной войны" или ключ генератора ключей RSA). При правильном применении это может работать даже с незащищенным соединением, но трудно представить, что разработчик захочет реализовать двухфакторную аутентификацию, но не SSL.
(Не) Сверните свое собственное шифрование/хеширование JavaScript
Принимая во внимание ненулевую стоимость и кажущуюся техническую сложность настройки SSL-сертификата на вашем веб-сайте, некоторые разработчики испытывают искушение использовать свои собственные схемы хеширования или шифрования в браузере, чтобы избежать передачи логинов в незашифрованном виде по незащищенному каналу.
Хотя это благородная мысль, она по сути бесполезна (и может быть недостатком безопасности), если она не сочетается с одним из вышеперечисленных - то есть либо для защиты линии с помощью надежного шифрования, либо с использованием проверенного ответа на запрос механизм (если вы не знаете, что это такое, просто знайте, что это один из самых трудных для доказательства, самый сложный для разработки и самый сложный для реализации концепций в области цифровой безопасности).
Несмотря на то, что хеширование пароля может быть эффективным против раскрытия пароля, оно уязвимо для атак повторного воспроизведения, атак/перехватов "человек посередине" (если злоумышленник может внедрить несколько байтов в вашу незащищенную HTML-страницу до того, как она достигнет вашей браузер, они могут просто закомментировать хеширование в JavaScript) или атаки методом грубой силы (поскольку вы передаете злоумышленнику как имя пользователя, соль, так и хешированный пароль).
Капчи против человечности
CAPTCHA предназначен для предотвращения одной конкретной категории атак: автоматический словарь/грубая сила методом проб и ошибок без участия оператора. Нет сомнений в том, что это реальная угроза, однако есть способы беспрепятственного решения этой проблемы, для которых не требуется CAPTCHA, специально разработанные правильно серверные схемы регулирования входа в систему - мы обсудим это позже.
Знайте, что реализации CAPTCHA не созданы одинаково; они часто не поддаются решению человеком, большинство из них на самом деле неэффективны против ботов, все они неэффективны против дешевой рабочей силы в третьем мире (согласно OWASP, текущая ставка в потогонной мастерской составляет $ 12 за 500 тестов), и некоторые реализации могут быть технически незаконно в некоторых странах (см. бланк проверки подлинности OWASP). Если вам необходимо использовать CAPTCHA, используйте Google reCAPTCHA, так как он по определению является OCR-сложным (поскольку использует уже неправильно классифицированное OCR сканирование книг) и очень старается быть удобным для пользователя.
Лично я нахожу CAPTCHAS раздражающим и использую их только в качестве крайней меры, когда пользователь не смог войти в систему несколько раз, и задержки регулирования максимальны. Это случается достаточно редко, чтобы быть приемлемым, и это укрепляет систему в целом.
Хранение паролей/проверка логинов
Это может, наконец, стать общеизвестным после всех широко известных хаков и утечек пользовательских данных, которые мы наблюдали в последние годы, но нужно сказать: не храните пароли в открытом виде в вашей базе данных. Пользовательские базы данных регулярно взламываются, просачиваются или отбираются с помощью SQL-инъекций, и, если вы храните сырые, незашифрованные пароли, это мгновенная игра для вашей безопасности входа в систему.
Итак, если вы не можете сохранить пароль, как вы проверяете, что комбинация логин + пароль, указанная в форме авторизации, верна? Ответ хэшируется с использованием ключевой деривационной функции. Каждый раз, когда создается новый пользователь или изменяется пароль, вы берете пароль и запускаете его через KDF, например, Argon2, bcrypt, scrypt или PBKDF2, превращая пароль в виде открытого текста ("correcthorsebatterystaple") в длинную строку случайного вида, который намного безопаснее хранить в вашей базе данных. Чтобы проверить логин, вы запускаете ту же хеш-функцию для введенного пароля, на этот раз передавая соль и сравнивая полученную хеш-строку со значением, хранящимся в вашей базе данных. Argon2, bcrypt и scrypt хранят соль уже с помощью хеша. Проверьте эту статью на sec.stackexchange для более подробной информации.
Причина, по которой соль используется, заключается в том, что само по себе хэширования недостаточно - вы захотите добавить так называемую "соль", чтобы защитить хеш от радужных таблиц. Соль эффективно предотвращает сохранение двух паролей, которые в точности совпадают, как одно и то же значение хеш-функции, предотвращая сканирование всей базы данных за один прогон, если злоумышленник выполняет атаку с целью подбора пароля.
Криптографический хэш не должен использоваться для хранения паролей, поскольку выбранные пользователем пароли недостаточно надежны (то есть обычно не содержат достаточно энтропии), и атака по подбору пароля может быть завершена за относительно короткое время злоумышленником, имеющим доступ к хэшам. Вот почему используются KDF - они эффективно "растягивают ключ", что означает, что каждое предположение о пароле, которое делает злоумышленник, вызывает многократное повторение алгоритма хеширования, например, 10 000 раз, что заставляет злоумышленника угадать пароль в 10000 раз медленнее.
Данные сеанса - "Вы вошли как Spiderman69"
Как только сервер проверит логин и пароль в вашей пользовательской базе данных и найдет совпадение, системе необходим способ запомнить, что браузер был аутентифицирован. Этот факт должен храниться только на стороне сервера в данных сеанса.
Если вы не знакомы с данными сеанса, вот как это работает: одна случайно сгенерированная строка сохраняется в истекающем файле cookie и используется для ссылки на коллекцию данных - данные сеанса - которые хранятся на сервере. Если вы используете инфраструктуру MVC, это, несомненно, уже решено.
Если это вообще возможно, убедитесь, что куки файл сеанса имеет флаги secure и HTTP Only, установленные при отправке в браузер. Флаг HttpOnly обеспечивает некоторую защиту от cookie, читаемого через XSS-атаку. Флаг безопасности гарантирует, что куки отправляются обратно только через HTTPS, и, следовательно, защищает от сетевых атак. Значение куки не должно быть предсказуемым. Если файл cookie ссылается на несуществующий сеанс, его значение следует немедленно заменить, чтобы предотвратить фиксацию сеанса.
ЧАСТЬ II: Как остаться в системе - флажок "Запомнить меня"
Постоянные файлы cookie для входа (функция "запомнить меня") представляют собой опасную зону; с одной стороны, они полностью безопасны, как обычные логины, когда пользователи понимают, как с ними обращаться; и, с другой стороны, они представляют собой огромный риск безопасности для небрежных пользователей, которые могут использовать их на общедоступных компьютерах и забыть выйти из системы, а также могут не знать, что такое файлы cookie браузера и как их удалить.
Лично мне нравятся постоянные входы в систему на сайтах, которые я посещаю регулярно, но я знаю, как безопасно с ними обращаться. Если вы уверены, что ваши пользователи знают то же самое, вы можете использовать постоянные входы в систему с чистой совестью. Если нет - хорошо, тогда вы можете согласиться с философией, согласно которой пользователи, которые небрежно относятся к своим учетным данным, навязывают это себе, если их взломают. Это не значит, что мы идем в наши пользовательские дома и отрываем все эти пост-лицевые заметки Post-It с паролями, которые они выстроили на краю своих мониторов.
Конечно, некоторые системы не могут позволить себе взломать какие-либо учетные записи; для таких систем нет способа оправдать наличие постоянных входов в систему.
Если вы решите внедрить постоянные файлы cookie для входа, вот как вы это делаете:
-
Во-первых, найдите время, чтобы прочитать статью Paragon Initiative на эту тему. Вам нужно правильно составить кучу элементов, и статья отлично объясняет каждый из них.
-
И просто, чтобы повторить одну из самых распространенных ошибок, НЕ ХРАНИТЕ УСТОЙЧИВОГО ВХОДА COOKIE (TOKEN) В ВАШУ БАЗУ ДАННЫХ, ТОЛЬКО ХЭШ ЭТОГО! Токен входа в систему эквивалентен паролю, поэтому, если злоумышленник попадет в вашу базу данных, он может использовать токены для входа в любую учетную запись, как если бы они были комбинациями логин-пароль в виде открытого текста. Поэтому используйте хеширование (согласно https://security.stackexchange.com/a/63438/5002 слабый хеш отлично подойдет для этой цели) при хранении постоянных токенов входа.
ЧАСТЬ III. Использование секретных вопросов
Не вводите "секретные вопросы". Функция "секретных вопросов" является антишаблоном безопасности. Прочитайте статью по ссылке № 4 из списка, который ДОЛЖЕН ПРОЧИТАТЬ. Вы можете спросить Сару Пэйлин об этом после ее Yahoo! учетная запись электронной почты была взломана во время предыдущей президентской кампании, потому что ответ на ее секретный вопрос был... "Средняя школа Василлы"!
Даже при заданных пользователем вопросах весьма вероятно, что большинство пользователей выберет либо:
-
"Стандартный" секретный вопрос, например, девичья фамилия матери или любимое животное
-
Простая мелочь, которую каждый может извлечь из своего блога, профиля LinkedIn или подобного
-
Любой вопрос, на который проще ответить, чем угадать свой пароль. Который, для любого приличного пароля, это каждый вопрос, который вы можете себе представить
В заключение, вопросы безопасности по своей сути небезопасны практически во всех их формах и вариациях и не должны использоваться по какой-либо причине в схеме аутентификации.
Истинная причина, по которой вопросы безопасности даже существуют в дикой природе, заключается в том, что они удобно снижают стоимость нескольких звонков в службу поддержки пользователей, которые не могут получить доступ к своей электронной почте, чтобы получить код повторной активации. Это за счет безопасности и репутации Сары Пэйлин. Стоило того? Возможно нет.
ЧАСТЬ IV: Функциональность забытого пароля
Я уже упоминал, почему вы никогда не должны использовать вопросы безопасности для обработки забытых/утерянных паролей пользователей; Само собой разумеется, что вы никогда не должны отправлять пользователям по электронной почте их действительные пароли. В этой области следует избегать, по крайней мере, еще двух распространенных ошибок:
-
Не сбрасывайте забытый пароль на надежный автоматически сгенерированный пароль - такие пароли, как известно, трудно запомнить, а это означает, что пользователь должен либо изменить его, либо записать - скажем, на ярко-желтом пост-крае на краю монитора. Вместо того, чтобы устанавливать новый пароль, просто позвольте пользователям сразу выбрать новый - что они и хотят делать в любом случае. (Исключением из этого может быть случай, если пользователи повсеместно используют менеджер паролей для хранения/управления паролями, которые обычно невозможно запомнить без записи).
-
Всегда хэшируйте потерянный код/токен пароля в базе данных. СНОВА, этот код является еще одним примером эквивалента пароля, поэтому он ДОЛЖЕН быть хеширован, если злоумышленник попадет в вашу базу данных. Когда запрашивается утерянный пароль, отправьте открытый текстовый код на адрес электронной почты пользователя, затем хешируйте его, сохраните хеш в своей базе данных и выбросьте оригинал. Так же, как пароль или постоянный токен входа.
Последнее замечание: всегда проверяйте, что ваш интерфейс для ввода "потерянного пароля" по крайней мере так же безопасен, как и ваша форма входа в систему, иначе злоумышленник просто использует это для получения доступа. Удостоверьтесь, что вы генерируете очень длинные "потерянные коды паролей" (например, 16 буквенно-цифровых символов с учетом регистра). Это хорошее начало, но рассмотрите возможность добавления той же схемы регулирования, которую вы используете для самой формы входа.
ЧАСТЬ V: Проверка надежности пароля
Во-первых, вы захотите прочитать эту небольшую статью для проверки реальности: 500 самых распространенных паролей
Итак, возможно, этот список не является каноническим списком наиболее распространенных паролей в любой системе где-либо когда-либо, но он является хорошим показателем того, насколько плохо люди будут выбирать свои пароли, когда нет обязательной политики. Кроме того, список выглядит пугающе близко к дому, когда вы сравниваете его с общедоступным анализом недавно украденных паролей.
Итак: без минимальных требований к надежности пароля, 2% пользователей используют один из 20 самых распространенных паролей. Значение: если злоумышленник получит всего 20 попыток, 1 из 50 аккаунтов на вашем сайте будет взломан.
Чтобы помешать этому, необходимо вычислить энтропию пароля и затем применить пороговое значение. Специальная публикация 800-63 Национального института стандартов и технологий (NIST) содержит ряд очень хороших предложений. Это, в сочетании с анализом раскладки словаря и клавиатуры (например, "qwertyuiop" - неверный пароль), может отклонить 99% всех плохо выбранных паролей на уровне 18-битной энтропии. Просто рассчитать надежность пароля и показать пользователю визуальный измеритель надежности - это хорошо, но недостаточно. Если он не применяется, многие пользователи, скорее всего, будут его игнорировать.
И для того, чтобы освежить удобство использования паролей с высокой энтропией, настоятельно рекомендуется Randall Munroe Password Strength xkcd.
Используйте Troy Hunt Iwen Pwned API для проверки паролей пользователей по паролям, скомпрометированным в результате взлома публичных данных.
ЧАСТЬ VI: многое другое - или: предотвращение попыток быстрого входа в систему
Во-первых, взгляните на цифры: скорость восстановления пароля - как долго будет действовать ваш пароль
Если у вас нет времени просматривать таблицы по этой ссылке, вот их список:
-
Взломать слабый пароль практически не нужно времени, даже если вы взломали его со счетом
-
Взлом буквенно-цифрового 9-символьного пароля практически не занимает времени, если он не учитывает регистр
-
Практически не требуется времени, чтобы взломать сложный пароль из букв и цифр, прописные и строчные буквы, если его длина меньше 8 символов (настольный ПК может выполнить поиск во всем пространстве ключей до 7 символов за раз дней или даже часов)
-
Однако взломать даже 6-символьный пароль потребовалось бы слишком много времени, если вы ограничены одной попыткой в секунду!
Итак, что мы можем узнать из этих чисел? Ну, много, но мы можем сосредоточиться на самой важной части: тот факт, что предотвращение большого количества быстрых последовательных попыток входа в систему (т.е. Атака методом перебора) на самом деле не так сложен. Но предотвратить это не так просто, как кажется.
Вообще говоря, у вас есть три варианта, которые эффективны против атак методом перебора (и атак по словарю, но, поскольку вы уже применяете политику надежных паролей, они не должны быть проблемой):
-
Представить CAPTCHA после N неудачных попыток (раздражает чертовски часто и неэффективно - но я повторяюсь здесь)
-
Блокировка учетных записей и требование проверки электронной почты после N неудачных попыток (это DoS- атака, которая должна произойти)
-
И, наконец, регулирование входа в систему: то есть установка задержки между попытками после N неудачных попыток (да, атаки DoS все еще возможны, но, по крайней мере, они гораздо менее вероятны и намного сложнее осуществить).
Рекомендация № 1: небольшая задержка, которая увеличивается с увеличением количества неудачных попыток, например:
- 1 неудачная попытка = нет задержки
- 2 неудачные попытки = задержка 2 с
- 3 неудачные попытки = задержка 4 сек
- 4 неудачных попытки = задержка 8 секунд
- 5 неудачных попыток = 16 секундная задержка
- и т.п.
DoS-атака по этой схеме была бы очень непрактичной, поскольку результирующее время блокировки немного больше, чем сумма предыдущих времен блокировки.
Для уточнения: Задержка не является задержкой перед возвратом ответа в браузер. Это больше похоже на тайм-аут или рефрактерный период, в течение которого попытки входа в конкретную учетную запись или с определенного IP-адреса не будут приниматься или оцениваться вообще. То есть правильные учетные данные не будут возвращаться при успешном входе в систему, а неправильные учетные данные не будут вызывать увеличение задержки.
Рекомендация № 2: задержка средней длины, которая вступает в силу после N неудачных попыток, например:
- 1-4 неудачных попытки = без задержки
- 5 неудачных попыток = 15-30 минутная задержка
DoS, атакующий эту схему, был бы весьма непрактичным, но, безусловно, выполнимым. Кроме того, может быть уместно отметить, что такая длительная задержка может быть очень раздражающей для законного пользователя. Забывчивым пользователям вы не понравитесь.
Лучшая практика # 3: объединение двух подходов - либо фиксированная, кратковременная задержка, которая вступает в силу после N неудачных попыток, например:
- 1-4 неудачных попытки = без задержки
- 5+ неудачные попытки = задержка 20 секунд
Или увеличение задержки с фиксированной верхней границей, например:
- 1 неудачная попытка = 5 секундная задержка
- 2 неудачные попытки = 15 секундная задержка
- 3+ неудачные попытки = 45 секундная задержка
Эта окончательная схема была взята из предложений передовой практики OWASP (ссылка 1 из списка MUST-READ) и должна рассматриваться как лучшая практика, даже если она по общему признанию ограничивающая.
Однако, как правило, я бы сказал: чем сильнее ваша политика паролей, тем меньше у вас проблем с задержками. Если вам требуются надежные (чувствительные к регистру буквенно-цифровые символы + требуемые цифры и символы) символьные пароли 9+, вы можете дать пользователям 2-4 попытки без задержки ввода пароля перед активацией регулирования.
DoS, атакующий эту последнюю схему регулирования входа в систему, был бы очень непрактичным. И, наконец, всегда разрешайте проходить постоянные (cookie) входы (и/или проверенную CAPTCHA форму входа), чтобы законные пользователи даже не задерживались во время атаки. Таким образом, очень непрактичная DoS-атака становится чрезвычайно непрактичной.
Кроме того, имеет смысл более активно регулировать учетные записи администраторов, поскольку они являются наиболее привлекательными точками входа.
ЧАСТЬ VII: Распределенные атаки грубой силы
Кроме того, более продвинутые злоумышленники будут пытаться обойти регулирование входа в систему, "распространяя свою деятельность":
-
Распространение попыток ботнета предотвратить пометку IP-адреса
-
Вместо того, чтобы выбрать одного пользователя и попробовать 50 000 наиболее распространенных паролей (которые они не могут из-за нашего регулирования), они выберут самый распространенный пароль и попробуют его против 50 000 пользователей. Таким образом, они не только обходят меры максимального количества попыток, такие как CAPTCHA и регулирование входа в систему, но и увеличивают их шансы на успех, поскольку наиболее распространенный пароль номер 1 гораздо более вероятен, чем номер 49,995.
-
Интервал запросов входа в систему для каждой учетной записи пользователя, скажем, с интервалом 30 секунд, чтобы проникнуть под радар
В этом случае лучше всего регистрировать количество неудачных входов в систему в масштабе всей системы и использовать скользящее среднее значение частоты неудачных входов в систему вашего сайта в качестве основы для верхнего предела, который вы затем устанавливаете для всех пользователей.
Слишком абстрактно? Позвольте мне перефразировать:
Скажем, за последние 3 месяца на вашем сайте в среднем было 120 неудачных входов в день. Используя это (скользящее среднее), ваша система может установить глобальный лимит в 3 раза больше, т.е. 360 неудачных попыток за 24 часа. Затем, если общее количество неудачных попыток во всех учетных записях превышает это число в течение одного дня (или даже лучше, отслеживает скорость ускорения и запускает расчетный порог), оно активирует регулирование входа в систему в масштабе всей системы, что означает короткие задержки для ВСЕХ пользователей. (тем не менее, за исключением логинов cookie и/или резервных логинов CAPTCHA).
Я также опубликовал вопрос с более подробной информацией и действительно хорошим обсуждением того, как избежать хитрых питалов при отражении атак с использованием грубой силы.
ЧАСТЬ VIII. Поставщики двухфакторной аутентификации и аутентификации
Учетные данные могут быть скомпрометированы, будь то эксплойты, записанные и утерянные пароли, кражи ноутбуков с ключами или вход пользователей на фишинговые сайты. Логины могут быть дополнительно защищены двухфакторной аутентификацией, которая использует внеполосные факторы, такие как одноразовые коды, полученные из телефонного звонка, SMS-сообщения, приложения или электронного ключа. Несколько провайдеров предлагают услуги двухфакторной аутентификации.
Аутентификация может быть полностью делегирована службе единого входа, где другой поставщик обрабатывает сбор учетных данных. Это выдвигает проблему доверенной третьей стороне. Google и Twitter предоставляют стандартные службы единого входа -based, в то время как Facebook предоставляет аналогичное запатентованное решение.
ДОЛЖНЫ ПРОЧИТАТЬ ССЫЛКИ О веб-аутентификации
- Руководство OWASP по проверке подлинности/OWASP
- Что нужно и что нужно для аутентификации клиентов в Интернете (очень читабельная статья MIT)
- Википедия: HTTP cookie
- Вопросы личного знания для аутентификации при отказе: секретные вопросы в эпоху Facebook (очень читабельная исследовательская статья Беркли)