Установка Samba 3 PDC плюс LDAP на FreeBSD

Материал из rrv-wiki
Перейти к навигации Перейти к поиску

Содержание

Установка 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), перезагрузить компьютер. Все.

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

  1. не найден ни один домен – проверьте виден ли samba-сервер по его NetBIO имени в сетевом окружении, если нет, то возможно сервер samba не запущен, не настроен wins на клиенте (“Сеть и удаленный доступ к сети” -> “Подключение по локальной сети” -> TCP/IP “Свойства” -> “Дополнительно” -> Wins “добавить” -> перезагрузить компьютер
  2. Компьютер с таким именем уже существует – есть два пути удалить и снова создать пользователя соответствующего компьютеру в БД LDAP или задать другое имя
  3. Кто то, уже зашел под администратором домена, в один момент времени только с одного компьютера разрешено подключатся к samba-серверу. (для гарантии лудше перезагружать win-машину после того как поработали на ней под администратором домена)
  4. Возможно у вас 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