Методы хранения паролей. Управление паролями в UNIX

24.11.2018

Многие из Вас прекрасно понимают, что хранить пароли в открытом виде в базе данных - крайне глупо . Если злоумышленник каким-то образом получит доступ к таблице с пользователями, то у него будет полная база паролей. А учитывая, что большинство пользователей имеют 1 пароль для всех сайтов, последствия могут быть печальными, а всё по Вашей вине. Есть, конечно, MD5-хэширование , но оно не даёт 100% гарантии , что пароли не будут расшифрованы. Почему это так и как правильно шифровать пароли пользователей на сайте , Вы узнаете из этой статьи.

MD5 - это общедоступный алгоритм шифрования. И многие сайты хэшируют пароли только с помощью этого алгоритма. Безусловно, алгоритм MD5 необратим. Однако, далеко не все знают, что в Интернете существует масса баз, в которых уже посчитаны, порой, десятки миллионов паролей и их MD5-хэшей . Фактически, злоумышленник просто вставляет хэш в форму и почти мгновенно получает изначальный пароль.

Но Вы должны понимать, что десятки миллионов паролей - это капля в море , подобно размерам небольшого города и Вселенной. Но проблема в том, что в этом "городе" хранятся самые популярные пароли. Таким образом, несмотря на MD5-хэширование паролей у пользователей, всё-таки многие пароли всплывут. Однако, из этого есть выход.

Простеший способ, который защитит Вас от кражи паролей на 99.99% - это хэширование не просто пароля, но и некого секретного слова :

$secret = "Xdgd99DFd9Z"; // Секретное слово
$password = "123"; // Пароль
echo md5($password.$secret); // Результат хэширования
?>

Теперь, несмотря на тривиальность пароля, по хэшу его будет невозможно угадать. Ваша же задача, как Администратора, подобрать такое секретное слово, чтобы его гарантированно не было в этих базах. Для этого достаточно произвольным образом нажимать клавиши на клавиатуре. И данное слово надо сохранить в конфигурационном файле сайта, чтобы всегда к нему был доступ. Также можно не бояться, что злоумышленник узнает это слово, оно ему всё равно не поможет. Само слово запоминать Вам не нужно.

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

При необратимом шифровании информация зашифровывается таким образом, что не подлежит обратной расшифровке. На первый взгляд это может показаться странным, но в действительности такой метод шифрования используется очень часто. Функция, с помощью которых реализуется однонаправленное шифрование, называются функциями хэширования. При использовании таких функций создается уникальный "отпечаток" строки. Наиболее часто в качестве алгоритма хэширования используется алгоритм MD5, реализовать который можно с помощью одноименной функции:

String md5($str [, $raw_output])

В качестве обязательного аргумента функция принимает строку $str , которую необходимо зашифровать и возвращает ее уникальный 128-битовый отпечаток (хэш-код). Если необязательный аргумент $raw_output имеет значение true , то возвращается бинарная строка из 16 символов. Вероятность того, что две строки дадут одинаковый хэш-код, стремиться к нулю.

Примечание . Аналогичная функция md5_file() часто используется для создания уникального хэш-кода объемных файлов, которые передаются по сети. Загрузив файл, всегда можно проверит его целостность, вычислив код по алгоритму md5 и сравнив полученный результат с хэш-кодом, представленным распространителем. Это позволяет отследить повреждения файла, вызванные передачей через сеть, а также предотвращает фальсификацию файла. Такой способ часто применяют при распространении объемных дистрибутивов.

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

.

Примечание . Такая схема авторизации не позволяет получить непосредственный доступ к паролям, даже если происходит хищение базы данных. В этом случае злоумышленник вынужден тратить значительное машинное время на перебор паролей по словарю, поэтому пароли вида W3t6,8yt6P практически не поддаются расшифровке, в тоже время необратимое шифрование не сможет защитить от перебора при пароле вида 12345.

При помощи функции md5() можно зашифровать различные данные, к примеру пароли пользователя.

Использование функции md5() :


$maks_password ="dghbcdj27hg" ; //Сохраненный пароль пользователя
$maks_cipher =md5 ($maks_password ) ; //Сохраненный хэш- код пароля
//Пароль пользователя вводимй при посещении странички
$user_password ="dghbcdj27hg" ;
//Хэш- код пароля пользователя, вычисляемый при посещении странички
$user_cipher =md5 ($maks_password ) ;
//Если хэш- коды совпадают то пароль верный
if ($maks_cipher ==$user_cipher )
{
echo "Hello, Maks" ;
}
else
{
echo "Введен не верный пароль" ;
}
?>

Для этих же целей используется функция crypt() , которая имеет следующий синтаксис:

String crypt($str [, $salt])

Аргумент $strпредставляет собой предназначенную для шифрования строку. К примеру, если передавать этой функции строку с паролем " dghbcdj27hg " и аргумент $salt , равный " ttt ", то будет возвращена строка " ttqHdgPBP2/UI ", которая не может быть дешифрована. Однако, поскольку результат работы функции строго определен в том смысле, что при вызове с одинаковыми параметрами $str и $salt функция возвращает один и тот же результат, ее можно использовать для проверки паролей.

