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

       

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


Самый последний атрибут ночного сторожа, который нас интересует, это способность предотвращать. Это тот голос, который подсказывает: «Не стоит ставить на подоконник только что испеченный пирог, чтобы охладить его».

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

Цель, которую я преследую, состоит в предотвращении использования или хотя бы в уменьшении количества плохих паролей. Хорошие механизмы защиты становятся бесполезными из-за выбора плохих паролей. Паролем для возвращения в пещеру клана, скорее всего, было слово «ог». В наше время ситуация обостряется из-за повсеместного наплыва хитроумных программ для взлома паролей, таких как John the Ripper (Solar Designer, Солар Дизайнер), LOphtCrack (Mudge, Мадж и Weld Pond, Вельд Понд) и Crack (Alec Muffett, Алек Маффет)).

Единственный способ избежать уязвимости, которой подвержены ваши системы благодаря этим программам, - избавиться от плохих паролей. Вам нужно помочь пользователям получить пароли, которые сложно отгадать. Один из способов сделать это в Unix (хотя эту программу можно перенести и на NT, и на MacOS) - использовать libcrack, также написанную Алеком Маффетом. В процессе написания программы Crack Мяф-фет оказал огромную услугу системным администраторам, взяв несколько методов, используемых в Crack, и создав из них библиотеку проверки паролей, написанную на С.

В библиотеке имеется лишь одна функция для пользовательского интерфейса: FascistCheck(). Эта функция принимает двааргумента: строку для проверки и полный префикс пути для файла словаря, созданного при установке libcrack.

Функция возвращает либо NULL, если строка является «безопасным» паролем, либо объяснение, например, «это словарное слово» „ если пароль легко взломать. Было бы очень удобно, если бы существовала возможность использовать эту функциональность как часть программы на Perl, устанавливающей или меняющей пароли, так что давайте посмотрим, как можно написать модуль, применяя эту функцию. Нам потребуется заглянуть ненадолго в программу на С, но я обещаю, что это не займет много времени и пройдет безболезненно.




Первый наш шаг - собрать пакет libcrack с http://www.users.dlr-con.co.uk/~crypto/. Этот процесс подробно описан в дистрибутиве и не вызывает затруднений. Я лишь приведу пару советов:

  • Чем больше будет словарь, который вы соберете, тем лучше. Хороший источник для слов, которые можно включить в словарь, - это ftp://ftp.ox.ac.uk/pub/wordlists. Процесс сборки требует значительного дискового пространства (для процесса

    sort в utils/mkdict), имейте это в виду.


  • Убедитесь, что вы собираете ilbcrack при помощи тех же средств разработки, что и Perl. Например, если при компиляции Perl вы пользовались

    gcc, обязательно используйте gcc и при компиляции libcrack.



    Это справедливо для всех модулей, которые нужно связать с дополнительными библиотеками С.


  • После того как библиотека С libcrack.a собрана, необходимо выбрать метод для вызова функции FascistCheck() из Perl. Для создания подобной связи существует два популярных метода: XS и SWIG. Мы будем применять XS, т. к. его легко использовать для простых задач, и все необходимые для этого инструменты входят в состав дистрибутива Perl. Подробное сравнение этих двух методов можно найти в книге «Advanced Perl Programming» (Углубленное программирование на Perl) Шрирама Щринивасана (Sriram Srinivasan) (O'Reilly).

    Самый простой способ начать работать с XS - использовать программу h2xs для создания прототипа модуля:

    $ h2xs -A -n Cracklib

    Writing Cracklib/Cracklib.pm

    Writing Cracklib/Cracklib.xs

    Writing Cracklib/Makefile.PL

    Writing Cracklib/test.pi

    Writing Cracklib/Changes

    Writing Cracklib/MANIFEST

    Вот описание файлов, создаваемых этой командой (табл. 10.2). Таблица 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() везде, где нужно установить или сменить пароли. Если количество плохих паролей в вашей системе уменьшится, «ночной сторож» с удовольствием одобрит вас.






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