Установка Samba 3 PDC плюс LDAP на FreeBSD
Содержание
- 1 Установка Samba 3 [PDC] + LDAP на FreeBSD
- 2 Введение
- 3 Начальная настройка
- 4 Установка программного обеспечения
- 5 Настраиваем OpenLDAP
- 6 Подготовка и запуск сервера LDAP
- 7 Запускаем сервер LDAP
- 8 Настройка Samba
- 9 Настраиваем NSS
- 10 Заводим новых пользователей
- 11 Процедура добавления компьютера в домен.
- 12 Процедура добавления пользователя в домен.
- 13 Резервное копирование
Установка Samba 3 [PDC] + LDAP на FreeBSD
Введение
Эта статья ни на что не претендует, здесь я описал то, как это работает у меня. Буду благодарен за устранение неточностей или улудшений функционала.
rrv.
Начальная настройка
Если будущий сервер имеет доступ в 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
Установка программного обеспечения
Устанавливаем из портов 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
Устанавливаем из портов 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
Устанавливаем из портов LDAP-клиента
Вообще то он уже стоит :) Он требуется для установки 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
Устанавливаем nss_ldap и pam_ldap
Так как для добавления пользователей в samba, необходимы одноименные системные пользователи, то было бы разумно хранить их в LDAP. Это дает возможность использовать список пользователей на других системах по средствам «реплик» (об этом возможно расскажу ниже). Для хранения в LDAP системных аккаунтов, устанавливаем из портов nss_ldap и pam_ldap (учтите, для установки требуется FreeBSD 5.1 или более поздняя версия). Внимание! версия nss_ldap-1.249 глючит! последняя тестированнная nss_ldap-1.239.tbz.
# 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
Установим pam_ldap:
# 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
Устанавливаем из портов 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
Либо, ее немного подправленной под конкретную ситуацию версией, ниже по тексту при рассмотрении системы резервирования.
Настраиваем 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
Подготовка и запуск сервера 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.
Запускаем сервер 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
Как видим, сервер работает.
Настройка 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 # netbios-имя сервера 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 # Еще одни интересные права можно выставить с помощью опций read list и write list. # Важно заметить, что этот метод можно использовать если у пользователей # отсутствует другой доступ к серверу, кроме smb! # Для того, что бы сделать папку с правами на запись группе write_group и на чтение # read_group необходимо создать группы write_group и read_group причем в гуппе # read_group должны так же содержатся и пользователи из write_group. # Затем создаем папку с правами 770 и пренадлежащую read_group. # теперь создаем сетевую папку [bases] path = /home/samba/bases create mode = 660 directory mode = 770 read list = @read_group public = @write_group writable = yes public = no
Для того, чтобы samba могла подключатся к LDAP-серверу и иметь доступ к паролям, ей необходимо “знать” пароль администратора LDAP-сервера (в нашем случае пользователь cn=root,dc=test-dimain,dc=ru). Для этого выполним следующую команду (помня что наш тестовый пароль “my_passwd”):
# smbpasswd -w my_passwd
Не забудьте почистить историю команд, т.к. пороль вводится в открытом виде, затем samba сохранит его в файле secrets.tdb.
Наполняем базу 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 можно добавить разными способами, но мы воспользуемся штатными средствами, а именно утилитой ldapadd, идущей в комплекте с сервером OpenLDAP.
Эта утилита позволяет добавлять данные в БД 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.
Настраиваем 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 должен иметь доступ до этого файла
Заводим новых пользователей
Пробуем заводить пользователей.
Создаем файл 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
И о чудо! Система знает этого пользователя!
Теперь зададим пароль администратора 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
Процедура добавления компьютера в домен.
Сразу оговорюсь о граблях: В момент добавления компьютера в домен, компьютер должен уже иметь правильное имя (в нашем случае HOST10), не пытайтесь одновременно вводить компьютер в домен и менять его имя!!! А так же неплохо бы включить WINS.
Пользователь соответствующий компьютеру должен быть уже добавлен на samba-сервере, как мы это уже делали ранее. Для включения компьютера в домен необходимо зайти под локальным администратором, затем открыть свойства системы (щелкнуть правой кнопкой мыши по “моему компьютеру”), вкладка “сетевая идентификация”, “Свойства”, Поставить галочку “Является членом домена”, ввести имя домена (в нашем случае test-domain), OK, ввести имя и пароль администратора домена (в нашем случае admin), перезагрузить компьютер. Все.
Возможные проблемы:
- не найден ни один домен – проверьте виден ли samba-сервер по его NetBIO имени в сетевом окружении, если нет, то возможно сервер samba не запущен, не настроен wins на клиенте (“Сеть и удаленный доступ к сети” -> “Подключение по локальной сети” -> TCP/IP “Свойства” -> “Дополнительно” -> Wins “добавить” -> перезагрузить компьютер
- Компьютер с таким именем уже существует – есть два пути удалить и снова создать пользователя соответствующего компьютеру в БД LDAP или задать другое имя
- Кто то, уже зашел под администратором домена, в один момент времени только с одного компьютера разрешено подключатся к samba-серверу. (для гарантии лудше перезагружать win-машину после того как поработали на ней под администратором домена)
- Возможно у вас WinXP, не требуется ни чего дополнительно делать для подключения WinXP в домен! Но почему то этот процесс всегда проходит по разному, возникают какие то трудности, но обычно ни чего серьезного.
Win7
Для введения компьютера Win7 в домен, надо добавить в реестр следующее
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ LanmanWorkstation\Parameters] «DomainCompatibilityMode»=dword:00000001 «DNSNameResolutionRequired»=dword:00000000
При вводе компьютера в домен появиться сообщение об ошибке, игнорируем.
Процедура добавления пользователя в домен.
Пользователь должен быть уже добавлен на 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/). Теперь зайдем на компьютер пользователя под вновь созданным пользователем домена со старым профилем. Если планируется хранить профиль на сервере, то на этом можно остановиться, если же нас не устраивает то, что сеть при массовом подключении утром и при массовом отключении вечером сеть сильно перегружена, то имеет смысл хранить профиль на локальном компьютере пользователя. Для этого заходим на компьютер локальным администратором и опять заходим в профили пользователей, выбираем профиль пользователя домена и нажимаем кнопку “сменить тип” и меняем тип на “локальный профиль”, при необходимости этот процесс можно обратить аналогичным способом. Важно обратить внимание, что если залогиниться с другого компьютера, то профиль опять автоматически станет сетевым. Очень рекомендую перенести папку “мои документы” на сервер и вообще научить пользователей не хранить фалов на рабочем столе и в моих документах, а хранить файлы на сервере, тем самым вы сильно упростите жизнь себе и пользователям, т.к. станет будет на много проще делать резервное копирование, о котором мы поговорим в следующем разделе.
Еще одно, если требуется, что бы на компьютере пользователь обладал правами Опытного пользователя или даже Администратора (хотя я это сильно не рекомендую), то необходимо добавить требуемого пользователя домена в соответствующую группу на локальном компьютере.
Резервное копирование
Здесь не будет рассматриваться классический вариант резервного копирования, т.к. резервное копирование по всем правилам требует определенных финансовых затрат, а так же дополнительных, постоянных затрат времени администратора. Мы рассмотрим более дешевый, а так же не требующий постоянного вмешательства администратора, метод резервная копия “вчерашний день”, значительно менее гибкий, а так же значительно менее надежный, чем классический метод резервного копирования, но в большинстве случаем его хватает. Суть метода такова, в ночное время когда сотрудников нет на рабочих местах, либо их количество ограниченно, все файлы, претерпевшие изменения, копируются на зеркально настроенный сервер, и если на основном сервере произойдет авария, то второй сервер в кратчайшие сроки заменит основной, правда с потерей данных изменившихся со времени последний копии.
Итак, начнём.
Для начала нам необходимо поднять аналогичный сервер, то есть установить samba, OpenLDAP, и т.п. что было описано выше, возможно, даже сделать полную копию скопировав партиции, а затем, подредактировав конфигурационные файлы отвечающие за сетевые службы, т.к. у нового сервера будет другое имя и ip-адрес.
Внимание! На резервном сервере категорически не рекомендую запускать nmbd при запуске SAMBA-сервера! Они конфликтуют с основным сервером. В место этого пропешите в /etc/rc.conf:
#samba_enable="YES" smbd_enable="YES"
Тогда nmbd не запустится.
Платой за это является то, что доступ к резервному серверу будет не возможен по имени, только через 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
Если у нас не один "резервный сервер", то есть еще один или более серверов, на которых требуется поднять подчиненный LDAP-сервер, то требуется создать несколько секций replica.
Для реплик необходимо задать пароль в открытом виде, мы используем пароль 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 почти полностью взят из статьи Григорьева Михаила [1]
Создание сертификата организации:
С помощью этого сертификата, будем в дальнейшем подписывать все остальные сертификаты пользователей, и сертификаты истемных служб.
Генерируем приватный ключ:
# 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/*
Если у нас не один "резервный сервер", то есть еще один или более серверов на которых требуется поднять подчиненный LDAP-сервер, то требуется скопировать на них папку /usr/local/etc/openldap/ssl целиком.
Настраиваем серверную часть OpenLDAP
Настраиваем серверную часть 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/ldap.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
Для начала необходимо установить rsync на обоих серверах:
#cd /usr/ports/net/rsync #make install
Создадим ключи dsa
Теперь создадим ключи 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
Настройка ssh
Теперь создадим файл /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 [2])
Так же необходимо добавить в файл /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, [3], [4], [5]
Теперь осталось лишь определится, что требуется резервировать, оформить вызовы rsync в виде срипта и добавить вызов скрипта по cron.
p.s.
для инкрементного backup-а используйте связку -b --backup-dir=/home/backup_old/ например так:
#!/bin/sh D=`date +%Y%m%d` /usr/local/bin/rsync -a -e ssh -r -l -x --force -p -t -g -o --delete -S –H\ /home/ 192.168.0.3:/home/ -b --backup-dir=/home/old/home-$D/
В этом примере (скрипте который можно поместить в cron) все изменённые в директории /home файлы будут копироваться в папку /home/old/home-ГодМесяцДень например /home/old/home-20100305