Примечание . В UNIX-подобных ситемах и Windows хэш-код, возвращаемый функцией crypt() , не совпадает. В UNIX-подобной операционной системе результат функции crypt() можно использовать для автоматического выполнения файла.htpasswd, используемого совместно с конфигурационным файлом.htaccess для защиты директории паролем.

Использование функции crypt():


$maks_password ="dghbcdj27hg" ;
$maks_crypt =crypt ($maks_password , "ttt" ) ;
echo $maks_crypt ;
$user_password ="dghbcdj27hg" ;
$user_crypt =crypt ($maks_password , "ttt" ) ;
if ($maks_crypt ==$user_crypt )
{
echo "
Пароли совпадают "
;
}
else
{
echo "Введен неверный пароль" ;
}
?>

ТАК .

Для однонаправленного шифрования можно также использовать функцию crc() , вычисляющую 32-битовую контрольную сумму исходной строки:

Int crc($str)

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

Симметричное шифрование

При симметричном шифровнии строки шифруются с помощью ключа, который известен как отправителю так и получателю. В РНР алгоритмы симметричного шифрования реализованы в библиотеке mcrypt; ознакомиться с полным набором функций и алгоритмов этой библиотеки можно на сайте http://www.php.net. Функции mcrypt работают, только если подключена библиотека mcrypt.

Примечание . Как и любое расширение, по умолчанию библиотека mcrypt в РНР5 отключена. Для того, чтобы ее подключить, необходимо убрать комментарий напротив строки extension=php_mcrypt.dll в конфигурационном файле php.ini . Кроме того, необходимо скопировать в системную директорию C:/Windows/system32 библиотеку libmcrypt.dll из дистрибутива РНР. Если данная библиотека не входит в состав дистрибутива РНР, то ее следует загрузить из сети, например по ссылке http://www.softtime.ru/libmcrypt.dll.

Рассмотрим пример, в котором строка зашифровывается и расшифровывается при помощи алгоритма 3DES(Triple-DES).

Использование симметричного шифрования:


//Шифруем пароль
$user_password ="dghbcdj27hg" ;
$key ="Это секретный код" ;
//Шифруем пароль с использованием секретного ключа $key
$user_crypt =mcrypt_ecb (MCRYPT_3DES, $key , $user_password , MCRYPT_ENCRYPT) ;
echo "Зашифрованный пароль - $user_crypt
"
;
//Расшифровываем пароль
$user_crypt =mcrypt_ecb (MCRYPT_3DES, $key , $user_crypt , MCRYPT_DECRYPT) ;
echo "Расшифрованный пароль - $user_crypt " ;
?>

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

Подбор пароля

Как видно из рассмотренных примеров, для шифрованию паролей зачастую проще прибегать к необратимому шифрованию. Однако это не значит, что пароль, особенно простой, невозможно подобрать. Рассмотрим простейший скрипт подбора пароля методом перебора символов из массива $arr . При этом пароли располагаются в файле password , расположенном в той же директории,что и скрипт. Переменная max_number задает максимальный размер подыскиваемого пароля.

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

Подбор пароля, зашифрованного с помощью MD5:


//Устанавливаем неограниченное время выполнения скрипта
set_time_limit (0) ;
//Читаем пароли из файла password
$pass =file ("password" ) ;
for each ($pass as $password )
{
//Замеряем время, затраченное на подбор пароля
$begin =time () ;
echo decrypt_md5 (trim ($password ) , "" ) ;
$end =time () ;
echo "(На подбор затрачено " .($end - $begin ) ."секунд)
"
;
}
//Функция символического подбора пароля
//$pass - расшифрованный пароль
// $answer - текущий ответ, при первом вызове - пустая строка
function decrypt_md5 ($pass , $answer )
{
$arr =array
"q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" ) ;
//Будем считать, что пароль не превышает
//4 символов
$max_number =3;
if (strlen ($answer ) >$max_number ) return;
for ($j =0; $j <count ($arr ) ; $j + + )
{
$temp =$answer .$arr [$j ];
if (md5 ($temp ) ==$pass ) return $temp ;
//Рекурсивно вызываем функцию для увеличения
//длины подбираемого пароля
$result =decrypt_md5 ($pass , $temp ) ;
//Если функция возвращает не пустую строку,
//следовательно, найден ответ и дальше искать не следует
if (strlen ($result ) >0) return $result ;
}
}
?>

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

После этого содержимое файла password разбиваются на строки, помещаемые в массив $pass , элементы которого в цикле передаются рекурсивной функции decrypt_md5() .

Примечание . Следует отметить, что строки массива $pass пропускаются через функцию trim() , для того чтобы избавиться от невидимых символов \r\n , которые могут оставаться в конце строк.

Функция перебирает значения от а через ab, ac и до azzz, и как только временная переменная $аanswer принимает значение аааа, функция переходит к символу b и перебирает пароли до bzzz. Таким образом перебираются все символы из массива $arr. Как только пароль найден, функция возвращает его и выходит из рекурсивного цикла благодаря проверке:

