Active Directory на базе Ubuntu Linux


 

Еще одним применением такой конструкции может быть организация централизованного доступа (единый логин-пароль к сервисам) без использования Windows-сервера с Active Directory. Домен совместимый с Active Directory мы будем строить на базе Samba 4 и согласно официального сайта Samba (https://www.samba.org/) текущая версия SAMBA - Samba 4.9.0.

В поставку Linux-дистрибутива Ubuntu Server 16.04 входит samba версии:

# apt-cache policy samba
samba:
 Установлен: (отсутствует)
 Кандидат:  2:4.3.11+dfsg-0ubuntu0.16.04.16
 Таблица версий:
    2:4.3.11+dfsg-0ubuntu0.16.04.16 500
       500 http://ru.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
    2:4.3.11+dfsg-0ubuntu0.16.04.15 500
       500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages
    2:4.3.8+dfsg-0ubuntu1 500
       500 http://ru.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

Версия 4.3.11 это мягко говоря не первая свежесть и для наших задач сервер Active Directory лучше скомпилировать из исходных кодов последней стабильной версии.

Сборка Samba 4.9.0 из исходных кодов

Загружаем и распаковываем архив с текущей стабильной версией:

# cd /usr/src/
# wget https://download.samba.org/pub/samba/stable/samba-4.9.0.tar.gz
# tar -xvf ./samba-4.9.0.tar.gz
# cd ./samba-4.9.0/

Устанавливаем необходимые для сборки пакеты:

# aptitude install build-essential liblmdb++-dev libjansson-dev libkrb5-dev heimdal-multidev pkgconf
# aptitude install gnutls-dev libgpgme11-dev libarchive-dev libacl1-dev libldap2-dev libpam0g-dev libtasn1-bin
# aptitude install libfam-dev libncurses-dev liblmdb-dev
# cd /usr/src/
# wget http://www.digip.org/jansson/releases/jansson-2.11.tar.gz
# tar -xvf ./jansson-2.11.tar.gz
# cd /usr/src/jansson-2.11/
# ./configure
# make
# make install
# ldconfig
# cd /usr/src/samba-4.9.0/

Сборка:

# ./configure --with-gpgme --with-quotas --with-dnsupdate --with-automount \
   --with-cluster-support --with-regedit --with-ads --with-winbind --with-ads
# make && make install

Моя инфраструктура для тестирования Active Directory на базе Ubuntu Server

Внутренний домен internal.gita-dev.ru в идеале должен стать частью глобального домена gita-dev.ru, а часть внутренней сети 10.211.0.0/16 должна дополнительно обслуживаться DHCP-сервером и вводимые в домен рабочие станции должны автоматически регистрироваться в Active Directory DNS. Схему тестовой инфраструктуры Gita-DEV можно схематически описать следующим образом.

Конфигурационный файл контроллера домена

Конфигурационный файл smb.conf создается автоматически в процессе выполнения команды:

/usr/local/samba/bin/samba-tool domain provision --use-rfc2307 --realm internal.gita-dev.ru \
--domain internal --server-role dc --dns-backend BIND9_FLATFILE \
--option="interfaces=lo master-bridge" --option="bind interfaces only=yes"

Пробежимся по всем указанным мной параметрам конфигурации:

--use-rfc2307 - обеспечивает поддержку одинаковых идентификаторов пользователей и групп в Linux-системах (я про эту проблему уже писал в статье про ввод Linux в Windows-домен)

--realm internal.gita-dev.ru - полное имя создаваемого домена (Kerberos realm)

--domain internal - NetBios имя домена (короткое)

--server-role dc - Роль сервера контроллер домена

--dns-backend BIND9_FLATFILE - информация о DNS-записях будет храниться в виде файла для bind (скоро этот удобный механизм удалят и придется использовать встроенные в Samba 4 механизмы DNS-сервера)

interfaces=lo master-bridge и bind interfaces only=yes - дополнительные параметры указывающие, что работать будем только со строго определенным набором интерфейсов.

Дополнительно можно указать еще и пароль администратора или вам его создадут автоматически. Если все прошло как надо, то вы получите следующее сообщение:

Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=internal,DC=gita-dev,DC=ru
See /usr/local/samba/bind-dns/named.conf for an example configuration include file for BIND
and /usr/local/samba/bind-dns/named.txt for further documentation required for secure DNS updates
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba AD has been generated at /usr/local/samba/private/krb5.conf
Merge the contents of this file with your system krb5.conf or replace it with this one. Do not create a symlink!
Setting up fake yp server settings
Once the above files are installed, your Samba AD server will be ready to use
Admin password:       xxxPasswordxxx
Server Role:          active directory domain controller
Hostname:             ad-1
NetBIOS Domain:       INTERNAL
DNS Domain:           internal.gita-dev.ru
DOMAIN SID:           S-1-5-21-3954735136-536341056-1970609469

Конфигурационный файл для контроллера домена довольно сильно отличается от типового файла клиента и выглядит следующим образом:

# Global parameters
[global]
       bind interfaces only = Yes
       interfaces = lo master-bridge
       netbios name = AD-1
       realm = INTERNAL.GITA-DEV.RU
       server role = active directory domain controller
       server services = s3fs, rpc, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate
       workgroup = INTERNAL
       idmap_ldb:use rfc2307 = yes

[netlogon]
       path = /usr/local/samba/var/locks/sysvol/internal.gita-dev.ru/scripts
       read only = No

[sysvol]
       path = /usr/local/samba/var/locks/sysvol
       read only = No

В файле /etc/hosts должен быть обязательно прописано полное доменное имя для ip-адреса контроллера домена:

127.0.0.1      localhost
10.211.0.4     ad-1.internal.gita-dev.ru

Домен у меня функционирует внутри VPN-тунеля, поэтому и адреса из VPN-сети, внешний интерфейс закрыт при помощи Firewall.

Тестовый запуск контроллера домена под управлением Ubuntu Linux

Устанавливаем керберос-сервер и копируем созданную конфигурацию:

# aptitude install krb5-config krb5-kdc
# cp /usr/local/samba/private/krb5.conf /etc/krb5.conf

Вы уже сейчас можете запустить Samba 4 в качестве контроллера домена, но при условии что у вас настроен bind на использование файла /usr/local/samba/bind-dns/dns/internal.gita-dev.ru.zone (он автоматически изменяется в процессе работы Samba DC). Давайте проведем тестовый запуск и посмотрим на содержимое этого файла. Запуск Samba 4 в режиме отладки производится командой:

# /usr/local/samba/sbin/samba -i -F -d 9

Созданный файл конфигурации DNS выглядит довольно монстроидально:

; -*- zone -*-
; generated by provision.pl
$ORIGIN internal.gita-dev.ru.
$TTL 1W
@              IN SOA ad-1  hostmaster (
                               2018091815  ; serial
                               2D             ; refresh
                               4H             ; retry
                               6W             ; expiry
                               1W )           ; minimum
                       IN NS  ad-1

           IN A   10.211.0.4
;

ad-1       IN A   10.211.0.4
gc._msdcs              IN A   10.211.0.4

172a423b-47f5-43ab-b24c-78b773da899a._msdcs    IN CNAME       ad-1
;
; global catalog servers
_gc._tcp               IN SRV 0 100 3268      ad-1
_gc._tcp.Default-First-Site-Name._sites IN SRV 0 100 3268      ad-1
_ldap._tcp.gc._msdcs   IN SRV 0 100 3268      ad-1
_ldap._tcp.Default-First-Site-Name._sites.gc._msdcs    IN SRV 0 100 3268 ad-1
;
; ldap servers
_ldap._tcp             IN SRV 0 100 389       ad-1
_ldap._tcp.dc._msdcs   IN SRV 0 100 389       ad-1
_ldap._tcp.pdc._msdcs  IN SRV 0 100 389       ad-1
_ldap._tcp.ee4751b1-6614-4254-80c2-c71873624c4c.domains._msdcs         IN SRV 0 100 389 ad-1
_ldap._tcp.Default-First-Site-Name._sites              IN SRV 0 100 389 ad-1
_ldap._tcp.Default-First-Site-Name._sites.dc._msdcs    IN SRV 0 100 389 ad-1
;
; krb5 servers
_kerberos._tcp         IN SRV 0 100 88        ad-1
_kerberos._tcp.dc._msdcs       IN SRV 0 100 88 ad-1
_kerberos._tcp.Default-First-Site-Name._sites  IN SRV 0 100 88 ad-1
_kerberos._tcp.Default-First-Site-Name._sites.dc._msdcs IN SRV 0 100 88 ad-1
_kerberos._udp         IN SRV 0 100 88        ad-1
; MIT kpasswd likes to lookup this name on password change
_kerberos-master._tcp          IN SRV 0 100 88        ad-1
_kerberos-master._udp          IN SRV 0 100 88        ad-1
;
; kpasswd
_kpasswd._tcp          IN SRV 0 100 464       ad-1
_kpasswd._udp          IN SRV 0 100 464       ad-1
;
; heimdal 'find realm for host' hack
_kerberos              IN TXT INTERNAL.GITA-DEV.RU

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

# aptitude install bind9 bind9utils

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

# cd /etc
# mv ./bind ./bind.bak
# ln -s /usr/local/samba/bind-dns /etc/bind
# chown -R bind:bind /usr/local/samba/bind-dns

Перезапускаем bind и проверяем, что все работает, для проверки работоспособности запросим несколько специфичных DNS-записей контроллера домена, например:

# nslookup gc._msdcs.internal.gita-dev.ru 127.0.0.1
Server:        127.0.0.1
Address:       127.0.0.1#53

Name:  gc._msdcs.internal.gita-dev.ru
Address: 10.211.0.4

Как вы видите, мы запрашиваем данные у локального DNS-сервера, а хотелось бы интегрировать запросы в глобальный домен. И это очень интересная задача у которой есть несколько путей решения. В результате ряда экспериментов, я пришел к выводу, что разумнее всего использовать stub-зоны, но для этого необходимо разрешить трансфер зоны с контроллера домена на наш виртуальный slave.

По умолчанию трансфер зоны естественно запрещен:

# dig AXFR internal.gita-dev.ru @10.211.0.4

Настроить трансфер зоны вы можете отредактировав конфигурационный файл (если вы используете bind_flat), а для режима встроенного DNS-сервера это пока не поддерживается.

На вышестоящем сервере соответственно прописываем передачу зоны для субдомена:

zone "internal.gita-dev.ru" {
   type stub;
   masters { 10.211.0.4; };
   file "internal.gita-dev.ru.db";
   check-names warn;
};

Автоматический запуск Samba 4 при старте сервера

Так как мы собрали Samba 4 из исходных кодов, то и механизмы автозапуска нам естественно придется сделать самостоятельно. Для автозапуска Samba я использую простой конфигурационный файл службы для SystemD. Создайте файл /lib/systemd/system/samba-ad-dc.service, со следующим содержимым:

[Unit]
Description=Samba Active Directory Domain Controller
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/samba/sbin/samba -D
PIDFile=/usr/local/samba/var/run/samba.pid
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

Настраиваем автозапуск и запускаем службу:

# systemctl enable samba-ad-dc
# systemctl start samba-ad-dc

Вводим рабочую станцию под управлением Windows 10 в созданный домен Active Directory

Для управления созданным доменом Active Directory можно при помощи консольной утилиты samba-tool. Для быстрого доступа без указания полного пути иы создаем символическую ссылку на нее:

# ln -s /usr/local/samba/bin/samba-tool /usr/bin/samba-tool

И хотя управлять созданным доменом можно из консоли, тем более что графических утилит управления AD в Linux так и не появилось, на практике это не очень удобно и например понижение политики сложности паролей выглядит следующим образом:

# samba-tool domain passwordsettings set --complexity=off\
  --min-pwd-length=3 --max-pwd-age=0\ 
  --min-pwd-age=0 --history-length=0

А запрос сведений о текущей политике паролей соответственно:

# samba-tool domain passwordsettings show
Password informations for domain 'DC=internal,DC=gita-dev,DC=ru'

Password complexity: on
Store plaintext passwords: off
Password history length: 24
Minimum password length: 7
Minimum password age (days): 1
Maximum password age (days): 42
Account lockout duration (mins): 30
Account lockout threshold (attempts): 0
Reset account lockout after (mins): 30

Сменить пароль администратора можно командой:

# samba-tool user setpassword Administrator

Но как вы наверное знаете, совершенно не обязательно использовать оснастку на сервере Active Directory, тем более, что если вы установили Windows контроллер домена в режиме Core, то и рабочего стола у вас там не будет, а для управления доменом вы будете использовать инструменты администрирования установленные на рабочей станции которая является членом домена.

Ввод рабочей станции Windows в домен контролируемый контроллером домена под управлением Ubuntu Linux ничем не отличается от ввода в домен контролируемый контроллером домена Windows и установка инструментов управления тоже довольно типовая, но я на всякий случай я подготовил для вас видео.

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