Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> LDAP auth

Настройка аутентификации через LDAP.

Автор: fr33man.


Настроив LDAP сервер, я решил хранить всю информацию о пользователях в директориях LDAP. Тут же захотелось, чтобы все было завязано на LDAP и первым
моим шагом была настройка системы таким образом, чтобы она видела не только локальных пользователей, а еще и пользователей, которые
хранятся в LDAP'е. Чем я и занялся.

Установка необходимого софта.

Идем в порты, чтобы посмотреть нужные нам программы, конечно же предворительно обновив дерево портов.

/root/> cd /usr/ports/
/usr/ports/> make search name='nss_ldap'
Port:   nss_ldap-1.251
Path:   /usr/ports/net/nss_ldap
Info:   RFC 2307 NSS module
Maint:  kazakov@gmail.com
B-deps: gettext-0.14.5_2 gmake-3.81_1 libiconv-1.9.2_2 openldap-client-2.3.27
R-deps: openldap-client-2.3.27
WWW:    http://www.padl.com/OSS/nss_ldap.html

/usr/ports/> make search name='pam_ldap'
Port:   pam_ldap-1.8.2
Path:   /usr/ports/security/pam_ldap
Info:   A pam module for authenticating with LDAP
Maint:  marcus@FreeBSD.org
B-deps: gettext-0.14.5_2 gmake-3.81_1 libiconv-1.9.2_2 openldap-client-2.3.27
R-deps: openldap-client-2.3.27
WWW:    http://www.padl.com/OSS/pam_ldap.html

/usr/ports/>

nss_ldap нужен, для того, чтобы система видела пользователей, хранящихся в LDAP, а pam_ldap нужен
непосредственно для аутентификации пользователей.

Ставим...

/usr/ports/> cd /usr/ports/net/nss_ldap
/usr/ports/net/nss_ldap/> make install clean
...
...
/usr/ports/net/nss_ldap/> rehash
/usr/ports/net/nss_ldap/> cd /usr/ports/security/pam_ldap/
/usr/ports/security/pam_ldap/> make install clean
/usr/ports/security/pam_ldap/> rehash
/usr/ports/security/pam_ldap/>

Все, установилось.

Настройка.

Для начала давайте добавим следующие записи в LDAP:

users.ldif:

dn: ou=users,dc=l1523,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: users

fr33man.ldif

dn: cn=fr33man,ou=users,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: fr33man
sn: Vasiliy Ozerov
uid: fr33man
userPassword: {SSHA}WBsUosYPMQ1PPaJNp2728NL7P0/EXx5n
uidNumber: 5001
gidNumber: 0
gecos: Vasiliy Ozerov
homeDirectory: /home/fr33man
loginShell: /usr/local/bin/bash

Добавляем:

/root/> ldapadd -x -D "cn=root,dc=unix" -W \
? -H ldap://192.168.1.250 -f users.ldif
Enter LDAP Password:
adding new entry "ou=users,dc=l1523,dc=ru"

/root/> ldapadd -x -D "cn=root,dc=unix" -W \
? -H ldap://192.168.1.250 -f fr33man.ldif
Enter LDAP Password:
adding new entry "cn=fr33man,ou=users,dc=l1523,dc=ru"

/root/> 

Рихтуем /usr/local/etc/nss_ldap.conf:


# Корневой каталог LDAP сервера
base dc=l1523,dc=ru

# Если не удалось подключиться к LDAP,
# То не пытаться переподключиться
bind_policy soft

# Timeout подключения к LDAP серверу
bind_timelimit 10

# ip-адрес или hostname LDAP сервера
host 192.168.1.250

# nss_ldap закроет подключение, если сервер
# не ответит в указонное в idle_timelimit время
idle_timelimit 3600

# Версия протокола
ldap_version 3

# Описание каталогов, где хранятся группы, пользователи, пароли соответственно
nss_base_group  ou=groups,dc=l1523,dc=ru?one
nss_base_passwd ou=users,dc=l1523,dc=ru?one
nss_base_shadow ou=users,dc=l1523,dc=ru?one

# persist -- не отключаться от LDAP сервера
# oneshot -- отключаться после каждого запроса
nss_connect_policy persist

