вторник, 10 мая 2011 г.

Сервер LDAP аутентификации для SSH

Недавно столкнулся с проблемой, когда количество систем и пользователей постепенно увеличивается, а управлять всей этой растущей структурой становится все сложней. Каждый раз приходится настраивать новую инсталляцию сервера с нуля: создавать учетные записи, задавать соответствующие пароли, выставлять необходимые права доступа и т.д. Естественно вся эта рутина настораживает и никакой речи об эффективности управления и быть не может. Ведь не секрет что, намного удобнее хранить всех пользователей и группы - централизованно. В данной статье я выложу готовое решение для настройки сервера аутентификации OpenLDAP для SSH соединений. Мне известно о коммерческих продуктах, но на данный момент, мы соберем проверенное решение на базе открытого OpenLDAP.


Подготавливаем сервер LDAP, устанавливая необходимые пакеты

# yum install openldap{-servers,-clients,-devel,} nss_ldap

Сделайте запись о вашем LDAP сервере в файле /etc/hosts
В моем случае он выглядел так:

# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
10.2.10.100 ldap.domain.com ldap

Выставляем рутовый пароль LDAP

# slappasswd
pass:
confirm:
{SSHA}AdOU1S01Nj+gQ4cGHf8gCfm9ENETu3i2


Получив хеш-пароля, необходимо его скопировать в буффер. Далее мы редактируем конфигурационный файл openldap

# vi /etc/openldap/slapd.conf
 ...
database bdb       # Тип базы данных
suffix "dc=ldap,dc=domain,dc=com" # Имя базы LDAP 
rootdn "cn=Manager,dc=ldap,dc=domain,dc=com" # Имя административной записи
rootpw {SSHA}AdOU1S01Nj+gQ4cGHf8gCfm9ENETu3i2 # Хеш-пароль для, выданный slappasswd
directory /var/lib/ldap   # Каталог базы данных LDAP

Остальное в конфигурационом файле, оставляем как есть. Далее сохраняем и запускаем сервис OpenLDAP

# service ldap start 

Теперь вам необходимо создать root DN запись в базе данных LDAP. Она будет основой для последующих учетных записей. Cоздаем файл "init.ldif" (Имя файла не является обязательным)

dn: dc=ldap,dc=domain,dc=com
objectclass: dcObject
objectClass: organization
objectClass: top
o: ldap
dc: ldap

dn: cn=Manager,dc=ldap,dc=domain,dc=com
ou: People
description: All People in Organisation
objectClass: organizationalRole

dn: ou=People,dc=ldap,dc=domain,dc=com
ou: People
objectclass: organizationalUnit

dn: ou=Groups,dc=ldap,dc=domain,dc=com
ou: Groups
description: All People in Organisation
objectClass: organizationalUnit

Теперь необходимо применить содержимое этого файла для базы LDAP

# ldapadd -x -D "cn=Manager,dc=ldap,dc=domain,dc=com" -W -f init.ldif
(Утилита ldapadd запросит у вас пароль rootdn, который вы указывали вначале утилитой slappasswd)

Теперь необходимо произвести импорт учетной записи из файла /etc/passwd в базу LDAP Создаем пользователя iosx для группы users задаем ему пароль

# useradd -g 100 iosx
# passwd iosx

Фильтруем вывод информации о созданом пользователе в отдельный файл и производим миграцию файла passwd в LDAP

# grep iosx /etc/passwd > passwd.iosx
# /usr/share/openldap/migration/migrate_passwd.pl passwd.iosx iosx.ldif

# cat passwd.kripton
iosx:x:501:100::/home/iosx:/bin/bash

# cat iosx.ldif
dn: uid=iosx,ou=People,dc=ldap,dc=domain,dc=com
uid: iosx
cn: iosx
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1dwar3Bsb5$32UTMwe3azdsd2ua6G5dr/
shadowLastChange: 15103
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 501
gidNumber: 100
homeDirectory: /home/iosx

# ldapadd -x -D "cn=Manager,dc=ldap,dc=domain,dc=com" -W -f iosx.ldif
(Утилита ldapadd запросит у вас пароль rootdn, который вы указывали вначале утилитой slappasswd)


Проверяем данные на сервере.

# ldapsearch -x -b "dc=ldap,dc=domain,dc=com"
 ...
# iosx, People, ldap.domain.com
dn: uid=iosx,ou=People,dc=ldap,dc=domain,dc=com
uid: iosx
cn: iosx
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fS4xJHdxajNCSGI1JDNRV3RNx3VTYXakNVZsdWE2Raltci8=
shadowLastChange: 15103
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 501
gidNumber: 100
homeDirectory: /home/iosx
...


А вот теперь необходимо настроить клиентские сервера для аутентификации. Все действия проводятся на стороне клиента.
В моем случае это сервер client.domain.com. Для Linux клиентов необходимо установить следующие пакеты

# yum install nss_ldap openldap-clients

Запускаем эту комманду для активации LDAP аутефикации

# authconfig --useshadow --usemd5 --enableldap --enableldapauth --ldapserver=ldap.domain.com --ldapbasedn="dc=ldap,dc=domain,dc=com" --enablemkhomedir --updateall

Собственно все.
Давайте проведем тестирование:

1: ldapsearch -x (Должен опубликовать листинг всех записей в базе LDAP)
2: getent passwd | grep iosx (Несмотря на то что в системе данного пользователя нет, вы будете должны получить для него ответ)
3: ssh -l iosx client.domain.com (Запускайте SSH соединение на клиентский сервер с любого другого хоста)

iosx@client.domain.com's password:
Creating directory '/home/iosx'.
Creating directory '/home/iosx/.mozilla'.
Creating directory '/home/iosx/.mozilla/extensions'.
Creating directory '/home/iosx/.mozilla/plugins'.
[iosx@client ~]$ id
uid=501(iosx) gid=100(users) groups=100(users) context=user_u:system_r:unconfined_t
[iosx@client ~]$ pwd
/home/iosx
[iosx@client ~]$ cat /etc/passwd | grep iosx
[iosx@client ~]$


Ну а вот теперь точно все. В целом LDAP вещь довольно громоздкая и сложная. Ее можно соберать различными "ведрами" для всевозможных проектов. Все зависит от поставленых задач.

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