07.05.2012

Сборка пакета PAM-SQLite и NSS-SQLite

Как многим известно, аутентификация в Linux проходит централизованно в PAM. Стандартно PAM использует файлы /etc/passwd (и еще несколько: shadow, group,  и т.д.). В крупных компаниях предпочитают держать пользователей не в файлах, а в LDAP. Но если Вы пишете свое приложение, то наверняка хотите хранить пользователей в базе. Для MySQL и PostgreSQL в репозиториях Debian есть стандартные пакеты libpam-mysql и libpam-pgsql. Но что делать, если пользователи живут в SQlite? Об этом ниже, а пока небольшая вводная, важная к прочтению:

Подразумевается, что читатель знает разницу между аутентификацией и авторизацией.

Процесс происходит примерно так (рассмотрим на примере SSH). Демон SSH принимает соединение с логином и паролем.
Теперь перед SSH-демоном две задачи:
1) Identity. Установить, что пользователь вообще существует.
(это делается на первом слое: NSS)
2) Authnetication. Проверить его пароль.
(это делается на втором слое: PAM, если конечно в /etc/ssh/sshd_config стоит настройка "UsePAM yes" ).

Далее, через систему NSS он смотрит настройки. Находятся они в файле /etc/nsswitch.conf. По дефолту там стоит так:

passwd:         compat
group:           compat
shadow:        compat
compat - значит локальные файл (/etc/passwd,/etc/shadow,/etc/group)
Можно добавить своё, например:
passwd:         compat   ldap   sqlite
group:           compat   ldap   sqlite
shadow:        compat   ldap   sqlite
В таком случае система сначала будет искать пользователя в файлах, если нет, то в LDAP и наконец в SQLite.

Поэтому кроме пакета libpam-sqlite вам понадобится еще пакет libnss-sqlite, чтобы NSS вообще понимал такую инструкцию как "sqlite".

====
Теперь разберемся откуда брать код.
Поиск кода обоих приложений (libnss-sqlite и libpam-sqlite) приводит на аккаунт github Sectoid. Но ведет его достаточно вяло. libpam-sqlite остановился на версии 0.3. Эта версия поддерживает SQLite2, а вот SQLite3 - нет.
Версию 0.3 уже, в свою очередь форкнул ip1981 и добавил в неё поддержку SQLite3, назвав ее версией 0.4.
Но я внезапно нашел вот уже версию 1.0.1 (с поддержкой SQLite3).



Нам понадобятся пакеты:
apt-get install libpam0g-dev libmhash-dev libsqlite0-dev
И инструменты сборки:
apt-get install dh-make dpatch devscripts autoconf  shtool libtool
Переходим в директорию, где будем работать:
cd /usr/src
Скачиваем исходники с сайта:
git clone https://github.com/dtjm/pam_sqlite3.git libpam-sqlite-1.0.1



Затем надо войти в директорию:
cd libpam-sqlite-1.0.1
И дебианизировать исходники:
dh_make -s --indep --createorig
Теперь нужно поправить строки в debian/control. Мейнтейнера только своего оставьте, а не меня:
cat > debian/control

Source: libpam-sqlite
Section: admin
Priority: extra
Maintainer: Michael L Abramovich <michael.abramovich@nodesquad.com>
Build-Depends: debhelper (>= 8.0.0)
Standards-Version: 3.9.3
Homepage: https://github.com/dtjm/pam_sqlite3

Package: libpam-sqlite
Architecture: i386
Depends: ${misc:Depends}, sqlite, libmhash2, libnss-sqlite
Description: PAM module allowing authentication from a SQLite3 database
 This module provides support to authenticate against SQLite
 tables for PAM-enabled appliations.

Теперь надо конфиг добавить в пакет.
Создаем файл dirs с описанием директорий, которые будут участвовать:
echo "etc" > debian/dirs 
echo "lib/security" >> debian/dirs
И запишем, что там лежит наш конфиг:
echo "/etc/pam_sqlite3.conf" > debian/conffiles
Кстати, надо не забыть его там создать:
cat > debian/pam_sqlite3.conf
database        = /etc/sysdb
table           = account
user_column     = user_name
pwd_column      = user_password
expired_column  = acc_expired
newtok_column   = acc_new_pwreq
debug
Обращаю внимание, что у нас коннект к базе SQlite, так что пароля не будет в конфиге (в отличии от например libpam-mysql), а значит заморачиваться с правами нам не надо - секретов у нас нет.

Далее просто впишите в файл debian/rules следующий конфиг:
cat > debian/rules 
#!/usr/bin/make -f
# -*- makefile -*-

include /usr/share/dpatch/dpatch.make

arrange: arrange-stamp
arrange-stamp: install
        touch arrange-stamp

binary: binary-stamp
binary-stamp: binary-arch binary-indep
        touch binary-stamp

binary-arch: binary-arch-stamp
binary-arch-stamp: arrange
        dh_testdir
        dh_testroot
        dh_installdocs
        dh_installdebconf
        #dh_installchangelogs ChangeLog upstream
        dh_link
        dh_shlibdeps
        dh_strip
        dh_compress
        dh_fixperms
        dh_installdeb
        dh_gencontrol
        dh_md5sums
        dh_builddeb
        touch binary-arch-stamp

binary-indep: binary-indep-stamp
binary-indep-stamp: arrange
        touch binary-indep-stamp

build: build-stamp patch
build-stamp: config
        dh_testdir
        $(MAKE)
        touch build-stamp

clean: unpatch
        dh_testdir
        dh_testroot
        -$(MAKE) distclean
        dh_clean arrange-stamp binary-stamp binary-arch-stamp binary-indep-stamp build-stamp config-stamp install-stamp

config: config-stamp
config-stamp:
        dh_testdir
        ./configure --prefix=/usr --with-openssl --with-pam_mods_dir=/lib/security --with-pam=/usr
        touch config-stamp

install: install-stamp
install-stamp: build
        dh_testdir
        dh_installdirs
        $(MAKE) install DESTDIR=$(CURDIR)/debian/libpam-sqlite
        # No, we _definitely_ don't need libtool's .la files in lib/security
        rm -f debian/libpam-sqlite/lib/security/pam_sqlite.la
        install -m 600 debian/pam_sqlite3.conf debian/libpam-sqlite/etc
        install -m 444 pam_sqlite3.so debian/libpam-sqlite/lib/security
        touch install-stamp

.PHONY: build clean binary-indep binary-arch binary install force-clean

Только вот надо поправить немного. Если скопировать отсюда текст, то вместо табов будет по 8 пробелов. Поправим:
sed -i 's/        /\t/g'  debian/rules
Теперь соберем наконец наш пакет:
debuild -us -uc


Теперь приступим к сборке libnss-sqlite

Вернемся в исходную директорию:
cd /usr/src
Скачиваем исходники с сайта (они работают только с SQLite3, для старого SQLite не подойдут):
git clone https://github.com/Sectoid/libnss-sqlite.git libnss-sqlite-0.2
Переходим в нужную директорию:
cd libnss-sqlite-0.2
Запускаем первоначальную настройку (вообще она есть в debian/rules, но на всякий случай):
./bootstrap.sh
Укажем в debian/rules где находятся база с пользователями (аналог /etc/passwd и /etc/group) и база паролей (аналог /etc/shadow). В моем случае и то и то хранится в одной базе:
vi +36 debian/rules
Ну и соберем это дело:
debuild -us -uc










Комментариев нет:

Отправить комментарий