Инструменты пользователя

Инструменты сайта


net:samba-pdc-ldap

Контроллер домена на базе samba с хранением учетных записей в OpenLDAP

Введение

C ростом организации рано или поздно перед каждым администратором возникает вопрос о централизованном хранении и управлении учетными записями. Данная статья посвящена настройке Samba 3 в качестве основного контроллера домена (PDC), все записи о пользователях будут храниться в LDAP-каталоге. Преимущества подобной организации очевидны - упрощение управления пользователями, возможность делегирования полномочий по управлению пользователями в домене, повышение отказоустойчивости системы, простота переноса и восстановления после отказа аппаратного обеспечения, возможность интеграции с LDAP других сервисов - svn, jabber, squid, postfix/exim, proftpd и т.п. и т.д.



Все дальнейшие настройки мы будем производить согласно следующей схеме LDAP каталога.

sys-adm.local
ou=Users
ou=Department1
uid=user1
ou=Department100
uid=user100
ou=Groups
cn=Domain Admins
cn=Domain Users
cn=Domain Guests
ou=Computers
uid=workstation1$
uid=workstation100$



Предварительные настройки системы

Итак, в нашем распоряжении имеется следующая система:

# cat /etc/redhat-release
CentOS release 5.8 (Final)

# uname -r
2.6.18-308.4.1.el5

Подключаем репозитарии EPEL и RPMForge

# wget http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
# rpm --import RPM-GPG-KEY.dag.txt
# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

# rpm -K rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK

# rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
Preparing...                ########################################### [100%]
   1:rpmforge-release       ########################################### [100%]

# wget http://ftp.tlk-l.net/pub/mirrors/fedora-epel/RPM-GPG-KEY-EPEL
# rpm --import RPM-GPG-KEY-EPEL
# wget http://ftp.tlk-l.net/pub/mirrors/fedora-epel/5/x86_64/epel-release-5-4.noarch.rpm

# rpm -K epel-release-5-4.noarch.rpm
epel-release-5-4.noarch.rpm: (sha1) dsa sha1 md5 gpg OK

# rpm -ivh epel-release-5-4.noarch.rpm
Preparing...                ########################################### [100%]
   1:epel-release           ########################################### [100%]

Обновляем систему

# yum update

Редактируем файл /etc/hosts и настраиваем корректное имя нашего хоста

# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain
192.168.127.2 pdc pdc.sys-adm.local

Настраиваем демон ntp для синхронизации времени. После выполнения всех предварительных настроек можно приступать к установке samba.

Сборка и установка samba-3.4.x

По личному опыту могу сказать, что samba-3.4.x на момент написания статьи является наиболее надежной из всех веток. Поэтому именно эту версию samba мы и будем собирать. В принципе вам никто не запрещает использовать любую из веток, а на данный момент это - samba-3.4.x, samba-3.5.x, samba-3.6.x. Данная система работает у меня в production более 2х лет, за все время работы не было ни единого сбоя или нештатной ситуации. Если у вас уже установлена необходимая версия samba, то вы можете пропустить этот шаг и перейти непосредственно к настройке системы.

Устанавливаем пакеты, необходимые для сборки samba.

# yum install rpm-build.x86_64 pam-devel.x86_64 readline-devel.x86_64 libacl-devel.x86_64 openldap-devel.x86_64
# yum install krb5-devel.x86_64 cups-devel.x86_64 autoconf gcc-c++.x86_64 which.x86_64 make.x86_64

Скачиваем исходный код samba с официального сайта и запускаем сборку пакета.

# cd /tmp
# wget http://samba.org/samba/ftp/stable/samba-3.4.17.tar.gz
# tar zxf samba-3.4.17.tar.gz
# cd samba-3.4.17/packaging/RHEL
# sh makerpms.sh --target=x86_64
Supported RPM version [4.4.2.3]
/tmp/samba-3.4.17/packaging/RHEL /tmp/samba-3.4.17/packaging/RHEL
/tmp/samba-3.4.17/packaging/RHEL
/tmp/samba-3.4.17/packaging/RHEL /tmp/samba-3.4.17/packaging/RHEL
Creating samba-3.4.17.tar.bz2 ... Done.
/tmp/samba-3.4.17/packaging/RHEL
setup/
...
...
...
Wrote: /usr/src/redhat/SRPMS/samba-3.4.17-1.src.rpm
Wrote: /usr/src/redhat/RPMS/x86_64/samba-3.4.17-1.x86_64.rpm
Wrote: /usr/src/redhat/RPMS/x86_64/samba-client-3.4.17-1.x86_64.rpm
Wrote: /usr/src/redhat/RPMS/x86_64/samba-common-3.4.17-1.x86_64.rpm
Wrote: /usr/src/redhat/RPMS/x86_64/samba-swat-3.4.17-1.x86_64.rpm
Wrote: /usr/src/redhat/RPMS/x86_64/samba-doc-3.4.17-1.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.3392
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd samba-3.4.17
+ rm -rf /var/tmp/samba-3.4.17-root
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.3392
+ umask 022
+ cd /usr/src/redhat/BUILD
+ rm -rf samba-3.4.17
+ exit 0
makerpms.sh: Done.