If(strlen($result)>0) return $result;

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

Генерация пароля

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

Генератор паролей:




>
Генератор паролей


<for m action="" method="post" >


for m>

//Параметр $number указывае количество символов в пароле
echo htmlspecialchars (generate_password ($_POST ["number" ]) ) ;
function generate_password ($number )
{
$arr =array
("a" , "b" , "c" , "d" , "e" , "f" ,
"g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" ,
"q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" ,
"A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" ,
"K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" ,
"U" , "V" , "W" , "X" , "Y" , "Z" , "1" , "2" , "3" , "4" ,
"5" , "6" , "7" , "8" , "9" , "0" , ", " , "." , "(" , ") " ,
"[" , "]" , "!" , "?" , "$" , "^" , "%" , "@" , "*" , "$" ,
"<" , ">" , "/" , "|" , "+ " , "- " , "{ " , "} " , "~" , "`" ) ;
//Генерируем пароль
$pass =" " ;
for ($i =0; $i <$number ; $i + + )
{
//Вычисляем случайный индекс массива
$index =rand (0, count ($arr ) - 1) ;
$pass .=$arr [$index ];
}
return $pass ;
}
?>

В окне веб-браузера это будет выглядеть ТАК .

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

В данной статье обсуждается управление паролями в UNIX, в том числе используемые системы шифрования, правила создания и проверки паролей, сокрытие и устаревание паролей. Мы также поговорим о том, как работает система и какими методами злоумышленникам удается эти средства защиты обойти.

Контролировать доступ к машине администратор может в первую очередь путем обеспечения выбора пользователями правильных паролей. Часто это наиболее слабое звено в любой вычислительной среде, где пользователям предоставлено право задавать пароль самим. Как ни удивительно, но во многих системах вся власть над паролями отдается в руки пользователей. При противоположном подходе, когда пользователи никак не влияют на создание паролей, они часто записывают их где попало, в силу чего вся цепочка защиты сразу рассыпается.

ХРАНЕНИЕ ПАРОЛЕЙ

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

Форматы файла паролей во всех реализациях UNIX согласованы, но, как будет показано далее, этого нельзя сказать о скрытых файлах. Каждый пользователь UNIX должен иметь запись в файле паролей. Однако клиент-серверные приложения не всегда требуют, чтобы пользователь имел бюджет уровня UNIX, когда ему не предоставляется доступ на уровне UNIX, поскольку приложение само выполняет аутентификацию пользователей и осуществляет управление ими. Тем не менее некоторые приложения используют методы аутентификации на уровне UNIX. Но это зависит от конкретного приложения, и данная тема выходит за рамки этой статьи.

Каждая запись в файле паролей /etc/passwd имеет формат

Userid:password:UID:GID:Comment:Home directory:shell

и выглядит, к примеру, следующим образом:

Chare:x:500:500:Chris Hare:/home/chare:/bin/bash

Поле «идентификатор пользователя» (chare) содержит реальное название бюджета пользователя. Поле пароль (x) будет содержать либо реальный зашифрованный пароль, либо его обозначение (как в данном примере). Наличие последнего свидетельствует об использовании скрытого файла. Поле «номер пользователя» (500) представляет собой уникальный идентификатор, с помощью которого система различает пользователей. Номер группы (500) позволяет определить, к какой группе принадлежит пользователь и какая ему соответствует запись в файле /etc/group. Комментарии или поле GECOS (Chris Hare) могут содержать любую текстовую информацию, необходимую для идентификации. Как правило, здесь записывается имя пользователя и другие данные, например номер телефона или название отдела. Домашний каталог (/home/chare) указывает, куда помещается пользователь в момент первоначальной регистрации в системе, а исходный командный процессор (/bin/bash) определяет, какой интерпретатор команд применяется.

МЕТОДЫ ШИФРОВАНИЯ ПАРОЛЕЙ

Все зависит от того, какой механизм паролей UNIX реализован. Одно время пароли хранились в незашифрованном формате, и только администратор и системное программное обеспечение имели доступ к данному файлу. Проблема возникает при редактировании файла /etc/passwd. Поскольку большинство редакторов создают для редактирования временный файл, то во время этого процесса к нему может обратиться кто угодно и узнать пароль для всех бюджетов. В результате пароли стали шифровать с помощью алгоритма однонаправленного шифрования, и в этом случае в системе хранятся зашифрованные значения. Однако надежность защиты полностью определяется выбранным методом шифрования.

При регистрации в системе UNIX программа getty требует ввести имя пользователя и запускает программу входа в систему, а та, в свою очередь, запрашивает пароль, но не декодирует его. Фактически, программа /bin/login шифрует пароль, введенный пользователем, а затем сравнивает полученное значение с тем, которое хранится в /etc/passwd. Если данные совпадают, то пароль был введен правильно.

