Улучшение паролей пользователей с apg (FreeBSD)


Dru Lavigne
перевод Евгения Чайкина aka StraNNick


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

apg, или автоматический генератор пароля, заинтриговал меня, поскольку он поддерживает протокол pwdgen, определенный RFC 972. Да, я знаю, мне нужно выходить более часто, но интересно то, что хотя этот протокол доступен с 1986, большинство людей никогда не слышали о нём и не имели возможности использовать его в сети.

Давайте установим это приложение и увидим, какую пользу оно может принести:
% cd /usr/ports/security/apg
% make install clean

Порт установил три утилиты: клиент apg, сервер apgd, и менеджер Bloom-фильтра, apgbfm. Каждая утилита имеет соответствующий manpage, битком набитый примерами и полезными URL-ами для дополнительного чтения.

Один из URL ссылается на NIST, Национальный Институт Стандартов и Технологии (NIST известен своими наилучшим методами безопасности), другой на - FIPS (Федеральный Стандарт по Обработке Информации). Остальные URL рассказывают о применении Bloom-фильтра.

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

UlmIrrors1 (Ulm-Irr-ors-ONE)
ziadrotAw (zia-drot-Aw)
FoacodCurt (Foac-od-Curt)
wroztAm1 (wrozt-Am-ONE)
HeudIfpyd9 (Heud-If-pyd-NINE)
BeshDaftem (Besh-Daft-em)

По умолчанию apg создает пароли длиной от восьми до десяти символов, использующих как верхний, так и нижний регистр. Тем не менее, вы можете использовать дополнительные ключи, чтобы соответствовать любой парольной политике. Например, чтобы принудительно включить символы:
% apg -MS -t

loce>fruo (loc-e-GREATER_THAN-fruo)
afmisbol: (af-mis-bol-COLON)
pamob(ocon (pam-ob-LEFT_PARENTHESIS-oc-on)
swotbuad# (swot-bu-ad-CROSSHATCH)
naynalwak) (nayn-al-wak-RIGHT_PARENTHESIS)
cravser- (crav-ser-HYPHEN)

Для уверенности в том, что каждый пароль будет длиной 14 символов, определите 14 минимумом (-m) и максимумом (-x) длины:
% apg -MS -m14 -x14 -t

Если ваша политика паролей настаивает на действительно произвольных паролях, которые могут быть непроизносимыми, используйте -a1 вместо -МС:
% apg -a1 -m14 -x14

V/u|X@/qO%y;`r
ux:S};"JRCf]I8
LLV5lb!WY5qH!9
-vUY&x6Lj+:IO^
m(X2R.I`C2["Mi
jO%H3w1ZMRnZTj

Хммм. Я думаю, лучше я займусь произносимыми паролями.

apg также поддерживает способность проверять произвольно сгенерированные пароли атакой по словарю как с помощью словарного файла, так и с помощью Bloom-фильтра. Если при создании произвольного пароля найдётся совпадение в любом из файлов, apg отбросит это и сгенерирует другой пароль.

Ваша система FreeBSD поставляется со словарным файлом, который находится в /usr/share/dicts/words. Если этого файла нет в вашей конкретной системе, вы можете установить его, используя /stand/sysinstall, выбрав configure, затемdistributions и выбирая dict. Этот файл отсортирован по алфавиту и хранится в кодировке ASCII, что означает, что вы можете добавить ваши собственные слова. В общем, слова добавляются так:
R00t
r00t
r00T

и так далее, поскольку слова чувствительны к регистру. Рекомендовано, чтобы вы потратили некоторое время, добавляя слова, которых вы не хотите в качестве паролей в вашей сети. Как только вы закончите, заключите apg в двойные кавычки и сверьте с вашим словарным файлом используя ключ -r и определяя имя файла:
% apg -MS -m14 -x14 -t -r /usr/share/dict/words

Ещё лучше, найдите время, чтобы создавать Bloom файл. Утилита потребует от вас определить как имя словаря, так и желаемое имя Bloom-файла:
% apgbfm -d /usr/share/dict/words -f ~/bloomfile
Counting words in dictionary. Please wait...

Эта команда может быть запущена обычным пользователем. В данном случае, я решила создать Bloom файл в своем домашнем каталоге. Как только файл будет сгенерирован, используйте ключ -b, чтобы сообщить apg где расположен Bloom файл:
% apg -MS -m14 -x14 -t -b ~/bloom

Если вы попробуете оба ключа -r и -b с apg, вы обнаружите, что Bloom файл - значительно быстрее, так как он использует алгоритм, чтобы определять может ли быть пароль обнаруженным в словарном файле.

Последний ключ, который я упомяну, будет -s, (seed) ключ. Этот ключ рекомендован, так как он дает генератору случайных чисел начальное значение:
% apg -MS -m14 -x14 -t -b ~/bloom -s
Please enter some random data (only first eight are significant)
(eg. your old password):>
jasvafwabvoud, (jas-vaf-wab-voud-COMMA)
rhylpoj:oruch~ (rhylp-oj-COLON-or-uch-TILDE)
dibogcewbowug{ (dib-og-cewb-ow-ug-LEFT_BRACE)
abun`frelfoksi (ab-un-GRAVE-frelf-oks-i)
dircunittanas" (dirc-un-itt-an-as-QUOTATION_MARK)
rhaph"drockeet (rhaph-QUOTATION_MARK-droc-keet)

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

Для тех кто предпочитает графические утилиты, автор apg выпустил также front-end tkAPG. Порта для этой утилиты не существует, но она легко установится на вашу систему FreeBSD. Скачайте исходники. Как только вы загрузили файл, разархивируйте его и перейдите во вновь созданный каталог:
% tar xzvf tkapg-0.0.2a.tar.gz
% cd tkapg-0.0.2a

Этот каталог содержит файл README и файл сценария, именуемый tkapg. Откройте сценарий в вашем любимом редакторе и замените строку:
exec wish "$0" "$@"

на:
exec /usr/local/bin/wish8.3 "$0" "$@"

Как только вы сохранили изменения, перейдите в X Window, откройте xterm, перейдите в каталог tkapg-0.0.2a и введите:
% ./tkapg

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

Если вы решите заняться командной строкой, вы можете создать сценарий оболочки так, чтобы не забывать заносить все ваши выборы. Здесь я модифицировала предложение из man apg, чтобы включать свои желаемые выборы:
% vi ~dlavigne6/bin/pwgen.sh

#!/bin/sh
apg -MS -m14 -x14 -t -b /usr/home/dlavigne6/bloom -s

Как только я сохраню этот файл, мне нужно сделать его исполняемым:
% chmod +x ~dlavigne6/bin/pwgen.sh

Когда я хочу сгенерировать произвольные пароли, я просто набираю:
% pwgen.sh

Если вы хотите протестировать ваш сценарий немедленно и вы используете C-shell, наберите rehash, иначе она не найдет вашу новую программу.

Другая альтернатива - создать псевдоним для команды apg. Поскольку я планирую использование apg на одной машине и я всегда работаю в C-shell, я добавила такую строку в ~/.cshrc:
% alias apg /usr/local/bin/apg -MS -m14 -x14 -t
-b /usr/home/dlavigne6/bloom -s

Теперь, всякий раз, когда я набираю apg, он автоматически использует все мои желаемые ключи. Кроме того, если вы хотите протестировать ваш псевдоним немедленно, скажите оболочке C перечитывать свой файл конфигурации:
% source ~dlavigne6/.cshrc

Вплоть до этого момента, мы концентрировались на apg клиенте, что означает, что мы пока не использовали протокол pwdgen. Подобно любому TCP/IP протоколу, pwdgen требует как компонент клиента, так и компонент сервера. Работа компонента сервера - слушать запросы клиента на своем порту. Чтобы определять, на каком именно, выполняем:
% grep pwdgen /etc/services
pwdgen 129/tcp #Password Generator Protocol
pwdgen 129/udp #Password Generator Protocol

Этот сервис запущен демоном inetd, для чего вам понадобится root-ом отредактировать файл /etc/inetd.conf, чтобы он включал эту строку:
pwdgen stream tcp nowait root /usr/local/sbin/apgd apgd

Как только вы сохранили изменения, просто наберите inetd, чтобы запустить сервис. Кроме того, если у вас уже запущен inetd для других сервисов, перезапустите его:
% killall -1 inetd

Эта команда должна показывать inetd прослушивающий порт TCP 129:
% sockstat -4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root inetd 92412 4 tcp4 *:129 *:*

Преимущество использования apgd - то, что вам не нужно устанавливать порт apg на каждом пользовательском компьютере. Когда пользователям нужно генерировать произвольные пароли, они просто соединяются с портом 129 на сервере apgd. В этом примере apgd работает на сервере с IP-адресом 10.0.0.1:
% telnet 10.0.0.1 129
Trying 10.0.0.1...
Connected to 10.0.0.1.
Escape character is '^]'.
AilEjmacGa
yotgakki
DrehojOird
yejBabif
albEifia
jolnapt6
Connection closed by foreign host.

Обратите внимание на несколько вещей. Прежде всего, не дёргайтесь из-за слова telnet. Небезопасный telnet сервис не запущен на 10.0.0.1. Просто я использовала telnet, чтобы напрямую связаться с портом 129 pwdgen. В сущности, telnet действует как apg клиент.

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

Давайте посмотрим поближе на сгенерированные пароли. Помните, когда я добавляла строку к /etc/inetd.conf, я не включала никаких ключей на apgd. Это означает, что я получила по умолчанию от восьми до десяти букв без символов. Также отметьте отсутствие правил произношения, поскольку я не включала -t в своем inetd.

Наверное, лучше изменить эти умолчания, чтобы включить ключи, соответствующие моим сетевым парольным политикам:
pwdgen stream tcp nowait root /usr/local/sbin/apgd
apgd -MS -m14 -x14 -t -b /usr/local/etc/bloom

Обратите внимание, что теперь это одна очень длинная линия (перенос сделан для этой статьи). Убедитесь, что вы не используете редактор, который пытается разбить это на две линии. Я также создала Bloom файл в директории, которая доступна всем пользователям, а не в одной домашнем каталоге конкретного пользователя. Обратите внимание также на отсутствие ключа -s; к несчастью, этот выбор невозможен с apgd.

Наконец, я также должна сообщить inetd об изменениях:
% killall -1 inetd

Теперь, когда пользователь присоединяется к серверу apgd, происходит следующее:
% telnet 10.0.0.1 129
Trying 10.0.0.1...
Connected to 10.0.0.1.
Escape character is '^]'.
yeog-flaysdok: (ye-og-HYPHEN-flays-dok-COLON)
caijpyfratcef| (caij-py-frat-cef-VERTICAL_BAR)
ajyafdiwubaig] (aj-yaf-di-wub-aig-RIGHT_BRACKET)
nohoktegrogib( (no-hok-te-grog-ib-LEFT_PARENTHESIS)
nobkarcyonnip= (nob-karc-yonn-ip-EQUAL_SIGN)
hirkadlarjiaf[ (hirk-ad-larj-iaf-LEFT_BRACKET)
Connection closed by foreign host.

Если вы решите использовать сервер apgd, вы можете также изменить /etc/syslog.conf чтобы следить когда пользователи используют эту услугу. Давайте посмотрим, что случится, если я добавляю эти строки в конец /etc/syslog.conf:
!apgd
*.info /var/log/apgd.log

Чтобы сообщить syslog о наших изменениях:
% killall -1 syslogd
Oct 19 12:40:36 syslogd: /var/log/apgd.log: No such file or directory

Ой. Я забыла создать этот log-файл:
% touch /var/log/apgd.log
% killall -1 syslogd

Далее, я проверю результат, присоединившись к серверу apgd:
% telnet localhost 129
<output snipped>

и найду это подсоединение в логе:
% more /var/log/apgd.log
Oct 19 12:43:01 genisis apgd[92692]:
password generation request from 127.0.0.1.49334

Это не самое длинное описание регистрации входа. У меня есть запись с IP адресом, в данном случае это localhost, использованным протоколом pwdgen и временем.

Я надеюсь, что мне удалось уговорить вас начать использовать генерацию случайных паролей. Если вы планируете попробовать это на вашей системе или в небольшой сети, вы можете предпочесть устанавливать порт apg на каждом компьютере. Для большей сети, установите и сконфигурируйте apgd на одном из ваших серверов и покажите вашим пользователям, как подключаться к порту 129

http://www.onlamp.com/lpt/a/4298

Обновлено: 12.03.2015