# Использовать страничный вывод
nss_paged_results yes


# Размер страницы
pagesize 1000

# Порт, на котором работает LDAP
port 389

# Область поиска
scope one

# Время ожидпния при поиске
timelimit 30

Теперь /etc/nsswitch.conf:


# Сначала ищем в файлах, потом в LDAP
group: files ldap

hosts: files dns
networks: files

# Сначала ищем в файлах, потом в LDAP
passwd: files ldap

# Сначала ищем в файлах, потом в LDAP
shadow: files ldap
shells: files

Проверяем, как все работает:

/usr/local/etc/> id fr33man
uid=5001(fr33man) gid=0(wheel) groups=0(wheel), 5001(People)
/usr/local/etc/> grep fr33man /etc/passwd
/usr/local/etc/>

Пользователь fr33man есть, но его нет в локальных базах.

Теперь переходим к настройке pam_ldap. Для этого редактируем /usr/local/etc/ldap.conf до такого состояния:


# host, где находится LDAP сервер
host 192.168.1.250

# URL LDAP сервера
uri ldap://192.168.1.250/

# Версия протокола
ldap_version 3

# Порт LDAP сервера
port 389

bind_timelimit 30
bind_policy soft
idle_timelimit 3600

# Фильтр поиска
pam_filter objectclass=posixAccount

# UID пользователя соответствует аттрибуту uid
pam_login_attribute uid

# Минимальный uid
pam_min_uid 1000

# Максимальный uid
pam_max_uid 65530

# Алгоритм хэша паролей
pam_password SSHA

nss_base_passwd ou=users,dc=l1523,dc=ru?one
nss_base_shadow ou=users,dc=l1523,dc=ru?one
nss_base_group          ou=groups,dc=l1523,dc=ru?one

Осталось указать сервисам login, sshd и тд. использовать модуль pam_ldap для аутентификации, для этого редактируем
/etc/pam.d/sshd и /etc/pam.d/ до такого состояния:

/etc/pam.d/sshd:

auth            required        pam_nologin.so          no_warn
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local

auth            sufficient        /usr/local/lib/pam_ldap.so    no_warn
auth            required        pam_unix.so             no_warn try_first_pass

account         required        pam_login_access.so
account         sufficient        /usr/local/lib/pam_ldap.so
account         required        pam_unix.so

session         required        pam_permit.so

password        sufficient        /usr/local/lib/pam_ldap.so              no_warn
password        required        pam_unix.so             no_warn try_first_pass

/etc/pam.d/system:


auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            sufficient      /usr/local/lib/pam_ldap.so
auth            required        pam_unix.so             no_warn try_first_pass nullok

account         required        pam_login_access.so
account         sufficient      /usr/local/lib/pam_ldap.so
account         required        pam_unix.so

session         required        pam_lastlog.so          no_fail

password        sufficient      /usr/local/lib/pam_ldap.so
password        required        pam_unix.so             no_warn try_first_pass

Теперь можно проверять, как это все работает. Попробуем зайти по ssh:


//> ssh localhost -l fr33man
Password:
Last login: Fri Sep 29 06:08:09 2006 from 127.0.0.1
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
        The Regents of the University of California.  All rights reserved.

[fr33man@backup ~]$ exit
logout
Connection to localhost closed.
//>

Пользователя fr33man мы не создавали локально, следовательно домашней директории для него нет. Поэтому можете содать домашнюю директорию, а
можете воспользоваться демоном amd(8).



размещено: 2006-11-08,
последнее обновление: 2006-11-08,
автор: fr33man


cookie, 2007-10-11 в 11:05:13

А где groups.ldif ?

Vitar, 2008-07-10 в 20:01:13

Стандартый вариант груп на базе posixGroup.

dn: ou=groups,dc=l1523,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: groups

dn: cn=fr33man,ou=groups,dc=l1523,dc=ru
cn: fr33man
gidNumber: 5001
objectClass: posixGroup
objectClass: top



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0434 секунд
Из них PHP: 34%; SQL: 66%; Число SQL-запросов: 77 шт.
Исходный размер: 26258; Сжатая: 6442