Самым популярным методом шифрования стало применение улучшенного стандарта на шифрование данных (Data Encryption Standard, DES). Сам стандарт DES представляет собой систему с симметричным ключом, т. е. один и тот же ключ служит и для шифрования, и для дешифровки. Если бы алгоритм не был усовершенствован, то два пользователя с одним и тем же паролем могли получить одно и то же зашифрованное значение. Данная проблема сохраняется и в улучшенной системе, если поле пароля одного из пользователей скопировать в поле пароля другого пользователя. Однако в случае применения расширенного метода DES, даже если выбран одинаковый пароль, зашифрованные значения будут отличаться. Подробнее об этом рассказывается в следующем разделе.

ШИФРОВАНИЕ ПАРОЛЕЙ В UNIX С ПОМОЩЬЮ DES

Обращение к методу шифрования паролей в UNIX выполняется с помощью системного вызова crypt(3). В силу правил контроля экспорта в США, на вашей системе может не быть программ шифрования.

Истинное значение, которое хранится в /etc/passwd, получается путем использования пароля пользователя для шифрования 64-разрядного блока нулей с помощью вызова crypt(3). «Чистый текст» - это пароль пользователя, который является ключом данной операции. Итоговый «закодированный текст» представляет собой зашифрованный пароль. «Чистый текст» (также называемый незакодированным текстом) - исходное незашифрованное сообщение. Закодированный текст - сообщение после шифрования.

Алгоритм crypt(3) базируется на стандарте DES, разработанном в Национальном институте стандартов и технологий (National Institute of Standards and Technology, NIST). В обычном случае для шифрования исходного текста, в DES часто называемого «чистым текстом», применяется 56-разрядный ключ, состоящий, например, из восьми 7-разрядных символов. Этот «чистый текст», как правило, имеет в длину 64 бита. Вот почему UNIX распознает только первые восемь символов пароля, введенного пользователем. Полученный в итоге закодированный текст невозможно расшифровать, не зная значения исходного ключа.

При вызове crypt(3) в UNIX используется модифицированная версия указанного метода, при этом декларируется, что «чистый текст» преобразуется в блок нулей. Новое шифрование закодированного текста с помощью пароля пользователя в качестве ключа еще больше усложняет этот процесс. Так повторяется 25 раз, а затем полученные в итоге 64 разряда разделяются на 11 печатных символов и сохраняются в файле паролей.

Хотя исходные тексты crypt(3) могут предоставить многие производители (их распространение ограничивается территорией Соединенных Штатов), общедоступного метода для преобразования закодированного текста или зашифрованного значения обратно в исходный «чистый текст» не существует.

Роберт Моррис и Кен Томсон, первыми реализовавшие технологию crypt(3) в UNIX, опасались, что с появлением микросхем с поддержкой DES на аппаратном уровне защиту системы UNIX можно будет легко преодолеть. Чтобы ликвидировать эту угрозу, они предложили использовать «крупинку соли» - 12-разрядное число, применяемое для модификации результата работы DES. Это число может принимать значения от 0 до 4095. В итоге каждый возможный пароль можно представить в файле паролей одним из 4096 способов. Разные пользователи на одной и той же машине могут использовать один и тот же пароль, и никто, даже системный администратор, не будет об этом знать.

Когда запускается программа /bin/passwd для создания нового пароля, она выбирает значение «крупинки соли» в зависимости от времени дня, которое затем применяется для модификации пароля пользователя. Чтобы предотвратить маловероятную возможность задания другого значения «крупинки соли» при следующей регистрации пользователя, UNIX хранит эту величину в /etc/passwd. Фактически, данное значение представлено в виде первых двух символов зашифрованного пароля. Такой механизм гарантирует, что пароль может быть зашифрован снова и ему будет найдено соответствие.

Например, значение зашифрованного пароля

W1wEdEKQNtJbA

состоит из «крупинки соли» (W1) и самого 11-символьного зашифрованного пароля (wEdEKQNtJbA). В нашем примере пользователь вводит свой пароль в процессе регистрации, а «крупинка соли», т. е. W1, добавляется в процессе шифрования. После этого пароль сравнивается с зашифрованным значением, которое хранится в соответствующем файле (помните, что этот файл может быть скрытым). Если два значения совпадают, то пользователь получает доступ в систему. При вводе пароля, вопреки распространенному мнению, значение, хранящееся в системе, не декодируется.

ШИФРОВАНИЕ ПАРОЛЕЙ MD5

Linux стала первой операционной системой на базе UNIX, в которой был реализован Message Digest 5 (MD5) - метод шифрования паролей в процессе регистрации. Он основан на использовании системы подключаемых модулей идентификации (Pluggable Authenti-cation Module, PAM) для усовершенствования или замены процесса шифрования DES, который применяется по умолчанию. И это лишь часть возможностей PAM. Прежде чем рассмотреть алгоритм Message Digest 5, поговорим о том, для чего служит PAM.

Цель всех проектов PAM - удалить компоненты аутентификации из программного обеспечения определения привилегий. Такой подход позволяет системным администраторам выбирать предпочтительный для них модуль аутентификации во время исполнения, а не полагаться на выбор производителя ПО. В контексте нашего обсуждения модулями аутентификации могут быть стандартное шифрование UNIX DES, шифрование MD5, Kerberos или любой другой из подобных методов. Обсуждение самой среды PAM выходит за рамки данной статьи.

