Установка Samba 3 [PDC] + LDAP на FreeBSD


1. Если будущий сервер имеет доступ в Internet только через proxy-сервер, тогда добавим в /etc/make.conf следующие строки (здесь 192.168.1.1 - proxy-сервер, а 3128 – порт proxy-сервера):

     FETCH_ENV =    FTP_PROXY=ftp://192.168.1.1:3128

     FETCH_ENV =    HTTP_PROXY=http://192.168.1.1:3128

2. Устанавливаем из портов LDAP-сервер:

     # cd /usr/ports/net/openldap22-server/

     # make >> /root/openldap22-server.make

т.к. мы устанавливаем посредствам ssh то для экономии трафика вывод таких команд как make  мы будем перенаправлять в файл для последующего изучения, а ошибки непосредственно будем видеть на экране

     # tail /root/openldap22-server.make

если фатальных ошибок не обнаружено то продолжаем

     # make install >> /root/openldap22-server.make.install

     # tail /root/openldap22-server.make.install

если видим нечто подобное:

     If there are vulnerabilities in these programs there may be a security

     risk to the system. FreeBSD makes no guarantee about the security of

     ports included in the Ports Collection. Please type 'make deinstall'

     to deinstall the port if this is a concern.


     For more information, and contact details about the security

     status of this software, see the following webpage:

http://www.OpenLDAP.org/

значит все в порядке, можно продолжать.

     # make clean

3. Устанавливаем из портов SAMBA 3

     # cd /usr/ports/net/samba3

     # make configure

выставляем необходимые опции (я установил следующие: LDAP, ADS, CUPS, WINBIND, QUOTAS, UTMP, POPT. На самом деле я добавил только QUOTAS к установленным по умолчанию)

     # make >> /root/samba3.make

     # tail /root/samba3.make

если фатальных ошибок не обнаружено то продолжаем

     # make install >> /root/samba3.make.install

     # tail /root/samba3.make.install

если видим нечто подобное:

     If there are vulnerabilities in these programs there may be a security

     risk to the system. FreeBSD makes no guarantee about the security of

     ports included in the Ports Collection. Please type 'make deinstall'

     to deinstall the port if this is a concern.


     For more information, and contact details about the security

     status of this software, see the following webpage:

http://www.samba.org/

значит все в порядке, можно продолжать.

     # make clean

4. Устанавливаем из портов LDAP-клиента

# cd /usr/ports/net/openldap22-client/

     # make >> /root/openldap22-client.make

     # tail /root/openldap22-client.make

