суббота, 10 ноября 2012 г.

Контроллер домена samba + openldap + tls

Как вы поняли, речь пойдет о поднятии контроллера домена с помощью связки samba + openldap. Спросите зачем это нужно? Ну, например, может возникнуть потребность некой единой структуры аутентификации и авторизации для малых и средних контор. Единственный минус всего этого решения - отсутствие поддержки групповых политик, но и эту проблему можно обойти, если вспомнить, что групповые политики - это всего лишь ключи реестра. Ну что ж, приступим.

Поднимать работающий контроллер домена мы будем на CentOS 6. Весь процесс установки и настройки можно разделить на три этапа:
  • установка и настройка openLDAP
  • подготовка системы для работы с openLDAP
  • установка и настройка пакета скриптов smbldap-tools
  • установка и настройка samba


Установка и настройка openLDAP


Установка и настройка openLDAP подробно описаны вот здесь. Помимо базовой настройки, вам нужно настроить TLS, а также необходимо подключить схему samba. Перед подключением схемы установите следующие пакеты:

[root@server-DS ~]# yum install samba samba-common


Подготовка системы для работы с openLDAP


В самом начале рекомендую вам отключить SELinux, чтобы убедиться в правильности проделанной вами работы. В файле /etc/sysconfig/selinux сделайте такое изменение:

SELinux=disabled

и перегрузитесь или выполните в консоли

[root@server-DS ~]# setenforce 0

Далее отредактируем файл /etc/hosts. Это обязательное действие, иначе система не сможет себя распознать по имени и могут наблюдаться некоторые провисания при доступе на шару, например. Добавим такую строку:

server_ip_address server-ds server-ds.example.net

Для связи нашей системы с openLDAP нам нужно явно указать системе что(логины, пароли, группы и т.д) и откуда брать. Для этого в Linux используется файл /etc/nsswitch.conf. Внесём в него такие изменения:

passwd: files ldap
shadow: files ldap
group: files ldap
hosts: files dns wins

Теперь система знает механизм поиска логинов, паролей и групп. Далее нам следует указать системе как связаться с openLDAP, в каком месте openLDAP находятся необходимые нам данные и т.д. Для этого существует пакет nss-pam-ldapd. Установим его:

[root@server-DS ~]# yum install nss-pam-ldapd

и внесём необходимые изменения в его конфигурационный файл /etc/nslcd.conf:

#какую версию ldap использовать
ldap_version 3
#число потоков, выполняющие запросы к серверу ldap
threads 20
#от чьего имени связываться с сервером ldap
binddn cn=authuser,dc=example,dc=net
bindpw secret
#базовый DN поиска
base dc=example,dc=net
#базовые DN для пользователей, паролей и групп
base group ou=Groups,dc=example,dc=net
base passwd ou=Users,dc=example,dc=net
base passwd ou=Computers,dc=example,dc=net
base shadow ou=Users,dc=example,dc=net
#область поиска
scope sub
scope passwd sub
#использовать TLS
ssl start_tls
tls_reqcert never
#пользователь и группа от имени которых будет запущен демон nslcd(только локальные)
uid nslcd
gid ldap
#адрес сервера ldap
uri ldap://ldap_server_ip_address/

Необходимо создать указанного пользователя authuser:

dn: cn=authuser,dc=example, dc=net
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: authuser
userPassword: {SSHA}KeU8UoK5Uxlihed0atpkzXqa4+JMjZX7
и добавить его в базу openLDAP:
[root@server ~]# ldapadd -x -W -D cn=administrator,dc=example,dc=net -f authuser.ldif
Enter LDAP Password:
adding new entry "cn=authuser,dc=example,dc=net"

Запустим демон nslcd и добавим его а автозагрузку:

[root@server-DS ~]# /etc/init.d/nslcd start
[root@server-DS ~]# chkconfig nslcd on

и теперь система "видит" пользователей из базы openLDAP. Если база не пуста и пользователи имеются в ou=Users, то вы можете убедится в этом выполнив команду id <username>, которая покажет вам uid, gid и группы, в которые входит пользователь <username>:

[root@server-DS ~]# id sysadmin
uid=1025(sysadmin) gid=555(IT) группы=555(IT), 512(Domain Admins)

Теперь добавим такую строчку в файл /etc/openldap/ldap.conf:

TLS_REQCERT allow

Добавленная строка нужна для того, чтобы samba могла соединится с openLDAP используя TLS.

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


Следующим нашим шагом будет установка набора скриптов для связи samba и openLDAP. Установим этот пакет, подключив для начала репозиторий epel:

[root@server-DS ~]# rpm -i http://ftp.tlk-l.net/pub/mirrors/fedora-epel/6/i386/epel-release-6-7.noarch.rpm
[root@server-DS ~]# yum install smbldap-tools

