ВАЖНОЕ ЗАМЕЧНИЕ: ВСЕ ДЕЙСТВИЯ, ОПИСАННЫЕ В ДАННОЙ СТАТЬЕ БЫЛИ БОЛЕЕ-МЕНЕЕ ПРОВЕРЕНЫ НА ПРАКТИКЕ, НО В ЛЮБОМ СЛУЧАЕ - ВСЕ ВРЕМЯ УСТАНОВКИ ЭТИХ НАСТРОЕК Я НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ ВАМ ИМЕТЬ ДВЕ ЗАПАСНЫХ (Т.Е. ТЕХ, С КОТОРЫХ ВЫ НЕ РАБОТАЕТЕ В ТЕКУЩИЙ МОМЕНТ) КОНСОЛИ С ПРАВАМИ СИСТЕМНОГО АДМИНИСТРАТОРА.
Что такое SAMBA и LDAP?
LDAP - Lightweight Directory Access Protocol, т.е. протокол доступа к каталогу (иерархической оъектной базе данных). SAMBA - программа, которая превращает Unix-систему в сервер сети Microsoft Windows (слово SAMBA происходит от названия протокола сети Microsoft - SMB, Server Messaging Block). Результатом наших действий должна стать настроенная система, пользователи которой должны иметь возможность заходить на нее по SSh и получать доступ к своим домашним каталогам по SMB.
Необходимые условия
Установленный дистрибутив Fedora Core 1
Установленный пакет samba-3.0.X
Установленный пакет openldap-servers
Прямые руки :-)
Настройка сервера LDAP
Прежде всего, настрои сервер OpenLDAP - без этого наша затея теряет смысл. Процедура настройки сервера с точностью до одной строки повторяет настройку, которые я приводил в предыдущей своей "непутевой заметке" о PAM_LDAP. Если быть точным, то нам потребуется проделать все, что необходимо было сделать в указанной заметке, т.е. получить работающий сервер c PAM_LDAP. Если же вам нужен просто файл-сервер, на который у пользователей нет доступа по SSH/Telnet/IMAP и т.д., вы можете не изменять /etc/pam.d/system-auth. А файлы /etc/nsswitch.conf и /etc/ldap.conf все-таки лучше подправить, дабы они выглядели как я уже писал ранее.
По завершении настройки сервера и проверки его работоспособности с помощью ldapsearch, приступим к следующему этапу: добавим в конфигурационный файл сервера LDAP еще одну строку include так, чтобы список всех include в начале файла /etc/openldap/slapd.conf выглядел следующим образом:
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/samba.schema
Файл samba.schema лежит в документации к серверу SAMBA в каталоге /usr/share/doc/samba-3.0.0/LDAP, я рекомендую скопировать его в /etc/openldap/schema
Проведем также дополнительные настройки, которые поспособствуют повышению безопасности, для чего добавим следующие директивы access ПЕРЕД уже существующими в /etc/opeldap/slapd.conf
access to attrs=sambaNTPassword to self write to * none
access to attrs=sambaLMPassword to self write to * none
прежде всего, исправляем конфигурационный файл сервера SAMBA. Файл этот зовется /etc/samba/smb.conf . Поскольку та версия, которая поставляется в дистрибутиве, ну ОЧЕНЬ длинная и с подробными комментариями, останавливаться на ней я не буду, а приведу пример упрощенного файла:
[global]
netbios name = LOCALHOST
workgroup = WORKGROUP
server string = No-Dashis' server
printcap name = /etc/printcap
load printers = no
printing = bsd
log file = /var/log/samba/%m.log
max log size = 50
security = user
encrypt passwords = yes
unix password sync = no
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
dns proxy = no
case sensitive = no
#
# Пошли настройки LDAP
#
ldap admin dn = "cn=root,dc=pupkin,dc=com,dc=ru"
ldap ssl = off
passdb backend = ldapsam:ldap://localhost
ldap delete dn = no
ldap suffix = dc=pupkin,dc=com,dc=ru
ldap filter = (&(uid=%u)(objectClass=sambaSamAccount))
#
# При смене пользователем пароля SAMBA (по сети или
# через smbpasswd автоматически менять пароль LDAP
#
ldap passwd sync = yes
[Home]
comment = Home Directory
browseable = yes
writable = yes
path = /home/%u
Запускаем SAMBA:
# /etc/init.d/smb start
Чтобы SAMBA могла "ходить" на сервер LDAP за информацией о паролях пользователей, необходимо сохранить пароль администратора сервера LDAP (или другого пользователя с достаточными правами) в файле secret.tdb . Сделать это можно примерно так:
# smbpasswd -w zarazamelkaya
Кроме того, нужно создать еще один объект в каталоге, отвечающий за представление сервера (в принципе, этого можно и не делать, тогда SAMBA сама создаст его аккурат в той ветви, которая обозначена как suffix в smb.conf). Я предпочитаю добавлять эту запись самостоятельно, чтобы она создалась в нужной мне ветвеи каталога. Добавить эту служебную запись можно воспользовавшись, например, командой ldapadd:
Ну вот, пришло время финального теста - заводим пользователя, меняем ему пароль используя smbpasswd и проверяем работоспособность. Пользовательский эккаунт будет образован сочетанием трех классов: AUXILIARY-классов sambaSamAccount (необходимые поля для Windows :-)) и posixAccount - атрибуты, необходимые для сопоставления учетной записи идентификаторов пользователя и группы (uid и gid), а также STRUCTURAL-класса sambaSidEntry
Когда smbclient спросит у вас пароль пользователя serega, надо вспомнить, что мы его установили на предыдущем шаге в команде smbpasswd. С тем же паролем пользователь serega сможет зайти в систему, например, по SSH - если установить его учетной записи в LDAP атрибут loginShell. Если же вы хотите, чтобы пользователи не могли заходить на сервер, а использовали только ресурсы SAMBA - просто отключите PAM_LDAP в /etc/pam.d/system-auth, а также уберите слово ldap из всех строк в /etc/nsswitch.conf
Но главное, что надо помнить - ответ на ваши вопросы всегда есть в документации.
Приложение 1. Работающий /etc/openldap/slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/samba.schema
pidfile /var/run/slapd.pid
access to attrs=sambaNTPassword by self write by * none
access to attrs=sambaLMPassword by self write by * none
access to attrs=userPassword by self write by * auth
access to * by peername=127.0.0.1 read by users read by anonymous auth
database ldbm
suffix "dc=pupkin,dc=com,dc=ru"
rootdn "cn=root,dc=pupkin,dc=com,dc=ru"
rootpw {crypt}<свой_хэш_не_скажу>
directory /var/lib/ldap
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub