Начиная эту статью, я не преследую цель написать подробное руководство по установке и настройке необходимого серверного программного обеспечения (ПО). Таких статей, How-To и т.п. в Сети много. Я постараюсь описать именно процесс перехода с AD на OpenLDAP+Samba3 и те сложности, с которыми мне пришлось столкнуться.
Хочу заметить, что в моей локальной сети переход прошел не так гладко, как хотелось. Были ошибки, сбои и весьма неприятные моменты. Такие «грабли» я постараюсь описать подробно, чтобы те, кто прочитает мою статью, на них не наступал.
По ходу описания я буду приводить ссылки на материалы, которые я использовал.
Имеется:
Для Linux-сервера я выбрал новый на момент написания статьи Ubuntu Linux 7.04 Feisty со следующими версиями пакетов:
Инструмент для перехода: Windows to Linux Migration Toolkit (w2lmt).
Инструмент для графического отображения дерева LDAP: phpldapadmin.
Подготовка Windows-сервера.
Следующие группы, названные по-русски, необходимо переименовать:
| Администраторы домена | -> | Domain Admins |
| Компьютеры домена | -> | Domain Computers |
| Гости домена | -> | Domain Guests |
| Пользователи домена | -> | Domain Users |
Связано это с тем, что эти группы имеют фиксированное значение SID, а используемый в процессе перехода скрипт smbldap-populate создаст группы с именами в латинице, и пользователи корректно не перенесутся на новую систему.
Также надо быть особо внимательным, если в сети имеется несколько рабочих станций, за которыми работают под одним и тем же именем.
На двух станциях работали под одним и тем же именем пользователя. Должного внимания профилям в процессе перехода я не уделил. В результате профиль с одной станции скопировался на другую, затерев старый профиль. Соответственно преждние "Мои документы", "Рабочий стол" и т.д. были удалены. Пришлось снимать жесткий диск и восстанавливать удаленные файлы.
Подготовка Linux-сервера
Подготовка Linux-сервера сводится к устранению возможных дубликатов uid и gid, хранящихся в базе LDAP и в /etc/passwd.
После первоначальной установки ОС Linux, в системе создается первый пользователь с uid=1000 и gid=1000.
Скрипт smbldap-populate без параметров создаст первоначальную структуру LDAP, в которой будут созданы пользователи root и nobody, а первый пользователь домена будет иметь uid=1000. Т.е. будет конфликт между локальным пользователем и пользователем в LDAP, имеющими одинаковый uid=1000.
Группы, созданные smbldap-populate будут иметь следующие параметры:
| Группа | uid | SID |
| Account Operators | 548 | S-1-5-32-548 |
| Administrators | 544 | S-1-5-32-544 |
| Backup Operators | 551 | S-1-5-32-551 |
| Domain Admins | 512 | SID_СЕРВЕРА-512 |
| Domain Computers | 515 | SID_СЕРВЕРА-515 |
| Domain Guests | 514 | SID_СЕРВЕРА-514 |
| Domain Users | 513 | SID_СЕРВЕРА-513 |
| Print Operators | 550 | S-1-5-32-550 |
| Replicators | 552 | S-1-5-32-552 |
В заново установленной ОС Linux локальных групп с такими gid-ми скорее всего не будет, но лучше убедиться, что их действительно нет. И, если есть, присвоить им другие значения gid, отличные от перечисленных.
Предполагается, что в сети уже есть работающий DNS-сервер.
В моей сети работает связка DDNS + DHCPD3. О том, как ее настроить можно прочитать здесь:
http://www.ops.ietf.org/dns/dynupd/secure-ddns-howto.html
http://www.opennet.ru/base/net/auto_dns_dhcp.txt.html
Краткое отступление
Об утилитах Windows to Linux Migration Toolkit (w2lmt) я узнал из книги Дэвида Аллена "Переход с Windows на Linux".
Другой документации или какого-либо описания работы w2lmt в Сети я не нашел. Поэтому все описанное цитаты из книги и личный опыт. Книга посвещена не только w2lmt, все "грабли" в ней не расписаны.
Кроме этого, я не буду полностью описывать работу w2lmt, а коснуcь только тех моментов, которые возникали именно в моем процессе перехода.
Состав w2lmt
Для перехода с AD на LDAP+Samba3 использовались w2lmt 0.3.1.
Скачанный архив, кроме всего прочего, содержит perl-скрипты и соответствующие им конфигурационные файлы.
| w2lmt-migrate-dns |
Скрипт предназначен для автоматического переноса информации DNS из Windows в Linux. Этот скрипт я не использовал, т.к. в локальной сети уже работал DNS на Linux-сервере. |
| w2lmt-migrate-smbauth |
Скрипт предназначен для извлечения информации аутентификации. Это основной скрипт, который должен корректно перенести пользователей с Windows-сервера в LDAP. |
| w2lmt-migrate-directory |
Скрипт, который запускается после завершения w2lmt-migrate-smbauth. Этот скрипт запросит сервер Exchange для обновления объектов каталогов любой сохраненной в нем нужной информации. Также он добавляет объекты контактов и группы распределений. В моей сети не использовался Exchange, а служба AD использовалась только для аутентификации. Поэтому у меня не было необходимости запускать этот скрипт. |
| w2lmt-migrate-imap |
Все скрипты запускаются с ключем "-f /path/to/file.conf".
Для работы скриптов требуется пакет smbldap-tools версии не ниже 0.8.5.
Устанавливаем сервер LDAP:
Отвечаем на следующие вопросы:
После первой установки slapd, в базе LDAP будет единственная запись администратора cn=admin,dc=mydomain с паролем password.
Устанавливаем phpldapadmin и apache2
Устанавливаем samba
Отвечаем на следующие вопросы:
Хотя созданный файл smb.conf будет изменет, на вопросы ответить придется.
Устанавливаем smbldap-tools и ldap-utils
Настройка slapd
В результате файл slapd.conf будет выглядеть примерно так:
#######################################################################
# Global Directives:
# Features to permit
#allow bind_v2
# Schema and objectClass definitions
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/samba.schema
# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile /var/run/slapd/slapd.pid
# List of arguments that were passed to the server
argsfile /var/run/slapd/slapd.args
###################################################################
# loglevel # Logging description
loglevel 256
# Where the dynamically loaded modules are stored
modulepath /usr/lib/ldap
moduleload back_bdb
# The maximum number of entries that is returned for a search operation
sizelimit 500
# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
tool-threads 1
#######################################################################
# Specific Backend Directives for bdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend bdb
checkpoint 512 30
#######################################################################
# Specific Directives for database #1, of type bdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database bdb
# The base of your directory in database #1
suffix "dc=MYDOMAIN"
# Where the database file are physically stored for database #1
directory "/var/lib/ldap"
# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM
dbconfig set_cachesize 0 2097152 0
# Number of objects that can be locked at the same time.
dbconfig set_lk_max_objects 1500
# Number of locks (both requested and granted)
dbconfig set_lk_max_locks 1500
# Number of lockers
dbconfig set_lk_max_lockers 1500
# Indexing options for database #1
index objectClass eq
# Save the time that the entry gets modified, for database #1
lastmod on
# users can authenticate and change their password
access to attrs=userPassword,sambaNTPassword,sambaLMPassword,sambaPwdLastSet,sambaPwdMustChange
by dn="cn=admin,dc=MYDOMAIN" write
by self write
by anonymous auth
by * none
# The admin dn has full write access, everyone else
# can read everything.
access to *
by dn="cn=admin,dc=MYDOMAIN" write
by * read
Настройка samba
passdb backend = ldapsam:ldap://127.0.0.1
idmap backend = ldap:ldap://127.0.0.1
ldap admin dn = cn=admin,dc=mydomain
ldap suffix = dc=mydomain
ldap machine suffix = ou=Computers
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap passwd sync = yes
ldap delete dn = yes
ldap passwd sync = yes
ldap ssl = no
preferred master = yes
domain master = no
domain logons = yes
logon path =
logon drive = Z:
logon home = \\%L\SYSVOL\users\%U
add machine script = /usr/sbin/smbldap-useradd -t 0 -w "%u"
add user script = /usr/sbin/smbldap-useradd -m "%u"
delete user script = /usr/sbin/smbldap-userdel "%u"
add group script = /usr/sbin/smbldap-groupadd -p "%g"
delete group script = /usr/sbin/smbldap-groupdel "%g"
add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/sbin/smbldap-usermod -g '%g' '%u'
interfaces = 127.0.0.0/8 eth0
hosts allow = 127.0.0.1 192.168.0.0/255.255.255.0
hosts deny = ALL
map to guest = Bad User
guest account = nobody
log file = /var/log/samba/log.%m
max log size = 500 # in Kb
log level = 5
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
socket address = 127.0.0.1 192.168.0.2
printing = cups
load printers = yes
####### MAIL THE ADMIN A BACKTRACE
panic action = /usr/share/samba/panic-action %d
[homes]
comment = Home Directories
guest ok = No
browseable = No
create mask = 0644
directory mask = 0775
writeable = yes
inherit permissions = Yes
[profiles]
path = /home/SYSVOL/profiles
comment = User Profiles
guest ok = Yes
browseable = No
create mask = 0600
directory mask = 0700
writeable = Yes
profile acls = Yes
csc policy = disable
force user = %U
valid users = %U @"Domain Admins"
[netlogon]
comment = User Netlogon
path = /home/SYSVOL/netlogon
browseable = No
write list = MYDOMAIN@"Domain Admins"
[IPC$]
# IPC необходимо для нормальной работы Windows-домена:
# browse network, browse folder и прочее.
path = /tmp
hosts allow = 192.168.0.0/24, 127.0.0.1
hosts deny = 0.0.0.0/0
Для хранения сценариев регистрации, профилей и домашних папок пользователей LDAP, я создал папку /home/SYSVOL (по аналогии с Windows, мне так удобнее). Соответственно, в ней созданы папки netlogons, profiles, users.
Параметры domain master = no и domain logons = yes превращают сервер Samba в резервный контроллер домена.
Параметр logon path = оставлен пустым, т.к. я не хочу хранить профили пользователей рабочих станций на сервере. Если все же требуется хранить профили, то нужно указать путь. По-умолчанию
logon path = \\%N\%U\profile
Устанавливаем пакет libpam-ldap
Файл /etc/ldap/ldap.conf должен выглядеть так:
/etc/pam.d/common-account
# и добавить две строки
account sufficient pam_ldap.so
account required pam_unix.so try_first_pass
/etc/pam.d/common-auth
# и добавить две строки
auth sufficient pam_ldap.so
auth required pam_unix.so nullok_secure use_first_pass
/etc/pam.d/common-password
# и добавить две строки
password sufficient pam_ldap.so
password required pam_unix.so nullok obscure min=4 max=8 md5 use_first_pass
Итак, Linux-сервер готов для переноса пользователей из AD в LDAP. Но нужно сделать еще кое-что.
Я использовал простую структуру дерева LDAP, которую создает утилита smbldap-populate.