Файл system.auth в каталоге /etc/pam.d определяет применяемые методы аутентификации. Пример его показан на Рисунке 1. Поле «тип модуля» (Module Type) предназначено для обновления аутентификационных ключей (token), или паролей, связанных с пользователем. Как правило, для каждого вида аутентификации служит свой модуль PAM. Поле «флаг управления» (Control Flag) указывает, как библиотека PAM будет реагировать в случае успешного или неудачного завершения процедуры аутентификации. Флаг управления «достаточно», как в данном случае, означает, что библиотека PAM подтвердила аутентификацию или обновление пароля.

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

Путь доступа к модулю (module path) указывает местонахождение подключаемых модулей. Для каждого из них указываются свои аргументы (arguments), которые определяют, как данный модуль будет действовать. В приведенном примере нас интересуют аргументы md5 и shadow. Именно они сообщают PAM о необходимости применить пароли MD5 и создать скрытый файл паролей.

Алгоритм MD5 подробно описан в документе IETF RFC 1321. Он был разработан Роном Ривестом из RSA Data Security. Данный документ носит исключительно информационный характер, т. е. не имеет статуса стандарта Internet. Алгоритм Message Digest генерирует отпечаток, или дайджест сообщения, для пароля. На самом деле MD5 применяется в самых разных ситуациях, обычно для цифровых подписей, и базируется на алгоритме Message Digest 4 (MD4). Хотя MD4 работает очень быстро, он довольно уязвим. Несмотря на то что MD5 чуть медленнее, он реализует более надежную функцию шифрования и будет очень быстро работать на современных вычислительных платформах. Пользователи не заметят различия в скорости между методами шифрования паролей DES и MD5.

Реализация механизма паролей MD5 работает так же, как и реализация DES, с добавлением «крупинки соли» для модификации процесса шифрования. Пароль в реализации Linux показан на Рисунке 2.

«Магическая строка», применяемая в реализации MD5, идентифицирует пароль как зашифрованный пароль MD5, поэтому модуль PAM знает, какой процесс шифрования использовать при сравнении хранимого значения и введенного пользователем. «Крупинка соли», как и в случае реализации DES, служит для варьирования процесса шифрования MD5. При таком подходе два пользователя, имеющие один и тот же пароль, будут иметь разные зашифрованные значения.

Однако, в отличие от реализации DES, «крупинка соли» в процессе MD5 может состоять из восьми символов. От самого пароля ее отделяет знак «$», тем самым позволяя менять ее длину. Пароль в MD5 может содержать от 13 до 24 символов.

УПРАВЛЕНИЕ ПАРОЛЯМИ

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

Многие версии UNIX предлагают функции устаревания паролей для контроля за тем, когда пользователи должны менять свои пароли. Управление устареванием паролей ведется с помощью значений, добавляемых в файл паролей вслед за зашифрованным паролем. Эти величины определяют минимальный период времени, с момента последнего изменения, прежде чем пользователь сможет его поменять, и максимальный период - до окончания срока действия пароля. На Рисунке 3 дается графическое представление этой концепции.

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

В UNIX, при традиционном подходе, элементы управления устареванием записываются после пароля и отделяются от него запятой. Эти символы представляют:

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

Программа pwexp.pl имеет дело c механизмом поддержки устаревания пароля, который реализован в версиях UNIX вплоть до System V Release 3.2. На этом уровне для усиления системной защиты прибегают к разным вариантам. В итоге было создано несколько различных методов управления скрытыми файлами. Производные BSD и AT&T System V Release 4 опираются на /etc/shadow, в то время как другие системы, в том числе SCO UNIX, разработанная Santa Cruz Operation, и HP-UX компании Hewlett-Packard реализовали Trusted Computing Base. Следует отметить, что реализация SCO UNIX может использовать /etc/passwd, /etc/shadow или Trusted Computing Base в зависимости от уровня защиты системы. В реализации AIX компании IBM применяется другой механизм для хранения скрытых паролей и информации о возрасте паролей.

Программа, представленная на Листинге 2 - pwexp2.pl, - печатает данные об изменениях и устаревании паролей для систем, где используется файл /etc/shadow. Ее необходимо запускать с привилегиями root, иначе файл /etc/shadow будет недоступен всем остальным пользователям. Результат выполнения команды pwexp2.pl показан на Рисунке 4.

СКРЫТЫЕ ФАЙЛЫ

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

Первый из трех основных форматов, файл /etc/shadow, приведен на Рисунке 4. Для каждого пользователя в этом файле должна присутствовать соответствующая запись /etc/shadow. Сразу выявить зашифрованный пароль невозможно, но пароль, закодированный с помощью DES, состоит, как правило, из 13 символов: 2 символа - это «крупинки соли», а 11 символов - сам пароль. Пример, показанный на Рисунке 5, - пароль, зашифрованный с помощью MD5.