Теперь необходимо произвести настройки этого пакета. Можно поступить двумя способами - вручную отредактировать файлы или воспользоваться готовым скриптом.Для начала я рекомендую просмотреть первый вариант, чтобы было понятней пользование скриптом. Итак, редактируем файлы /etc/smbldap-tools/smbldap.conf и /etc/smbldap-tools/smbldap_bind.conf:

# SID домена
SID="S-1-5-21-3954423230-3418645706-2461697144"

# имядомена
sambaDomain="example.net"

# адрес слэйв сервера ldap(если вы настраивали ldap сервер на этой же машине, то можно указать адрес 127.0.0.1)
slaveLDAP="127.0.0.1"

# порт сервера slave ldap
slavePort="389"

# адрес сервера master ldap(если вы настраивали ldap сервер на этой же машине, то можно указать адрес 127.0.0.1)
masterLDAP="127.0.0.1"

# порт сервера master ldap
masterPort="389"

# использовать TLS
ldapTLS="1"

# так как мы не используем SSL в чистом виде, а используем TLS, то эти параметры оставьте пустыми
verify=""
cafile=""
clientcert=""
clientkey=""

# суффикс ldap, как в базе openLDAP
suffix="dc=example,dc=net"

# место хранения пользователей в ldap
usersdn="ou=Users,${suffix}"

# место хранения компьютеров в ldap
computersdn="ou=Computers,${suffix}"

# место хранения групп в ldap
groupsdn="ou=Groups,${suffix}"

# место хранения записей Idmap в ldap(необязательный параметр)
idmapdn="ou=Idmap,${suffix}"

# место, где хранить uidNumber и gidNumber доступные для новых пользователей и групп
sambaUnixIdPooldn="sambaDomainName=example.net,${suffix}"

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

# используемый тип шифрования (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT)
hash_encrypt="SSHA"

# опциональный параметр, используется вместе с hash_encrypt="CRYPT"
crypt_salt_format=""

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

userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
#defaultMaxPasswordAge="0"

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

userSmbHome=""
userProfile=""
userHomeDrive=""
userScript="%G.vbs"
mailDomain=""

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

with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"

with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

#DN и пароль администратора на slave сервере ldap(пароль пишется в открытом виде в двойных кавычках)
slaveDN="cn=administrator,dc=example,dc=net"
slavePw="secret"

#DN и пароль администратора на master сервере ldap(пароль пишется в открытом виде в двойных кавычках)
masterDN="cn=administrator,dc=example,dc=net"
masterPw="secret"

Так как пароль пишется в открытом виде, то режим доступа к файлу /etc/smbldap-tools/smbldap_bind.conf должен иметь следующий вид:

[root@server-DS ~]# ls -l /etc/smbldap-tools/smbldap_bind.conf
-rw-------. 1 root root 457 Окт 29 15:43 /etc/smbldap-tools/smbldap_bind.conf

Чтобы воспользоваться скриптом, необходимо сначала поставить бит исполнимого файла на скрипт, потому как при установке пакета этот бит отсутствует. После этого запустите скрипт и следуйте подсказкам:

[root@server-DS ~]# chmod 0700 `rpm -qal | grep configure.pl`
[root@server-DS ~]# `rpm -qal | grep configure.pl`

Теперь осталось заполнить нашу базу в openLDAP записями, необходимыми для samba, в том числе создать аккаунт administrator, который является администратором домена. Воспользуемся командой из пакета smbldap-tools:

[root@server-DS ~]# smbldap-populate -a administrator

Установка и настройка Samba


Так как samba-пакеты были установлены ещё на этапе настройки openLDAP(для подклячения схемы), то теперь можно приступить к настройке. Приведём конфигурационный файл samba /etc/samba/smb.conf к такому виду:

[global]
workgroup = example.net
netbios name = server-ds
interfaces = lo, eth1
bind interfaces only = Yes
server string =
name resolve order = wins bcast hosts
passdb backend = ldapsam:"ldap://127.0.0.1/"

#параметры безопасности
security = user
check password script = cracklib
restrict anonymous = 1
lanman auth = no
ntlm auth = yes
client NTLMv2 auth = yes
client lanman auth = no
client plaintext auth = no
max protocol = SMB2
min protocol = NT1

#настроим логи
syslog = 1
syslog only = yes

#набор скриптов для интеграции samba и openLDAP
rename user script = /usr/sbin/smbldap-usermod -r '%unew' '%uold'
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'"
add machine script = /usr/sbin/smbldap-useradd -w "%u"

#опции входа
#задаём скрипт, выполняющийся при входе в сессию(выполняется от имени входящего пользователя)
logon script = %G.vbs
#выключаем перемещаемые профили
logon path =
logon home =

#включаем функцию контроллера домена и мастер-браузера сети Windows
domain logons = Yes
preferred master = Yes
local master = Yes
domain master = Yes
os level = 254
wins support = Yes