если фатальных ошибок не обнаружено то продолжаем (возможно возникнут ошибки, тогда необходимо выполнить сначала # make deinstall)

     # make install >> /root/openldap22-client.make.install

     # tail /root/openldap22-client.make.install

если видим нечто подобное:

The OpenLDAP client package has been successfully installed.

Edit

 /usr/local/etc/openldap/ldap.conf

to change the system-wide client defaults.

Try `man ldap.conf' and visit the OpenLDAP FAQ-O-Matic at

 http://www.OpenLDAP.org/faq/index.cgi?file=3

for more information.

************************************************************

===>   Compressing manual pages for openldap-client-2.2.23

===>   Running ldconfig

/sbin/ldconfig -m /usr/local/lib

===>   Registering installation for openldap-client-2.2.23

значит все в порядке, можно продолжать.

     # make clean


5. Так как для добавления пользователей в samba, необходимы одноименные системные пользователи, то было бы разумно хранить их в LDAP. Это дает возможность использовать список пользователей на других системах по средствам «реплик» (об этом возможно расскажу ниже). Для  хранения в LDAP системных аккаунтов, устанавливаем из портов nss_ldap и pam_ldap (учтите, для установки требуется FreeBSD 5.1 или более поздняя версия).

     # cd /usr/ports/net/nss_ldap/

     # make >> /root/nss_ldap.make

     # tail /root/nss_ldap.make

если фатальных ошибок не обнаружено то продолжаем

     # make install >> /root/nss_ldap.make.install

     # tail /root/nss_ldap.make.install

если видим нечто подобное:

WARNING: For users of previous versions of this port:

WARNING:

WARNING: Previous versions of this port expected configuration files

WARNING: to be located at /etc/ldap.conf and /etc/ldap.secret.  You

WARNING: may need to move these configuration files to their new

WARNING: location specified above.

=====================================================================

===>   Running ldconfig

/sbin/ldconfig -m /usr/local/lib

===>   Registering installation for nss_ldap-1.204_5

значит все в порядке, можно продолжать.

     # make clean


     # cd /usr/ports/security/pam_ldap/

     # make >> /root/pam_ldap.make

     # tail /root/pam_ldap.make

если фатальных ошибок не обнаружено то продолжаем

     # make install >> /root/pam_ldap.make.install

     # tail /root/pam_ldap.make.install

если видим нечто подобное:

================================================================================

Copy /usr/local/etc/ldap.conf.dist to /usr/local/etc/ldap.conf, then edit

/usr/local/etc/ldap.conf in order to use this module.  Add a line similar to

the following to /etc/pam.conf on 4.X, or create an /etc/pam.d/ldap on 5.X

with a line similar to the following:

login   auth    sufficient      /usr/local/lib/pam_ldap.so

================================================================================

===>   Registering installation for pam_ldap-1.7.6

значит все в порядке, можно продолжать.

     # make clean


6. Настраиваем OpenLDAP

Для начала скопируем схему samba.shema которая прилагается в дистрибутиве SAMBA в каталог схем OpenLDAP

# cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema/

Затем редактируем конфигурационный файл LDAP сервера

# vi /usr/local/etc/openldap/slapd.conf

#

# See slapd.conf(5) for details on configuration options.

# This file should NOT be world readable.

#

include         /usr/local/etc/openldap/schema/core.schema

# Эти схемы необходимо включить для работы.

include         /usr/local/etc/openldap/schema/cosine.schema

include         /usr/local/etc/openldap/schema/inetorgperson.schema

include         /usr/local/etc/openldap/schema/misc.schema

include         /usr/local/etc/openldap/schema/nis.schema

include         /usr/local/etc/openldap/schema/openldap.schema

include         /usr/local/etc/openldap/schema/samba.schema


# Define global ACLs to disable default read access.


# Do not enable referrals until AFTER you have a working directory

# service AND an understanding of referrals.

#referral       ldap://root.openldap.org


pidfile         /var/run/openldap/slapd.pid

argsfile        /var/run/openldap/slapd.args


# Для использования ssl необходимо раскоментировать следующие строки

# а также установить и настроить пакет openssl

#TLSCipherSuite         HIGH:MEDIUM:+SSLv2:+TLSv1

#TLSCertificateFile     /usr/local/etc/openldap/ldap.csr

#TLSCertificateKeyFile  /usr/local/etc/openldap/ldap.key


# Load dynamic backend modules:

# modulepath    /usr/local/libexec/openldap

# moduleload    back_bdb

# moduleload    back_ldap

# moduleload    back_ldbm

# moduleload    back_passwd

# moduleload    back_shell


# Sample security restrictions

#       Require integrity protection (prevent hijacking)

#       Require 112-bit (3DES or better) encryption for updates

#       Require 63-bit encryption for simple bind

# security ssf=1 update_ssf=112 simple_bind=64


# Sample access control policy:

#       Root DSE: allow anyone to read it

#       Subschema (sub)entry DSE: allow anyone to read it

#       Other DSEs:

#               Allow self write access

#               Allow authenticated users read access

#               Allow anonymous users to authenticate

#       Directives needed to implement policy:

# access to dn.base="" by * read

# access to dn.base="cn=Subschema" by * read

# access to *

#       by self write

#       by users read

#       by anonymous auth

#

# if no access controls are present, the default policy

# allows anyone and everyone to read anything but restricts

# updates to rootdn.  (e.g., "access to * by * read")

#

# rootdn can always read and write EVERYTHING!


#######################################################################

# BDB database definitions

#######################################################################


#database       bdb

#Тип базы данных

database        ldbm



#Здесь test-domain.ru – это домен вашей организации, например freebsd.org

# это основной суффикс БД, он является корневым объектом системы дерикторий.

# в принципе он задается произвольно, на усмотрение администратора.

suffix          "dc=test-domain,dc=ru"

#имя администратора БД LDAP

rootdn          "cn=root,dc=test-dimain,dc=ru"

# Cleartext passwords, especially for the rootdn, should

# be avoid.  See slappasswd(8) and slapd.conf(5) for details.

# Use of strong authentication encouraged.

#Хеш пароля администратора БД LDAP

# Создать хеш пароля можно так #/usr/local/sbin/slappasswd  (по умолчанию {SSHA})

rootpw          {SSHA}EFY1y0ArXBfKJx5yI82uFD6w0t22OK9W


#Уровень логирования

loglevel 256

# The database directory MUST exist prior to running slapd AND

# should only be accessible by the slapd and slap tools.

# Mode 700 recommended.

directory       /var/db/openldap-data

# Indices to maintain

index   objectClass,uid,uidNumber,gidNumber     eq

index   cn,mail,surname,givenname               eq,subinitial


# FOR samba3

index   sambaSID                eq

index   sambaPrimaryGroupSID    eq

index   sambaDomainName         eq


# Basic ACL

access to attr=userPassword

by self write

by anonymous auth

by * none

# Доступ к smb-паролям пользователей только администратору SAMBA

# в нашем случае это admin

access to attrs=sambaLMPassword,sambaNTPassword

by dn="cn=admin,ou=users,dc=test-dimain,dc=ru" write

by * none

access to *

by * read


Проверим права доступа:

# ls -la /usr/local/etc/openldap/slapd.conf

-rw-------  1 root  wheel  3097 Jun 17 11:19 /usr/local/etc/openldap/slapd.conf


7. Устанавливаем из портов OpenSSL

Для обеспечения безопасности передаваемой информации по сети будем использовать SSL. Начнем:

     # cd /usr/ports/security/openssl/

     # make >> /root/openssl.make

     # tail /root/openssl.make

если фатальных ошибок не обнаружено то продолжаем

     # make install >> /root/openssl.make.install

     # tail /root/openssl.make.install

если видим нечто подобное:

     If there are vulnerabilities in these programs there may be a security

     risk to the system. FreeBSD makes no guarantee about the security of

     ports included in the Ports Collection. Please type 'make deinstall'

     to deinstall the port if this is a concern.


     For more information, and contact details about the security

     status of this software, see the following webpage:

http://www.openssl.org/

значит все в порядке, можно продолжать.

     # make clean


Далее воспользуйтесь статьей  Григорьева Михаила

http://www.unixdoc.ru/index.php?mode=2&podmode=1&arcicle_id=123&theme=freebsd%20ldap%20ssl%20auth


Либо, ее немного подправленной под конкретную ситуацию версией, ниже по тексту при рассмотрении системы резервирования.


8. Подготовка и запуск сервера LDAP

Посмотрим на содержимое скрипта запуска сервера LDAP /usr/local/etc/rc.d/slapd.sh, нас интересуют следующие строки:

# Add the following lines to /etc/rc.conf to enable slapd:

#

#slapd_enable="YES"

#slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'

#slapd_sockets="/var/run/openldap/ldapi"


Отсюда видно, что необходимо добавить следующие строки в файл /etc/rc.conf


slapd_enable="YES"

slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/ ldaps://0.0.0.0/"'

slapd_sockets="/var/run/openldap/ldapi"

Как несложно догадаться, последовательность символов “%2f” заменяет символ “/ “ и  %2fvar%2frun%2fopenldap%2fldapi на самом деле это /var/run/openldap/ldapi.


9. Запускаем сервер LDAP:


# /usr/local/etc/rc.d/slapd.sh start

Starting slapd.


Проверим работу демона сервера:


# netstat -a | grep LISTEN | grep ldap

tcp4       0      0  *.ldaps                *.*                    LISTEN

tcp4       0      0  *.ldap                 *.*                    LISTEN


Как видим, сервер работает.


10. Настройка  SAMBA


Воспользуемся любимым текстовым редактором и добавим в /etc/rc.conf следующую строчку: samba_enable=”YES”. Например вот так

# echo samba_enable=\"YES\" >> /etc/rc.conf


Теперь займемся конфигурационным файлом SAMBA. Для начала скопируем шаблон (пример предоставленный разработчиками):


#cp /usr/local/etc/smb.conf.default /usr/local/etc/smb.conf


Теперь правим его до примерно такого состояния:

# vi /usr/local/etc/smb.conf


#======================= Global Settings =====================================

[global]

# Для сокращения статьи я убрал почти все лишнее и комментарии

# настоятельно рекомендую ознакомится с оригинальным smb.conf и документацией по SAMBA


# имя домена

  workgroup = TEST-DOMAIN

# netbio-имя сервера

  netbios name = TESTDOMAIN

# Крментарий который будет видно при простотре в сетевом окружении

  server string = Server TEST-DOMAIN


# безопастность разделения ресурсов на уровне пользователей

  security = user

# Шифрованный пароль (могут возникнуть проблемы с win95 и win98-неSE, об этом много написанно)

  encrypt passwords = yes


# Администратор домена (либо администраторы, если их написать через запятую )

       admin users = admin


# Hosts allow разрешает машинам с указанными IP-адресами

#присоединяться к Samba-серверу.

; hosts allow = 192.168.8. 127.


# По умолчанию демон Samba слушает все активные сетевые интерфейсы.

#С помощью  параметра Interfaces можно выбрать только те интерфейсы,

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

; interfaces = 192.168.8.2/24 192.168.12.2/24



# Для каждой машины %m, подключенной к Samba-серверу,  использовать свой log-файл.

;   log file = /var/log/samba/log.%m

# возможно имеет смысл писать единый log-файл, для удобства поиска grep-ом:

  log file = /var/log/samba/samba.log




# Максимальный размер log-файлов (в Kb).

  max log size = 50000


# Для использования LDAP-сервера в качестве хранилища данных о пользователях

# необходимо указать где находится LDAP-сервер

 passdb backend = ldapsam:ldap://127.0.0.1

# и структуру

 ldap suffix = dc=test-domain,dc=ru

 ldap user suffix = ou=users

 ldap group suffix = ou=groups

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

# и заканчивая WinXP) так же необходимо добавлять в домен, причем в нашем случае

# они будут хранится в той же ветке базы LDAP, что и пользователи

 ldap machine suffix = ou=users

# хотя это и не обязательно, а некоторым покажется даже не удобным

# Так вот, возможно хранить их в отдельной ветке БД, например так:

# ldap machine suffix = ou=machine


  ldap filter = (uid=%u)

# Указываем администратора сервера LDAP

  ldap admin dn = "cn=root,dc=test-domain,dc=ru"

  ldap delete dn = no

# если используем ssl то необходимо раскоментировать следующую строчку

;   ldap ssl = start tls


# Если требуется сделать разные конфиги SAMBA для разных компьютеров

# То возможно использовать вставки в основной конфиг

#   (%m –автоматически заменяется именем компьютера клиента)

# возможно хорошей мыслью будут символические ссылки

;   include = /usr/local/etc/smb.conf.%m


# По идее ускоряет работу SAMBA (если кто знает этот вопрос более полно, пишите)

#         SO_RCVBUF=8192 SO_SNDBUF=8192

  socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192


# Является ли локальным мастером домена

  local master = yes


# OS Level  значение этого параметра влияет на то кой сервер победит в выборах

# доменного мастера просмотра (Domain Master Browser)

# (Заметьте, что это СОВСЕМ НЕ ТОЖЕ САМОЕ, что и Primary Domain Controller,

# хотя в NT домене одна и та же машина может играть обе роли одновременно).

# Роль доменного мастера просмотра заключается в том, чтобы собирать списки

# просмотра от локальных мастеров просмотра на всех подсетях содержащих машины

# входящие в рабочую группу. Если нет машины сконфигурированной как доменный

# мастер просмотра, каждая подсеть будет изолированной рабочей группой, которая не

# в состоянии увидеть какие-нибудь машины в любых других сетях. Доменный мастер

# просмотра присутствует в сети, чтобы сделать межсетевой просмотр возможным для

# рабочей группы. (Взято с http://www.samba.org.ua/articles/?section=2&articleid=8 , почитайте

# там доходчиво и интересно написано, так что некоторые фразы я взял от туда, что бы ничего

# не выдумывать. Еще раз очень рекомендую)

# чем больше это значение тем больше вероятность стать доменным мастером.

  os level = 255

  domain master = yes


# Заставляет nmbd форсировать выборы мастера при загрузке

  preferred master = yes


# Для того, чтобы клиенты Windows 9x/Me могли использовать сервер Samba для

# входа в домен, укажите следующий параметр.

 domain logons = yes


# Скрипт выполняемый при вхождении пользователя в домен

# причем какой срипт запустится зависит от имени машины с которой

# заходит пользователь (%m – автоматически заменяется именем компьютера)

  logon script = %m.bat


# Скрипт выполняемый при вхождении пользователя в домен

# причем какой срипт запустится зависит от имени пользователя

# (%U – автоматически заменяется именем пользователя)

  logon script = %U.bat

# Место хранения профиля  

# здесь %L – автоматически меняется на netbio-имя сервера

# %U – автоматически заменяется именем пользователя

# %a – автоматически заменяется названием опирационной системы (Win98, Win2k, WinXP,….)

  logon home = \\%L\Profiles\%U\%a

  logon path = \\%L\Profiles\%U\%a


# Включение wins-сервера

# WINS сервера настоятельно рекомендуется для преобразования NetBIOS (SMB) имен в IP адреса.

# WINS позволяет клиентам в удаленных сегментах сети получать NetBIOS name_type информацию,

# которая НЕ может быть получена посредством любых других методов преобразования имен.

#  В глобальной сети со смешанным окружением из NT серверов и Samba, рекомендуется использовать

# возможности WINS из NT сервера. В окружении, где присутствует только Samba, рекомендуется

# использовать один и только один nmbd как ваш WINS сервер.

  wins support = yes


# Использовать сторонний wins-сервер. (то есть SAMBA-сервер подключается как wins-клиент)

# эта опция используется только если wins support = no

;   wins server = w.x.y.z


# Samba умеет определять не-WINS клиентов, находящихся в сети.

#Для этого нужно указать параметр WINS Proxy = yes.

# Для правильной работы WINS Proxy необходимо,

# чтобы в сети имелся по крайней мере один WINS-сервер.

  wins proxy = yes


# Если задан параметр DNS Proxy, Samba будет пытаться выполнять преобразование

# NetBIOS-имен посредством запросов к DNS

  dns proxy = no


# Последовательность в которой Samba будет пытаться выполнять преобразование

# NetBIOS-имен

  name resolve order = lmhosts wins dns host bcast


# Опция "write cache size" позволяет Samba улучшить производительность систем у которых

# дисковая подсистема является узким местом. Значение этой опции определяется в байтах.

# Значение этой опции определяется в байтах, следовательно 262,144 представляет 256k кэш

# на файл (Пробуйте, экспериментируйте у каждого свое значение работает лудше )

write cache size = 262144


# Поддержка русского языка

  display charset = KOI8-R

  unix charset = KOI8-R

  dos charset = CP866


# These scripts are used on a domain controller or stand-alone

# machine to add or delete corresponding unix accounts

# add user script = /usr/sbin/useradd %u

# add group script = /usr/sbin/groupadd %g

# add machine script = /usr/sbin/adduser -n -g machines -c Machine -d /dev/null -s /bin/false %u

# delete user script = /usr/sbin/userdel %u

# delete user from group script = /usr/sbin/deluser %u %g

# delete group script = /usr/sbin/groupdel %g


time server = yes


#============================ Share Definitions ==============================

#Домашний каталог

[homes]

 comment = Home Directories

 browseable = no

 writable = yes

 public = no

 valid users = %S

 # использовать корзину (аналогичную структуру необходимо использовать

 #  в тех сетевых папках, где это требуется, все корзины независимы)

    vfs object = recycle

    recycle:repository = .Корзина

    recycle:keeptree = Yes

    recycle:touch = Yes

    recycle:versions = Yes

    recycle:maxsize = 0

    # не поподают в корзину а сразу удаляются, файлы со следующи разрешениями

    recycle:exclude = *.tmp|*.tbi|*.temp|~$*|*.~??



# Сетевая папка в которой находятся скрипты пользователей, запускаемые на компьютерах

#  пользователей которые входят в домен, права доступа unix на папку должны быть 777

# то есть полный доступ всем, а в нутрии уже создаются файлы с правами 400, то есть доступ

#  на чтение и только хозяину. Не забудьте создать саму папку.  

# При желании папку можно разместить в любом месте например в /home

[netlogon]

  comment = Network Logon Service

  path = /usr/local/samba/lib/netlogon

  browseable = no

  guest ok = yes

  writable = no

  share modes = no

  volume = NETLOGON

# А вот эта замечательная структура позволяет запускать скрипт на сервере!!!

;   root preexec = /usr/local/samba/lib/netlogon/bin/make_logon_script '%m' '%U' '%a' '%g' '%L'


# Сетевая папка в которой хранятся профили пользователей, права доступа unix на папку

# должны быть 777, то есть полный доступ всем, а в нутрии уже создаются папки с правами 700,

# то есть полный доступ только хозяину. Не забудьте создать саму папку.

# При желании папку можно разместить в любом месте например в /home

[Profiles]

   create mode = 600

   directory mode = 700

   path = /usr/local/samba/profiles

   browseable = no

   guest ok = yes

   Writeable = yes


# Дальше пошли примеры сетевых ресурсов


# Общая файловая помойка

[pub]

       comment = Папка общего пользования

       path = /home/samba/pub

#обратите внимание на значок “@” перед словом users, он означает группа,

# то есть @users означает группа users. Если бы было необходимо дать права на доступ

# одному пользователю то мы бы указали пользователя, например valid users = roman

       valid users = @users

       create mode = 666

       directory mode = 777

       public = yes

       writable = yes

       printable = no

       browseable = yes



# Папка Soft доступна на чтение всем, на запись только группе technical

[soft]

       comment = Soft

       path = /home/samba/soft

       valid users = @technical

       create mode = 775

       directory mode = 775

       public = yes

       writable = yes

       printable = no

       browseable = yes


# Папка accounts не отображается в сетевом окружении и доступна только группе accounts

[accounts]

       comment = Папка группы бухгалтеров

       path = /home/samba/accounts

       valid users = @accounts

       create mode = 660

       directory mode = 770

       public = no

       writable = yes

       printable = no

       browseable = no


# Еще одна интересная структура, интерфейсная папка. Интересна она тем, что

# позволяет создать сложную структуру в которой каждый может писать только

# в свою папку, а читать из всех. Достигается это тем, что на папку /home/samba/interface

# выставляются права 755, а хозяином папки делается администратор samba-сервера

# А в нутрии этой папки создаются папки других пользователей, хозяивами которых

# они и являются

# #ls -la /home/samba/interface/

# drwxr-xr-x  16 admin  wheel  1536 20 июн 13:05 .

# drwxr-xr-x  32 root   wheel  1024 15 июн 15:41 ..

# drwxr-xr-x   2 kot     wheel   512 20 июн 12:24 Астахов Константин

# drwxr-xr-x   2 egor    wheel   512  9 июн 18:04 Калиновский Егор

# по аналогии  можно создовать папки для групп и др.

# папки могут быть сколь угодно вложены и иметь любые права и имена.

# единственнон правило они должны сочитатся с правилами создания папок и файлов

# create mode и directory mode

[interface]

  comment = Interface of  Test-domain

  path = /home/samba/interface

  create mode = 644

  directory mode = 755

  writable = yes

  public = yes


Для того, что бы samba могла подключатся к LDAP-серверу и иметь доступ к паролям, ей необходимо “знать” пароль администратора LDAP-сервера (в нашем случае пользователь cn=root,dc=test-dimain,dc=ru). Для этого выполним следующую команду (помня что наш тестовый пароль “my_passwd”):

# smbpasswd -w my_passwd


Не забудьте почистить историю команд, т.к. пороль вводится в открытом виде, затем samba сохранит его в файле secrets.tdb.


11. Наполняем базу LDAP данными.


Начнем с создания базовых элементов. Если посмотреть smb.conf то необходимо обратить внимание на следующие строки:

 ldap suffix = dc=test-domain,dc=ru

 ldap user suffix = ou=users

 ldap group suffix = ou=groups

 ldap machine suffix = ou=users


От сюда видно, что структура БД LDAP должна быть следующей:

dn: dc=test-domain,dc=ru

 |

 +- dn: ou=users, dc=test-domain,dc=ru

 |

 +- dn: ou=groups, dc=test-domain,dc=ru


Это древовидная структура, в основании лежит корневой элемент dc=test-domain,dc=ru из которого произрастают остальные ветки структуры в нашем случае две, ветка пользователей  ou=users, dc=test-domain,dc=ru и ветка групп ou=groups, dc=test-domain,dc=ru, в нутрии которых также могут находится ответвления, либо данные. В нашем случае это данные о пользователях и группах.


Данные в LDAP можно добавить разными способами, но мы воспользуемся штатными средствами, а именно утилитой идущей в комплекте с сервером OpenLDAP: ldapadd.

Эта утилита позволяет добавлять данные в БД LDAP, из предварительно созданного файла ldif. Подготовим этот файл (внимание! Не советую использовать комментарии в ldif файлах!):


# vi /usr/local/etc/openldap/base_for_LDAP/base.ldif

dn: dc=test-domain,dc=ru

objectClass: dcObject

objectClass: organization

objectClass: top

dc:test-domain

o:test-domain


dn: ou=users,dc=test-domain,dc=ru

objectClass: top

objectClass: organizationalUnit

ou: users


dn: ou=groups,dc=test-domain,dc=ru

objectClass: top

objectClass: organizationalUnit

ou: groups


Структура файла относительно проста, первая строка указывает на объект, затем идет перечисления классов, свойства которых наследует объект, затем названия свойств объекта и их значения. В созданном нами файле /usr/local/etc/openldap/base_for_LDAP/base.ldif описываются 3 объекта. Подробности об объектах и их свойствах, можно найти в файлах схем (чего_нибудь.schema) в папке /usr/local/etc/openldap/schema/. Теперь добавим данные из созданного нами файла в БД LDAP:

# /usr/local/bin/ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/base.ldif

Enter LDAP Password:

adding new entry "dc= test-domain,dc=ru"

adding new entry "ou=users, test-domain,dc=ru"

adding new entry "ou=groups,dc= test-domain,dc=ru"


(в принципе  “# /usr/local/bin/ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f  /usr/local/etc/openldap/base_for_LDAP/base.ldif “ это одна строка, то правила командной строки не запрещают перенос на следующую стоку поставив на месте переноса “\”)

Как видно после ввода пароля администратора БД (cn=root,dc=test-domain,dc=ru) в базу добавились данные из файла.

Для того, чтобы наглядно посмотреть БД LDAP и вносимые изменения, я бы порекомендовал поставить один из многочисленных браузеров LDAP (я использую браузер Softerra LDAP Browser под винду), либо для гурманов, воспользоваться входящей в дистрибутив утилитой ldapsearch, например так:

# ldapsearch -b dc=test-domain,dc=ru

# extended LDIF

#

# LDAPv3

# base <dc=test-domain,dc=ru> with scope sub

# filter: (objectclass=*)

# requesting: ALL

#

# test-domain.ru

dn: dc= test-domain,dc=ru

objectClass: dcObject

objectClass: organization

objectClass: top

dc: test-domain

o: test-domain


# users, test-domain.ru

dn: ou=users,dc= test-domain,dc=ru

objectClass: top

objectClass: organizationalUnit

ou: users


# groups, test-domain.ru

dn: ou=groups,dc= test-domain,dc=ru

objectClass: top

objectClass: organizationalUnit

ou: groups


# computers, test-domain.ru

dn: ou=computers,dc= test-domain,dc=ru

objectClass: top

objectClass: organizationalUnit

ou: computers


# search result

search: 2

result: 0 Success


# numResponses: 5

# numEntries: 4


(Либо вот так ldapsearch -W -x -D "cn=root,dc=test-domain,dc=ru" -b dc=test-domain,dc=ru)

Хотя это и не так наглядно как в браузере. Вообще утилита ldapsearch применяется для всевозможного поиска по базе, за подробностями гурманы отправляются в man.


12. Настраиваем NSS


Ну вот, и добрались мы до создания системных пользователей хранимых в БД LDAP.

# vi /etc/nsswitch.conf

group: files ldap

passwd: files ldap

Тем самым мы сообщаем системе, что пользователей и группы необходимо вначале брать из файлов (/etc/master.passwd и /etc/group), а затем из БД LDAP, т.к. данные пользователя root и остальные системные пользователи будут хранится в /etc/master.passwd, то не зависимо от того будет ли работать LDAP-сервер вы всегда сможете зайти на сервер и все поправить.

# chmod 0600 /etc/nsswitch.conf

# chown root /etc/nsswitch.conf

только root должен иметь доступ до этого файла.

Поправим теперь конфигурационный файл /usr/local/etc/ldap.conf:

# cp /usr/local/etc/ldap.conf.dist /usr/local/etc/ldap.conf


И поправим его любимым редактором. Файл хорошее документирован (правда на английском) поэтому выведу уже исправленный файл, но без комментариев и потом уже в тексте вставлю свои (курсивом), так что не пугайтесь:

# cat /usr/local/etc/ldap.conf | grep -v ^# | grep -v ^$

# Имя или IP-адрес  компьютера на котором находится сервер LDAP

host 127.0.0.1

# Корень дерева каталогов, с которого начинается поиск

base dc=test-domain,dc=ru

# Путь до LDAP сервера(В нашем случае LDAP сервер находится на этом же компьютере

#, поэтому используем Unix Domain Socket )

uri ldapi://%2fvar%2frun%2fopenldap%2fldapi/

# Пользователь proxyuser это псевдо-root в LDAP, он может читать пароли, но не может их менять

rootbinddn cn=proxyuser,dc= test-domain,dc=ru

scope one

# Максимальны и минимальный uid пользователей которые могут хранится в БД LDAP

pam_min_uid 10000

pam_max_uid 30000

# Следующие строки описывают, где находятся данные о пользователях и группах

nss_base_passwd        ou=users,dc= test-domain,dc=ru?one

nss_base_group          ou=groups,dc= test-domain,dc=ru?one

#опция, отвечающая за тип пароля передаваемого  от pam_ldap к openldap серверу

pam_password SSHA


# chmod 0600 /usr/local/etc/ldap.conf

# chown root /usr/local/etc/ldap.conf

только root должен иметь доступ до этого файла.


Теперь  файл /usr/local/etc/nss_ldap.conf в нашем случае совсем не отличается от /usr/local/etc/ldap.conf поэтому сделаем символическую ссылку, в место того, что бы править файл:

#ln -s /usr/local/etc/ldap.conf /usr/local/etc/nss_ldap.conf


Создадим пароль для proxyuser, он должен хранится в открытом (!!!вот она дырка в систему, если есть способ это обойти пишите!!!) виде в файле  /etc/ldap.secret:

# vi /etc/ldap.secret

zeds_mojno_pisat_luboy_parol


# chmod 0600 /etc/ldap.secret

# chown root /etc/ldap.secret

только root должен иметь доступ до этого файла


13. Пробуем заводить пользователей.

Создаем файл ldif (мы это уже делали) он должен выглядеть примерно так:

# vi /usr/local/etc/openldap/base_for_LDAP/admin.ldif

dn: cn=admin,ou=users,dc=test-domain,dc=ru

objectClass: top

objectClass: person

objectClass: posixAccount

objectClass: shadowAccount

cn: admin

sn: admin

uid: admin

userpassword:{SSHA} *

uidNumber: 10000

gidNumber: 10000

gecos:User

homeDirectory: /home/admin

loginShell:/usr/sbin/nologin


И добавляем в БД LDAP как мы это уже делали:

# ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/admin.ldif

Enter LDAP Password:

adding new entry "cn=admin,ou=users,dc=test-domain,dc=ru"


Проверяем:

# id admin

uid=10000(admin) gid=10000 groups=10000


И о чудо! Система знает этого пользователя! J

Теперь зададим пароль администратора SAMBA (заметьте, при добавлении администратора, а также смене его пароля не используется ключ -a)

# smbpasswd admin

New SMB password:

Retype new SMB password:


Великолепно, ошибок нет. Посмотрим теперь, что изменилось в БД LDAP при добавлении пользователя в домен:

# ldapsearch -b "cn=admin,ou=users,dc= test-domain,dc=ru"

# extended LDIF

#

# LDAPv3

# base <cn=admin,ou=users,dc=test-domain,dc=ru> with scope sub

# filter: (objectclass=*)

# requesting: ALL

#


# admin, users, test-domain.ru

dn: cn=admin,ou=users,dc=test-domain,dc=ru

objectClass: top

objectClass: person

objectClass: posixAccount

objectClass: shadowAccount

objectClass: sambaSamAccount

cn: admin

sn: admin

uid: admin

uidNumber: 10000

gidNumber: 10000

gecos: User

homeDirectory: /home/admin

loginShell: /usr/sbin/nologin

sambaSID: S-1-5-21-4236119322-1494742573-350487638-21000

sambaPrimaryGroupSID: S-1-5-21-4236119322-1494742573-350487638-21001

displayName: User

sambaPwdMustChange: 2147483647

sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000

00000000

sambaAcctFlags: [U          ]

sambaPwdCanChange: 1119587321

sambaPwdLastSet: 1119587321


# search result

search: 2

result: 0 Success


# numResponses: 2

# numEntries: 1


Либо вот так:

#ldapsearch -W -x -D "cn=root,dc=test-domain,dc=ru" -b dc=test-domain,dc=ru

Enter LDAP Password:

И для получения полной информации включая пароли.


Как видим, SAMBA сама добавила записи необходимые ей для работы. Таким образом при создании пользователя нас должно заботить лишь создание системного окаунта обо всем остальном позаботится smbpasswd. К слову, с группами почти аналогично, только вместо smbpasswd необходимо будет воспользоваться  net groupmap add, но об этом ниже.


Теперь займемся созданием групп:

# vi /usr/local/etc/openldap/base_for_LDAP/group_Admin\ group\ Samba.ldif

dn: cn= Admin group Samba,ou=groups,dc=test-domain,dc=ru

objectClass: top

objectClass: posixGroup

cn: Admin group Samba

gidnumber: 10000

memberuid: admin



# ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" -f  \

/usr/local/etc/openldap/base_for_LDAP/group_Admin\ group\ Samba.ldif

Enter LDAP Password:

adding new entry "cn= Admin group Samba,ou=groups,dc=test-domain,dc=ru"


# id admin

uid=10000(admin) gid=10000(Admin group Samba) groups=10000(Admin group Samba)


Все, теперь мы видим и название группы.


Для того, чтобы установить связь системных групп (групп unix) и групп в домене необходимо воспользоваться утилитой поставляемой с дистрибутивом SAMBA /usr/local/bin/net с параметром groupmap, если выполнить команду # net groupmap то можно увидеть варианты применения. Нас интересует net groupmap add, опять выполним

без параметров для того, чтобы увидеть структуру:

# net groupmap add

Usage: net groupmap add {rid=<int>|sid=<string>} unixgroup=<string> [type=<domain|local|builtin>] [ntgroup=<string>] [comment=<string>]


Добавим группу администраторов в домен:

# net groupmap add rid=512 unixgroup="Admin group Samba" ntgroup="Admin group \

Samba"

Successully added group Admin group Samba to the mapping db


Проверим как добавилось

# net groupmap list

Admin group Samba (S-1-5-21-4236119322-1494742573-350487638-512) -> Admin group Samba


Следует знать, что мы выбрали имя группы “Admin group Samba” произвольно, то что это группа администраторов системе сообщает rid – последние цифры в идентификационном номере объекта в доменных системах, в нашем случае S-1-5-21-4236119322-1494742573-350487638-512 (у вас S-1-5-21-4236119322-1494742573-350487638- будет другим) так вот rid=512 означает группу администраторов домена.


Вот табличка rid:

Domain Admins 512

Domain Users 513

Domain Guests 514

Далее я не использовал, но вдруг кому пригодится

Domain Computers 515

Domain Controllers 516

Cert Publishers 517

Shema Admins 518

Enterprise Admins 519

Group Policy Creator Owners 520


Не сочтите, что я издеваюсь повторениями, но я покажу еще один пример с пользователем roman который будет находится в двух группах системной users (пользователи домена, то есть Domain Users) и группе support. Причем добавлю пользователя в группы, двумя разными способами.


# vi /usr/local/etc/openldap/base_for_LDAP/roman.ldif

dn: cn=roman,ou=users,dc=test-domain,dc=ru

objectClass: top

objectClass: person

objectClass: posixAccount

objectClass: shadowAccount

cn: roman

sn:: 0J/Rg9C/0LrQuNC9INCg0L7QvNCw0L0=

uid: roman

userpassword:{SSHA} *

uidNumber: 10147

gidNumber: 10002

gecos:User

homeDirectory: /home/roman

loginShell:/usr/sbin/nologin


Обратим внимание на строчку sn:: 0J/Rg9C/0LrQuNC9INCg0L7QvNCw0L0=

Это закодированная строка  “Пупкин Роман”, т.к. в русские символы хранятся в БД LDAP в кодировке base64. Не забудьте второе двоеточие, оно как раз и означает, что используется кодировка base64. Перекодировать можно следующим образом:


# echo -n "Пупкин Роман" | iconv -f koi8-r -t utf-8 | uuencode -m 1 | head -n2 | tail -n 1

0J/Rg9C/0LrQuNC9INCg0L7QvNCw0L0=


Добавим в БД пользователя

# ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/roman.ldif


Добавим пользователя в домен

# smbpasswd –a roman


Создадим группу users:

# vi /usr/local/etc/openldap/base_for_LDAP/group_users.ldif

dn: cn=users,ou=groups,dc=test-domain,dc=ru

objectClass: top

objectClass: posixGroup

cn: users

gidnumber: 10002


Добавим в БД группу

# ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/group_users.ldif



Добавим группу пользователей в домен:

# net groupmap add rid=513 unixgroup="users" ntgroup="users"


Создадим группу support:

# vi /usr/local/etc/openldap/base_for_LDAP/group_support.ldif

dn: cn=support,ou=groups,dc=test-domain,dc=ru

objectClass: top

objectClass: posixGroup

cn: support

gidnumber: 10003


Добавим в БД группу

# ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/group_support.ldif



Добавим группу пользователей в домен, но мы не будем указывать rid, т.к. эта группа не имеет аналогов в домене (как например Domain Admins или Domain Users), а будет использована нами лишь для разграничений доступа групп пользователей к определенным ресурсам, описанными потом в smb.conf :

# net groupmap add unixgroup="support" ntgroup="support"

No rid or sid specified, choosing algorithmic mapping

Successully added group support to the mapping db


Теперь нам требуется добавить пользователя roman в группу support для этого создадим специальный файл group_support_add_roman.ldif и воспользуемся утилитой одущей в комплекте с дистрибутивом ldapmodify.


# vi /usr/local/etc/openldap/base_for_LDAP/group_support_add_roman.ldif

dn: cn=support,ou=groups,dc=test-domain,dc=ru

changetype:modify

add: memberuid

memberuid: roman

-



Обратите внимание на знак “-“ в конце.

# ldapmodify -W -x -D "cn=root,dc=test-domain,dc=ru" –f \ /usr/local/etc/openldap/base_for_LDAP/group_support_add_roman.ldif

Enter LDAP Password:

modifying entry "cn=support,ou=groups,dc=test-domain,dc=ru"


Проверяем:

# id roman

uid=10147(roman) gid=10002(users) groups=10002(users), 10003(support)


Как видим все получилось, пользователь roman добавлен в группу support.


В принципе с помощью утилиты ldapmodify возможно не только добовлять но и изменять, а также удалять данные из БД LDAP.


Вот например мы добавим пользователя root и admin в группу support, а пользователя roman исключим из нее:

# vi /usr/local/etc/openldap/base_for_LDAP/group_support_add_root_admin_del_roman.ldif

dn: cn=support,ou=groups,dc=test-domain,dc=ru

changetype:modify

add: memberuid

memberuid: root

-

add: memberuid

memberuid: admin

-

delete: memberuid

memberuid: roman

-


# ldapmodify -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/group_support_add_root_admin_del_roman.ldif

Enter LDAP Password:

modifying entry "cn=support,ou=groups,dc=test-domain,dc=ru"


Проверяем:

# id root

uid=0(root) gid=0(wheel) groups=0(wheel), 5(operator), 10003(support)

# id admin

uid=10000(admin) gid=10000(Admin group Samba) groups=10000(Admin group Samba), 10003(support)

# id roman

uid=10147(roman) gid=10002(users) groups=10002(users)


Как видим, все изменения возымели силу.


Теперь еще одна необходимость, предположим мы собрались удалить группу (либо пользователя, либо другой объект) support

# ldapdelete -W -x -D "cn=root,dc=test-domain,dc=ru" \

"cn= support,ou=groups,dc=test-domain,dc=ru"

Enter LDAP Password:


Проверяем:

# id root

uid=0(root) gid=0(wheel) groups=0(wheel), 5(operator)

# id admin

uid=10000(admin) gid=10000(Admin group Samba) groups=10000(Admin group Samba)

Как видим, группа исчезла.

Теперь добавим имена компьютеров в домен.

Компьютеры добавляются в систему, как обычные пользователи, последней буквой имени которых должен быть символ “$”, так же им не требуется корневой каталог в /home. Например есть у нас компьютер с именем HOST10, значит мы должны добавить пользователя HOST10$ (Внимание!!! Не забывайте экранировать символ “$” где это требуется символом “\”):


# vi /usr/local/etc/openldap/base_for_LDAP/HOST10\$.ldif

dn: cn=HOST10,ou=users,dc=test-domain,dc=ru

objectClass: top

objectClass: person

objectClass: posixAccount

objectClass: shadowAccount

cn: HOST10

sn: Computer HOST110

uid: HOST10$

userpassword:{SSHA} *

uidNumber: 20010

gidNumber: 20000

gecos:Computer

homeDirectory: /noexistent

loginShell:/usr/sbin/nologin


Добавим в БД пользователя

# ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/ HOST10\$.ldif

Enter LDAP Password:

adding new entry "cn=HOST10,ou=users,dc=test-domain,dc=ru"


Проверим:

# id HOST10\$

uid=20010(HOST10$) gid=20000 groups=20000


14. Процедура добавления компьютера в домен.


Сразу оговорюсь о граблях: В момент добавления компьютера в домен, компьютер должен уже иметь правильное имя (в нашем случае HOST10), не пытайтесь одновременно вводить компьютер в домен и менять его имя!!! А так же неплохо бы включить WINS.


Пользователь соответствующий компьютеру должен быть уже добавлен на samba-сервере, как мы это уже делали ранее. Для включения компьютера в домен необходимо зайти под локальным администратором, затем открыть свойства системы (щелкнуть правой кнопкой мыши по “моему компьютеру”), вкладка “сетевая идентификация”, “Свойства”, Поставить галочку “Является членом домена”, ввести имя домена (в нашем случае test-domain), OK, ввести имя и пароль администратора домена (в нашем случае admin), перезагрузить компьютер. Все.


Возможные проблемы:

  1. не найден ни один домен – проверьте виден ли samba-сервер по его NetBIO имени в сетевом окружении, если нет, то возможно сервер samba не запущен, не настроен wins на клиенте (“Сеть и удаленный доступ к сети” -> “Подключение по локальной сети” -> TCP/IP “Свойства” -> “Дополнительно” -> Wins “добавить” -> перезагрузить компьютер)

  2. Компьютер с таким именем уже существует – есть два пути удалить и снова создать пользователя соответствующего компьютеру в БД LDAP или задать другое имя

  3. Кто то, уже зашел под администратором домена, в один момент времени только с одного компьютера разрешено подключатся к samba-серверу. (для гарантии лудше перезагружать win-машину после того как поработали на ней под администратором домена)

  4. Возможно у вас WinXP, не требуется ни чего дополнительно делать для подключения WinXP в домен! Но почему то этот процесс всегда проходит по разному, возникают какие то трудности, но обычно ни чего серьезного.


15. Процедура добавления пользователя в домен.


Пользователь должен быть уже добавлен на samba-сервере, как мы это уже делали ранее. Затем заходим в домен под новым пользователем, если человек не имел до этого своего профиля, то на этом можно остановится, но если профиль уже был, то его не плохо было бы сохранить и в домене. Для этого мы заходим локальным администратором на компьютер, где находится требуемый профиль (имя пользователя локального администратора не должен совпадать с именем пользователя, чей профиль мы собираемся переносить). Далее “Панель управления” -> “Система” -> “Профили пользователей”, выбираем локального пользователя чей профиль собираемся переносить, нажимаем “копировать”, в “окошке копировать профиль на” прописываем полный путь к каталогу где будет хранится профиль пользователя, \\NetBIO_имя_сервера\Profiles\имя_пользователя\сокрощение_операционной_системы\ например \\test-domain\Profiles\roman\Win2k\, этот путь прописан в smb.conf (logon path = \\%L\Profiles\%U\%a). Теперь необходимо нажать кнопку “Изменить” в окошке “Разрешить использование”, выбрать в “искать в” наш домен (в нашем случае test-domain), предложат ввести имя и пароль администратора домена (в нашем случае admin). После этого (и не раньше), необходимо зайти в папку \\NetBIO_имя_сервера\Profiles\имя_пользователя\сокрощение_операционной_системы\ (в нашем случае \\test-domain\Profiles\roman\Win2k\), через “Пуск”->”Выполнить” введя имя и пароль адмнистратора домена, если этого не сделать этого то не удастся скопировать профиль. Затем нажать OK в “Копирование профиля”. При этом администратор домена станет хозяином папки с профилем пользователя, это надо исправить на сервере (в нашем случае такой командой # chown –R roman /usr/local/samba/profiles/roman/). Теперь зайдем на компьютер пользователя под вновь созданным пользователем домена со старым профилем. Если планируется хранить профиль на сервере, то на этом можно остановиться, если же нас не устраивает то, что сеть при массовом подключении утром и при массовом отключении вечером сеть сильно перегружена, то имеет смысл хранить профиль на локальном компьютере пользователя. Для этого заходим на компьютер локальным администратором и опять заходим в профили пользователей, выбираем профиль пользователя домена и нажимаем кнопку “сменить тип” и меняем тип на “локальный профиль”, при необходимости этот процесс можно обратить аналогичным способом. Важно обратить внимание, что если залогиниться с другого компьютера, то профиль опять автоматически станет сетевым. Очень рекомендую перенести папку “мои документы” на сервер и вообще научить пользователей не хранить фалов на рабочем столе и в моих документах, а хранить файлы на сервере, тем самым вы сильно упростите жизнь себе и пользователям, т.к. станет будет на много проще делать резервное копирование, о котором мы поговорим в следующем разделе.

Еще одно, если требуется, что бы на компьютере пользователь обладал правами Опытного пользователя или даже Администратора (хотя я это сильно не рекомендую), то необходимо добавить требуемого пользователя домена в соответствующую группу на локальном компьютере.


16. Резервное копирование.


Здесь не будет рассматриваться классический вариант резервного копирования, т.к. резервное копирование по всем правилам требует определенных финансовых затрат, а так же дополнительных, постоянных затрат времени администратора. Мы рассмотрим  более дешевый, а так же не требующий постоянного вмешательства администратора, метод резервная копия “вчерашний день”, значительно менее гибкий, а так же значительно менее надежный, чем классический метод резервного копирования, но в большинстве случаем его хватает. Суть метода такова, в ночное время когда сотрудников нет на рабочих местах, либо их количество ограниченно, все файлы претерпевшие изменения копируются на  зеркально настроенный сервер и если на основном сервере произойдет авария, то второй сервер в кратчайшие сроки заменит основной, правда с потерей данных изменившихся со времени последний копии.


И так, начнем.

Для начала нам необходимо поднять аналогичный сервер, то есть установить samba, OpenLDAP, и т.п. что было описано выше, возможно, даже сделать полную копию скопировав партиции, а затем, подредактировав конфигурационные файлы отвечающие за сетевые службы, т.к. у нового сервера будет другое имя и ip-адрес.


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


В этом нам поможет встроенная способность сервера OpenLDAP реплики, которыси управляет демон slurpd.

И так, копируем файл /usr/local/etc/openldap/slapd.conf с основного сервера на резервный, для этого можно воспользоваться командой scp, запустив на основном сервере, например так:

# scp /usr/local/etc/openldap/slapd.conf roman@192.168.0.2:/home/roman/

Password:

slapd.conf                                    100% 3097     3.0KB/s   00:00


Здесь:    roman – имя пользователя на резервном сервере,

    192.168.0.2 – IP-адрес резервного сервера.



Теперь добавим несколько строк в конфигурационный файл основного LDAP
сервера /usr/local/etc/openldap/slapd.conf:

replica uri=ldaps://192.168.0.4:636

binddn="cn=replicator,dc=test-domain,dc=ru"

bindmetod=simple credentials= my_passwd_rep

replogfile /var/log/ldap/replica.log


Для реплик необходимо задать пароль в открытом виде, мы используем пароль my_passwd_rep. (Честно говоря, безопасность использования LDAP мне не нравилась уже давно, но это уже слишком! особенно прочитав статью Барабанова  Алексея "LDAP и Все-Все-Все" по адресу http://www.barabanov.ru/arts.html)


Лог необходим лишь на этапе отладки, затем строчку  replogfile /var/log/ldap/replica.log

желательно убрать. (У меня лог почему то не захотел работать)


В официальной документации написано, что необходимо копировать каталог DatabaseDir (в нашем случае /var/db/openldap-data/) на резервный сервер, но это приводит к резкому замедлению работы резервного сервера, поэтому мы поступим проще:


#ldapsearch -W -x -D "cn=root,dc=test-domain,dc=ru" \

-b "dc=test-domain,dc=ru" > /home/roman/test-domain.ldif


(Теперь этот файл является резервной копией, его можно положить в надежное место и ограничить к нему доступ. Так же важно понимать, что теперь нельзя вносить изменения в основную базу до того как мы настроим репликации).


Знакомой нам командой перешлем его на резервный сервер:

# scp /home/roman/test-domain.ldif roman@192.168.0.4:/home/roman/

Password:

test-domain.ldif                               100% 24678     4.6KB/s   00:00


Переместим его на место и установим права:

#mv /home/roman/test-domain.ldif /usr/local/etc/openldap/base_for_LDAP/

#chown root:wheel /usr/local/etc/openldap/base_for_LDAP/ test-domain.ldif

#chmod 400 /usr/local/etc/openldap/base_for_LDAP/ test-domain.ldif


И создадим базу резервного сервера идентичную основной:

ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" -f /usr/local/etc/openldap/base_for_LDAP/replicator.ldif


Теперь создадим пользователя replicator на резервном сервере:


# vi /usr/local/etc/openldap/base_for_LDAP/replicator.ldif

dn: cn=replicator,dc=test-domain,dc=ru

objectClass: person

sn: REPLICATOR SN

cn: replicator

userPassword: {SSHA}7C1ZegBxUXR94cV2Vg2plCLulfAzQDWI


Как обычно, шифрованный пароль создаем так:

# /usr/local/sbin/slappasswd

New password:

Re-enter new password:

{SSHA}7C1ZegBxUXR94cV2Vg2plCLulfAzQDWI


Добавим пользователя replicator в БД LDAP резервного сервера

# ldapadd -W -x -D "cn=root,dc=test-domain,dc=ru" –f \

/usr/local/etc/openldap/base_for_LDAP/ replicator.ldif


На резервном сервере так же добавим несколько строк в конфигурационный файл LDAP сервера /usr/local/etc/openldap/slapd.conf:

updatedn="cn=replicator,dc=test-domain,ru"

updateref  ldaps://192.168.0.2:636


И поменяем

access to *

by * read


на:

access to *

by dn="cn=replicator,dc=test-domain,dc=ru" write

by self write

by * read




Теперь займемся ssl туннелем.


Сертификаты создаем на резервном сервере.


Текст по настройке ssl почти полностью взят из статьи Григорьева Михаила http://www.unixdoc.ru/index.php?mode=2&podmode=1&arcicle_id=123&theme=freebsd%20ldap%20ssl%20auth


Создание сертификата организации:


С помощью этого сертификата, будем в дальнейшем подписывать все

остальные сертификаты пользователей, и сертификаты системных служб.

Генерируем приватный ключ:

# openssl genrsa -des3 -out ca.key 2048

Generating RSA private key, 2048 bit long modulus

............................................................................................................................................+++

.........................................................................+++

e is 65537 (0x10001)

Enter pass phrase for ca.key:

Verifying - Enter pass phrase for ca.key:



Создание сертификата:

# openssl req -new -x509 -days 9999 -utf8 -key ca.key -out ca.cert

Enter pass phrase for ca.key:

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:RU

State or Province Name (full name) [Some-State]:SEVERO-MUMUYSK

Locality Name (eg, city) []:N-sk

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Test-organization Ltd

Organizational Unit Name (eg, section) []:Test-organization

Common Name (eg, YOUR name) []:server.test-domen.ru

Email Address []:roman@test-domen.ru

Отвечаем на вопросы, не забываем про самый главный ответ (Common Name (eg, YOUR name)).


Создание пользовательского подписанного сертификата:


Генерируем приватный ключ:

# openssl genrsa -out user.key 1024

Generating RSA private key, 1024 bit long modulus

.++++++

..++++++

e is 65537 (0x10001)


Генерируем запрос для подписания сертификата:

# openssl req -new -key user.key -out user.csr -utf8

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:RU

State or Province Name (full name) [Some-State]: SEVERO-MUMUYSK

Locality Name (eg, city) []:N-sk

Organization Name (eg, company) [Internet Widgits Pty Ltd]: Test-organization Ltd

Organizational Unit Name (eg, section) []:Test-organization

Common Name (eg, YOUR name) []:server.test-domen.ru

Email Address []:roman@test-domen.ru


Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:


Два последних пункта оставил пустым.



Подписываем сертификат:

#openssl x509 -req -in user.csr -out user.cert -CA ca.cert -CAkey ca.key -CAcreateserial -days 9999

Signature ok

subject=/C=RU/ST= SEVERO-MUMUYSK/L= N-sk/O= Test-organization Ltd/OU= Test-organization/CN= server.test-domen.ru/emailAddress= roman@test-domen.ru

Getting CA Private Key

Enter pass phrase for ca.key:


Приватный ключ ca.key надежно сохраняем, а публичный ключ ca.cert в

дальнейшем распространим по серверам - клиентам.


Создаём на серверной машине директорию для хранения сертификатов:

# mkdir /usr/local/etc/openldap/ssl



Копируем сертификаты:


# cp user.cert /usr/local/etc/openldap/ssl

# cp user.key /usr/local/etc/openldap/ssl

# cp ca.cert /usr/local/etc/openldap/ssl



Устанавливаем права:


# chmod 440 /usr/local/etc/openldap/ssl/*

# chown ldap:ldap /usr/local/etc/openldap/ssl/*



Настраиваем серверную часть OpenLDAP (у нас, резервный сервер):


Добавим в файл /usr/local/etc/openldap/slapd.conf следующие опции:


disallow tls_authc

TLSCertificateFile    /usr/local/etc/openldap/ssl/user.cert

TLSCertificateKeyFile /usr/local/etc/openldap/ssl/user.key

TLSCACertificateFile  /usr/local/etc/openldap/ssl/ca.cert


Внимание!!! Опцию disallow рекомендую добавить до определения database


Запускаем OpenLDAP Server:

# /usr/local/libexec/slapd -h 'ldap://0.0.0.0/ ldaps://0.0.0.0/'


Проверяем:

# netstat -atn | grep LISTEN

tcp4       0      0  *.636                  *.*                    LISTEN

tcp4       0      0  *.389                  *.*                    LISTEN



Настройка клиентской части OpenLDAP (основной сервер):


Создаём на клиентской машине директорию для хранения сертификата:

# mkdir /usr/local/etc/openldap/ssl


Копируем сертификат:

# cp ca.cert /usr/local/etc/openldap/ssl

(самым простым способом будет использовать scp, как мы это делали ранее)


Устанавливаем права:

# chmod 440 /usr/local/etc/openldap/ssl/ca.cert

# chown ldap:ldap /usr/local/etc/openldap/ssl/ca.cert


Добавим в файл /usr/local/etc/openldap/slapd.conf следующие опции:

BASE        dc=test-domain,dc=ru

URI         ldaps://server.test-domen.ru    #либо указать IP-адрес

TLS_CACERT  /usr/local/etc/openldap/ssl/ca.cert

TLS_REQCERT never


Проверка работоспособности LDAP-клиента (выполним на основном сервере):

# ldapsearch -LL -H ldaps:// server.test-domen.ru \

-W -x -D "cn=root,dc=test-domain,dc=ru" -b "dc=test-domain,dc=ru"


здесь статья Григорьева Михаила заканчивается.




Все, теперь можно запускать службы:

В начале на основном сервере, добавим строчку в /etc/rc.conf:

slurpd_enable="YES"

Она позволит запускаться демону slurpd.


Запускаем slapd и slurpd на основном сервере:

# /usr/local/etc/rc.d/slapd.sh start

Starting slapd.

# /usr/local/etc/rc.d/slurpd.sh start

Starting slurpd.


Теперь запускаем slapd на резервном сервере:

# /usr/local/etc/rc.d/slapd.sh start

Starting slapd.


Проверим работу например создав одного пользователя на основном сервере и проверив появился ли этот пользователь на резервном сервере (команда id). Так же можно проверить каталог /var/db/openldap-slurp/replica/ и отследить изменения.



Теперь займемся непосредственно резервированием.


В качестве утилиты резервного копирования возьмем rsync. Эта утилита копирует файлы и папки, причем передает только различия, чем резко экономит время передачи.

Для начала необходимо установить rsync на обоих серверах:


#cd /usr/ports/net/rsync

#make install



Теперь создадим ключи dsa для ssh для того, что бы при работе скрипта копирования не запрашивался пароль.


На основном сервере под учетной записью root (пароль оставляем пустым):

#ssh-keygen -t dsa

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:


Должно получится два файла /root/.ssh/id_dsa и /root/.ssh/id_dsa.pub


Теперь создадим файл /root/.ssh/config следующего содержания:

Host 192.168.0.3

 User root

 Compression yes

 Protocol 2

 RSAAuthentication yes

 StrictHostKeyChecking no

 ForwardAgent yes

 ForwardX11 yes

 IdentityFile /root/.ssh/id_dsa


Затем переместим /root/.ssh/id_dsa.pub на резервный сервер в папку /root/.ssh/

Теперь переименуем его в /root/.ssh/authorized_keys2 и установим права доступа root:wheel 600. Откроем его для редактирования и добавим в начало сторки следующее:

from="192.168.0.2, !*",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

таким образом должна получится одна строка вида:

from="192.168.0.2, !*",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AAAA……………….NDw2Jg== root@rezerv.test.domain.ru

(за разъяснениями man sshd http://www.opennet.ru/man.shtml?topic=sshd&category=8&russian=0)


Так же необходимо добавить в файл /etc/ssh/sshd_config строку:

PermitRootLogin without-password

для того, что бы появилась возможность подключатся к резервному серверу с учетной записью root но не через использование парольной  аутентификации.


Перезапустим сервер sshd:

#/etc/rc.d/sshd restart

если мы настраиваем сервер посредствам ssh, то команду можно видоизменить:

#/etc/rc.d/sshd restart > /root/sshd.txt; rm /root/sshd.txt


Теперь скопируем файл с паролями на резервный сервер:

#scp /etc/master.passwd 192.168.0.4:/etc/master.passwd.new

Attention! Access is allowed only to admins of Radio Uniton Ltd.

master.passwd                                 100% 1778     1.7KB/s   00:00


Если пароль не был запрошен, значит мы все сделали правильно.


Объединим базы паролей:

# pwd_mkdb -p /etc/master.passwd.new


Теперь пользователи и их пароли на обоих серверах абсолютно идентичны можно приступать к копированию.


Не забудем удалить /etc/master.passwd.new


Все теперь можно пробовать копировать данные, например такой командой:

# /usr/local/bin/rsync -a -e ssh -r -l -x --force -p -t -g -o --delete -S –H\

/home/ 192.168.0.3:/home/


За разъяснениями ключей обращайтесь: man rsync, http://bog.pp.ru/work/rsh.html, http://www.nestor.minsk.by/sr/2003/02/30209.html, http://www.google.com


Теперь осталось лишь определится, что требуется резервировать, оформить вызовы rsync в виде срипта и добавить вызов скрипта по cron.