После того, как пакеты успешно собрались устанавливаем их.

# cd /usr/src/redhat/RPMS/x86_64/x86_64/
# rpm -ivh samba-3.4.17-1.x86_64.rpm samba-common-3.4.17-1.x86_64.rpm samba-client-3.4.17-1.x86_64.rpm samba-doc-3.4.17-1.x86_64.rpm
 Preparing...               ########################################### [100%]
   1:samba-common           ########################################### [ 25%]
   2:samba                  ########################################### [ 50%]
   3:samba-client           ########################################### [ 75%]
   4:samba-doc              ########################################### [100%]

Копируем схему samba.schema в каталог OpenLDAP. Для корректной работы LDAP сервера у вас в системе должны быть установлены следующие пакеты - openldap-servers и openldap-clients

# cp /usr/share/doc/samba-doc-3.4.17/LDAP/samba.schema /etc/openldap/schema/samba.schema
Вы так же можете произвести процедуру сборки samba на любой машине с аналогичной версией ОС и установить готовые пакеты на контроллере домена. Я обычно собираю подобного рода пакеты на виртуальной машине, чтобы не засорять production сервера не нужными пакетами.

Настройка LDAP каталога

Собственно вся настройка LDAP каталога сводится к редактированию файла /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/samba.schema

# Задаем путь для pid файла
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

# Определяем настройки хранения данных
# Значение для поля rootpw генерируем с помощью команды: slappasswd -h {SSHA}
database        bdb
suffix          "dc=sys-adm,dc=local"
rootdn          "cn=root,dc=sys-adm,dc=local"
rootpw          {SSHA}2n7rOetD0z6RoWG2zZ9Cuvw5thEnPZVh

# Указываем обязательное использование протокола v3 и запрещаем анонимный доступ к нашему каталогу
# LDAPv3 - требуем, чтобы при любом обращении к DIT использовались процедуры 3-ей версии протокола LDAP.
# authc  - требуем, чтобы при любом обращении к DIT, перед тем как выполнить какую-либо операцию с каталогом, 
# была пройдена LDAP-аутентификация. Использование этого значения также подразумевает неявное использование 
# ключевого слова bind.
require LDAPv3 authc

# Задаем уровень логирование и путь к log файлу
# 256	0x100	stats	статистика соединений/операций/результатов
# 32	0x20	filter	обработка поисковых фильтров
# 256 + 32 = 288
loglevel 288
logfile /var/log/ldap.log

# Определяем несколько базовых ACL
access to attrs=userPassword,sambaNTPassword,sambaLMPassword
    by self write
    by anonymous auth
    by * none

access to *
    by self read
    by users read
    by anonymous auth
    by * none

# Путь 
directory       /var/lib/ldap

# Индексы, для ускорения поиска
index objectClass           eq
index cn                    pres,sub,eq
index sn                    pres,sub,eq
index uid                   pres,sub,eq
index displayName           pres,sub,eq
index uniqueMember          eq
index uidNumber             eq
index gidNumber             eq
index memberUID             eq
index sambaSID              eq
index sambaPrimaryGroupSID  eq
index sambaDomainName       eq
index sambaGroupType        eq
index sambaSIDList          eq
index default               sub

Производим небольшие настройки базы данных

# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# mkdir /var/lib/ldap/{db,logs}
# chown -R ldap:ldap /var/lib/ldap/

Редактируем файл /var/lib/ldap/DB_CONFIG

# $OpenLDAP: pkg/ldap/servers/slapd/DB_CONFIG,v 1.1.2.4 2007/12/18 11:51:46 ghenry Exp $
# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases.
#
# See the Oracle Berkeley DB documentation
#   <http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html>
# for detail description of DB_CONFIG syntax and semantics.
#
# Hints can also be found in the OpenLDAP Software FAQ
#       <http://www.openldap.org/faq/index.cgi?file=2>
# in particular:
#   <http://www.openldap.org/faq/index.cgi?file=1075>

# Note: most DB_CONFIG settings will take effect only upon rebuilding
# the DB environment.

# one 0.25 GB cache
set_cachesize 0 268435456 1

# Data Directory
set_data_dir db

# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
set_lg_dir logs

# Note: special DB_CONFIG flags are no longer needed for "quick"
# slapadd(8) or slapindex(8) access (see their -q option).

