ВАЖНОЕ ЗАМЕЧНИЕ: ВСЕ ДЕЙСТВИЯ, ОПИСАННЫЕ В ДАННОЙ СТАТЬЕ БЫЛИ БОЛЕЕ-МЕНЕЕ ПРОВЕРЕНЫ НА ПРАКТИКЕ, НО В ЛЮБОМ СЛУЧАЕ - ВСЕ ВРЕМЯ УСТАНОВКИ ЭТИХ НАСТРОЕК Я НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ ВАМ ИМЕТЬ ДВЕ ЗАПАСНЫХ (Т.Е. ТЕХ, С КОТОРЫХ ВЫ НЕ РАБОТАЕТЕ В ТЕКУЩИЙ МОМЕНТ) КОНСОЛИ С ПРАВАМИ СИСТЕМНОГО АДМИНИСТРАТОРА.
LDAP - Lightweight Directory Access Protocol, т.е. протокол доступа к каталогу (иерархической оъектной базе данных). SAMBA - программа, которая превращает Unix-систему в сервер сети Microsoft Windows (слово SAMBA происходит от названия протокола сети Microsoft - SMB, Server Messaging Block). Результатом наших действий должна стать настроенная система, пользователи которой должны иметь возможность заходить на нее по SSh и получать доступ к своим домашним каталогам по SMB.
Прежде всего, настрои сервер 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
# cp /usr/share/doc/samba-3.0.0/LDAP/samba.schema /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
Файл скопирован, конфигурация изменена. Перезапускаем OpenLDAP:
# /etc/init.d/ldap restart
прежде всего, исправляем конфигурационный файл сервера 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:
# echo "dn: sambaDomainName=MYSERVERNAME,dc=pupkin,dc=com,dc=ru objectClass: sambaDomain sambaDomainName: MYSERVERNAME sambaSID: S-1-5-21-3905436772-1214432718-1934470886 sambaAlgorithmicRidBase: 1000" | \ ldapadd -x -w zarazamelkaya \ -D "cn=root,dc=pupkin,dc=com,dc=ru"
Ну вот, пришло время финального теста - заводим пользователя, меняем ему пароль используя smbpasswd и проверяем работоспособность. Пользовательский эккаунт будет образован сочетанием трех классов: AUXILIARY-классов sambaSamAccount (необходимые поля для Windows :-)) и posixAccount - атрибуты, необходимые для сопоставления учетной записи идентификаторов пользователя и группы (uid и gid), а также STRUCTURAL-класса sambaSidEntry
# echo "dn: cn=serega,dc=pupkin,dc=com,dc=ru objectClass: sambaSamAccount objectClass: sambaSidEntry objectClass: posixAccount cn: serega uid: serega uidNumber: 1000 gidNumber: 1001 homeDirectory: /home/serega sambaSID: S-1-5-21-3905436772-1214432718-19344733 " | \ ldapadd -x -w zarazamelkaya \ -D "cn=root,dc=pupkin,dc=com,dc=ru" # smbpasswd serega SeryoginMegaParol # smbclient -L MYSERVERNAME -U serega
Когда smbclient спросит у вас пароль пользователя serega, надо вспомнить, что мы его установили на предыдущем шаге в команде smbpasswd. С тем же паролем пользователь serega сможет зайти в систему, например, по SSH - если установить его учетной записи в LDAP атрибут loginShell. Если же вы хотите, чтобы пользователи не могли заходить на сервер, а использовали только ресурсы SAMBA - просто отключите PAM_LDAP в /etc/pam.d/system-auth, а также уберите слово ldap из всех строк в /etc/nsswitch.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
passwd: files ldap shadow: files ldap group: files ldap hosts: files dns bootparams: nisplus [NOTFOUND=return] files ethers: files netmasks: files networks: files protocols: files rpc: files services: files netgroup: files publickey: nisplus automount: files aliases: files
host 127.0.0.1 base dc=pupkin,dc=com,dc=ru rootbinddn cn=root,dc=pupkin,dc=com,dc=ru port 389 scope sub pam_filter objectclass=posixAccount pam_login_attribute uid nss_base_passwd dc=pupkin,dc=com,dc=ru?sub?objectClass=posixAccount nss_base_group dc=pupkin,dc=com,dc=ru?sub?objectClass=posixGroup nss_base_shadow dc=pupkin,dc=com,dc=ru?sub?objectClass=posixAccount ssl no pam_password md5
auth required /lib/security/$ISA/pam_env.so auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok auth sufficient /lib/security/$ISA/pam_ldap.so use_first_pass auth required /lib/security/$ISA/pam_deny.so account sufficient /lib/security/$ISA/pam_unix.so account sufficient /lib/security/$ISA/pam_ldap.so password required /lib/security/$ISA/pam_cracklib.so retry=3 type= password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok password sufficient /lib/security/$ISA/pam_ldap.so use_authtok password required /lib/security/$ISA/pam_deny.so session required /lib/security/$ISA/pam_limits.so session required /lib/security/$ISA/pam_unix.so session optional /lib/security/$ISA/pam_ldap.so
Строки, содержащие вызовы pam_ldap.so, могут быть закомментированы для отключения авторизации в LDAP.