Perl для системного администрирования

       

Предотвращение подозрительных



Таблица 10.2. Файлы, созданные командой h2xs -A n Cracklib

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



Имя файла Описание
Cracklib/ Cracklib. рт Заглушка с прототипами и документацией
Cracklib/Cracklib.xs Склейка с кодом на С
Cracklib/Makefile.PL Код на Perl для создания файла Makefile
Cracklib /test.pl Тестовый код прототипа
Cracklib/Changes Документирование версий
Cracklib/MANIFEST Список файлов, входящих в состав модуля

char pw

char 'dictpatn

Директива PROTOTYPES создает Perl-прототипы для функций из этого файла. В программе, которую мы пишем, это не имеет значения, но мы включаем директиву для подавления предупреждений в процессе сборки.

Сразу же после определения функции мы описываем, как она вызывается и что возвращает:

CODE:

RETVAL = (char «)FascistCheck(pw,dictpath);

OUTPUT:

RETVAL

RETVAL - это настоящая склейка. Она представляет собой точку передачи между кодом на С и интерпретатором Perl. Именно тут мы говорим Perl, что он должен получить строку символов, возвращенную библиотечной функцией FascistCheck(), и сделать их доступными в качестве возвращаемого значения (т.е. OUTPUT) Perl-функции Cracklib: : Fas-cistCheck(). Больше нам не придется иметь дело с кодом на С.

В другом файле, который нужно поменять, мы изменим только одну строку. Нам требуется добавить еще один аргумент в вызов WriteMake-f ile() в Makefile.PL, чтобы убедиться, что Perl может найти файл ПЬ-crack.a. Вот как выглядит эта новая строка в нашем контексте:

'LIBS' => [''], tt например, '-1т'

'MYEXTLIB' => '/usr/local/lib/libcrack$(LIB_EXT)' tt местоположение cracklio

'DEFINE' => '', например DHAVE_SOMETHING'

Это тот минимум, который необходим для работы модуля. Если мы наберем:

perl Makefile.PL

make

make install

то сможем начать использовать наш модуль примерно так:

use Cracklib:

use Term: : ReadKey: tt для чтения паролей

Sdictpath = "/usr/local/etc/cracklib/pw_dict";

prL.t "Введите пароль: ":

RearJMode 2; tt отключаем зьвод символов ";;

chomp($pw = Headline):?} читаем пароль

ReadMode 0: tt возвращаем *езмл з поедьллцее :ост:)«"ие

print "\n" $result = Oacklib: : FascistCheck($pw Sclictpath); i f (df.'f". ""<: ?' f'S'i1

Но не стоит использовать этот модуль в таком виде. Давайте, перед тем как устанавливать модуль, доведем его до профессионального уровня.

Во-первых, добавим сценарий, позволяющий удостовериться, что модуль работает корректно. Сценарий должен вызывать нашу функцию с некоторыми известными значениями и сообщать каким-нибудь специфичным образом, получил ли он правильные ответы. В самом начале проверки нужно напечатать диапазон номеров тестов. Например, если мы собираемся провести 10 тестов, нужно сначала напечатать 1. 10. Затем для каждого выполняемого теста следует напечатать либо «ok », либо «not ok» и номер теста. Стандартная программа сборки модуля интерпретирует этот вывод и выводит пользователю итоги результатов проверки.

h2xs

предоставляет пример сценария проверки, который можно изменять. Создадим каталог t (стандартный каталог, назначенный по умолчанию для проверки модуля) и переименуем test.pl в t/cracklib.t. Вот фрагмент кода на Perl, который нужно добавить в конец t /crack-lib.t для выполнения ряда тестов:

местоположение файлов словарей Sclictpath = "/usr/local/etc/pw_dict";

проверочные строки и известные для них ответы cracklib %test =

("happy" => "it is too short",

"a" => "it's WAY too short",

"asdtasdf" => "it does not contain enough DIFFERENT characters"

"minicomputer" => "it is based on a dictionary word"

"ftm2tgr3fts" => ""):

Просматриваем в цикле все ключи из хэша. проверяя, возвращает

ли cracklib предполагаемые ответа. Если да. то пишем "ок", в

противном случае -- "not ok"

$tcst.iur = 2;

fo^each $pw (кеуз %test){

my (Sresult) = Crackiib::FascistCnecK($pw.Sdictpatn); if ((defined $гез„1:

ana Sresul-f c-q S:est{$p.';)) or (!ae!iriea Sresb.l: ctj StesiiSpw} eq "");' pri''t "0'' ". $':estnui!!++, "

else i

Всего было сделано шесть тестов (пять из хэша %test и проверка загрузки модуля), значит, нужно изменить строку из t/cracklib.t с:

BEGIN {$|=1: print "1. . 1\: ) на:

BEGIN {$|=1: print "1..6\"; }

Теперь можно набрать make test и Makefile и запустить программу проверки, чтобы убедиться, что модуль работает верно.

Разумеется, сценарий проверки очень важен, но наш сценарий вряд ли заслужит уважение, если мы пропустим такой решающий компонент, как документацию. Потратьте время и дополните файлы Cracklib.pm и Changes, заменив заглушки на полезную информацию о модуле. Также неплохо добавить файл README или INSTALL, в котором рассказано, как собрать модуль, где найти нужные компоненты, такие как libcrack, приведены примеры программ и т. д. Об этих новых файлах и переименовании файла test.pl нужно сказать в файле MANIFEST, чтобы не вводить в заблуждение программу компиляции модуля.

Наконец, установите модуль там, где нужно. Используйте вызовы Cracklib: : FascistCheck() везде, где нужно установить или сменить пароли. Если количество плохих паролей в вашей системе уменьшится, «ночной сторож» с удовольствием одобрит вас.



Содержание раздела