Описание: Кандидат 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
            