Аутентификация важна всякий раз, когда у вас есть вызов, например listen(socket_id). То, что находится по другую сторону этого сокета, должно быть идентифицировано. Когда R2-D2 подключается к сокету, «Звезда смерти» позволяет выполнять всевозможные запросы, возвращая чрезвычайно важную информацию о местонахождении заключенных. Учитывая конфиденциальность полученных данных, мы можем только надеяться, что учетная запись не была guest или rebelscum (гнусный повстанец), но что это было и как R2-D2 доказал возможность использовать эту учетную запись?
Каждая аутентификация может иметь некоторую многоуровневую комбинацию технических и человеческих идентификаторов. Например, у удаленного хоста, вероятно, есть IP-адрес. Он может предоставлять какую-либо форму идентификатора клиента, например файл cookie или токен OAuth. Кроме того, он может иметь идентификаторы человека или сервиса.
Когда клиент инициирует подключение к серверу, любая из сторон может потребовать аутентификацию. Сложности возникают, когда на акт подключения может влиять другой компьютер или когда эта аутентификация осуществляется от имени человека. Простейшим случаем может быть использование Telnet для подключения к IP‐адресу: это происходит в ответ на ввод человеком команды, на которую трудно повлиять. Но чуть более сложные примеры, такие как отправка электронной почты, подвержены влиянию. Если я попытаюсь отправить электронное письмо адресату luke@threatsbook.com, мой почтовый клиент подключится к моему почтовому серверу, который будет использовать DNS для поиска записи MX для threatsbook.com и подключения к этому сайту. DNS-сервер для threatsbook.com может влиять на то, куда будет подключаться мой почтовый сервер.
Спуфинг может произойти, когда ваш код прямо или косвенно вызывает метод listen(). В случае косвенного вызова, возможно, веб-сервер вызывает listen(), разбирает сообщения TLS и HTTP и передает что-то более «уточненное». Код по-прежнему должен идентифицировать вызывающую сторону. Веб-сервер может выполнять часть этой работы, и даже в этом случае вам вполне может потребоваться сопоставить таблицу учетных записей сервера с таблицей, используемой в ваших базах данных. Например, я могу войти в систему как adam@threatsbook.com и иметь customer_id 1234.
Компьютеры часто идентифицируют друг друга, используя сочетание криптографических сертификатов и идентификаторов, удобочитаемых для человека. Например, если darthvader@threatsbook.com отправляет почту anakin@threatmodelingbook.com, то почтовый сервер threatsbook должен найти домен threatmodelingbook и принять решение о доверии сертификату TLS, который предоставляет сайт. Почтовый сервер threatmodelingbook должен принимать решения о почте, поступающей от threatsbook, и решать, заслуживает ли этот сервер доверия. На многих этапах этого процесса есть криптографический ключ, подписанный так называемым сертификатом, и инструмент, который предоставляет политику, согласно которой этому сертификату следует доверять. Как правило, они относятся либо к корневому центру сертификации, подписавшему сертификат, либо к его персистентности. Персистентность означает, что ключ был ранее авторизован для использования в сочетании с именем хоста. SSH демонстрирует хорошую схему подсказок при представлении нового ключа, подчеркивая, изменился ли он по сравнению с тем, что было представлено ранее.
Спуфинг-атаки
В этой главе спуфинг рассматривался как нарушение подлинности. Я хочу, чтобы вы подумали о нем шире: думайте о спуфинг-атаках как о разрыве или запутывании связи между идентификатором и объектом.