Итак. Начнем.
- Устанавливаем ОС (Rosa, CentOS, RedHat - не важно) в режиме минимальной установки). Процесс описывать не буду, т.к. он тривиально прост.
- После успешной установки и загрузки в первую очередь подключаем репозитарии и обновляем систему.
В CentOS:
yum install epel-release -y
В Rosa Cobalt:
Открываем файл /etc/yum.repos.d/rels.repo и меняем в четырех репозитариях enabled=0 на enabled=1
Затем стандартно проводим обновление:
yum upgrade
-
Отключаем selinux:
Меняем в файле /etc/selinux/config SELINUX=permissive на SELINUX=disabled
Применяем без перезагрузки:
setenforce 0
-
Отключаем в системе поддержку ipv6:
Создаем файл /etc/sysctl.d/ipv6.conf и записываем туда параметры
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
Перезапускаем сеть
systemctl restart network
Меняем в файле /etc/ssh/sshd_config строку "AddressFamily any" на "AddressFamily inet"
systemctl restart sshd
-
Дописываем в файл /ets/hosts данные вашего сервера:
xxx.yyy.zzz.www namePC.namedomain.prefix namePC
- Samba можно установить либо из репозитария, либо из исходников. Если устанавливаем из репозитария, то пункты с 7 по 10 можно пропустить. С какой-то версии пакеты разделились: для пользовательского компьютера и для контролера домена. Для КД пакет называется samba-dc. Устанавливаем полный набор пакетов для Samba:
yum install samba*
-
Устанавливаем пакеты, необходимые для работы Samba:
yum install perl gcc libacl-devel libblkid-devel gnutls-devel readline-devel python-devel gdb pkgconfig krb5-workstation zlib-devel setroubleshoot-server libaio-devel setroubleshoot-plugins\ policycoreutils-python libsemanage-python setools-libs-python setools-libs popt-devel libpcap-devel sqlite-devel libidn-devel libxml2-devel libacl-devel libsepol-devel libattr-devel keyutils-libs-devel\ cyrus-sasl-devel cups-devel bind bind-utils libxslt docbook-style-xsl openldap-devel pam-devel bzip2 vim wget -y
-
Загружаем Samba 4. На момент написание статьи последняя версия была 4.6.8
wget https://download.samba.org/pub/samba/stable/samba-4.6.8.tar.gz
-
Распаковываем архив:
tar -zxvf samba-4.6.8.tar.gz
-
Устанавливаем Samba:
cd samba-4.6.8 ./configure --enable-debug --enable-selftest --with-ads --with-systemd --with-winbind make make install
-
Запускаем DNS сервер.
В файле настроек /etc/named.conf изменяем:
listen-on { any; } комментируем строку listen-on-v6 allow-query { ваша подсеть; localhost; } forward first; forwarders { IP_внешнего_сервера_DNS; }; recursion yes;Далее запускаем сервер
systemctl start named
Если запуск прошел удачно, то включаем автостарт сервиса
systemctl enable named
- Переименовываем файл /etc/krb5.conf в /etc/krb5.conf.default
- Создаем файл /etc/profile.d/samba.sh с содержимым:
export PATH=/usr/local/samba/bin:$PATH
-
Разворачиваем новый домен:
samba-tool domain provision --use-rfc2307 --interactive
- Почти на все вопросы можно нажать Enter (параметры по умолчанию показаны в квадратных скобках. На вопрос DNS backend необходимо ответит BIND9_DLZ, если планируется использовать более сложную структуру DNS, чем поддерживает ввстроенный в SAMBA DNS сервер (например мне не удалось подключить к встроенному серверу ведомую (secondary) зону. Переключение между BIND и встроенным сервером доступно в любой момент.
- Донастраиваем DNS:
Вносим изменения в файл /etc/named.conf
Дописываем строку в конец файла: include "/usr/local/samba/private/named.conf";
В раздел Option добавлям строку tkey-gssapi-keytab "/usr/local/samba/private/dns.keytab";
- Создаем линк на файл krb5.conf:
ln -sf /usr/local/samba/private/krb5.conf /etc/krb5.conf
- Перезапускаем DNS:
systemctl restart named
- Открваем во встроенном файерволе необходимые для работы Samba порты:
firewall-cmd --add-port=53/tcp --permanent;firewall-cmd --add-port=53/udp --permanent;firewall-cmd --add-port=88/tcp --permanent;firewall-cmd --add-port=88/udp --permanent; \ firewall-cmd --add-port=135/tcp --permanent;firewall-cmd --add-port=137-138/udp --permanent;firewall-cmd --add-port=139/tcp --permanent; \ firewall-cmd --add-port=389/tcp --permanent;firewall-cmd --add-port=389/udp --permanent;firewall-cmd --add-port=445/tcp --permanent; \ firewall-cmd --add-port=464/tcp --permanent;firewall-cmd --add-port=464/udp --permanent;firewall-cmd --add-port=636/tcp --permanent; \ firewall-cmd --add-port=1024-5000/tcp --permanent;firewall-cmd --add-port=3268-3269/tcp --permanent
ferewall-cmd --reload - Создаем файл автозапуска службы Samba /etc/systemd/system/samba.service
[Unit] Description= Samba 4 Active Directory After=syslog.target After=network.target [Service] Type=forking PIDFile=/usr/local/samba/var/run/samba.pid ExecStart=/usr/local/samba/sbin/samba [Install] WantedBy=multi-user.target
- Запускаем Samba:
systemctl enable samba systemctl start samba
- Создаем обратную зону для нашей сети:
samba-tool dns zonecreate (FQDN AD сервера) ZZZ.YYY,XXX,in-addr.arpa -Uadministrator
Где ZZZ.YYY,XXX,in-addr.arpa соответствует сети XXX.YYY.ZZZ.0/24 - Добавляем в обратную зону адрес нашего AD сервера:
samba-tool dns add (FQDN AD сервера) ZZZ.YYY,XXX,in-addr.arpa NNN PTR (FQDN AD сервера) -Uadministrator
Где NNN последняя часть IP адреса сервера AD. - Проверяем корректность аутентификацию NT:
smbclient -L localhost -U%
Если все прошло удачно, то увидим:Domain=[ИМЯ ДОМЕНА] OS=[Windows 6.1] Server=[Samba 4.6.8] Sharename Type Comment — — — — — — — — — — - netlogon Disk sysvol Disk IPC$ IPC IPC Service (Samba 4.6.8) Domain=[ИМЯ ДОМЕНА] OS=[Windows 6.1] Server=[Samba 4.6.8] Server Comment — — — — — — — — - Workgroup Master — — — — — — — — -
- Проверяем работу DNS:
host -t SRV _ldap._tcp.domain.local host -t SRV _kerberos._udp.domain.local host -t A dc.domain.local host -t PTR (IP адрес сервера AD)
Если ошибок нет, то увидим что-то подобное:_ldap._tcp.ИМЯ ДОМЕНА.ПРЕФИКС has SRV record 0 100 389 FQDN сервера. _kerberos._udp.ИМЯ ДОМЕНА.ПРЕФИКС has SRV record 0 100 88 FQDN сервера. FQDN сервера has address IP сервера NNN.ZZZ.YYY.XXX.in-addr.arpa domain name pointer FQDN сервера.
- Немного правим smb.conf:
# Global parameters [global] workgroup = DOMAIN realm = domain.local netbios name = DC server services = s3fs, rps, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate server role = active directory domain controller # если в DNS нет записей, то перенаправление на Google Public DNS dns forwarder = 8.8.8.8 # Don’t allow any updates | allow unsigned updates | only signed updates # allow dns updates = False | nonsecure | signed allow dns updates = nonsecure # команда для обновления обратной и прямой зоны nsupdate command = /bin/nsupdate -g wins support = yes [netlogon] path = /usr/local/samba/var/locks/sysvol/domain.local/scripts read only = No write ok = Yes [sysvol] path = /usr/local/samba/var/locks/sysvol read only = No write ok = Yes
- Настройка сервера времени.
По умолчанию в последних версиях Linux используется сервер времени Chronicd. Этот сервер специально разработан для "изолированных" систем. Т.е. клиенты могут обновлять свое время не зависимо от того подключен сервер к вышестоящему источнику времени или нет. Но единственный и, в данном случае важный, недостаток этого сервиса в том, что он не совместим с клиентами Windows (во всяком случае мне не удалось с наскока их подружить). Исходя из этого я выбрал несколько другую схему. Устанавливается отдельный сервер времени Chronycd, имеющий выход к вышестоящему источнику времени. А на контролеры домена устанвливается давно проверенный сервер NTPD, который синхронизируется с выделенным сервером времени в локалке. Недостаток NTPd в том, чтот если он не имеет доступа к своему источнику, то он перестает отдавать время своим клиентам. А КД в интернет выпускать - это плохая идея. Поэтому и выбрана такая схема.
Наши действия на контроллере домена.
Останавливаем и запрещаем автозапуск сервера chronyd:systemctl stop chronyd systemctl disable chronyd
Устанавливаем сервер времени NTPd (если еще не установлен):yum install ntp
Правим файл конфигупации /etc/ntp.conf. Добавляем строки:restrict -4 default kod nomodify notrap noquery mssntp restrict XXX.YYY,ZZZ.0 mask 255.255.255.0 nomodify notrap ntpsigndsocket /usr/local/samba/var/lib/ntp_signd server XXX.YYY.ZZZ.NNN iburst prefer - адрес локального сервера времени listen XXX.YYY.ZZZ.HHH - адрес интерфейса контролера домена
Остальное оставляем без изменений. Стартуем сервер времени:systemctl start ntpd systemctl enable ntpd
Проверяем udp порт:ss -u -a
Вывод должен содержать строку примерно такого вида:UNCONN 0 0 XXX.YYY.ZZZ.HHH:ntp *.*
Если она присутствует, то сервер поднялся и готов служать запросы от клиентов. Открываем соответствующий порт в файерволе контролера домена:firewall-cmd --permanent --add-port=123/udp fiewall-cmd --reload
- Одного КД в сети недостаточно. Всегда нужно использовать как минимум два. Устанавливаем второй КД.
Установка достаточно проста. Повторяем пункты с 1 по 13.
Приводим файл /etc/krb5.conf к виду:[libdefaults] dns_lookup_realm = false dns_lookup_kdc = true default_realm = ИМЯДОМЕНА.ПРЕФИКС
Подключаем сервер в качестве резервного контролера домена:samba-tool domain join имядомена.префикс DC --dns-backend=BIND9_DLZ -U"ИМЯДОМЕНА.ПРЕФИКС\administrator"
Удаляем файл /etc/krb5.conf
Создаем сиволическую ссылку на новый файл:ln -sf /usr/local/samba/private/krb5.conf /etc/krb5.conf
Донастраиваем BIND в соответствии с п.16
Перезапускаем BIND
Открываем необходимые порты в соответствии с п.19.
Создаем файл автозапуска в соответствии с п.20
Донастраиваем smb.conf в соответствии с пунктом 26.
Запускаем Samba
Настраиваем сервер времени в соответствии с п.27 - Samba не умеет синхронизировать SYSVOL между контроллерами домена. Ставим "костыль".
Нам необходима двунаправленная синхронизация между контролерами домена. Мой выбор пал на osync+rsync.
Устанавливаем rsync на каждый контроллер домена:yum install rsync
Пакета osync как правило в репозитариях нет. Скачиваем исходник. Текущую версию можно посмотреть и взять здесь: https://github.com/deajan/osync/releases
Распаковываем архив и устанавливаем:tar xvf v1.2.tar.gz cd osync-1.2 ./install.sh
Установщик скопирует osync в папку /usr/local/bin и создаст первоначальный файл конфигурации /etc/osync/sync.conf.example
Необходимо скопировать его с именем osync.conf
Вносим изменения в данный файл:#!/usr/bin/env bash INSTANCE_ID="sysvol_sync" INITIATOR_SYNC_DIR="/usr/local/samba/var/locks/sysvol" TARGET_SYNC_DIR="ssh://root@DC2:22//usr/local/samba/var/locks/sysvol" SSH_RSA_PRIVATE_KEY="/root/.ssh/id_rsa" CREATE_DIRS=yes REMOTE_3RD_PARTY_HOSTS="" PRESERVE_ACL=yes PRESERVE_XATTR=yes SOFT_DELETE=yes DESTINATION_MAILS="Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript." #REMOTE_RUN_AFTER_CMD="/usr/local/samba/bin/samba-tool ntacl sysvolreset"
Создаем ключ для подключения к другому контроллеру и копируем его на него:ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub root@DC2
Проверяяем корректность подключения:ssh DC2
Перед запуском делаем резервную копию SYSVOL. Она сохраняется в папке /usr/local/samba/var/locks/sysvol/.osync_workdir//usr/local/bin/osync.sh /etc/osync/sync.conf --dry --verbose
Если все прошло без ошибок, то убираем параметр --dry и запускаем снова:/usr/local/bin/osync.sh /etc/osync/sync.conf --verbose
После этого SYSVOL синхронизировался на обоих серверах.
Включаем на первом сервере (там где установлен osync) синхронизацию по расписанию:crontab -e */5 * * * * /usr/local/bin/osync.sh /etc/osync/sync.conf --silent
- И наконец. Управление всем этим хозяйством осуществляется из командной строки сервера, на котором установлен Samba, либо с помощью хорошо знакомых утилит от MS Remote Server Administrator Tools (RSAT), установленный на компьютере под управлением Windows. На компьютере с Linux и эмулятором Wine это не работает.
- В итоге мы получили ПОЧТИ полноценный аналог Active Directory, работающий на ссерверах Linux. Что теряем и приобретаем:
Переход от до MS AD к Samba AD возможен с минимальными потерями.
В домене Samba работает аутентификация пользователей и рабочих станций под управлением Windows и Linux.
Работает авторозация и предоставление ресурсов.
Есть поддержка групповых политик для работы клиентов MS Windows.
Есть перемещыемые профили.
Управление доменом Samba осуществляется либо из консоли сервера, либо с помощью инструментов MS (RSAT), развернутых на рабочей станции под управлением MS Windows (в оболочке Wine под управлением Linux данный инструментарий не работает).
Присутствует поддержка протоколов SMB2 и SMB3 (в том числе с поддержкой шифрования).
Работает реплиуация с другими серверами AD (в том числе с Windows 2012)
Выявленные недостатки:
Между серверами Samba AD не реплицируется хранилище SYSVOL, что приводит к некоректной работе (например групповых политик). Для осуществления репликации необходимо использовать другой инструментарий из состава ОС Linux (т.е. дополнительные настройки "костыля")
Доверительные отношения работают только в одном направлении (от Windows к Samba но не наоборот), что не позволяет организовать лес доменов.
Не поддерживаются поддомены
a) В Samba отсутствует глобальный каталог и полноценная поддержка фантомных объектов.
b) Проблемы при построении структуры AD (Active Directory browser), проблемы при поиске объектов в другом домене.
c) При применении групповых политик в многодоменной среде могут быть проблемы с определением, в каком домене находится компьютер.
DFS работает только в режиме одиночного сервера.
Не реализовано DFS-R
Не полностью реализован RODC.
Ограничение размера базы TDB в 4 Гб. Это ограничивает переход от леса доменов к плоской структуре с одним доменом.
Samba AD функционирует на уровне контроллера доменов Windows 2008 R2. В домен на уровне Windows 2012 Samba можно ввести только как клиент, но не как контроллер домена. Переход от AD 2012 к Samba невозможен.