Как многим известно, аутентификация в 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. По дефолту там стоит так:
Поэтому кроме пакета 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).
Нам понадобятся пакеты:
Затем надо войти в директорию:
Создаем файл dirs с описанием директорий, которые будут участвовать:
Далее просто впишите в файл debian/rules следующий конфиг:
Только вот надо поправить немного. Если скопировать отсюда текст, то вместо табов будет по 8 пробелов. Поправим:
Теперь приступим к сборке libnss-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/dirsecho "lib/security" >> debian/dirs
echo "/etc/pam_sqlite3.conf" > debian/conffilesКстати, надо не забыть его там создать:
cat > debian/pam_sqlite3.conf
database = /etc/sysdbОбращаю внимание, что у нас коннект к базе SQlite, так что пароля не будет в конфиге (в отличии от например libpam-mysql), а значит заморачиваться с правами нам не надо - секретов у нас нет.
table = account
user_column = user_name
pwd_column = user_password
expired_column = acc_expired
newtok_column = acc_new_pwreq
debug
Далее просто впишите в файл 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
Вернемся в исходную директорию:
Скачиваем исходники с сайта (они работают только с SQLite3, для старого SQLite не подойдут):cd /usr/src
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
Комментариев нет:
Отправить комментарий