2.12. Смена алгоритма шифрования используемого для защиты базы с паролями

Описание:  Кандидат BSDA должен уметь по данному скриншоту базы паролей определить используемый метод шифрования и знать как его сменить. Кандидат должен иметь базовое понимание того когда надо использовать DES, MD5 и Blowfish.

Практика: login.conf(5); auth.conf(5); passwd.conf(5) и adduser(8).

Комментарий

Жизнь показывает, что существует множество путей при помощи которых может «утекать» база с паролями пользователей. Один из распространённых случаев — утечка с backup'ами. Главное оружие любого системного администратора, это валидол и backup. Администратор, который понял эту истину может уподобиться белке, которая рассовывает орешки где попало и забывает где их положила. Так же могут быть распределены в системе резервные копии. Особенно, если система резервного копирования написана самим администратором. Такая система, быть может ничем не плоха, но на стадии отладки, пока подбирались опции, на жёстких дисках оказалось несколько копий резервных файлов с правами 644...

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

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

В системах BSD можно выбирать несколько алгоритмов шифрования паролей, однако ни один из них не является панацеей от взлома. Иметь стойкий пароль, намного важнее, чем строго его шифровать. Хотя последнее тоже может быть важно.

2.12.1. Устройство базы паролей

База с аутентификационными данными состоит из 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 формата паролей:

    DES

    Пароль qwerty При помощи алгоритма DES шифруется в строку cuqW.GIKHV/xs. Однако было бы ошибкой дать злоумышленнику возможность определить у кого из наших пользователей пароли совпадают, просто на основании того, что совпадают шифры. Поэтому при шифровании используется т.н. «соль». В момент заведения пароля генерируется случайное число. это число в символьном виде приписывается к паролю и далее шифруется пароль вместе с солью. Таким образом, следующая строка: 76aSxdZIXKXfk это тоже qwerty.

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

    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 — атака грубой силой, путём перебора паролей. Математики смогли снизить количество вычислений, необходимых для этой атаки на несколько порядков, однако это по прежнему актуальная бесконечность.

    Blowfish
    Алгоритм Blowfish не скомпрометирован пока ни в каком смысле. Кроме того, для его взлома нужно больше вычислений, а вероятность коллизий в нём меньше. Идентификатор $2 в начале строки пароля свидетельствует о применении данного алгоритма. Поле $04$ указывает на то, сколько проходов совершено при шифровании. (Внимание! Последняя фраза лишь догадка автора.)
    NT-hash
    Поле пароля устроено как в MD5, идентификатор алгоритма — $3. Обратите внимание: в случае использования алгоритма NT-hash соль не генерируется и хеши одинаковых паролей одинаковы! Я не знаю устройства этого алгоритма, но результат просто отвратителен! Данный эксперимент ставился в системе FreeBSD 6.1-RELEASE.
  • UID — идентификационный номер пользователя
  • GID — номер основной группы, которой принадлежит пользователь. Один пользователь может быть членом разных групп, но одна из них основная.
  • Класс пользователя — используется программой login(1) и другими для настройки характеристик учётной записи. С его помощью программы отыскивают свои настройки в базе /etc/login.conf(5) и устанавливают переменные окружения или делают иные настройки (см. Приложение F, /etc/login.conf(5)).
  • Время (в секундах от начала UNIX эры по гринвичу) когда истечёт срок действия пароля.
  • Время (в секундах от начала UNIX эры по гринвичу) когда истечёт время действия учётной записи.
  • 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
    

  1. Логин.
  2. В давние времена здесь писали пароль, сейчас это поле его не содержит, данный файл открыт на чтение всем.
  3. UID — идентификационный номер пользователя.
  4. GID — номер основний группы, которой принадлежит пользователь.
  5. GECOS: информация о пользователе.
  6. Домашний каталог пользователя.
  7. Стартовая оболочка пользователя.
/etc/pwd.db
Бинарная база содержащая в себе несекретную часть аутентификационной информации. Создаётся из /etc/master.passwd(5) командой pwd_mkdb(8).
/etc/spwd.db
Бинарная база содержащая в себе секретную часть аутентификационной информации. Создаётся из /etc/master.passwd(5) командой pwd_mkdb(8).

2.12.2. /etc/login.conf(5)

Данный файл является базой данных для различных программ, в том числе для программы 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

2.12.3. /etc/auth.conf(5)

В этом файле находятся умолчания, которые ипользует системная функция 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
desDES
md5MD5
blfBlowfish
nthNT-hash
oldDES
newsalt,<rounds> Newsalt; rounds — 24-битное целое, минимум 7250 (число проходов алгоритма).
blowfish,<rounds> Blowfish; rounds — от 4-х до 31-го (логарифм по основанию 2 от числа проходов алгоритма).

2.12.4. /etc/passwd.conf(5)

Данный файл присутствует только в 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 раза).

2.12.5. adduser(8)

Утилита adduser(8) предназначена для добавления пользователей в систему. Она может работать как интерактивно, так и из скриптов. Основной утилитой по управлению учётными записями является pw(8), она накладывает ограничение на длину пароля и т.п. Интерактивно вызванная утилита спрашивает у администратора имя пользователя, полное имя (GECOS) и др.

[Замечание]Замечание
Имя пользователя обычно не должно быть более 16 символов и должно состоять из букв и цифр. Эти ограничения наложены по историческим причинам, если вы хотите более длинные имена, вы можете переопределить переменную UT_NAMESIZE в <utmp.h> и пересобрать world. Однако после этого могут быть проблемы с бинарниками скомпилированными в других системах. Кроме того, NIS предполагает, что пароли бывают только 8-ми символьные.

2.12.6. Итого: Blowfish HOWTO

Суммируя сказанное выше, приведём краткое Blowfish HOWTO: как перевести базу паролей в формат Blowfish:

  1. В файл /etc/login.conf(5) в секции default: помещаем строки:
    default:
      :passwd_format=blf:
       
    По вкусу можем добавить строк мешающих создавать простые пароли (заметим, что в этом больше смысла, чем просто в включении шифрования Blowfish):
      :passwordtime=48d:
      :mixpasswordcase=true:
      :minpasswordlen=10:
      :idletime=60:
       
    (см. Приложение F, /etc/login.conf(5)).
  2. Перестраиваем базу:
    # cap_mkdb /etc/login.conf
       
  3. В файл /etc/auth.conf(8) добавляем строку
    crypt_default=blf
       
    Это необязательное, но желательное действие.
  4. Чтобы перекодировать пароли из текущих форматов в Blowfish, придётся заново ввести все пароли.

Обновлено: 12.03.2015