Третье поле указывает, сколько дней прошло с момента отсчета времени (1 января 1970 г.) до последней смены пароля пользователем. Четвертое поле - число дней, которые должны пройти до того момента, когда станет возможно сменить пароль. По умолчанию в большинстве инсталляций оно равно нулю, т. е. пользователь может сменить свой пароль в любое время.

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

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

Структура /tcb/files была взята из пакетов C2 Security, созданных Secure Ware, и реализована в HP-UX компании Hewlett-Packard и SCO UNIX компании Santa Cruz Operation. Это неотъемлемая часть Trusted Computing Base, поэтому и структура каталога начинается с /tcb. В указанном каталоге находится набор файлов, которые необходимы для реализации функций защиты C2. Большинство из них не относятся к теме данной статьи. Однако скрытые файлы создаются в каталоге /tcb/files/auth.

В этом каталоге названия большей части подкаталогов совпадают с буквами алфавита, что крайне важно, поскольку каждый пользователь имеет отдельный файл с информацией о нем. Местонахождение пользовательского файла определяется по первой букве имени пользователя. Например, файл bob хранится в /tcb/files/auth/b/bob, как показано на Рисунке 6.

Как видно из рисунка, между файлом /etc/shadow и данными, находящимися в Trusted Computing Base, очень много схожего. Записи u_name и u_id обеспечивают соответствие между содержимым файла и конкретным пользователем из /etc/passwd. Здесь хранится зашифрованный пароль, хотя, как правило, используется традиционная форма шифрования DES. Как и /etc/shadow, записи TCB содержат информацию о том, когда пользователь последний раз изменил свой пароль, но, в отличие от /etc/shadow, в нем записывается также, когда была сделана последняя неудачная попытка сменить пароль.

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

Информация о сроках действия паролей сохраняется в другом файле в TCB по мере того, как формируется политика работы с файлами, и применяется ко всем пользователям в системе. Для сравнения файл /etc/shadow позволяет задавать разные значения для каждого пользователя и таким образом повысить уровень детализации при определении защиты бюджетов с бо?льшими привилегиями.

Система AIX компании IBM использует другую реализацию для создания скрытого файла. Скрытые пароли хранятся в /etc/security/passwd. Формат этого файла показан на Рисунке 7.

Файл /etc/security/password содержит такую же пользовательскую информацию, что и скрытый файл, но разделен на блоки, которые в IBM называют строфами (stanza). Каждая из них представляет собой данные, относящиеся к конкретному пользователю. Однако информация об устаревании пароля хранится в другом файле - /etc/security/user, который мы рассмотрим несколько позже. Пример записи /etc/security/passwd, показанный на Рисунке 7, иллюстрирует доступные для каждого пользователя параметры, описание которых приведено в Таблице 3 .

Как уже упоминалось выше, в файле /etc/security/passwd отсутствуют данные об устаревании пароля, дате последнего изменения и другая информация, традиционно размещаемая в файле /etc/shadow. Она находится в /etc/security/user (см. Рисунок 7).

Как и файл /etc/security/password, сведения о пользователе разделены на строфы. В файле содержатся самые разные данные, но для нас наибольший интерес представляют записи, показанные в Таблице 4 , касающиеся устаревания пароля и элементов управления.

Файл /etc/security/user предлагает самые широкие возможности управления - как устареванием пароля, так и его качеством. Руководители компании и аудиторы должны стремиться обеспечить самый серьезный контроль качества пароля, чтобы не спровоцировать несанкционированный доступ в систему. При этом высокое качество достигается не за счет реализации произвольным образом сгенерированных паролей, а благодаря обучению пользователей и использованию соответствующих системных проверок для их контроля.

КАЧЕСТВО ПАРОЛЯ

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

  • ваше имя;
  • имя вашей супруги/супруга;
  • имя вашего ребенка;
  • имя вашего домашнего животного;
  • имена друзей, членов семьи или коллег;
  • имена персонажей мультфильмов или фантастических героев;
  • все указанные выше имена с циклически переставленными в них буквами;
  • название операционной системы, которую вы используете;
  • названия предметов, видимых с вашего рабочего места;
  • название улицы, на которой вы живете;
  • номер паспорта или водительских прав;
  • датa рождения;
  • популярные слова, такие, как wizard, gandalf, guru и т. п.;
  • имя любого пользователя;
  • любое слово, которое можно найти в словаре;
  • географическое название;
  • любое имя собственное;
  • простые шаблоны, вроде qwerty или abcdefg;
  • слова и фразы из телепередач или фильмов наподобие NCC-1701;
  • слова, состоящие из одинаковых букв.

Проверка качества важна для того, чтобы гарантировать надежность пароля как элемента управления. Она должна проводиться при задании пароля. Проверку можно выполнить и после данной операции с помощью таких программ, как crack, но это далеко не так эффективно, как считают многие. Контроль должен базироваться на серии правил, которые следует адаптировать к требованиям конкретной организации. Не все операционные системы или среды приложений предлагают такой уровень функциональности в своей архитектуре. Тем не менее крайне важно использовать подобные функции там, где это возможно. Однако в некоторых ситуациях ценность проведенной проверки почти ничтожна из-за природы самого приложения. Например, если приложение позволяет проверить пароли по словарю, но при этом не позволяет выполнить дополнительную проверку на базе правил, то контроль ценен настолько, насколько надежен словарь.

Причинами реализации правил для пароля во время задания последнего могут быть следующие:

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

Поскольку перечисленные ситуации вполне реальны, роль проверки при создании паролей возрастает. Однако не все системы предлагают правила проверки. А в тех системах, где такая возможность присутствует, нужно использовать все варианты проверки, в том числе соответствие шаблонов и подстановку символов. В среде, где это сделать невозможно, применяются три дополнительных метода: замена самой программы обслуживания паролей, «детективное расследование» и определение политики.

Предпочтительнее всего заменить программу /bin/passwd на одну из тех, которые поддерживают улучшенные правила проверки, поскольку приобретенные преимущества со временем оправдают первоначальные затраты на реализацию. Кроме того, несколько таких программ размещены в Internet, поэтому организации не нужно самой заниматься разработкой.

Определение политики защиты требует, чтобы пользователи были информированы о требованиях выбора высококачественных паролей. Однако пользователи есть пользователи, и не стоит полностью на них полагаться. Следовательно, необходимо с помощью функций поиска таких программ, как crack, находить низкокачественные пароли и добиваться их замены. Кроме того, нужно постоянно требовать от производителей приложения или операционной системы UNIX обеспечить необходимую функциональность.

Осталось только ответить на вопрос: «Что такое пароль хорошего качества?»

Пароль должен удовлетворять следующим критериям:

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

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

ПРОВЕРКА С ПОМОЩЬЮ ВЗЛОМЩИКА ПАРОЛЯ

Взломщик пароля - это программа, которая пытается «подобрать» зашифрованные пароли, хранящиеся в файле /etc/passwd, сравнивая их со словами из словаря. Насколько успешным будет результат работы такой программы - зависит от ресурсов центрального процессора, качества словаря и того, сделал ли пользователь копию /etc/passwd.

С развитием программного обеспечения интерактивного взлома паролей UNIX и роста вычислительной мощности, которую может использовать такое усовершенствованное программное обеспечение взлома, качество пароля становится все важнее. К примеру, средний настольный компьютер (с процессором Pentium младшего класса и операционной системой Windows 95) способен выполнять поиск со скоростью 50 тыс. паролей в секунду.

Рассмотрим следующие примеры.

  • Пароль из шести символов с прописными и строчными буквами и цифрами можно взломать за 62 6 , или 56 800 235 584, попыток, т. е. на это потребуется 15,78 ч.
  • Пароль из семи символов с прописными и строчными буквами и цифрами можно взломать за 62 7 , или 3521614606208, попыток, что эквивалентно 41 дню.
  • Пароль из восьми символов с прописными и строчными буквами и цифрами можно взломать за 62 8 , или 2 183 401 055 849e+14, попыток. Процесс займет приблизительно 7 лет.
  • Пароль из восьми символов, в котором используются только прописные или только строчные символы, можно взломать за 26 8 , или 208 827 064 576, попыток - около 24 дней.
  • Пароль из восьми символов (или PIN), в котором использованы только цифры, можно взломать за 10 8 , или 100 млн попыток, т. е. на это уйдет всего 100 с.

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

Если оценить время, которое на это требуется, становится очевидным, почему злоумышленники сначала пытаются заполучить системный файл паролей, а затем обработать его в поисках «простых» паролей. Программу для взлома написать достаточно легко: примерно 60 строк на языке Си или 40 строк на Perl. Если, стремясь гарантировать, что в вашей системе используются высококачественные пароли, вы решите написать подобную программу, имейте в виду, что тем самым можно навлечь на себя беду. Поскольку она может быть украдена и впоследствии использована для получения доступа к другим машинам, то, при должной ее эффективности, вы можете еще больше ослабить защиту своего компьютера.

Одна из наиболее популярных программ взлома паролей UNIX - crack - написана Алексом Моффеттом, в основу которой заложен поиск в словарях слов и выражений на английском (или другом) языке. Эти средства пробуют различные перестановки слов и фраз (в обратном порядке, добавляя в начале и в конце цифру, объединяя вместе два коротких слова, подставляя противоположное по значению и т. д.) параллельно с более простыми эвристиками, такими, как даты, перестановка букв регистрационного имени, почтовые индексы и определенные распространенные фразы. Некоторые инструментальные средства работают очень быстро и выполняют поиск словарных слов, например ferreted, в считанные минуты.

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

РЕЗЮМЕ

