Настройка LDAP-клиента под Solaris

Date September 7th, 2011 Author Vitaly Agapov

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

– Станислав Лем «Солярис»

solaris ldap
Рассмотрим, как интегрировать Solaris с директорией каталогов. То есть настроим LDAP-клиента, который позволит нам производить авторизацию пользователей и создавать домашние директории для тех, кто логинится впервые. Всё это осуществляется с помощью модуля PAM_ldap, но с некоторыми особенностями, способными поставить в тупик человека, который уже настраивал LDAP-клиентов под Linux.

Итак, где-то уже стоит OpenLDAP-сервер. Мы знаем uid и пароль пользователя с доступом к нужным веткам каталога. Начнём.

1. Подготовка LDAP-сервера.

Для LDAP-клиента под Solaris надо предусмотреть несколько вещей. Во-первых, LDAP-клиент перед тем, как забиндиться на сервер, будет спрашивать у него атрибуты из dn.base (supportedSASLMechanisms и supportedControl). Поэтому надо проверить, что ldap-сервер эти атрибуты нормально отдаёт:

$ ldapsearch -x -b "" -s base -h 172.17.0.16 '(objectclass=*)' supportedSASLMechanisms supportedControl
supportedControl: 1.3.6.1.1.13.1
supportedControl: 1.3.6.1.1.12
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: CRAM-MD5

За эту фичу OpenLDAP отвечает строчка в slapd.conf:

access to dn.base="" by * read

Во-вторых, надо удостовериться, что у пользователей в каталоге присутствует objectClass shadowAccount. Без него пользователь залогиниться не сможет.

2. Настройка LDAP-клиента

Конфигурирование ldap-клиента производится командой:

ldapclient manual -v \
-a credentialLevel=proxy \ 
-a defaultsearchbase=dc=example,dc=com \ 
-a proxyDN=uid=manager,dc=example,dc=com \ 
-a proxyPassword=our_secret_password \ 
-a authenticationMethod=simple \ 
-a defaultServerList=<server_addr>

Он сам сделает все настройки, поправит файлы. Главное – в выхлопе смотреть, чтобы не было ошибок. Резервные копии конфигов он скинет в /var/ldap/restore/

# getent passwd
...
test:x:10009:9100::/home/test:/bin/bash
...

Правим строчку в /etc/nsswitch.conf:

hosts:      dns [NOTFOUND=return] files

Да и вообще в /etc/nsswitch.conf лучше убрать ldap отовсюду кроме passwd и group.

Для возможности дебага прописать в /etc/syslog.conf:

auth.debug /var/log/authlog

3. Автосоздание домашней директории

Дальше – самое интересное. Если нужно автосоздание домашней директории, то придётся компилить линуксовый pam_mkhomedir, так как чуваки из Sun портировать его или делать аналог не хотят. Но так как у нас атрибут homeDirectory в LDAP’е прописан в расчёте на нормальные системы, то есть в виде /home/username, а Солярка в /home/ создавать директории не даёт и а хомяки хранит по умолчанию в /export/home, то придётся перед компилированием залезть внутрь.

wget http://www.kernel.org/pub/linux/libs/pam/pre/library/Linux-PAM-0.81.tar.bz2
bzip2 -d Linux-PAM-0.81.tar.bz2
tar -xvf Linux-PAM-0.81.tar
cd Linux-PAM-0.81
vi modules/pam_mkhomedir/pam_mkhomedir.c

Здесь ищем определение функции static int create_homedir и вставляем в самое начало функции:

char newdest[BUFSIZ];
snprintf(newdest, sizeof(newdest), "/export%s", dest);

Затем надо поменять

if (snprintf(remark,sizeof(remark),"Creating directory '%s'.", dest) == -1)

на

if (snprintf(remark,sizeof(remark),"Creating directory '%s'.", newdest) == -1)

и

if (rec_mkdir (dest,0755) != 0)
{
_log_err(LOG_DEBUG, "unable to create directory %s",dest);
return PAM_PERM_DENIED;
}

на

if (rec_mkdir (newdest,0755) != 0)
{
_log_err(LOG_DEBUG, "unable to create directory %s",newdest);
return PAM_PERM_DENIED;
}

Поехали дальше.

./configure
cp _pam_aconf.h libpam/include/security cd modules/pammodutil
gcc -c -O2 -D_REENTRANT -DPAM_DYNAMIC -Wall -fPIC -I../../libpam/include
gcc -c -O2 -D_REENTRANT -DPAM_DYNAMIC -Wall -fPIC -I../../libpam/include -I../../libpamc/include -Iinclude modutil_cleanup.c
gcc -c -O2 -D_REENTRANT -DPAM_DYNAMIC -Wall -fPIC -I../../libpam/include -I../../libpamc/include -Iinclude modutil_ioloop.c
gcc -c -O2 -D_REENTRANT -DPAM_DYNAMIC -Wall -fPIC -I../../libpam/include -I../../libpamc/include -Iinclude modutil_getpwnam.c -D_POSIX_PTHREAD_SEMANTICS
cd ../pam_mkhomedir
gcc -c -O2 -D_REENTRANT -DPAM_DYNAMIC -Wall -fPIC -I../../libpam/include -I../../libpamc/include -I../pammodutil/include pam_mkhomedir.c
ld -o pam_mkhomedir.so -B dynamic -G -lc pam_mkhomedir.o ../pammodutil/modutil_*.o
cp pam_mkhomedir.so /usr/lib/security/pam_mkhomedir.so.1
cd /usr/lib/security/
ln -s pam_mkhomedir.so.1 pam_mkhomedir.so

Прописываем модуль в /etc/pam.conf:

other session required pam_mkhomedir.so skel=/etc/skel umask=0022

Настравиваем autofs на монтирование хомяка из /export/home/username в /home/username, чтобы ldap’овый пользователь нормально работал. В /etc/auto_master:

+auto_master /net            -hosts          -nosuid,nobrowse /home           auto_home       -nobrowse

В /etc/auto_home:

+auto_home * localhost:/export/home/&

И запускаем autofs:

svcadm enable autofs

4. Sudo

Если после установки sudo и правки /usr/local/etc/sudoers попытки выполнить команду приводят к ошибкам:

$ sudo bash ld.so.1: sudo: fatal: relocation error: file /usr/lib/security/pam_mkhomedir.so: symbol pam_get_item: referenced symbol not found

То в /etc/pam.conf надо создать новую секцию для sudo без подключения модуля pam_mkhomedir.so:

sudo session required pam_unix_session.so.1

Tags: ,
Category: Solaris | 1 Comment »

Comments

Один комментарий на “Настройка LDAP-клиента под Solaris”

  1. non7top

    спасибо за №4

Leave a comment

 Comment Form