#параметры подключения к ldap
ldap suffix = dc=example,dc=net
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap admin dn = cn=administrator,dc=example,dc=net
ldap delete dn = Yes
ldap passwd sync = yes
ldap ssl = start_tls
ldapsam:trusted = yes

#отключим поддержку печати(зачем она на контроллере?!)
printcap name = /dev/null
disable spoolss = yes

#специальная шара для logon-скриптов
[netlogon]
comment = Network Logon Service
path = /etc/samba/netlogon
guest ok = no
writable = yes
write list = administrator, "@example.net\Domain Admins"
browseable = no

Теперь зададим пароль администратора, которого указали в "ldap admin dn":

[root@server-DS ~]# smbpasswd -W
Setting stored password for "cn=administrator,dc=example,dc=net" in secrets.tdb
New SMB password:
Retype new SMB password:

Запустим samba и добавим в автозагрузку:

[root@server-DS ~]# /etc/init.d/smb start && /etc/init.d/nmb start
[root@server-DS ~]# chkconfig smb on && chkconfig nmb on

Вводим наш сервер в собственный домен

[root@server-DS ~]# net rpc join -U administrator
Enter administrator's password:

И остался самый последний штрих. Наверняка в вашей сети будет не один аминистратор или вы сами не захотите сидеть под аккаунтом administrator, но захотите иметь админские права. Тогда необходимо снабдить правами администратора любую группу и добавить туда пользователя. Так как уже имеется группа Domain Admins, созданная командой smbldap-populate, то её мы и снабдим админскими правами:

[root@server-DS ~]# net rpc rights grant -S server-DS -U administrator 'standart.dn.ua\Domain Admins' SeMachineAccountPrivilege SeTakeOwnershipPrivilege SeBackupPrivilege SeRestorePrivilege SeRemoteShutdownPrivilege SePrintOperatorPrivilege SeDiskOperatorPrivilege
Enter administrator's password:
Successfully granted rights.

Теперь у вас имеется контроллер домена для Windows машин. Для управления аккаунтами, группами и др. в openLDAP можете настроить phpldapadmin как описано вот здесь или воспользоваться виндовой программкой(IMHO лучшей в своём роде) ldapadmin.

14 комментариев:

  1. В начале статьи редактируется /etc/nsswitch.conf :
    passwd: files ldap
    shadow: files ldap
    group: files ldap
    hosts: files dns wins

    Так вот меня интересует строка "hosts: files dns wins" - что мне ставить если у меня линуксовые тачки?

    ОтветитьУдалить
    Ответы
    1. А есть доходчивая статья на русском по переносу opeldap+samba на другой сервер?
      Не получается по простому.. slapcat -v -l backup.ldif, потом на новом серве slapadd -F /etc/openldap/slapd.d/ -v -l backup.ldif
      Available database(s) do not allow slapadd...

      Удалить
    2. Вам нужно настроить на другом сервере аналогичным образом. А для переноса базы сделать примерно вот так:
      slapcat -v -b "dc=example,dc=net" -l backup.ldif
      ldapadd -x -W -D ”cn=Manager,dc=example,dc=net” -f backup.ldif

      Удалить
  2. и еще вопрос nss-pam-ldapd - его обязательно ставить на сервер или главное чтобы на клиентских тачках был?

    ОтветитьУдалить
    Ответы
    1. Конечно обязательно, иначе samba не сможет брать пользователей из ldap

      Удалить
    2. спасибо получилось только базу заливал с помощью slapadd и потом главное не забыть вернуть права ldap на папку с базой /var/lib/ldap/

      Удалить
    3. ldapadd -x -W -D cn=administrator,dc=example,dc=net -f authuser.ldif

      1. Откуда взялся administrator
      2. Команда ldapadd неизвестна

      Удалить
    4. Что значит откуда? Вы openLDAP установили? настроили?

      Удалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
    Ответы
    1. Инструкция полностью рабочая, но для Centos 6(!). На сегодняшний день эта инструкция малоактуальна, ввиду того, что с 2012 года вышло уже несколько редакций Samba 4, умеющей натуральный AD. Отсылка к настройке openLDAP в слове "здесь", оно в виде ссылки, кликнуть пробовали?

      Удалить
  4. В мануале не указана установка и настройка openldap, Сделайте ссылку на вашу же статью по установке openLDAP-сервера, и только потом переходите к следующему этапу настройки. Укажите хотя бы пункт, который вы выкинули, "вот здесь устанавливаем openLDAP (сами знаете как, не знаете - читать тут).

    ОтветитьУдалить
    Ответы
    1. Аня, я на самом деле не пойму в чем у вас проблема. В предложении "Установка и настройка openLDAP подробно описаны вот здесь" слово "здесь" - это кликабельная ссылка, по которой и находится мануал по настройке. Ну, или на крайний случай, справа вверху есть ярлыки, там есть openLDAP - кликайте и смотрите статьи по теме. Еще раз напомню это все относится только к Centos 6 и openLDAP 2.4

      Удалить