Скачиваем архив w2lmt-0.3.1 и распаковываем его любое удобное место.
Далее следует внести изменения в файл migrate-smbauth.conf.
Если Active Directory выполняется в смешанном режиме (Mixed Mode, как раз мой случай), то в файле конфигурации сценария w2lmt-migrate-smbauth в качестве SourceType следует использовать настройку NT4. При использовании этой настройки сохраняется SID и RID существующего домена.
При выполнении Active Directory в "родном" режиме (Native Mode) сценарии будут создавать новый домен с новыми SID и RID для пользователей, групп и машин. Это происходит потому, что собственный режим AD не совместим с доменом типа Samba NT4, на который осуществляется переход. Следует помнить о том, что все объедененные в этом домене машины необходимо повторно объединять в новый домен на базе Linux.
Сценарий w2lmt-migrate-smbauth по ходу выполнения вызовет скрипт smbldap-populate без параметров. Т.к. установки по-умолчанию меня не устраивали, я внес в файл w2lmt-migrate-smbauth следующие изменения:
По-умолчанию, после установки пакета smbldap-tools, в папке /etc отсутствуют его конфигурационные файлы. По-этому их надо создать вручную. Это файлы /etc/smbldap-tools/smbldap.conf и /etc/smbldap-tools/smbldap_bind.conf.
Непосредственно для перехода конфигурационные файлы smbldap-tools можно оставить пустыми. Главное, чтобы они были, иначе скрипты smbldap-tools просто не будут выполняться, ссылаясь на их отсутствие.
Сценарий w2lmt-migrate-smbauth сначала покажет список параметров и их значения по-умолчанию и позволит изменить значения некоторых из них, но, увы, не у всех. По-этому конфигурационные файлы smbldap-tools лучше все-таки заполнить. Как вариант, их можно скопировать из папки /usr/share/doc/smbldap-tools/examples в папку /etc/smbldap-tools/ и отредактировать.
У меня конфигурационные файлы smbldap-tools выглядят так:
/etc/smbldap-tools/smbldap_bind.conf
/etc/smbldap-tools/smbldap.conf
# Domain name the Samba server is in charged.
# If not defined, parameter is taking from smb.conf configuration file
sambaDomain="MYDOMAIN"
########################################################################
#
# LDAP Configuration
#
########################################################################
# Slave LDAP server
# If not defined, parameter is set to "127.0.0.1"
slaveLDAP="localhost"
# Slave LDAP port
# If not defined, parameter is set to "389"
slavePort="389"
# Master LDAP server: needed for write operations
# If not defined, parameter is set to "127.0.0.1"
masterLDAP="localhost"
# Master LDAP port
# If not defined, parameter is set to "389"
masterPort="389"
# Use TLS for LDAP
# If set to 1, this option will use start_tls for connection
# (you should also used the port 389)
# If not defined, parameter is set to "1"
ldapTLS="0"
# How to verify the server's certificate (none, optional or require)
# see "man Net::LDAP" in start_tls section for more details
verify=""
# LDAP Suffix
suffix="dc=mydomain"
# Where are stored Users
# Warning: if 'suffix' is not set here, you must set the full dn for usersdn
usersdn="ou=Users,dc=mydomain"
# Where are stored Computers
# Warning: if 'suffix' is not set here, you must set the full dn for computersdn
computersdn="ou=Computers,dc=mydomain"
# Where are stored Groups
# Warning: if 'suffix' is not set here, you must set the full dn for groupsdn
groupsdn="ou=Groups,dc=mydomain"
# Where to store next uidNumber and gidNumber available for new users and groups
# If not defined, entries are stored in sambaDomainName object.
sambaUnixIdPooldn="cn=NextFreeUnixId,dc=mydomain"
# Default scope Used
scope="sub"
# Unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT)
hash_encrypt="CRYPT"
# if hash_encrypt is set to CRYPT, you may set a salt format.
# default is "%s", but many systems will generate MD5 hashed
# passwords if you use "$1$%.8s". This parameter is optional!
crypt_salt_format="%s"
########################################################################
#
# Unix Accounts Configuration
#
########################################################################
# Login defs
# Default Login Shell
userLoginShell="/bin/bash"
# Home directory
userHome="/home/SYSVOL/users/%U"
# Default mode used for user homeDirectory
userHomeDirectoryMode="700"
# Gecos
userGecos="Domain User"
# Default User (POSIX and Samba) GID
defaultUserGid="513"
# Default Computer (Samba) GID
defaultComputerGid="515"
# Skel dir
skeletonDir="/etc/skel"
# Default password validation time (time in days) Comment the next line if
# you don't want password to be enable for defaultMaxPasswordAge days (be
# careful to the sambaPwdMustChange attribute's value)
defaultMaxPasswordAge="45"
########################################################################
#
# SAMBA Configuration
#
########################################################################
# The UNC path to home drives location (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon home'
# directive and/or disable roaming profiles
userSmbHome="\\LAN2\%U"
# The UNC path to profiles locations (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon path'
# directive and/or disable roaming profiles
userProfile=""
# The default Home Drive Letter mapping
# (will be automatically mapped at logon time if home directory exist)
userHomeDrive="Z:"
# The default user netlogon script name (%U username substitution)
# if not used, will be automatically username.cmd
# make sure script file is edited under dos
userScript="login.bat"
# Domain appended to the users "mail"-attribute
# when smbldap-useradd -M is used
mailDomain="my.mail.domain"
########################################################################
#
# SMBLDAP-TOOLS Configuration (default are ok for a RedHat)
#
########################################################################
# Allows not to use smbpasswd (if with_smbpasswd == 0 in smbldap_conf.pm) but
# prefer Crypt::SmbHash library
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
# Allows not to use slappasswd (if with_slappasswd == 0 in smbldap_conf.pm)
# but prefer Crypt:: libraries
with_slappasswd="1"
slappasswd="/usr/sbin/slappasswd"
# comment out the following line to get rid of the default banner
# no_banner="1"
Обратите внимание на то, что параметр SID закомментирован. Если его раскомментировать, то сценарий w2lmt-migrate-smbauth сам подставит занчение SID, и оно будет не верным. Почему так, я не понял, установил опытным путем.
После того, как перенос данных из AD в LDAP будет выполнен, следует раскомментировать параметр SID и прописать его значение, узнать которое можно будет с помощью команды net getlocalsid.
Параметр ldapTLS="0" означает, что я не использую шифрование.
Параметр userProfile="" означает, что я не использую перемещаемые профили. Если есть необходимость их использовать, то этот параметр будет выглядеть, например, так: userProfile="\\LAN2\profiles\%U".
Перед запуском сценария w2lmt-migrate-smbauth стоит лишний раз убедиться в следующем:
Теперь запускаем сценарий w2lmt-migrate-smbauth
После этого на экране появится примерно такой диалог:
=== LDAP Settings: ==============================================
Master LDAP Server: localhost
Master LDAP Port: 389
Master DN: admin
LDAP Base Suffix: dc=mydomain
Users OU: ou=Users
Groups OU: ou=Groups
Computers OU: ou=Computers
IDMap OU: ou=Idmap
Unix ID Pool DN: cn=NextFreeUnixId,dc=mydomain
=== SAMBA Settings: =============================================
User's Home Share: \\LAN2\%U
User's Login Script: login.bat
User's Profile:
Password Age: 45
User Default GID: 513
Computer Default GID: 515
=== POSIX Settings: =============================================
User's Home Directory: /home/SYSVOL/users/%U
Default Shell: /bin/bash
Default Mail Domain: my.mail.domain
Skeleton Directory: /etc/skel
Hash Encryption Type: CRYPT
Hash Encryption Salt: %s
Press (C) to continue, (M) to modify the above or (Q) to quit:
В общем то можно нажать M и исправить параметры, но я бы не рекомендовал так поступать, т.к. скрипт позволяет редактировать только некоторые из показанных. Лучше выйти и отредактировать файлы конфигурации в текстовом редакторе.
Жмем C.
Вот тут я не сразу смог понять, что же не так. Вроде бы и настройки верные, и первоначальное дерево LDAP создалось, а перенос пользователей начинается только, если нажать два раза Enter.
Дело в том, что по окончанию создания первоначального дерева LDAP, скрипт smbldap-populate предлагает ввести пароль Администратора. Скрипт w2lmt-migrate-smbauth строку приглашения ввода пароля не выводит, просто курсор мигает. Так что пароль и подтверждение пароля пользователя Administrator приходится вводить вслепую.
Теперь можно пойти заварить кофейку. Перенос моих пользователей занял около 20 мин. ;-)
Можно сказать, что на этом все. Windows сервер можно выключать. Все пользователи со всех рабочих станций успешно прошли аутентификацию. Но "грабли" на некоторых станциях все же были, причем я не смог установить связаны ли они с версий Windows или с чем то еще.
Проблемы следующие:
Решение было одно - вывести станции из домена и заново их зарегистрировать.
Осень 2007 года подходит к концу.
Описанный вариант замены Active Directory на OpenLDAP+Samba3 был осуществлен полгода назад.
Система продолжает успешно работать.
Повторюсь, предложенное описание перехода не претендует на Полное руководство или How-To. Пишу, в основном, для себя.
Буду рад, если кому-то это описание окажется полезным.