Описание: Кандидат BSDA должен уметь по данному скриншоту базы паролей определить используемый метод шифрования и знать как его сменить. Кандидат должен иметь базовое понимание того когда надо использовать DES, MD5 и Blowfish.
Практика: login.conf(5)
; auth.conf(5)
;
passwd.conf(5)
и adduser(8).
Жизнь показывает, что существует множество путей при помощи которых может «утекать» база с паролями пользователей. Один из распространённых случаев — утечка с backup'ами. Главное оружие любого системного администратора, это валидол и backup. Администратор, который понял эту истину может уподобиться белке, которая рассовывает орешки где попало и забывает где их положила. Так же могут быть распределены в системе резервные копии. Особенно, если система резервного копирования написана самим администратором. Такая система, быть может ничем не плоха, но на стадии отладки, пока подбирались опции, на жёстких дисках оказалось несколько копий резервных файлов с правами 644...
Чем это чревато? Злоумышленник может попыться найти базу с
паролями и взломать её. Что может ему помешать? Во первых пароли
должны быть качественными, во вторых, они
должны быть качествено зашифрованы. Надо сразу сказать, что
первое намного важнее второго. Как бы качественно ни был
зашифрован пароль 12345
, его вскроют
за доли секунды.
Существует несколько способов шифрования паролей. Так или иначе, используется некоторая необратимая функция, при помощи которой, шифруется пароль. Т.е. система ваш пароль вообще не знает. Когда вы его вводите, она шифрует его заново и сверяет результаты шифрования со своей базой.
В системах BSD можно выбирать несколько алгоритмов шифрования паролей, однако ни один из них не является панацеей от взлома. Иметь стойкий пароль, намного важнее, чем строго его шифровать. Хотя последнее тоже может быть важно.
База с аутентификационными данными состоит из 4-х файлов.
Основной — /etc/master.passwd
и
генерирующихся из него при помощи pwd_mkdb(8)
трёх файлов: /etc/passwd(5)
,
/etc/pwd.db
и
/etc/spwd.db
.
/etc/master.passwd
В данном файле содержится собственно аутентификационная
информация: зашифрованный пароль, сведения о
пользовательских настройках (т.н. класс пользователя),
срок действия пароля. Ниже приведён фрагмент файла
/etc/master.passwd(5)
.
user1:*LOCKED*cuqW.GIKHV/xs:1001:1001:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin user2:*LOCKED*76aSxdZIXKXfk:1002:1002:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin user3:*LOCKED*$1$UmWRc8Kh$WyHRN96T7vQ7nZP0ChVjc/:1003:1003:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin user4:*LOCKED*$1$OgtF.3Zb$EafLlWm6H.OZ1sKkheySr.:1004:1004:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin user5:*LOCKED*$2a$04$HXoymCDzRfi9ctGmfrOqeu9Hn16XcWmQuVnA6C3aifKkkM7qrKauO:1005:1005:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin user6:*LOCKED*$2a$04$GO.hiRaXx7wp5cdAfJP9xOAOeXV48/kBYOJ2VaJRhknUg/VWLw/N.:1005:1005:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin user7:*LOCKED*$3$$2d20d252a479f485cdf5e171d93985bf:1006:1006:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin user8:*LOCKED*$3$$2d20d252a479f485cdf5e171d93985bf:1007:1007:russian:0:0:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/usr/sbin/nologin
Здесь имеется 10 полей разделённых двоеточиями. Вот их значение:
Пароль пользователя. Никакой пароль не может содержать
в себе звёздочек, или восклицательных знаков. Поэтому
поле *LOCKED*
свидетельствует о том, что данная учётная запись
заблокирована. Ни один пароль не совпадёт с ней при
процедуре аутентификации. Для блокирования учётной
записи таким способом можно применять команду
pw(8) (см. Раздел 4.1, «Создание, изменение и удаление учётных записей»).
Внимание | |
---|---|
Существуют способы войти в систему без проверки пароля, например при аутентификации в ssh(1) по паре сгенерированных ключей (см. Раздел 2.7, «Разбираться в основных рекомендованных методах доступа [до хоста]»). Поэтому такой способ блокирования учётной записи можно считать необходимым, но не достаточным. Кроме этого действия надо ещё сменить пользователю оболочку на /usr/sbin/nologin. |
У всех восьми упомянутых здесь пользователей пароль
одинаковый — qwerty
. Однако он приведён в
разных форматах. Всего мы обсудим 4 формата паролей:
Пароль qwerty
При
помощи алгоритма DES
шифруется в строку cuqW.GIKHV/xs
. Однако
было бы ошибкой дать злоумышленнику
возможность определить у кого из наших
пользователей пароли совпадают, просто на
основании того, что совпадают шифры. Поэтому
при шифровании используется т.н.
«соль». В момент заведения пароля
генерируется случайное число. это число в
символьном виде приписывается к паролю и далее
шифруется пароль вместе с солью. Таким
образом, следующая строка: 76aSxdZIXKXfk
это тоже
qwerty
.
Алгоритм DES не является достаточно криптостойким. Современная компьютерная техника позволяет взломать эти пароли методом перебора за незначительный промежуток времени. По этой причине большинство современных UNIX-систем шифруют пароли при помощи алгоритма MD5:
Пароль qwerty
в
формате MD5 может выглядеть следующим образом:
$1$UmWRc8Kh$WyHRN96T7vQ7nZP0ChVjc/
.
В данном примере пароль состоит из трёх полей,
разделённых знаками $
:
$1$
—
Указание на алгоритм шифрования MD5;
UmWRc8Kh
—
«соль», которая добавляется к
паролю при вычислении MD5 суммы (см. выше,
описание DES).
WyHRN96T7vQ7nZP0ChVjc/
—
собственно зашифрованный пароль.
В интернете можно встретить много истерических замечаний по поводу якобы взломанного алгоритма MD5. Правда на настоящий момент такова: некие китайские(?) математики нашли алгоритм при помощи которого можно находить коллизии в MD5. Т.е. если md5(xm)=y, то существует алгоритм по которому зная y можно найти другой xn, такой, что md5(xn)=md5(xm). Однако, если злоумышленник знает пароль, то знание коллизии к паролю ему уже не нужно. Что касается обратимости, то алгоритм md5 по прежнему необратим, и единственный вид атаки на него, это bruteforce — атака грубой силой, путём перебора паролей. Математики смогли снизить количество вычислений, необходимых для этой атаки на несколько порядков, однако это по прежнему актуальная бесконечность.
$2
в начале строки пароля
свидетельствует о применении данного алгоритма.
Поле $04$
указывает на
то, сколько проходов совершено при шифровании.
(Внимание! Последняя фраза лишь догадка автора.)
$3
. Обратите внимание: в
случае использования алгоритма NT-hash соль не
генерируется и хеши одинаковых паролей одинаковы!
Я не знаю устройства этого алгоритма, но результат
просто отвратителен! Данный эксперимент ставился
в системе
FreeBSD 6.1-RELEASE.
/etc/login.conf(5)
и устанавливают
переменные окружения или делают иные настройки (см.
Приложение F, /etc/login.conf(5)
).
GECOS — информация о пользователе: имя, место работы, рабочий и домашний телефон. Эту и другую информацию использует в работе утилита finger(1):
$
finger user
Login: user Name: Poluect
Directory: /home/user Shell: /usr/sbin/nologin
Office: a-sys, 123-4567 Home Phone: 765-4321
Never logged in.
No Mail.
No Plan.
/etc/passwd(5)
Данный файл нужен, главным образом, для совместимости. Он
присутствует во всех UNIX'ах и везде имеет одинаковую
структуру. В BSD он не первичен, т.е.
генерируется из файла
/etc/master.passwd
при помощи команды
pwd_mkdb(8). В файле присутствует
информация о логине пользователя, его оболочке и др. Поля
разделены двоеточиями:
user:*:1001:1001:Poluect,a-sys,1234567,7654321,hello_world:/home/user:/bin/csh
/etc/pwd.db
/etc/master.passwd(5)
командой
pwd_mkdb(8).
/etc/spwd.db
/etc/master.passwd(5)
командой
pwd_mkdb(8).
Данный файл является базой данных для различных программ, в том числе для программы login(1). С его помощью можно задавать переменные окружения, настройки учётных записей вроде сроков действия учётных записей, метода шифрования и т.д.
Полное описание формата этого файла можно найти в Приложение F, /etc/login.conf(5)
.
Файл /etc/login.conf
непосредственно
системой не читается. После его редактирования надо создать
бинарную базу /etc/login.conf.db
при помощи
команды:
#
cap_mkdb /etc/login.conf
Поля в файле /etc/login.conf
разделяются
двоеточиями. В первом поле каждой записи указано для кого она
предназначена. Здесь указывается «класс» пользователя
(5-е поле файла master.passwd(5)
). Ключевое
слово default
соответствует любому
пользователю с ненулевым UID (т.е. не root'у). В
FreeBSD и
DragonFly BSD пользователи могут
заводить свои собственные файлы
~/.login.conf
в домашнем каталоге, где они
должны указывать ключевое слово me
.
Пример:
default:\ :passwd_format=nth:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\ :path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin ~/bin:\ :nologin=/var/run/nologin:\ :cputime=unlimited:\ ............................ :umask=022:
Для смены алгоритма шифрования пароля в
FreeBSD следует поменять значение опции
passwd_format
, а в
OpenBSD —
localcipher
(и, возможно,
ypcipher
). Эти опции описаны в
Приложение F, /etc/login.conf(5)
, их значения в
Таблица 2.3, «Возможные значения опций crypt_default
(FreeBSD) и localcipher
,
ypcipher
(OpenBSD)»
В этом файле находятся умолчания, которые ипользует системная
функция crypt_set_format(3)
. По
хорошему, сюда надо записать что-то вроде:
crypt_default = blf
Однако при заведении новых паролей в этот файл система смотрит в
последнюю очередь, и более важным окажется файл
/etc/login.conf(5)
(см. Приложение F, /etc/login.conf(5)
).
Таблица 2.3. Возможные значения опций crypt_default
(FreeBSD) и localcipher
,
ypcipher
(OpenBSD)
Опция | Описание | OS |
---|---|---|
des | DES | |
md5 | MD5 | |
blf | Blowfish | |
nth | NT-hash | |
old | DES | |
newsalt,<rounds> | Newsalt; rounds — 24-битное целое, минимум 7250 (число проходов алгоритма). | |
blowfish,<rounds> | Blowfish; rounds — от 4-х до 31-го (логарифм по основанию 2 от числа проходов алгоритма). |
Данный файл присутствует только в NetBSD и,
по смыслу похож на /etc/login.conf(5)
из
других систем. В файле /etc/passwd.conf
хранится информация о том, какой алгоритм шифроваения для каких
пользователей использовать. Например:
default: localcipher = md5 ypcipher = old root: localcipher = blowfish,5
Здесь мы используем алгоритм md5 для локальных пользователей и старый des для пользователей NIS, а для root используем blowfish, который применяется к паролю 2 в 5-й степени раз (32 раза).
Утилита adduser(8) предназначена для добавления пользователей в систему. Она может работать как интерактивно, так и из скриптов. Основной утилитой по управлению учётными записями является pw(8), она накладывает ограничение на длину пароля и т.п. Интерактивно вызванная утилита спрашивает у администратора имя пользователя, полное имя (GECOS) и др.
Замечание | |
---|---|
Имя пользователя обычно не должно быть более 16 символов и
должно состоять из букв и цифр. Эти ограничения наложены по
историческим причинам, если вы хотите более длинные имена, вы
можете переопределить переменную UT_NAMESIZE
в <utmp.h> и пересобрать world.
Однако после этого могут быть проблемы с бинарниками
скомпилированными в других системах. Кроме того,
NIS предполагает, что пароли бывают только
8-ми символьные.
|
Суммируя сказанное выше, приведём краткое Blowfish HOWTO: как перевести базу паролей в формат Blowfish:
/etc/login.conf(5)
в секции default:\
помещаем строки:
default:\ :passwd_format=blf:\
:passwordtime=48d:\ :mixpasswordcase=true:\ :minpasswordlen=10:\ :idletime=60:
/etc/login.conf(5)
).
#
cap_mkdb /etc/login.conf
/etc/auth.conf(8)
добавляем строку
crypt_default=blf
HIVE: All information for read only. Please respect copyright! |