суббота, февраля 23, 2008

Аутентификация: pam_usb

Это уж двухлетней давности моя статья, сейчас с удивлением обнаружил, что в блоге ее не опубликовал. Исправляюсь ;)

Наткнулся я тут на весьма интересную штуку - pam_usb называется. Коротко говоря, она позволяет производить аутентификацию пользователей в системе не по паролю, а по криптографическому ключу на флэшке.

Во-первых, кто такой PAM?

PAM - это Plugable Authentithication Modules, т.е. подключаемые модули аутентификации. Идея состоит в том, что любая софтина, которой нужно аутентифицировать пользователя (напр.: login, passwd, sudo...) обращается к сервису PAM. Тот, в свою очередь, глядя в конфиг, по очереди обращается к указанным модулям, спрашивая у них - пускать или не пускать? Если напротив модуля стоит required, то "признание" этим модулем пользователя является условием необходимым, но не достаточным. Если стоит sufficient - значит, признания даже только одним этим модулем достаточно. Там еще много настроек указать можно...

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

PAM_USB

Это, как вы уже поняли, один из таких модулей. При попытке логина он ищет на указанном в конфиге устройстве файл вида /.auth/user.host, в хомяке пользователя - файл ~/.auth/id_pub, и проверяет их соответствие по алгоритму DSA.

Почему-то pam_usb нету в Debian, хотя распространяется он по GPL, и исходник весит 27Kb. Взять его можно на pamusb.org, жалко только, сайт в состоянии редизайна, и информации там по минимуму...

И еще: вообще-то, этому модулю пофиг, что вы ему укажете в качестве дивайса. С тем же успехом это может быть дискета или CD.

А нафига оно?

А вы еще не поняли? Пароль-то придумать ведь надо еще! Придумаешь простой - просто подобрать, придумаешь сложный - просто забыть. Про пароли, написанные карандашом на мониторе, я молчу. А носить всегда в кармане флэшку и выдергивать ее, уходя - все-таки гораздо легче, чем помнить пароль типа $KHYhguh(7438!

Как это сделать?

Итак, предположим, вы скачали и поставили пакет pam_usb. Что дальше делать?

Во-первых, надо сгенерировать ключи для нужных юзеров. Монтируем флэшку, скажем, в /mnt/flash, и говорим

# usbadm keygen /mnt/flash username 2048,

где username - это имя интересующего нас юзера, а 2048 - длина ключа. Повторяем это для всех нужных юзеров и отмонтируем флэшку.

Теперь надо настроить сам PAM. В директории /etc/pam.d лежат файлы, соответствующие программам, которые используют PAM: login, xdm, ... У меня в Debian'е все они включают (директивой @include) файл common-auth. В случае другого дистра, вероятно, придется поискать, куда именно вставлять интересующие нас строчки:

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

auth sufficient pam_usb.so check_device=-1 check_if_mounted=-1 force_device=/dev/transcend fs=vfat

auth required pam_unix.so nullok_secure

(где /dev/transcend - дивайс флэшки, а vfat - тип файловой системы на ней).

б) если мы хотим, чтобы в систему можно было зайти только по флэшке, зато без пароля:

auth required pam_usb.so check_device=-1 check_if_mounted=-1 force_device=/dev/transcend fs=vfat

в) наконец, если мы хотим, чтобы можно было зайти только при вставленной флэшке, и спрашивался пароль:

auth required pam_usb.so check_device=-1 check_if_mounted=-1 force_device=/dev/transcend fs=vfat

auth required pam_unix.so nullok_secure

Например, у меня сейчас в файле common-auth записаны строки из варианта а).

четверг, февраля 21, 2008

Про обучение программированию

Такой вот рассуждательный пост.

Мне со следующего учебного года, по всей видимости, предстоит обучать студентов программированию. Пока что это спецкурс, скорее факультативный, чем основной (хотя и непосредственно относящийся к специальности), на первом курсе. Называется - спортивное программирование. Звучит конечно круто, но приходится принимать во внимание два обстоятельства: 1) курс - всего 2 часа в неделю (2 академических часа в нашем вузе равняются 1-му астрономическому), 2) большинство (ок. 70%) поступающих к нам на физмат либо плохо знают Паскаль, либо вообще ничего из области программирования не знают. Из-за второго факта на дисциплине "Теория программирования" на первом курсе изучают Паскаль (до прошлого года - Turbo Pascal, сейчас, кажется, перешли на Free Pascal).

