Журнал LinuxFormat - перейти на главную

LXF144:DrBrown2

Материал из Linuxformat
Перейти к: навигация, поиск

Тайная жизнь паролей

Итак, вы в курсе, что единственное, чего нет в файле passwd – это пароль; а знаете ли вы, как все это работает на самом деле?

Начнем с основ. Все учетные записи в Linux – или, по крайней мере те, что соответствуют реальным пользователям – защищены паролями. Когда пользователь задает пароль, криптографическая свертка пароля (хэш) записывается в строку учетной записи пользователя в файле /etc/shadow. Входя в систему, пользователь вводит пароль, который снова хэшируется, и свертка сравнивается со сверткой в файле shadow. В открытом виде пароли не хранятся нигде.

Это немного упрощенное объяснение. На практике при задании пароля генерируется случайный текст (salt, «приправа») и дописывается к незашифрованному паролю. Затем результат объединения пароля и «приправы» шифруется. «Приправа» и пароль сохраняются в поле пароля в /etc/shadow. Когда пользователь входит в систему, «приправа» берется из файла shadow, объединяется с паролем, и вычисляется свертка от результата объединения. Применение «приправы» дает ряд преимуществ. Во-первых, если два пользователя выберут одинаковый пароль, об этом нельзя будет догадаться, заглянув в /etc/shadow. «Приправа» также значительно усложняет взлом пароля методом перебора, о чем я расскажу позже. За задание и проверку паролей в основном отвечает модуль PAM pam_unix. Ему часто помогают модули вроде pam_pwcheck, pam_cracklib и pam_passwdqc, выполняющие проверку паролей на надежность.

В Linux использовались различные алгоритмы хэширования. Самый ранний был основан на алгоритме DES и использовал только пароли из восьми символов – по семь бит от каждого символа образовывали 56-битный ключ DES. В дальнейших версиях была добавлена поддержка хэширования на основе MD5 и поддержка сверток SHA-256 и SHA-512. Они поддерживают более длинные пароли и используют более длинные свертки. Например, в системе SLED-11 (SUSE) моя запись в /etc/shadow выглядит так:

$1$vte.LblF$de2zWUjnCqqFbeqhcwCbi0

LXF144 51 1.jpg

Для неподготовленного взгляда это выглядит мусором, но символы $ создают в записях файла /etc/shadow некую структуру.

На рисунке ниже показана структура этой записи. Видны «приправа» из 8 символов и свертка из 22 символов. Они закодированы по основанию 64, и каждому символу соответствуют шесть бит. Это свертка MD5. В Ubuntu 10.04 она выглядит так:

$6$QIwH744n$2cFYj/WxLoNwzZ1YKs1YOCGNKS.gvM-mxcuFLydzAWw5jm8Or3BmLAKp6jLPdhyV0h5v5fA3/gsDEq3tFRTsCr0

Здесь мы видим «приправу» из восьми символов и свертку из 86 символов. Это хэш SHA-512. Все хэширование выполняется процедурой crypt library.

Взлом паролей

Если вы заполучите копию файла shadow, легко ли будет восстановить пароль? Криптографы могут вычислить усилия, необходимые для атаки методом перебора, когда последовательно перебираются все возможные пароли, затем они хэшируются и результат проверяется на совпадение. «Приправа» усложняет эту задачу, потому что каждый перебираемый пароль нужно объединять с «приправой» и хэшировать, а не просто сравнивать каждый хэш с каждой записью в файле shadow. «Приправа» также делает невозможным использование «радужных таблиц» – заранее вычисленных таблиц хэшей. «Радужные таблицы» содержат большой объем данных, и для каждого возможного значения «приправы» понадобится отдельная таблица – таблиц слишком много, чтобы это было осуществимо на практике. Все это очень подробно обсуждается в статье http://cromwell-intl.com/security/password.html.

На практике область паролей, выбираемых обычными людьми, гораздо, существенно меньше. Программы вроде John The Ripper умеют выполнять эффективные атаки методом перебора, используя словарные слова и строки, от них образованные. За одну ночь работы в файле shadow обыкновенной многопользовательской системы John может добыть один или несколько паролей – конечно, в зависимости от того, насколько хорошо осведомлены пользователи о важности выбора надежных паролей. И, конечно, чтобы осуществить такую атаку, первым делом нужно получить доступ к файлу shadow, а его может читать только root. Гораздо более многообещающий подход для многих хакеров – социальная инженерия: необходимо заставить пользователя поверить вам настолько, чтобы он сам сказал вам пароль. Осведомленность пользователя здесь также играет большую роль.

Вычисляем свертку

Начнем с фрагмента текста. Сложим ASCII-коды всех символов текста и возьмем четыре последних цифры результата. Очевидно, получится число от 0 до 9999. Это пример свертки. Это что-то вроде «отпечатка пальца» оригинала, но это преобразование с потерями, и по нему вернуться к исходному тексту нельзя. Для этого алгоритма по заданной свертке легко подобрать исходный текст (не обязательно исходный). А вот для криптостойких сверток, типа MD5 и SHA1, это гораздо сложнее.

Персональные инструменты
купить
подписаться
Яндекс.Метрика