среда, 20 августа 2014 г.

Модный апач и добрый пиколисп

В общем, так вышло, что пришлось обновляться. Обновился также и апач до версии 2.4. В старой версии 2.2 ещё продолжал работать модуль mod_auth_pam и было очень удобно, что я имел аутентификацию такую же, как и системную. В новой версии этот модуль за каким-то лядом выпили и всё перестало работать. Ну ляд там вполне понятный, конечно, кривой код, кривой в итоге модуль. Рекомендовали вместо этого использовать mod_authnz_external. Это, конечно, не то, но тоже решение. Программка pwauth для проверки пользователя по паролю была в комплекте, а вот ещё нужная вещь ограничение по группам пользователя не нашлось. Но нашёлся какой-то перловый скрипт, который шёл в исходниках этого модуля, который почему-то не заработал. Может, поэтому его и не включили в дистрибутивный пакет. Пришлось писать. Основная идея - берем с помощью getent группы и пользователей и создаём списки групп, куда входят как пользователи, которые участвют в списке, так и те, чья группа является основной.
Для реализации пришлось думать что брать. Нужно было, чтобы можно было обрабатывать списки (lisp, ну как же) и при этом чтобы можно было легко и прозрачно взаимодействовать с системой. В прошлом мне нравился Scheme Shell, но его судьба мне теперь неизвестна, вроде на 64 битных платформах с ним туго, хотя, вроде, есть multiarch, но привлёк некий picolisp - с очень свежим (или не очень) взглядом на мир. В общем, в целом обычный лисп, команды относительно удобно вызываются. Пример вызова "getent passwd":

(in (list 'getent "passwd")
  <какие-то действия>)
 Ну а дальше дело пошло. :) В общем, вот целиком готовый скрипт. Ну и как у меня выглядит конфиг апача, раз уж речь о нём тоже зашла. Это в конфиге virtualhost.
        # External auth
        DefineExternalAuth sysauth pipe /usr/sbin/pwauth
        DefineExternalGroup sysgroup pipe /usr/local/sbin/sysgroup
 А это в конфиге уже непосредственно того ресурса, который нужно разграничивать:
        AuthType Basic
        AuthBasicProvider external
        AuthExternal sysauth
        GroupExternal sysgroup
        AuthName "BAZON.RU projects"

        require external-group developers

2 комментария:

  1. Делал похожую штуку для plain text авторизации, взял ракету с компиляцией в натив.

    ОтветитьУдалить
    Ответы
    1. Ракета уже в натив умеет компиляться? Круто.

      Удалить