Pull to refresh

LDAP для интернет-проекта. Часть 4

Reading time3 min
Views8.8K
Прошу прощения за перерыв в написании последней части статьи, продолжаем!
Ссылки на остальные части: раз, два, три, пять
В этой части мы научимся авторизоваться на наших Linux/Unix серверах.

Как я уже говорил, не так сложно настроить авторизацию, насколько сложно спланировать структуру нашего каталога. У меня это сделано так:
Пользователей я храню в объектах типа posixAccount, unix-группы в объектах posixGroup.
Сами пользователи хранятся в контейнерах типа ou=developers,ou=shell-users,dc=habr,dc=ru

Сервера являются не объектами, а контейнерами, в которых хранятся объекты типа groupOfUniqueNames для определения доступа пользователей к данному серверу, объекты для прав sudo. Также там удобно хранить информацию об IP и прочее. Например, DN-объекта, в котором хранятся пользователи, имеющие доступ к сверверу:
cn=developers,ou=dev.habr.ru,ou=datacenter01,ou=servers,dc=habr,dc=ru
Мой пример может быть не удобен в вашем случае, так или иначе, нужно порисовать структуру.

Перейдём непосредственно к настройке:
Для авторизации используются модули nss_ldap и pam_ldap, разработанные компанией со звучным названием PADL.
Устанавливаем необходимые пакеты:
apt-get install libpam-ldap libnss-ldap
Установщик задаст следующие воросы:
  • LDAP URI — пишем ldap://ldap.habr.ru
  • База поиска — пишем ou=shell-users,dc=habr,dc=ru
  • Версия LDAP — 3
  • Local root database admin — нам не требуется, отвечаем Нет
  • Следующий вопрос про необходимость клона для локальной базы — отвечаем Нет
  • Аккаунт для управления LDAP — нам тоже не потребуется, у нас настроена авторизация для анонимных пользователей. Иначе, вводим cn=admin,dc=habr,dc=ru
  • И пароль для этого аккаунта, если в предыдущем пункте выбрали второе


Проверить настройку можно в файлах /etc/pam_ldap.conf и /etc/libnss-ldap.conf
У меня они одинаковые, поэтому я сделал символические ссылки:
ln -sf /etc/libnss-ldap.conf /etc/pam_ldap.conf
Если вводили пароль для администратора, то:
ln -sf /etc/libnss-ldap.secret /etc/pam_ldap.secret

Дальше нам нужно поправить конфигурацию PAM (будьте внимательны):
cat > /etc/pam.d/common-account << "EOF"
account required pam_ldap.so ignore_authinfo_unavail ignore_unknown_user
account required pam_unix.so
EOF


cat > /etc/pam.d/common-auth << "EOF"
auth sufficient pam_ldap.so
auth required pam_unix.so nullok_secure
EOF


cat > /etc/pam.d/common-password << "EOF"
password sufficient pam_ldap.so
password required pam_unix.so nullok obscure min=4 max=8 md5
EOF


cat > /etc/pam.d/common-session << "EOF"
session required pam_mkhomedir.so umask=0077 skel=/etc/skel/ silent #эта строка создаёт home-директорию, если её нет
session sufficient pam_ldap.so
session required pam_unix.so
EOF


Правим файл /etc/nsswitch.conf:
passwd: files ldap
group: files ldap
shadow: files ldap



Собственно после этого система будет пропускать любого пользователя, находящегося в ou=shell-users,dc=habr,dc=ru и ниже, но ведь нам нужно пускать пользователей по определённому признаку — тут есть несколько вариантов:
1.
Использовать groupOfUniqueNames и в /etc/pam_ldap.conf прописать следующие строки:
pam_groupdn cn=developers,ou=dev.habr.ru,ou=datacenter01,ou=servers,dc=habr,dc=ru
pam_member_attribute uniqueMember


Вроде бы всё хорошо, кроме того, что такая группа может быть только одна.
2.
Использовать дополнительный модуль PAM — pam_listfile или pam_succed_if
Эти модули умеют проверять пользователя по атрибутам user, group, rhost, tty…
Но тут группа будет posixGroup — это не очень удобно, хотя можно приспособиться. Мне не понравилось.
3.
Собственно это первый вариант, но со специальным патчем от padl.com, который позволяет использовать несколько записей pam_groupdn в конфигурации. Делается это примерно так:
apt-get install build-essential fakeroot dpkg-dev
cd /usr/src
apt-get source libpam-ldap
apt-get build-dep libpam-ldap
cd /usr/src/libpam-ldap-184 (может отличаться, в зависимости от версии debian)
wget "http://bugzilla.padl.com/attachment.cgi?id=227" -O - | sed s=orig/pam=pam= | sed s=new/pam=pam= > debian/patches/99pam_ldap.patch
dpkg-buildpackage -rfakeroot -uc -b
dpkg -i ../libpam-ldap*.deb


Для Debian Squeeze немного по-другому накладываются патчи:
wget -q "http://bugzilla.padl.com/attachment.cgi?id=227" -O - | sed s=orig/pam=pam= | sed s=new/pam=pam= > debian/patches/multi_groupdn
echo multi_groupdn >> debian/patches/series


Собственно всё.
Восстанавливаем наши символические ссылки на /etc/pam_ldap.conf (у меня dpkg их затрёт):
ln -sf /etc/libnss-ldap.conf /etc/pam_ldap.conf
ln -sf /etc/libnss-ldap.secret /etc/pam_ldap.secret
И прописываем нужные pam_groupdn:
pam_groupdn cn=developers,ou=dev.habr.ru,ou=datacenter01,ou=servers,dc=habr,dc=ru
pam_groupdn cn=admins,dc=habr,dc=ru



Проверяем авторизацию — радуемся.

Ещё остался вопрос про sudo, там довольно много материала — видимо придётся выйти за рамки 4-х топиков.
Спасибо за внимание!
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 5: ↑5 and ↓0+5
Comments6

Articles