Для того, чтобы OpenLDAP писал все сообщения в определенный файл, настраиваем соответствующим образом syslog. Редактируем файл /etc/syslog.conf и добавляем следующую строку в конец файла, после чего перезапускаем демон, предварительно создав сам log файл.

local4.*                                                /var/log/ldap.log
# touch /var/log/ldap.log
# chmod 640 /var/log/ldap.log

# service syslog restart
Shutting down kernel logger:                               [  OK  ]
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
Starting kernel logger:                                    [  OK  ]

И последний момент, который нам необходимо сделать, это добавить одну строку в конец файла /etc/sysconfig/ldap

SLAPD_OPTIONS="-4"

Таким образом наш демон slapd будет слушать только IPv4 адреса. Теперь у нас все готово к запуску OpenLDAP. Запускаем демон и добавляем его запуск при старте системы.

# service ldap start
Starting slapd:                                            [  OK  ]

# chkconfig --level 35 ldap on

При этом в log файле должны появиться такие записи

# cat /var/log/ldap.log
May 23 10:16:44 pdc slapd[7256]: @(#) $OpenLDAP: slapd 2.3.43 (Feb 22 2012 16:01:18) $     mockbuild@builder10.centos.org:/builddir/build/BUILD/openldap-2.3.43/openldap-2.3.43/build-servers/servers/slapd
May 23 10:16:45 pdc slapd[7257]: slapd starting

Настройка nsswitch на работу с LDAP каталогом

Устанавливаем пакет nss_ldap

# yum install nss_ldap.x86_64

Редактируем файл /etc/nsswitch.conf и настраиваем поиск пользователей в LDAP каталоге. Так же поиск компьютеров будет производиться с помощью wins сервера.

passwd:     files ldap
shadow:     files ldap
group:      files ldap

hosts:      files dns wins

Все остальные строки оставляем без изменений. Таким образом при поиске пользователей, групп и их паролей система так же будет обращаться в LDAP каталог. Для того, чтобы система знала к какому именно LDAP каталогу обращаться и где искать необходимую информацию нам необходимо настроить nss_ldap. Редактируем файл /etc/ldap.conf. Настройки производим в соответствии с нашей структурой (см схему выше).

# Адрес нашего OpenLDAP сервера
host 127.0.0.1
#uri ldap://localhost/

# База для поиска в LDAP каталоге
base dc=sys-adm,dc=local


# Так как у нас запрещены анонимные подключения, указываем пользователя и его пароль
binddn cn=root,dc=sys-adm,dc=local
bindpw 1234567

# Версия LDAP протокола и номер порта
ldap_version 3
port 389

# Область поиска
scope sub
bind_policy soft

# Задаем лимиты
timelimit 120
bind_timelimit 120
sizelimit 500
idle_timelimit 3600

# Указываем фильтры для поиска пользователей, групп и паролей
nss_base_passwd           ou=Users,dc=sys-adm,dc=local?sub
nss_base_shadow           ou=Users,dc=sys-adm,dc=local?sub
nss_base_group            ou=Groups,dc=sys-adm,dc=local?sub
nss_base_passwd           ou=Computers,dc=sys-adm,dc=local?sub
nss_connect_policy     persist

# При определении членства в группах исключаем следующих пользователей из поиска.
nss_initgroups_ignoreusers   root,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd,gdm

Установка и настройка smbldap-tools

smbldap-tools набор скриптов на perl значительно облегчающих работу с доменом, а именно создание, модификацию и удаление записей пользователей/групп/компьютеров.

К сожалению в CentOS 5.8 идет старая версия модуля perl-LDAP а именно perl-LDAP-0.33-3.fc6, для корректной работы smbldap-tools необходима версия не ниже 0.34. Поэтому мы соберем необходимую нам версию, а именно perl-LDAP-0.34-6
# cd /tmp
# wget http://wiki.sys-adm.org.ua/_media/srpms/perl-LDAP-0.34-6.src.rpm
# rpm -ivh perl-LDAP-0.34-6.src.rpm
   1:perl-LDAP              ########################################### [100%]

# cd /usr/src/redhat/SPECS/
# rpmbuild -ba perl-LDAP.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.59364
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd /usr/src/redhat/BUILD
+ rm -rf perl-ldap-0.34
+ /bin/gzip -dc /usr/src/redhat/SOURCES/perl-ldap-0.34.tar.gz
+ tar -xf -
...
...
...
Wrote: /usr/src/redhat/SRPMS/perl-LDAP-0.34-6.src.rpm
Wrote: /usr/src/redhat/RPMS/noarch/perl-LDAP-0.34-6.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.8427
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd perl-ldap-0.34
+ rm -rf /var/tmp/perl-LDAP-0.34-6-root-root
+ exit 0

Обновляем пакет

# rpm -Uvh /usr/src/redhat/SRPMS/perl-LDAP-0.34-6.src.rpm
   1:perl-LDAP              ########################################### [100%]

Теперь устанавливаем сам smbldap-tools с официального сайта

# yum install perl-Crypt-SmbHash perl-Digest-SHA1
# cd /tmp
# wget http://download.gna.org/smbldap-tools/packages/el5/smbldap-tools-0.9.8-1.el5.noarch.rpm
# rpm -ivh smbldap-tools-0.9.8-1.el5.noarch.rpm
Preparing...                ########################################### [100%]
   1:smbldap-tools          ########################################### [100%]

После того, как мы успешно установили smbldap-tools переходим непосредственно к настройке. Для этого редактируем два файла: /etc/smbldap-tools/smbldap_bind.conf и /etc/smbldap-tools/smbldap.conf

# $Id$
#
# /etc/smbldap-tools/smbldap_bind.conf
#
############################
# Credential Configuration #
############################
# Notes: you can specify two differents configuration if you use a
# master ldap for writing access and a slave ldap server for reading access
# By default, we will use the same DN (so it will work for standard Samba
# release)

# Указываем dn и пароль с которым мы будем подключаться к LDAP каталогу.
masterDN="cn=root,dc=sys-adm,dc=local"
masterPw="1234567"

# В случае, если у вас несколько LDAP серверов, указываем данные для подключения на slave.
slaveDN="cn=root,dc=sys-adm,dc=local"
slavePw="1234567"
# $Id$
#
# /etc/smbldap-tools/smbldap.conf
#
#  This code was developped by IDEALX (http://IDEALX.org/) and
#  contributors (their names can be found in the CONTRIBUTORS file).
#
#                 Copyright (C) 2001-2002 IDEALX
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
#  USA.

#  Purpose :
#       . be the configuration file for all smbldap-tools scripts

##############################################################################
#
# General Configuration
#
##############################################################################

# SID нашего домена
SID="S-1-5-21-206255134-223837211-2022137911"

# Имя домена.
sambaDomain="SYSADM"

##############################################################################
#
# LDAP Configuration
#
##############################################################################

# Адрес и порт для slave LDAP сервера
# Ex: slaveLDAP=127.0.0.1
slaveLDAP="127.0.0.1"
slavePort="389"

# Адрес и порт для master LDAP сервера
masterLDAP="127.0.0.1"
masterPort="389"

# Если установлена 1 будет использоваться шифрованное соединение с использованием start_tls
# на 389 порту. Но так как в нашем случае samba и OpenLDAP находятся на одном сервере,
# то использовать TLS нет смысла
ldapTLS="0"

# Если установлена 1 будет использоваться шифрованное соединение на 636 порту (ldaps)
# Но так как в нашем случае samba и OpenLDAP находятся на одном сервере,
# то использовать SSL нет смысла
ldapSSL="0"

# Проверка сертификата сервера, если такой задан и используется
verify="none"

# Так как мы не используем шифрование, то значения следующих 3х параметров не имеют значения для нас
# Root CA сертификат
cafile="/etc/smbldap-tools/ca.pem"

# Сертификат сервера
clientcert="/etc/smbldap-tools/smbldap-tools.example.com.pem"

# private key сервера
clientkey="/etc/smbldap-tools/smbldap-tools.example.com.key"

# LDAP Suffix. см структуру LDAP каталога в начале статьи
suffix="dc=sys-adm,dc=local"

# Указываем путь, где будут храниться пользователи
usersdn="ou=Users,${suffix}"

# Указываем путь, где будут храниться компьютеры
computersdn="ou=Computers,${suffix}"

# Указываем путь, где будут храниться группы
groupsdn="ou=Groups,${suffix}"

# Указываем путь, где будут храниться Idmap записи (используется, если samba является domain member server)
idmapdn="ou=Idmap,${suffix}"

# Указываем путь, где будут храниться группы следующие значение uidNumber и gidNumber,
# используемые при создании новых пользователей и групп
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"

# Область поиска по умолчанию
scope="sub"

# Хеш используемый для хранения паролей
# Возможные значения: CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT
password_hash="SSHA"

# Если password_hash установлен в CRYPT, устанавливаем формат salt
password_crypt_salt_format="$1$%.8s"

##############################################################################
#
# Unix Accounts Configuration
#
##############################################################################

# Задаем шел по умолчанию
userLoginShell="/sbin/nologin"

# Домашняя папка
userHome="/home/%U"

# Маска используемая при создании домашней папки
userHomeDirectoryMode="700"

# Gecos
userGecos="System User"

# GID используемый по умолчанию при создании пользователей
defaultUserGid="513"

# GID используемый по умолчанию при создании компьютеров
defaultComputerGid="515"

# Skel dir
skeletonDir="/etc/skel"

# Treat shadowAccount object or not
shadowAccount="1"

# Время жизни пароля в днях
# defaultMaxPasswordAge="45"

##############################################################################
#
# SAMBA Configuration
#
##############################################################################

# UNC путь к домашней папке пользователя. Если задать пустым, то будет использоваться
# значение 'logon home' из файла smb.conf
userSmbHome=""

# UNC путь к профилю пользователя. Если задать пустым, то будет использоваться
# значение 'logon path' из файла smb.conf
userProfile=""

# Имя диска, используемое при подключении домашней папки во время входа пользователя
userHomeDrive="W:"

# Имя скрипта, выполняемого при входе пользователя на компьютер
userScript="logon.bat"

# Имя домена, добавляемое к имени пользователя при использовании smbldap-useradd -M
mailDomain="example.com"

##############################################################################
#
# SMBLDAP-TOOLS Configuration (default are ok for a RedHat)
#
##############################################################################

# При значении 0 запрещает использование команды /usr/bin/smbpasswd, а вместо нее
# использовать библиотеку Crypt::SmbHash, которая является более предпочтительной
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"

# При значении 0 запрещает использование команды /usr/sbin/slappasswd, а вместо нее
# использовать библиотеки Crypt::, которые являются более предпочтительными.
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

После того, как мы настроили smbldap-tools можно переходить к инициализации LDAP каталога.

Инициализация LDAP каталога

Чтобы инициализировать наш LDAP каталог и создать минимально необходимую структуру, мы воспользуемся командой smbldap-populate.

# smbldap-populate -a sysadm-da -g 10000 -l 11111 -r 10000 -u 10000
Populating LDAP directory for domain SYSADM (S-1-5-21-206255134-223837211-2022137911)
(using builtin directory structure)

adding new entry: dc=sys-adm,dc=local
adding new entry: ou=Users,dc=sys-adm,dc=local
adding new entry: ou=Groups,dc=sys-adm,dc=local
adding new entry: ou=Computers,dc=sys-adm,dc=local
adding new entry: ou=Idmap,dc=sys-adm,dc=local
adding new entry: sambaDomainName=SYSADM,dc=sys-adm,dc=local
adding new entry: uid=sysadm-da,ou=Users,dc=sys-adm,dc=local
adding new entry: uid=nobody,ou=Users,dc=sys-adm,dc=local
adding new entry: cn=Domain Admins,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Domain Users,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Domain Guests,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Domain Computers,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Administrators,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Account Operators,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Print Operators,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Backup Operators,ou=Groups,dc=sys-adm,dc=local
adding new entry: cn=Replicators,ou=Groups,dc=sys-adm,dc=local

Please provide a password for the domain sysadm-da:
Changing UNIX and samba passwords for sysadm-da
New password: *******
Retype new password: *******

Как видно из вывода команды, она создает все необходимые OU (Organization Unit), а так же группы и двух пользователей nobody (гость) и sysadm-da (администратор домена). Ключи -u и -g задают начальные uid/gid соответственно для вновь создаваемых пользователей и групп. Параметр -a задает имя администратора домена, по умолчанию используется root. Теперь мы можем посмотреть информацию о пользователе sysadm-da

# smbldap-usershow sysadm-da
dn: uid=sysadm-da,ou=Users,dc=sys-adm,dc=local
objectClass: top,person,organizationalPerson,inetOrgPerson,sambaSamAccount,posixAccount,shadowAccount
uid: sysadm-da
cn: sysadm-da
sn: sysadm-da
gidNumber: 0
uidNumber: 0
homeDirectory: /home/sysadm-da
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaHomePath: \\PDC\home
sambaHomeDrive: W:
sambaProfilePath:
sambaPrimaryGroupSID: S-1-5-21-206255134-223837211-2022137911-512
sambaSID: S-1-5-21-206255134-223837211-2022137911-500
loginShell: /sbin/nologin
gecos: Netbios Domain Administrator
sambaLMPassword: 0AFA9EFC9DE20294AAD3B435B51404EE
sambaAcctFlags: [U]
sambaNTPassword: 8F4BC1891E1050BDB614E72625AC2D7B
sambaPwdLastSet: 1337698672
sambaPwdMustChange: 1341586672
userPassword: {CRYPT}0qaZvNIQMvD5.
shadowLastChange: 15482
shadowMax: 45

Утилиты id/getent также должны видеть этого пользователя

# id sysadm-da
uid=0(root) gid=0(root) groups=0(root),512(Domain Admins)

# getent passwd sysadm-da
sysadm-da:x:0:0:Netbios Domain Administrator:/home/sysadm-da:/sbin/nologin

Если вы откроете LDAP каталог в любом LDAP редакторе, в моем случае это Apache Directory Studio, то должны будете увидеть следующую структуру

 DIT (Directory Information Tree)

Создаем учетную запись компьютера PDC в домене

# smbldap-useradd -W -g 515 PDC

# smbldap-usershow PDC$ 
dn: uid=PDC$,ou=Computers,dc=sys-adm,dc=local
cn: PDC$
uid: PDC$
uidNumber: 10000
gidNumber: 515
homeDirectory: /nonexistent
loginShell: /sbin/nologin
description: Computer
gecos: Computer
objectClass: posixAccount,account,sambaSamAccount
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaPwdMustChange: 2147483647
sambaPwdLastSet: 1337774553
sambaAcctFlags: [W          ]
sambaSID: S-1-5-21-206255134-223837211-2022137911-10001
sambaPrimaryGroupSID: S-1-5-21-206255134-223837211-2022137911-515
displayName: PDC$
sambaDomainName: SYSADM

Ну а теперь собственно можно переходить к заключительному этапу настройке системы, а именно - настройка samba.

Настройка samba

Редактируем основной конфигурационный файл самбы /etc/samba/smb.conf

[global]

    # Общие настройки сервер
    workgroup = SYSADM
    server string = Primary Domain Controller
    netbios name = PDC
    security = user

    # Отключаем все, что связанно с печатью
    load printers = no
    show add printer wizard = no
    printcap name = /dev/null
    disable spoolss = yes
    
    # Путь к профилю, так как мы не используем перемещаемые профили, то оставляем пустым
    logon path =
    # Путь к домашней папке пользователя, которая будет мапиться на диск, указанный в 'logon drive'
    logon home = \\PDC\%U
    # Имя сетевого диска, для подключения домашней папки
    logon drive = W:
    # Имя скрипта, выполняемое при заходе на компьютер
    logon script = logon.bat

    # Путь log файла и его максимальный размер в килобайтах
    log file = /var/log/samba/samba.log
    max log size = 50000

    # Включаем использование шифрованных паролей
    encrypt passwords = yes
    
    # Вызов wbinfo -u и wbinfo -g будет возвращать список доменных пользователей и групп соответственно
    winbind enum groups = yes
    winbind enum users = yes
    
    # Добавляет имя домена к имени пользователя, т.е. если мы указали user1,
    # то имя будет трактоваться как SYSADM\\user1
    winbind use default domain = yes

    # Указываем, где хранить idmap преобразования
    idmap backend = ldap:"ldap://127.0.0.1/"
    ldap idmap suffix = ou=Idmap

    # Диапазон для маппинга uid/gid соответственно
    idmap uid = 10000-50000
    idmap gid = 10000-50000

    # Необходимые опции для полноценной работы с LDAP бекэндом
    ldapsam:trusted = yes
    ldapsam:editposix = yes
    
    # Синхронизируем LDAP пароли с NT и LM хешами (sambaLMPassword/sambaNTPassword)
    # При изменении пароля через windows он будет автоматически синхронизирован с LDAP.
    ldap passwd sync = yes
    
    # Удаляем полностью dn
    ldap delete dn = yes

    # Указываем, где LDAP хранит информацию о пользователях, группах и компьютерах
    ldap suffix = dc=sys-adm,dc=local
    ldap user suffix = ou=Users
    ldap group suffix = ou=Groups
    ldap machine suffix = ou=Computers
    
    # DN (Distinguished Name) используемой самбой при доступе к LDAP каталогу
    ldap admin dn = "cn=root,dc=sys-adm,dc=local"
    
    # Указываем самбе, что всю информацию о пользователях и группах мы храним в LDAP каталоге
    passdb backend = ldapsam:"ldap://127.0.0.1/"
    
    # Отключаем использование SSL
    ldap ssl = off

    enable privileges = yes
       
    # Наш сервер будет master browser, а так же будет выполнять роль доменного мастера
    # и logon сервера.
    os level = 128
    local master = yes
    domain master = yes
    preferred master = yes
    domain logons = yes

    # Указываем что наш сервер будет выполнять роль WINS сервера
    wins support = yes

    # Так как наш PDC является wins сервером, включаем данный функционал
    dns proxy = yes
    
    # Сервер является источником синхронизации времени
    time server = yes

    # Используем NTLMv2
    client ntlmv2 auth = yes
    # Запрещаем отправлять пароль в чистом виде, если сервер не поддерживает шифрование
    client plaintext auth = no

    # Отключаем использование старых методов аутентификации
    lanman auth = no
    lm announce = no

    # Время неактивности в минутах, после чего соединение считается мертвым и закрывается.
    deadtime = 15

    # Задаем кодировки
    display charset = utf8
    unix charset = utf8
    dos charset = cp866

    # Уровень информативности в log файлах
    log level  = 3

    # Наш сервер не является DFS сервером
    host msdfs  = no
    
    # Скрипты для модификаций учетных записей
    add user script = /usr/sbin/smbldap-useradd -a -m "%u"
    add machine script = /usr/sbin/smbldap-useradd -w '%u' -g 515
    add group script = /usr/sbin/smbldap-groupadd -a "%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"
    delete user script = /usr/sbin/smbldap-userdel -r "%u"
    delete group script = /usr/sbin/smbldap-groupdel "%g"
    rename user script = /usr/sbin/smbldap-usermod -r '%unew' '%uold'
    
    # Тюнинг сокета
    socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192 SO_KEEPALIVE

[home]
    comment = Home Directories
    path = /home/%U
    read only = no
    public = no
    writable = yes
    create mask = 0600
    browseable = no
    directory mask = 0700
    
[netlogon]
   comment = Network Logon Service
   path = /var/lib/samba/netlogon
   guest ok = yes
   writable = yes
   write list = "@SYSADM\Domain admins"
   browseable = no

[IPC$]
   path = /tmp

Задаем пароль для доменного пользователя, которого мы указали в ldap admin dn

# smbpasswd -w 1234567
Setting stored password for "cn=root,dc=sys-adm,dc=local" in secrets.tdb
Так как пароль сохраняется в файле secrets.tdb, то после смены пользователя, указанного в ldap admin dn, необходимо будет ввести новый пароль с помощью этой же команды.

Сохраняем доменный SID

# net getdomainsid
SID for local machine PDC is: S-1-5-21-3476215178-4255336796-2547748680
SID for domain SYSADM is: S-1-5-21-206255134-223837211-2022137911

Запускаем samba

# service smb start
Starting SMB services:                                     [  OK  ]
Starting NMB services:                                     [  OK  ]

Необходимо подождать около минуты, пока пройдут выборы. Узнать о том, что наш PDC стал локальным и доменным мастер браузером можно с помощью следующей команды

# nmblookup 'SYSADM#1b' 'SYSADM#1c'
added interface eth0 ip=192.168.127.2 bcast=192.168.127.255 netmask=255.255.255.0
Socket opened.
querying SYSADM on 192.168.127.255
Got a positive name query response from 192.168.127.2 ( 192.168.127.2 )
192.168.127.2 SYSADM<1b>
querying SYSADM on 192.168.127.255
Got a positive name query response from 192.168.127.2 ( 192.168.127.2 )
192.168.127.2 SYSADM<1c>

После этого запускаем winbind

# service winbind start
Starting Winbind services:                                 [  OK  ]

Вводим наш сервер в домен. В принципе в параметре -U можно указать любого пользователя, у которого есть право на добавление компьютеров в домен.

# net rpc join -U sysadm-da MEMBER
Enter sysadm-da's password:
Joined domain SYSADM.

После добавления PDC в домен у учетной записи PDC$ должен появиться новый атрибут sambaNTPassword

# smbldap-usershow PDC$ 
dn: uid=PDC$,ou=Computers,dc=sys-adm,dc=local
cn: PDC$
uid: PDC$
uidNumber: 10000
gidNumber: 515
homeDirectory: /nonexistent
loginShell: /bin/false
description: Computer
gecos: Computer
objectClass: posixAccount,account,sambaSamAccount
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaPwdMustChange: 2147483647
sambaSID: S-1-5-21-206255134-223837211-2022137911-10001
sambaPrimaryGroupSID: S-1-5-21-206255134-223837211-2022137911-515
displayName: PDC$
sambaDomainName: SYSADM
sambaNTPassword: 51A8827A71C511FF556408867FB3330F
sambaPwdLastSet: 1337889271
sambaAcctFlags: [S          ]

Проверяем информацию о домене

# net rpc info -U sysadm-da
Enter sysadm-da's password:
Domain Name: SYSADM
Domain SID: S-1-5-21-206255134-223837211-2022137911
Sequence number: 1337889347
Num users: 2
Num domain groups: 4
Num local groups: 0

Производим базовые проверки

# wbinfo -p
Ping to winbindd succeeded

# wbinfo -t
checking the trust secret for domain SYSADM via RPC calls succeeded

# wbinfo -i sysadm-da
sysadm-da:*:0:0:sysadm-da:/home/sysadm-da:/bin/false

# wbinfo -g | grep "domain"
domain admins
domain users
domain guests
domain computers

Проверяем аутентификацию через демон winbind

# wbinfo -a sysadm-da%1234567
plaintext password authentication succeeded
challenge/response password authentication succeeded

Проверяем преобразование SID → uid и uid → SID

# wbinfo --name-to-sid=SYSADM\\sysadm-da
S-1-5-21-206255134-223837211-2022137911-500 User (1)

# wbinfo --sid-to-uid=S-1-5-21-206255134-223837211-2022137911-500
0

Добавляем запуск самбы при старте системы

# chkconfig --level 35 smb on
# chkconfig --level 35 winbind on

Тестирование samba

В качестве теста попробуем ввести две машины в наш новый домен, одна из них будет Windows XP Professional SP3, а вторая Windows 7 Professional SP1. Для Win7 мы создадим учетную запись командой, в то время как для Win XP запись создатся автоматически.

Собственно процедура ввода в домен Windows XP стандартная. В свойствах ситемы на вкладке 'Имя компьютера' выбираем Изменить и в появившемся диалоговом окне вводит имя домена, в нашем случае SYSADM

После нажатия конпки Ok появится диалоговое окно с запросом учетных данных пользователя, обладающего правами на добавление компьютера в домен, в нашем случае это пользователь sysadm-da, который является администратором домена и был создан автоматически при выполнении скрипта smbldap-populate.

После того, как компьютер будет успешно добавлен на экране отобразится соответствующее информационное окно

После этого необходимо перезагрузить компьютер и при вводе логина и пароля в поле 'Вход в' выбрать наш домен

Если посмотреть свойства системы, то будет видно, что компьютер теперь является участником домена

Если открыть 'Мой компьютер', то будет виден подключенный сетевой диск с домашней папкой пользователя.

В сетевом окружении должен быть виден наш домен SYSADM

Внутри которого должны быть видны 3 компьютера - pdc, windows xp и windows 7

А так выглядят утилиты User Manager и Server Manager соответственно из архива srvtools.zip

Ниже привожу аналогичные свойства, но только для Windows 7. Как я уже писал выше, для компьютера на базе Windows 7 мы создадим учетную запись сами, из командной строки

# smbldap-useradd -W -g 515 Win7
# smbldap-usershow Win7$ 
dn: uid=Win7$,ou=Computers,dc=sys-adm,dc=local
cn: Win7$
uid: Win7$
uidNumber: 10001
gidNumber: 515
homeDirectory: /nonexistent
loginShell: /bin/false
description: Computer
gecos: Computer
objectClass: posixAccount,account,sambaSamAccount
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaPwdMustChange: 2147483647
sambaAcctFlags: [W          ]
sambaSID: S-1-5-21-206255134-223837211-2022137911-10003
sambaPrimaryGroupSID: S-1-5-21-206255134-223837211-2022137911-515
displayName: Win7$
sambaDomainName: SYSADM
sambaNTPassword: 5E415440CC8A65306EF7A88D88D8B3C3
sambaPwdLastSet: 1338147705

# smbldap-usershow WINXPSP3$ 
dn: uid=WINXPSP3$,ou=Computers,dc=sys-adm,dc=local
uid: WINXPSP3$
sambaSID: S-1-5-21-206255134-223837211-2022137911-10002
sambaAcctFlags: [W          ]
objectClass: sambaSamAccount,account,posixAccount
cn: WINXPSP3$
uidNumber: 10000
gidNumber: 513
homeDirectory: /home/SYSADM/SMB_workstations_home
loginShell: /bin/false
sambaNTPassword: DFFC9CCB77ABA78CA5F1DEB0E69E8AEB
sambaPwdLastSet: 1338046413

Как видно из вывода, запись для компьютера Win7 содержит намного больше полей, чем для WINXPSP3. В принципе обе записи являются рабочими, но я предпочитаю создавать записи для рабочих станций из командной строки.

На этом настройку можно считать завершенной.

Перед тем, как вводить в домен машины под управлением Windows 7, вам необходимо добавить в реестр данные с файла samba3-win7.reg, который доступен в конце статьи. После внесения данных в реестр, необходимо перегрузить компьютер и после этого выполнять процедуру ввода в домен, которая аналогична процедуре для Windows XP.

Windows 8

В связи со скорым выходом новой ОС Windows 8 решил проверить работу данной ОС в домене samba. Как и ожидалось никаких проблем с вводом Windows 8 в домен не оказалось. Для теста использовалась Windows 8 Consumer Preview. Ниже привожу несколько скриншотов

Примечание

Сегодня, в первые за 5 лет использования в качестве КД samba, столкнулся с невозможностью зайти на компьютер под доменой учетной записью. При попытке входа на рабочую станцию выдается сообщение с ошибкой - «The local Session Manager service failed the logon. Data area passed to a system call is too small». Немного поискав в интернете обнаружил, что я не одинок - https://bugzilla.samba.org/show_bug.cgi?id=7343 . А здесь собственно дается пояснение - если в двух словах, то длина учетной записи, а в нашем случае длина поля uid, должна быть меньше 20 символов.

Дополнительные файлы

net/samba-pdc-ldap.txt · Последние изменения: 2015/07/01 12:31 — root