В связи со всем этим возникает, конечно, вопрос - как тут можно обучать спортивному программированию? Некоторые вещи я для себя уже уяснил, и продолжаю уяснять, думаю по мере накопления публиковать. Итак, чего я пока нарешал:

  1. Кому не надо - пусть гуляют. Мне вообще обучать кого-либо невыгодно, тем более я не собираюсь возиться с теми, у кого нет желания учиться.
  2. Знание какого-нибудь ЯП в спортивном (да любом) программировании нужно, но не является главным. С учетом того, что Паскалю их обучать будут параллельно, программировать видимо будем все на том же Паскале.
  3. За 27 астрономических часов, размазанных на весь учебный год, подготовить с нуля программиста-олимпийца невозможно никак. Так что от этой цели придется отказаться. Буду делать возможное - постараюсь мало-мальски подготовить желающих стать программистами к самообучению в нужном направлении.
  4. В данной ситуации "спортивное программирование" приходится интерпретировать как знание алгоритмов. Так что будем изучать алгоритмы, сколько успеем. Все остальное, что успею - "дополнительные сведения".
  5. Вопреки всем обстоятельствам, я хочу дать шанс талантливым ребятам, по случайности оказавшимся у нас. Поэтому по возможности буду включать в курс какие-то сведения, помогающие сориентироваться в мире современного программирования.
  6. Какие это могут быть сведения? На изучение, например, современных технологий программирования, у меня нет времени (и подготовка учащихся недостаточна). Перебором вариантов аналогично показывается, что не проходят идеи об изучении каких-либо конкретных разделов/технологий современного программирования (сверх "знания алгоритмов"). Из "дополнительных сведений" конкретные знания приходится исключить.
  7. Таким образом, из "дополнительных" сведений остаются только 1) сведения обзорного характера - хотя бы просто перечисление самых динамично развивающихся сейчас технологий и какая-нибудь попытка классификации языков программирования; 2) какие-то основополагающие, фундаментальные вещи, афористические формулировки - квинтэссенция полувекового опыта программирования; 3) знания, относящиеся не к практике и даже не к теории, а скорее к "философии программирования".

Для практикующих программистов: да, я сам программист, я знаю, что "нормальный программист" не занимается изучением "философии программирования", и чаще всего вообще не замечает ее существования. Это - знания, приходящие с опытом, и программисту кажется, что он это всегда знал, а для первокурсника это вовсе не очевидно. Сюда относится, например, "инстинкт модуляризации" - стремление разнести функциональность по модулям, классам, функциям, аспектам кажется опытному программисту естественным, а для изучающего Паскаль оно непонятно.

Пока что больше вопросов, чем ответов...

понедельник, февраля 11, 2008

Интерпретатор lambda-исчисления

В порядке самообразования решил поподробнее изучить λ-исчисление. Нашел несколько книжек и пр. Забавной показалась теорема о существовании неподвижной точки у любой функции. Решил "проверить", переписал Y-комбинатор из книжки на знакомом мне Haskell... Угу, фиг - его невозможно типизировать. Хотел было попробовать на Scheme, но сообразил, что типизация она и в scheme типизация. Тогда стал искать какой-нибудь язык, реализующий нетипизированное λ-исчисление, чтобы на нем можно было "поиграться" с примерами из книжек. Нашел только unlambda, который, как оказалось, реализует вовсе даже не лямбду, а комбинаторную логику, а синтаксис у него похож более всего на brainfuck. Вздохнул и решил писать что-то такое сам...

Вроде написал, и примеры из книжек на нем работают, но в сложных выражениях пока что вылезают баги при α-конверсии (переменные то переименуются, когда не надо, то наоборот). Надеюсь всё-таки допилить...

Подробности про язык тут, само поделие тут (Depends: python, python-ply; запускать ./pylambda.py в терминале).