Хотя механизм паролей в UNIX порождает массу споров и страдает от повторяющихся атак, он обеспечивает надежный контроль для предотвращения несанкционированного доступа к системе. Это утверждение верно, если элементы управления регистрацией корректно настроены с целью обеспечения высококачественных паролей и они оцениваются при создании, задаются ограничения на число неудачных попыток доступа, условия блокирования бюджетов и сроки устаревания пароля. Крайне важно гарантировать, чтобы реальные зашифрованные пароли не были видны пользователям, не имеющим прав администраторов, а для ftp необходимо установить соответствующие ограничения, которые не позволяют загружать их всем подряд. Наконец, прежде чем использовать любое программное обеспечение оценки паролей, например решения Oracle, получите разрешение у руководства на его применение.

Автор выражает свою благодарность специалистам, прочитавшим данную статью и высказавшим свои замечания перед ее публикацией. Особая признательность автора - Мигноне Коут за постоянную поддержку в его исследованиях и писательской деятельности.

Крис Хеа - консультант по защите и управлению информацией в компании Nortel Networks. Он работает в компьютерной отрасли свыше 14 лет, занимаясь проектированием приложений, вопросами гарантии качества, системным администрированием, сетевым анализом, а также консультируя по вопросам защиты, работы системы и архитектуры.

Для хранения секретного списка паролей на диске во многих ОС используется криптография. Система задействует одностороннюю функцию, которую просто вычислить, но для которой чрезвычайно трудно (разработчики надеются, что невозможно) подобрать обратную функцию.

Например, в ряде версий Unix в качестве односторонней функции используется модифицированный вариант алгоритма DES. Введенный пароль длиной до 8 знаков преобразуется в 56-битовое значение, которое служит входным параметром для процедуры crypt(), основанной на этом алгоритме. Результат шифрования зависит не только от введенного пароля, но и от случайной последовательности битов, называемой привязкой (переменная salt). Это сделано для того, чтобы решить проблему совпадающих паролей. Очевидно, что саму привязку после шифрования необходимо сохранять, иначе процесс не удастся повторить. Модифицированный алгоритм DES выполняется, имея входное значение в виде 64-битового блока нулей, с использованием пароля в качестве ключа, а на каждой следующей итерации входным параметром служит результат предыдущей итерации. Всего процедура повторяется 25 раз. Полученное 64-битовое значение преобразуется в 11 символов и хранится рядом с открытой переменной salt.

В ОС Windows NT преобразование исходного пароля также осуществляется многократным применением алгоритма DES и алгоритма MD4.

Хранятся только кодированные пароли. В процессе аутентификации представленный пользователем пароль кодируется и сравнивается с хранящимися на диске. Таким образом, файл паролей нет необходимости держать в секрете.

При удаленном доступе к ОС нежелательна передача пароля по сети в открытом виде. Одним из типовых решений является использование криптографических протоколов. В качестве примера можно рассмотреть протокол опознавания с подтверждением установления связи путем вызова - CHAP (Challenge Handshake Authentication Protocol).

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

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



В микротелефонных трубках используется аналогичный метод.

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

После успешной регистрации система должна осуществлять авторизацию (authorization) - предоставление субъекту прав на доступ к объекту. Средства авторизации контролируют доступ легальных пользователей к ресурсам системы, предоставляя каждому из них именно те права, которые были определены администратором, а также осуществляют контроль возможности выполнения пользователем различных системных функций. Система контроля базируется на общей модели, называемой матрицей доступа . Рассмотрим ее более подробно.

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

Операции зависят от объектов. Например, процессор может только выполнять команды, сегменты памяти могут быть записаны и прочитаны, считыватель магнитных карт может только читать, а файлы данных могут быть записаны, прочитаны, переименованы и т. д.

Желательно добиться того, чтобы процесс осуществлял авторизованный доступ только к тем ресурсам, которые ему нужны для выполнения его задачи. Это требование минимума привилегий, уже упомянутое в предыдущей лекции, полезно с точки зрения ограничения количества повреждений, которые процесс может нанести системе. Например, когда процесс P вызывает процедуру А, ей должен быть разрешен доступ только к переменным и формальным параметрам, переданным ей, она не должна иметь возможность влиять на другие переменные процесса. Аналогично компилятор не должен оказывать влияния на произвольные файлы, а только на их хорошо определенное подмножество (исходные файлы, листинги и др.), имеющее отношение к компиляции. С другой стороны, компилятор может иметь личные файлы, используемые для оптимизационных целей, к которым процесс Р не имеет доступа.

Различают дискреционный (избирательный) способ управления доступом и полномочный (мандатный).

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

Полномочный подход заключается в том, что все объекты могут иметь уровни секретности, а все субъекты делятся на группы, образующие иерархию в соответствии с уровнем допуска к информации. Иногда это называют моделью многоуровневой безопасности, которая должна обеспечивать выполнение следующих правил.

· Простое свойство секретности. Субъект может читать информацию только из объекта, уровень секретности которого не выше уровня секретности субъекта. Генерал читает документы лейтенанта, но не наоборот.

· *-свойство. Субъект может записывать информацию в объекты только своего уровня или более высоких уровней секретности. Генерал не может случайно разгласить нижним чинам секретную информацию.

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

Отметим, что данная модель разработана для хранения секретов, но не гарантирует целостности данных. Например, здесь лейтенант имеет право писать в файлы генерала.

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

Похожие статьи