WIN-DC
Открываем редактор реестра. Ставим сервер времени LIN-DC1
Далее перезапускаем службу времени
После этого должны начать добавляться записи в домен с LIN-DC1
LIN-DC1
hostnamectl set-hostname LIN-DC1.SEMIFINAL.IRPO bash echo -e "TYPE=eth\nBOOTPROTO=static" > /etc/net/ifaces/ens19/options echo "192.168.1.3/24" > /etc/net/ifaces/ens19/ipv4address echo "default via 192.168.1.1" > /etc/net/ifaces/ens19/ipv4route mcedit /etc/net/ifaces/ens19/resolv.conf search semifinal.irpo nameserver 77.88.8.8 mcedit /etc/sysconfig/network HOSTNAME=LIN-DC1.SEMIFINAL.IRPO systemctl restart network
Настроим сервер времени
apt-get update && apt-get install chrony -y Разрешим подключение из локальной сети и проверим pool mcedit /etc/chrony.conf allow 192.168.1.0/24 pool pool.ntp.org iburst local stratum 10 control chrony server systemctl enable --now chronyd
Создим домен semifinal.irpo с функциональным уровнем не ниже Windows Server 2016
apt-get update && apt-get install task-samba-dc samba-client bind bind-utils krb5-kdc -y rm /etc/samba/smb.confМеняем адрес DNS на WIN-DC mcedit /etc/net/ifaces/ens19/resolv.conf search semifinal.irpo nameserver 192.168.1.2 systemctl restart network Проверяем ping 192.168.1.2 ping win-dc.senifinal.irpo ping ya.ru
Присоединяемся к домену (если что-то произошло и мы присоединяемся повторно, то на WIN-DC в разделе Active Directory Users & Computers — Domain-Controllers удаляем запись LIN-DC1
samba-tool domain join semifinal.irpo DC -U administrator@semifinal.irpo --dns-backend=SAMBA_INTERNAL --option "ad dc functional level = 2016"
На WIN-DC должна появится запись о новом контроллере
Открываем Tools — DNS
Смотрим, какой использовался форвардер
В настройку smb.conf в секцию GLOBAL добавляем (на картинке не соответствует реальности)
mcedit /etc/samba/smb.conf
dns forwarder = 1.1.1.1
systemctl enable --now samba
Копируем файл krb5 в системный с заменой
cp /var/lib/samba/private/krb5.conf /etc/
Переводим все fsmo на LIN-DC1
samba-tool fsmo seize --role=all -U administrator@semifinal.irpo
Проверяем
samba-tool fsmo show samba-tool domain level show
LIN-SRV1
hostnamectl set-hostname LIN-SRV1.SEMIFINAL.IRPO bash echo -e "TYPE=eth\nBOOTPROTO=static" > /etc/net/ifaces/ens19/options echo "192.168.1.4/24" > /etc/net/ifaces/ens19/ipv4address echo "default via 192.168.1.1" > /etc/net/ifaces/ens19/ipv4route echo -e "search semifinal.irpo\nnameserver 192.168.1.3\n" > /etc/net/ifaces/ens19/resolv.conf systemctl restart network ip -br -c a
Настроим клиент времени
apt-get update && apt-get install chrony -y mcedit /etc/chrony.conf server 192.168.1.3 iburst Пройти весь файл и закомментировать все pool #pool systemctl enable --now chronyd
Установим
apt-get update && apt-get install task-auth-ad-sssd -y Присоединяем к домену system-auth write ad semifinal.irpo LIN-SRV1 SEMIFINAL 'administrator' 'P@ssw0rd'
На WIN-DC можно проверить запись в прямой и обратной зонах (надо обновить F5)
LIN-SRV2
hostnamectl set-hostname LIN-SRV2.SEMIFINAL.IRPO bash echo -e "TYPE=eth\nBOOTPROTO=static" > /etc/net/ifaces/ens19/options echo "192.168.1.5/24" > /etc/net/ifaces/ens19/ipv4address echo "default via 192.168.1.1" > /etc/net/ifaces/ens19/ipv4route echo -e "search semifinal.irpo\nnameserver 192.168.1.3\n" > /etc/net/ifaces/ens19/resolv.conf systemctl restart network ip -br -c a
Настроим клиент времени
apt-get update && apt-get install chrony -y mcedit /etc/chrony.conf server 192.168.1.3 iburst Пройти весь файл и закомментировать все pool #pool systemctl enable --now chronyd
Установим
apt-get update && apt-get install task-auth-ad-sssd -y Присоединяем к домену system-auth write ad semifinal.irpo LIN-SRV2 SEMIFINAL 'administrator' 'P@ssw0rd'
ADM
hostnamectl set-hostname ADM.SEMIFINAL.IRPO bash echo -e "TYPE=eth\nBOOTPROTO=static" > /etc/net/ifaces/enp7s1/options echo "192.168.1.99/24" > /etc/net/ifaces/enp7s1/ipv4address echo "default via 192.168.1.1" > /etc/net/ifaces/enp7s1/ipv4route echo -e "search semifinal.irpo\nnameserver 192.168.1.3\n" > /etc/net/ifaces/enp7s1/resolv.conf systemctl restart network ip -br -c a
Настроим сервер времени
apt-get update && apt-get install chrony -y Разрешим подключение из локальной сети и проверим pool mcedit /etc/chrony.conf #pool pool.ntp.org iburst server 192.168.1.3 iburst systemctl enable --now chronyd
LIN-SRV1
Создадим папки
mkdir /opt/Share mkdir /opt/profiles mkdir /opt/UserDocs chmod 777 /opt/*
Открываем файл mcedit /etc/samba/smb.conf и в конец дописываем описание шар (внимательно убираем лишние пробелы)
[Share] path = /opt/Share read only = no guest ok = yes browseable = yes public = yes [Profiles] path = /opt/profiles read only = no browseable = no valid users = %U create mask = 0600 directory mask = 0700 [UserDocs] path = /opt/UserDocs read only = no browseable = no valid users = "@SEMIFINAL\Domain Users"
Запустим SAMBA
systemctl enable --now smb
С ADM можно посмотреть опубликованные шары smbclient -L 192.168.1.4 (пароль toor)
Переходим на WIN-DC, открываем проводник, подключаем шару
Копируем профили
Открываем CMD от имени Администратора
robocopy C:\Users Z: /E /COPY:DAT /ZB /R:3 /W:10
Может на долго зависнуть, т.к. не ко всем папкам есть доступ. Если постоянно висит надпись реконект, то прервать.
Переходим на LIN-SRV1
mv /opt/Share/* /opt/profiles/
LIN-DC1
Примонтируем временно папку SYSVOL с WIN-DC
mkdir /mnt/sysvol
apt-get install cifs-utils
mcedit .smbclient
username=administrator
password=P@ssw0rd
mcedit /etc/fstab
//win-dc/sysvol /mnt/sysvol cifs user,rw,_netdev,credentials=/root/.smbclient 0 0
mount -a
Проверяем, что примонтировалась
ls -l /mnt/sysvol
Копируем содержимое в папку /var/lib/samba/sysvol
cp -r /mnt/sysvol/* /var/lib/samba/sysvol
Проверяем
ls -l /var/lib/samba/sysvol/
Создаем структуру домена
samba-tool ou create "OU=LinOU,DC=semifinal,DC=irpo" -U Administrator samba-tool user create LinUser1 P@ssw0rd --userou "OU=LinOU" -U Administrator samba-tool user create LinUser2 P@ssw0rd --userou "OU=LinOU" -U Administrator samba-tool group add LinUsers --groupou "OU=LinOU" -U Administrator samba-tool group addmembers LinUsers LinUser1,LinUser2 -U Administrator samba-tool computer move LIN-CLI1 "OU=LinOU" -U Administrator //Если LIN-CLI1 не вошел в домен, то не сработает, надо повторить после ввода LIN-CLI1 в домен
Добавляем записи DNS
samba-tool dns add LIN-DC1 SEMIFINAL.IRPO web A 192.168.1.4 -U Administrator samba-tool dns add LIN-DC1 semifinal.irpo mon A 192.168.1.5 -U Administrator samba-tool dns add LIN-DC1 semifinal.irpo backup A 192.168.1.4 -U Administrator samba-tool dns add LIN-DC1 semifinal.irpo adm A 192.168.1.99 -U Administrator samba-tool dns zonecreate LIN-DC1 1.168.192.in-addr.arpa -U Administrator (если не создана виндой) samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 4 PTR LIN-SRV1.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 5 PTR LIN-SRV2.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 2 PTR LIN-DC2.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 3 PTR LIN-DC1.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 99 PTR ADM.semifinal.irpo -U Administrator
ADM
apt-get update && apt-get install admc gpui gpupdate -y Оставим пока только 1 адрес DNS mcedit /etc/net/ifaces/enp7s1/resolv.conf search semifinal.irpo nameserver 192.168.1.2
В терминале kinit administrator@SEMIFINAL.IRPO (пароль P@ssw0rd)
ИЛИ
kinit
Проверим klist
Переходим в графику. Открываем ADMC — Файл — Параметры подключения
Потом в меню ФАЙЛ — Сменить пользователя
Если не получается, то:
открываем терминал — переходим в su — kinit administrator@SEMIFINAL.IRPO
Потом запускаем ADMC от имени root и оставляем открытым.
В настройках ставим галочку «Дополнительные возможности»
Открываем настройку пользователей -> Выбираем нужных пользователей -> ПКМ -> Свойства -> Профили ->
Путь пишем //lin-srv1/Profiles/%username% или \\lin-srv1\Profiles\%username% (надо проверять, как будет работать)
На WIN-DC меняем контроллер домена
Выключаем WIN-DC
Переходим на LIN-DC1 и удаляем записи о WIN-DC
samba-tool domain demote --remove-other-dead-server=WIN-DC -U administrator@semifinal.irpo
Возвращаемся на ADM
Если контроллер не удаляли, то
Если удаляли, то
В терминале kinit administrator@SEMIFINAL.IRPO (пароль P@ssw0rd)
Проверим klist
Переходим в графику. Открываем ADMC — Файл — Параметры подключения (Должен остаться только LIN-DC1)
Выбираем его. Закрываем ADMC, заново запускаем.
Потом в меню ФАЙЛ — Сменить пользователя
Должно всё вернуться, но контроллер новый
LIN-DC2 (предварительно выключить win-dc или отключить на нем сетевую карту)
hostnamectl set-hostname LIN-DC2.SEMIFINAL.IRPO bash echo -e "TYPE=eth\nBOOTPROTO=static" > /etc/net/ifaces/ens19/options echo "192.168.1.2/24" > /etc/net/ifaces/ens19/ipv4address echo "default via 192.168.1.1" > /etc/net/ifaces/ens19/ipv4route mcedit /etc/net/ifaces/ens19/resolv.conf search semifinal.irpo nameserver 192.168.1.3 nameserver 192.168.1.2 systemctl restart network
Настроим сервер времени
apt-get update && apt-get install chrony -y Укажем сервер времени, проверим pool mcedit /etc/chrony.conf #pool pool.ntp.org iburst server 192.168.1.3 iburst systemctl enable --now chronyd Проверим (Может заработать через несколько минут) ping lin-dc1 chronyc tracking
Установим DHCP
apt-get install dhcp-server -y
mcedit /etc/dhcp/dhcpd.conf
option domain-name "semifinal.irpo";
option domain-name-servers 192.168.1.3, 192.168.1.2; # LIN-DC1 и LIN-DC2
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
}
# Включаем динамические обновления DNS
ddns-update-style interim;
ddns-domainname "semifinal.irpo.";
ddns-rev-domainname "in-addr.arpa.";
zone semifinal.irpo. {
primary 192.168.1.3;
}
zone 1.168.192.in-addr.arpa. {
primary 192.168.1.3;
}
Включаем DHCP
systemctl enable --now dhcpd
Проверяем systemctl status dhcp
Ставим
apt-get install task-samba-dc krb5-kdc -y
rm /etc/samba/smb.conf (если вход в домен работать не будет его можно удалять постоянно)
Вводим LIN-DC2 в домен
samba-tool domain join semifinal.irpo DC -U administrator@semifinal.irpo --dns-backend=SAMBA_INTERNAL --option "ad dc functional level = 2016"
Посмотрим машины в домене
samba-tool computer list
mcedit /etc/samba/smb.conf
И как на LIN-DC1 в секцию GLOBAL (только адрес берем, такой, который узнали на WIN-DC)
dns forwarder = 1.1.1.1
Включаем SAMBA
systemctl enable --now samba.service
Копируем созданный samba файл krb5 (перезаписываем)
cp /var/lib/samba/private/krb5.conf /etc/
Проверяем kinit
kinit administrator@SEMIFINAL.IRPO
Пароль P@ssw0rd
Проверим билет
klist
LIN-CLI1 (Если до этого не сделали)
hostnamectl set-hostname LIN-CLI1.SEMIFINAL.IRPO bash echo -e "TYPE=eth\nBOOTPROTO=dhcp" > /etc/net/ifaces/enp7s1/options systemctl restart network ip -br -c a Должны прилететь адреса по DHCP. Если этого не произошло (DHCP на LIN-DC2 не заработал), то ставим адреса в ручную echo -e "TYPE=eth\nBOOTPROTO=static" > /etc/net/ifaces/enp7s1/options echo "192.168.1.5/24" > /etc/net/ifaces/enp7s1/ipv4address echo "default via 192.168.1.1" > /etc/net/ifaces/enp7s1/ipv4route echo -e "search semifinal.irpo\nnameserver 192.168.1.3\n" > /etc/net/ifaces/enp7s1/resolv.conf systemctl restart network ip -br -c a
Настроим клиент времени
apt-get update && apt-get install chrony -y mcedit /etc/chrony.conf server 192.168.1.3 iburst Пройти весь файл и закомментировать все pool #pool systemctl enable --now chronyd systemctl restart chronyd ping lin-dc1 chronyc tracking
Установим
apt-get update && apt-get install task-auth-ad-sssd krb5-kdc gpupdate systemd-settings-enable-kill-user-processes -y Присоединяем к домену system-auth write ad semifinal.irpo LIN-CLI1 SEMIFINAL 'administrator' 'P@ssw0rd'
ИЛИ через графику: открываем центр управления системой — Аутентификация — внизу применить (
LIN-DC1 (Если не получилось до этого)
Создаем структуру домена
samba-tool ou create "OU=LinOU,DC=semifinal,DC=irpo" -U Administrator samba-tool user create LinUser1 P@ssw0rd --userou "OU=LinOU" -U Administrator samba-tool user create LinUser2 P@ssw0rd --userou "OU=LinOU" -U Administrator samba-tool group add LinUsers --groupou "OU=LinOU" -U Administrator samba-tool group addmembers LinUsers LinUser1,LinUser2 -U Administrator samba-tool computer move LIN-CLI1 "OU=LinOU" -U Administrator //Это получилось с LIN-DC2. Если LIN-CLI1 не вошел в домен, то не сработает
Добавляем записи DNS
samba-tool dns add LIN-DC1 semifinal.irpo web A 192.168.1.4 -U Administrator samba-tool dns add LIN-DC1 semifinal.irpo mon A 192.168.1.5 -U Administrator samba-tool dns add LIN-DC1 semifinal.irpo backup A 192.168.1.4 -U Administrator samba-tool dns add LIN-DC1 semifinal.irpo adm A 192.168.1.99 -U Administrator samba-tool dns zonecreate LIN-DC1 1.168.192.in-addr.arpa -U Administrator (если не создана виндой) samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 4 PTR LIN-SRV1.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 5 PTR LIN-SRV2.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 2 PTR LIN-DC2.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 3 PTR LIN-DC1.semifinal.irpo -U Administrator samba-tool dns add LIN-DC1 1.168.192.in-addr.arpa 99 PTR ADM.semifinal.irpo -U Administrator
LIN-SRV2
Установка системы мониторинга (если DNS на 192.168.1.2 и 192.168.1.3 отвалился, ставим 77.88.8.8 в /etc/net/ifaces/ens19/resolv.conf, systemctl restart network, ставим всё, потом возвращаем назад nameserver 192.168.1.3 и nameserver 192.168.1.2)
apt-get update && apt-get install grafana prometheus prometheus-node_exporter -y systemctl enable --now grafana-server
В файле /etc/prometheus/prometheus.yml секции scrape_configs добавим (такой job там уже есть, надо только добавить в конце targets)
mcedit /etc/prometheus/prometheus.yml
- job_name: node static_configs: - targets: ['192.168.1.3:9100', '192.168.1.2:9100', '192.168.1.4:9100']
Запустим
systemctl enable --now prometheus
Lin-DC1, Lin-DC2, Lin-SRV1 (если DNS на 192.168.1.2 и 192.168.1.3 отвалился, ставим 77.88.8.8 в /etc/net/ifaces/ens19/resolv.conf, systemctl restart network, ставим всё, потом возвращаем назад nameserver 192.168.1.3 и nameserver 192.168.1.2)
Ставим клиентов
apt-get install prometheus-node_exporter -y systemctl enable --now prometheus-node_exporter
ADM
- Откройте веб-интерфейс http://192.168.1.5:3000 (логин/пароль по умолчанию admin/admin).
Меняем пароль на P@ssw0rd
- Добавьте источник данных Prometheus (URL: http://localhost:9090).
- Импортируйте готовый дашборд для Node Exporter (например, ID 1860 с grafana.com).
Потом внизу импорт
Добавить Data Source → Prometheus (http://localhost:9090)
Импортировать дашборд ID: 1860 (Node Exporter Full) или создать виджеты node_cpu_seconds_total, node_memory_MemAvailable_bytes, node_filesystem_avail_bytes.
LIN-SRV2
apt-get install nginx
mcedit /etc/nginx/sites-enabled.d/task.conf
server {
listen 80;
server_name mon.semifinal.irpo;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
systemctl enable —now nginx
Если все работает, то с ADM должно грузиться по имени http://mon.semifinal.irpo
WIN-CLI1 (возможно будет iso с инсталяшкой, если нет, то скачиваем из Инета)
Проверить, что адрес прилетает по DHP.
- Откройте «Управление» → «Добавить роли и компоненты».
- В разделе «Компоненты» найдите «Средства удалённого администрирования сервера» (RSAT).
- Установите оснастки: Active Directory – пользователи и компьютеры, Управление групповыми политиками, DNS-сервер.
- После установки оснастки будут доступны в меню «Администрирование».
WIN-CLI2
- Убедитесь, что компьютер получает IP-адрес от DHCP-сервера (LIN-DC2).
- Откройте «Свойства системы» → «Имя компьютера» → «Изменить».
- Выберите «Является членом домена», введите semifinal.irpo.
- Введите учётные данные администратора домена (Administrator, P@ssw0rd).
- Перезагрузите компьютер.
Дальше совсем новое
Двунаправленная репликация SYSVOL
LIN-DC1 и LIN-DC2
- На обоих контроллерах установим пакеты:
apt-get install rsync unison -y
- На LIN-DC1 и LIN-DC2 разрешим root по ssh
mcedit /etc/openssh/sshd_config
PermitRootLogin yes
systemctl restart sshd
- На LIN-DC1 настроим беспарольный доступ по SSH к LIN-DC2:
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519 ssh-copy-id root@192.168.1.2 пароль root
- На LIN-DC1 создадим конфигурационный файл /root/.unison/sysvol.prf со следующим содержимым:
mkdir /root/.unison/
mcedit /root/.unison/sysvol.prf
# Локальный и удалённый корни root = /var/lib/samba/sysvol root = ssh://root@192.168.1.2//var/lib/samba/sysvol # Автоматический режим без вопросов auto = true batch = true # Сохранять владельца и группу owner = true group = true # Не синхронизировать права (они задаются отдельно) perms = -1 # Использовать rsync для ускорения rsync = true xattrs = true #Не обрабатывать символические ссылки links = false
- На LIN-DC1 добавим задание в cron для автоматической синхронизации каждые 5 минут:
- Выполним mcedit /etc/crontab
- Добавим строку:
*/5 * * * * /usr/bin/unison sysvol -silent systemctl restart crond
- Выполним первую синхронизацию вручную для проверки:
/usr/bin/unison sysvol
Выполним синхронизацию
/usr/bin/rsync -XAavz --log-file /var/log/sysvol-sync.log \ --delete-after -f"+ */" -f"- *" /var/lib/samba/sysvol \ root@192.168.1.2:/var/lib/samba && /usr/bin/unison
LIN-DC1
Установим шаблоны
apt-get install admx-basealt admx-chromium admx-msi-setup gpui -y
- Загрузим шаблоны MSI (для Windows-политик):
admx-msi-setup
- Загрузим шаблоны в домен:
samba-tool gpo admxload -U Administrator
LIN-SRV1
- Установим Apache и модуль GSSAPI:
apt-get install apache2 apache2-mod_auth_gssapi samba-utils -y
- Включим необходимые модули Apache:
a2enmod auth_gssapi a2enmod authn_core a2enmod authz_user
- Создадим Service Principal Name (SPN) для веб-сервера в домене:
samba-tool spn add HTTP/web.semifinal.irpo@SEMIFINAL.IRPO LIN-SRV1$ -Uadministrator samba-tool spn add HTTP/lin-srv1.semifinal.irpo@SEMIFINAL.IRPO LIN-SRV1$ -Uadministrator
- Экспортируем keytab-файл с ключами для HTTP-сервиса:
samba-tool domain exportkeytab /etc/apache2/http.keytab --principal=HTTP/web.semifinal.irpo@SEMIFINAL.IRPO samba-tool domain exportkeytab /etc/apache2/http.keytab --principal=HTTP/lin-srv1.semifinal.irpo@SEMIFINAL.IRPO chown www-data:www-data /etc/apache2/http.keytab && chmod 600 /etc/apache2/http.keytab
- Создадим конфигурацию виртуального хоста в файле /etc/apache2/sites-available/web.conf:
<VirtualHost *:80> ServerName web.semifinal.irpo DocumentRoot /var/www/web <Location /> AuthType GSSAPI AuthName «GSSAPI Login» GssapiCredStore keytab:/etc/apache2/http.keytab GssapiBasicAuth On GssapiLocalName On require valid-user </Location> </VirtualHost>
- Создадим каталог для сайта и разместим в нём файл login.html (из /template):
mkdir -p /var/www/web cp /template/login.html /var/www/web/index.html
- Активируем сайт и перезагрузим Apache:
a2ensite web.conf systemctl reload apache2
LIN-SRV1 (Кибербэкап)
Монтируем образ
mkdir /mnt/cdr
mount /dev/sr0 /mnt/cdr
ls /mnt/cdr
cd /mnt/cdr
Смотрим, как называется файл, если архивный …tar, то распаковываем
tar --xattrs --xattrs-include=* -xvf CyberBackup_16_64-bit.x86_64.tar
chmod +x /mnt/cdr/CyberBackup_*
./CyberBackup_16_64-bit.x86_64
Выбираем роль сервера управления
После установки на ADM http://backup.semifinal.irpo:9877 или http://192.168.1.4:9877
ADM
Аналогично, только выбираем КиберБэкап агента для linux и узла хранения
- В процессе установки укажите IP-адрес сервера управления: 192.168.1.4.
- После установки агента подключите его к серверу управления через веб-интерфейс.
- На хосте ADM создайте каталог для хранения резервных копий:
mkdir /backup
- В веб-интерфейсе сервера управления:
- Создайте узел хранения с именем BackUpFolder, указав путь /backup на хосте ADM.
- Создайте план резервного копирования с именем DomDataBackUp.
- В плане укажите источник: папки /opt/profiles и /opt/userdocs на LIN-SRV1.
- Настройте расписание (например, ежедневно).
- Убедитесь, что план выполняется успешно.
—————————————————————————————————
На всех Linux машинах настроить имя
hostnamectl set-hostname LIN-DC1.SEMIFINAL.IRPO
hostnamectl set-hostname LIN-DC2.SEMIFINAL.IRPO
hostnamectl set-hostname LIN-CLI1.SEMIFINAL.IRPO
hostnamectl set-hostname LIN-SRV1.SEMIFINAL.IRPO
hostnamectl set-hostname LIN-SRV2.SEMIFINAL.IRPO
После каждого bash
На всех Linux машинах настроить адресацию согласно таблице
mcedit /etc/net/ifaces/ens19/options
BOOTPROTO=static
ИЛИ
echo «BOOTPROTO=static» > /etc/net/ifaces/ens1/options
mcedit /etc/net/ifaces/ens19/ipv4address
192.168.1.x/24
mcedit /etc/net/ifaces/ens19/ipv4route
default via 192.168.1.1
mcedit /etc/net/ifaces/ens19/resolv.conf
search semifinal.irpo
nameserver 77.88.8.8
После настройки сети на каждой машине
systemctl restart network
Все команды выполняются от пользователя root, если не указано иное.
Синхронизация времени (NTP)
Задача: Настроить сервер времени на LIN-DC1 и клиентов на всех остальных хостах.
Хост: LIN-DC1 (NTP-сервер)
- Установим пакет chrony, если его нет, и включить режим сервера
apt-get install chrony -y mcedit /etc/chrony.conf allow 192.168.1.0/24 control chrony server systemctl enable --now chronyd
Хосты: LIN-DC2, LIN-SRV1, LIN-SRV2, LIN-CLI1, ADM (NTP-клиенты)
- Установим пакет chrony, если его нет:
apt-get install chrony -y
- Добавим в файл /etc/chrony.conf строку с адресом NTP-сервера:
mcedit /etc/chrony.conf server 192.168.1.3 iburst Закомментируем pool systemctl restart chronyd
Развёртывание первого контроллера домена (PDC)
Задача: Создать домен semifinal.irpo с функциональным уровнем не ниже Windows Server 2016. DNS-сервер — BIND9_DLZ.
Хост: LIN-DC1
- Установим необходимые пакеты:
apt-get install task-samba-dc bind bind-utils -y
- Остановим и отключим конфликтующие службы (если они были запущены):
for service in smb nmb krb5kdc slapd bind; do systemctl disable --now $service; done
- Удалим старые конфигурации Samba:
rm -f /etc/samba/smb.conf && rm -rf /var/lib/samba /var/cache/samba && mkdir -p /var/lib/samba/sysvol
- Выполним создание домена в пакетном режиме с параметрами:
samba-tool domain provision --realm=SEMIFINAL.IRPO --domain=SEMIFINAL --adminpass='P@ssw0rd' --server-role=dc --dns-backend=BIND9_DLZ --option="dns forwarder=8.8.8.8" --option="ad dc functional level = 2016" --use-rfc2307
Переведем домен в режим функционирования 2016
samba-tool domain level raise --forest-level=2016 --domain-level=2016
- Настроим BIND9 для работы с динамической зоной Samba:
- Отключим chroot:
control bind-chroot disabled
- В файл /etc/sysconfig/bind добавим строку (если её нет):
mcedit /etc/sysconfig/bind KRB5RCACHETYPE="none" ИЛИ grep -q '^KRB5RCACHETYPE=' /etc/sysconfig/bind || echo 'KRB5RCACHETYPE="none"' >> /etc/sysconfig/bind
- В конец файла /etc/bind/named.conf добавим строку, подключающую зону Samba:
echo 'include "/var/lib/samba/bind-dns/named.conf";' >> /etc/bind/named.conf
- Скопируем сгенерированный файл конфигурации Kerberos в системный каталог и запустим SAMBA и BIND9
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf systemctl enable --now bind && systemctl enable --now samba
Развёртывание второго контроллера домена (BDC)
Задача: Ввести LIN-DC2 в домен в качестве дополнительного контроллера.
Хост: LIN-DC2
- Установим необходимые пакеты:
apt-get install task-samba-dc bind bind-utils -y
- Остановим и отключим конфликтующие службы (если они были запущены):
for service in smb nmb krb5kdc slapd bind; do systemctl disable --now $service; done
- Удалим старые конфигурации Samba:
rm -f /etc/samba/smb.conf && rm -rf /var/lib/samba /var/cache/samba && mkdir -p /var/lib/samba/sysvol
- Настроим разрешение имён так, чтобы LIN-DC2 использовал LIN-DC1 в качестве первичного DNS. В файл /etc/resolvconf.conf добавим строки:
name_servers=192.168.1.3 search_domains=semifinal.irpo
Применим изменения:
resolvconf -u
- Скопируем файл krb5.conf с первого контроллера:
scp root@192.168.1.3:/etc/krb5.conf /etc/krb5.conf
- Получим билет Kerberos администратора домена:
kinit administrator@SEMIFINAL.IRPO
- Присоединимся к домену как дополнительный DC:
samba-tool domain join semimifinal.irpo DC -Uadministrator --dns-backend=BIND9_DLZ --option="dns forwarder=1.1.1.1" --option="ad dc functional level = 2016" samba-tool domain level raise --forest-level=2016 --domain-level=2016 samba-tool domain level show
- Настроим BIND9 для работы с динамической зоной Samba:
- Отключим chroot:
control bind-chroot disabled
- В файл /etc/sysconfig/bind добавим строку (если её нет):
mcedit /etc/sysconfig/bind KRB5RCACHETYPE="none" ИЛИ grep -q '^KRB5RCACHETYPE=' /etc/sysconfig/bind || echo 'KRB5RCACHETYPE="none"' >> /etc/sysconfig/bind
- В конец файла /etc/bind/named.conf добавим строку, подключающую зону Samba:
echo 'include "/var/lib/samba/bind-dns/named.conf";' >> /etc/bind/named.conf
systemctl enable --now bind && systemctl enable --now samba
Часть 4. Повышение функционального уровня домена и роли FSMO
Задача: Установить функциональный уровень домена 2016 и передать все роли FSMO на LIN-DC1.
Хост: LIN-DC1
- В файл /etc/samba/smb.conf в секцию [global] добавим строку и перезагрузим SAMBA:
ad dc functional level = 2016 systemctl restart samba
- Выполним повышение уровня домена и леса (если до этого не сделали):
samba-tool domain level raise --domain-level=2016 --forest-level=2016
- Передадим все роли FSMO на LIN-DC1 (если они ещё не там):
samba-tool fsmo transfer --role=all -Uadministrator
Двунаправленная репликация SYSVOL (Rsync/Unison)
Задача: Обеспечить синхронизацию каталога SYSVOL между LIN-DC1 и LIN-DC2.
Хосты: LIN-DC1 и LIN-DC2
- На обоих контроллерах установим пакеты:
apt-get install rsync unison -y
- На LIN-DC1 настроим беспарольный доступ по SSH к LIN-DC2:
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519 ssh-copy-id root@192.168.1.2
- На LIN-DC1 создадим конфигурационный файл /root/.unison/sysvol.prf со следующим содержимым:
# Локальный и удалённый корни root = /var/lib/samba/sysvol root = ssh://root@192.168.1.2//var/lib/samba/sysvol # Автоматический режим без вопросов auto = true batch = true # Сохранять владельца и группу owner = true group = true # Не синхронизировать права (они задаются отдельно) perms = -1 # Использовать rsync для ускорения rsync = true xattrs = true # Не обрабатывать символические ссылки links = false
- На LIN-DC1 добавим задание в cron для автоматической синхронизации каждые 5 минут:
- Выполним crontab -e
- Добавим строку:
*/5 * * * * /usr/bin/unison sysvol -silent
- Выполним первую синхронизацию вручную для проверки:
/usr/bin/unison sysvol
Настройка DNS-записей (прямая и обратная зоны)
Задача: Создать A и PTR записи для всех хостов, включая служебные имена.
Хост: LIN-DC1 (можно выполнять с любого DC)
- Добавим прямые записи (A) для всех хостов:
samba-tool dns add 192.168.1.3 semimifinal.irpo LIN-DC2 A 192.168.1.2 -Uadministrator samba-tool dns add 192.168.1.3 semimifinal.irpo LIN-SRV1 A 192.168.1.4 -Uadministrator samba-tool dns add 192.168.1.3 semimifinal.irpo LIN-SRV2 A 192.168.1.5 -Uadministrator samba-tool dns add 192.168.1.3 semimifinal.irpo ADM A 192.168.1.99 -Uadministrator
# Для DHCP-клиентов записи добавятся автоматически.
- Создадим обратную зону 1.168.192.in-addr.arpa (если ещё не создана):
samba-tool dns zonecreate 192.168.1.3 1.168.192.in-addr.arpa -Uadministrator
- Добавим обратные записи (PTR) для хостов со статическими адресами:
samba-tool dns add 192.168.1.3 1.168.192.in-addr.arpa 3 PTR LIN-DC1.semifinal.irpo -Uadministrator samba-tool dns add 192.168.1.3 1.168.192.in-addr.arpa 2 PTR LIN-DC2.semifinal.irpo -Uadministrator samba-tool dns add 192.168.1.3 1.168.192.in-addr.arpa 4 PTR LIN-SRV1.semifinal.irpo -Uadministrator samba-tool dns add 192.168.1.3 1.168.192.in-addr.arpa 5 PTR LIN-SRV2.semifinal.irpo -Uadministrator samba-tool dns add 192.168.1.3 1.168.192.in-addr.arpa 99 PTR ADM.semifinal.irpo -Uadministrator
Настройка DHCP-сервера на LIN-DC2 с динамическим обновлением DNS
Задача: DHCP должен выдавать адреса клиентам и регистрировать их в DNS.
Хост: LIN-DC2
- Установим DHCP-сервер:
apt-get install dhcp-server
- Создадим доменного пользователя для обновления DNS:
samba-tool user create dhcpduser --random-password samba-tool user setexpiry dhcpduser --noexpiry samba-tool group addmembers DnsAdmins dhcpduser
- Экспортируем keytab для этого пользователя:
samba-tool domain exportkeytab —principal=dhcpduser@SEMIFINAL.IRPO /etc/dhcp/dhcpduser.keytab chown dhcpd:dhcp /etc/dhcp/dhcpduser.keytab chmod 400 /etc/dhcp/dhcpduser.keytab
- Создадим скрипт /usr/local/bin/dhcp-dyndns.sh с содержимым из официальной документации и сделаем его исполняемым:
#!/bin/bash
#
# This script is for secure DDNS updates on Samba,
# it can also add the 'macAddress' to the Computers object.
#
# Version: 0.9.6
#
##########################################################################
# #
# You can optionally add the 'macAddress' to the Computers object. #
# Add 'dhcpduser' to the 'Domain Admins' group if used #
# Change the next line to 'yes' to make this happen #
Add_macAddress='no'
# #
##########################################################################
keytab=/etc/dhcp/dhcpduser.keytab
usage()
{
cat <<-EOF
USAGE:
$(basename "$0") add ip-address dhcid|mac-address hostname
$(basename "$0") delete ip-address dhcid|mac-address
EOF
}
_KERBEROS()
{
# get current time as a number
test=$(date +%d'-'%m'-'%y' '%H':'%M':'%S)
# Note: there have been problems with this
# check that 'date' returns something like
# Check for valid kerberos ticket
#logger "${test} [dyndns] : Running check for valid kerberos ticket"
klist -c "${KRB5CCNAME}" -s
ret="$?"
if [ $ret -ne 0 ]
then
logger "${test} [dyndns] : Getting new ticket, old one has expired"
kinit -F -k -t $keytab "${SETPRINCIPAL}"
ret="$?"
if [ $ret -ne 0 ]
then
logger "${test} [dyndns] : dhcpd kinit for dynamic DNS failed"
exit 1
fi
fi
}
rev_zone_info()
{
local RevZone="$1"
local IP="$2"
local rzoneip
rzoneip="${RevZone%.in-addr.arpa}"
local rzonenum
rzonenum=$(echo "$rzoneip" | tr '.' '\n')
declare -a words
for n in $rzonenum
do
words+=("$n")
done
local numwords="${#words[@]}"
unset ZoneIP
unset RZIP
unset IP2add
case "$numwords" in
1)
# single ip rev zone '192'
ZoneIP=$(echo "${IP}" | awk -F '.' '{print $1}')
RZIP="${rzoneip}"
IP2add=$(echo "${IP}" | awk -F '.' '{print $4"."$3"."$2}')
;;
2)
# double ip rev zone '168.192'
ZoneIP=$(echo "${IP}" | awk -F '.' '{print $1"."$2}')
RZIP=$(echo "${rzoneip}" | awk -F '.' '{print $2"."$1}')
IP2add=$(echo "${IP}" | awk -F '.' '{print $4"."$3}')
;;
3)
# triple ip rev zone '0.168.192'
ZoneIP=$(echo "${IP}" | awk -F '.' '{print $1"."$2"."$3}')
RZIP=$(echo "${rzoneip}" | awk -F '.' '{print $3"."$2"."$1}')
IP2add=$(echo "${IP}" | awk -F '.' '{print $4}')
;;
*)
# should never happen
exit 1
;;
esac
}
BINDIR=$(samba -b | grep 'BINDIR' | grep -v 'SBINDIR' | awk '{print $NF}')
[[ -z $BINDIR ]] && printf "Cannot find the 'samba' binary, is it installed ?\\nOr is your path set correctly ?\\n"
WBINFO="$BINDIR/wbinfo"
SAMBATOOL=$(command -v samba-tool)
[[ -z $SAMBATOOL ]] && printf "Cannot find the 'samba-tool' binary, is it installed ?\\nOr is your path set correctly ?\\n"
MINVER=$($SAMBATOOL -V | grep -o '[0-9]*' | tr '\n' ' ' | awk '{print $2}')
if [ "$MINVER" -gt '14' ]
then
KTYPE="--use-kerberos=required"
else
KTYPE="-k yes"
fi
# DHCP Server hostname
Server=$(hostname -s)
# DNS domain
domain=$(hostname -d)
if [ -z "${domain}" ]
then
logger "Cannot obtain domain name, is DNS set up correctly?"
logger "Cannot continue... Exiting."
exit 1
fi
# Samba realm
REALM="${domain^^}"
# krbcc ticket cache
export KRB5CCNAME="/tmp/dhcp-dyndns.cc"
# Kerberos principal
SETPRINCIPAL="dhcpduser@${REALM}"
# Kerberos keytab as above
# krbcc ticket cache : /tmp/dhcp-dyndns.cc
TESTUSER="$($WBINFO -u | grep 'dhcpduser')"
if [ -z "${TESTUSER}" ]
then
logger "No AD dhcp user exists, need to create it first.. exiting."
logger "you can do this by typing the following commands"
logger "kinit Administrator@${REALM}"
logger "$SAMBATOOL user create dhcpduser --random-password --description='Unprivileged user for DNS updates via ISC DHCP server'"
logger "$SAMBATOOL user setexpiry dhcpduser --noexpiry"
logger "$SAMBATOOL group addmembers DnsAdmins dhcpduser"
exit 1
fi
# Check for Kerberos keytab
if [ ! -f "$keytab" ]
then
logger "Required keytab $keytab not found, it needs to be created."
logger "Use the following commands as root"
logger "$SAMBATOOL domain exportkeytab --principal=${SETPRINCIPAL} $keytab"
logger "chown XXXX:XXXX $keytab"
logger "Replace 'XXXX:XXXX' with the user & group that dhcpd runs as on your distro"
logger "chmod 400 $keytab"
exit 1
fi
# Variables supplied by dhcpd.conf
action="$1"
ip="$2"
DHCID="$3"
name="${4%%.*}"
# Exit if no ip address
if [ -z "${ip}" ]
then
usage
exit 1
fi
# Exit if no computer name supplied, unless the action is 'delete'
if [ -z "${name}" ]
then
if [ "${action}" = "delete" ]
then
name=$(host -t PTR "${ip}" | awk '{print $NF}' | awk -F '.' '{print $1}')
else
usage
exit 1
fi
fi
# exit if name contains a space
case ${name} in
*\ * )
logger "Invalid hostname '${name}' ...Exiting"
exit
;;
esac
# if you want computers with a hostname that starts with 'dhcp' in AD
# comment the following block of code.
if [[ $name == dhcp* ]]
then
logger "not updating DNS record in AD, invalid name"
exit 0
fi
## update ##
case "${action}" in
add)
_KERBEROS
count=0
# does host have an existing 'A' record ?
mapfile -t A_REC < <($SAMBATOOL dns query "${Server}" "${domain}" "${name}" A "$KTYPE" 2>/dev/null | grep 'A:' | awk '{print $2}')
if [ "${#A_REC[@]}" -eq 0 ]
then
# no A record to delete
result1=0
$SAMBATOOL dns add "${Server}" "${domain}" "${name}" A "${ip}" "$KTYPE"
result2="$?"
elif [ "${#A_REC[@]}" -gt 1 ]
then
for i in "${A_REC[@]}"
do
$SAMBATOOL dns delete "${Server}" "${domain}" "${name}" A "${i}" "$KTYPE"
done
# all A records deleted
result1=0
$SAMBATOOL dns add "${Server}" "${domain}" "${name}" A "${ip}" "$KTYPE"
result2="$?"
elif [ "${#A_REC[@]}" -eq 1 ]
then
# turn array into a variable
VAR_A_REC="${A_REC[*]}"
if [ "$VAR_A_REC" = "${ip}" ]
then
# Correct A record exists, do nothing
logger "Correct 'A' record exists, not updating."
result1=0
result2=0
count=$((count+1))
elif [ "$VAR_A_REC" != "${ip}" ]
then
# Wrong A record exists
logger "'A' record changed, updating record."
$SAMBATOOL dns delete "${Server}" "${domain}" "${name}" A "${VAR_A_REC}" "$KTYPE"
result1="$?"
$SAMBATOOL dns add "${Server}" "${domain}" "${name}" A "${ip}" "$KTYPE"
result2="$?"
fi
fi
# get existing reverse zones (if any)
ReverseZones=$($SAMBATOOL dns zonelist "${Server}" "$KTYPE" --reverse | grep 'pszZoneName' | awk '{print $NF}')
if [ -z "$ReverseZones" ]; then
logger "No reverse zone found, not updating"
result3='0'
result4='0'
count=$((count+1))
else
for revzone in $ReverseZones
do
rev_zone_info "$revzone" "${ip}"
if [[ ${ip} = $ZoneIP* ]] && [ "$ZoneIP" = "$RZIP" ]
then
# does host have an existing 'PTR' record ?
PTR_REC=$($SAMBATOOL dns query "${Server}" "${revzone}" "${IP2add}" PTR "$KTYPE" 2>/dev/null | grep 'PTR:' | awk '{print $2}' | awk -F '.' '{print $1}')
if [[ -z $PTR_REC ]]
then
# no PTR record to delete
result3=0
$SAMBATOOL dns add "${Server}" "${revzone}" "${IP2add}" PTR "${name}"."${domain}" "$KTYPE"
result4="$?"
break
elif [ "$PTR_REC" = "${name}" ]
then
# Correct PTR record exists, do nothing
logger "Correct 'PTR' record exists, not updating."
result3=0
result4=0
count=$((count+1))
break
elif [ "$PTR_REC" != "${name}" ]
then
# Wrong PTR record exists
# points to wrong host
logger "'PTR' record changed, updating record."
$SAMBATOOL dns delete "${Server}" "${revzone}" "${IP2add}" PTR "${PTR_REC}"."${domain}" "$KTYPE"
result3="$?"
$SAMBATOOL dns add "${Server}" "${revzone}" "${IP2add}" PTR "${name}"."${domain}" "$KTYPE"
result4="$?"
break
fi
else
continue
fi
done
fi
;;
delete)
_KERBEROS
count=0
$SAMBATOOL dns delete "${Server}" "${domain}" "${name}" A "${ip}" "$KTYPE"
result1="$?"
# get existing reverse zones (if any)
ReverseZones=$($SAMBATOOL dns zonelist "${Server}" --reverse "$KTYPE" | grep 'pszZoneName' | awk '{print $NF}')
if [ -z "$ReverseZones" ]
then
logger "No reverse zone found, not updating"
result2='0'
count=$((count+1))
else
for revzone in $ReverseZones
do
rev_zone_info "$revzone" "${ip}"
if [[ ${ip} = $ZoneIP* ]] && [ "$ZoneIP" = "$RZIP" ]
then
host -t PTR "${ip}" > /dev/null 2>&1
ret="$?"
if [ $ret -eq 0 ]
then
$SAMBATOOL dns delete "${Server}" "${revzone}" "${IP2add}" PTR "${name}"."${domain}" "$KTYPE"
result2="$?"
else
result2='0'
count=$((count+1))
fi
break
else
continue
fi
done
fi
result3='0'
result4='0'
;;
*)
logger "Invalid action specified"
exit 103
;;
esac
result="${result1}:${result2}:${result3}:${result4}"
if [ "$count" -eq 0 ]
then
if [ "${result}" != "0:0:0:0" ]
then
logger "DHCP-DNS $action failed: ${result}"
exit 1
else
logger "DHCP-DNS $action succeeded"
fi
fi
if [ "$Add_macAddress" != 'no' ]
then
if [ -n "$DHCID" ]
then
Computer_Object=$(ldbsearch "$KTYPE" -H ldap://"$Server" "(&(objectclass=computer)(objectclass=ieee802Device)(cn=$name))" | grep -v '#' | grep -v 'ref:')
if [ -z "$Computer_Object" ]
then
# Computer object not found with the 'ieee802Device' objectclass, does the computer actually exist, it should.
Computer_Object=$(ldbsearch "$KTYPE" -H ldap://"$Server" "(&(objectclass=computer)(cn=$name))" | grep -v '#' | grep -v 'ref:')
if [ -z "$Computer_Object" ]
then
logger "Computer '$name' not found. Exiting."
exit 68
else
DN=$(echo "$Computer_Object" | grep 'dn:')
objldif="$DN
changetype: modify
add: objectclass
objectclass: ieee802Device"
attrldif="$DN
changetype: modify
add: macAddress
macAddress: $DHCID"
# add the ldif
echo "$objldif" | ldbmodify "$KTYPE" -H ldap://"$Server"
ret="$?"
if [ $ret -ne 0 ]
then
logger "Error modifying Computer objectclass $name in AD."
exit "${ret}"
fi
sleep 2
echo "$attrldif" | ldbmodify "$KTYPE" -H ldap://"$Server"
ret="$?"
if [ "$ret" -ne 0 ]; then
logger "Error modifying Computer attribute $name in AD."
exit "${ret}"
fi
unset objldif
unset attrldif
logger "Successfully modified Computer $name in AD"
fi
else
DN=$(echo "$Computer_Object" | grep 'dn:')
attrldif="$DN
changetype: modify
replace: macAddress
macAddress: $DHCID"
echo "$attrldif" | ldbmodify "$KTYPE" -H ldap://"$Server"
ret="$?"
if [ "$ret" -ne 0 ]
then
logger "Error modifying Computer attribute $name in AD."
exit "${ret}"
fi
unset attrldif
logger "Successfully modified Computer $name in AD"
fi
fi
fi
exit 0
chmod 755 /usr/local/bin/dhcp-dyndns.sh
- Полностью заменим содержимое файла /etc/dhcp/dhcpd.conf на предлагаемое в официальной документации, но со своими параметрами:
authoritative;
ddns-update-style none;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option domain-name-servers 192.168.1.3, 192.168.1.2;
option domain-name "semifinal.irpo";
default-lease-time 3600;
pool {
max-lease-time 1800;
range 192.168.1.100 192.168.1.200;
}
}
on commit {
set ClientIP = binary-to-ascii(10, 8, «.», leased-address);
set ClientDHCID = concat (
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2)
);
set ClientName = pick-first-value(option host-name, config-option host-name, client-name, noname);
log(concat("Commit: IP: ", ClientIP, " DHCID: ", ClientDHCID, " Name: ", ClientName));
execute("/usr/local/bin/dhcp-dyndns.sh", "add", ClientIP, ClientDHCID, ClientName);
}
on release {
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
set ClientDHCID = concat (
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2) );
log(concat("Release: IP: ", ClientIP));
execute("/usr/local/bin/dhcp-dyndns.sh", "delete", ClientIP, ClientDHCID); }
on expiry {
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
# cannot get a ClientMac here, apparently this only works when actually receiving a packet
log(concat("Expired: IP: ", ClientIP));
# cannot get a ClientName here, for some reason that always fails
# however the dhcp update script will obtain the short hostname.
execute("/usr/local/bin/dhcp-dyndns.sh", "delete", ClientIP, "", "0");
}
Отключим chroot для DHCP-сервера и запустим его:
control dhcpd-chroot disabled systemctl enable --now dhcpd
Установка административных шаблонов и создание объектов домена
Задача: Установить ADMX-шаблоны, создать пользователей, группу, подразделение.
Хост: LIN-DC1
- Установим пакеты с шаблонами:
apt-get update && apt-get install admx-basealt admx-chromium admx-msi-setup gpui -y
- Загрузим шаблоны MSI (для Windows-политик):
admx-msi-setup
- Загрузим шаблоны в домен:
samba-tool gpo admxload -U Administrator
- Создадим пользователей, группу и добавим пользователей в группу:
samba-tool user add LinUser1 P@ssw0rd samba-tool user add LinUser2 P@ssw0rd samba-tool group add LinUsers samba-tool group addmembers LinUsers LinUser1,LinUser2 samba-tool user list --full-dn
- Создадим подразделение LinOU и переместим в него пользователей:
samba-tool ou add "OU=LinOU,DC=semifinal,DC=irpo" samba-tool user move "CN=LinUser1,CN=Users,DC=semifinal,DC=irpo" "OU=LinOU,DC=semifinal,DC=irpo" samba-tool user move "CN=LinUser2,CN=Users,DC=semifinal,DC=irpo" "OU=LinOU,DC=semifinal,DC=irpo" samba-tool user list --full-dn
Создание и настройка групповых политик (полезная информация)
Задача: Создать GPO IrpoStyle (тёмная тема) и ChromiumSSO (прозрачная аутентификация в браузере).
Хост: LIN-DC1 (или любой хост с GPUI)
- Создадим объекты GPO:
samba-tool gpo create IrpoStyle samba-tool gpo create ChromiumSSO
- Запустим редактор групповых политик:
gpui
- В открывшемся окне выберите политику IrpoStyle и перейдите в раздел:
Конфигурация пользователя → Административные шаблоны → ALT System Control → Оформление- Включите параметр «Тема оформления» и выберите значение «Тёмная».
- Включите параметр «Запретить изменение темы оформления».
- Выберите политику ChromiumSSO и перейдите в раздел:
Конфигурация компьютера → Административные шаблоны → Google Chrome → Настройки Kerberos- Включите параметр «Включить аутентификацию Kerberos».
- В параметре «Список серверов, для которых разрешена аутентификация Kerberos» укажите:
*.semifinal.irpo
- Сохраним изменения в каждой политике.
Настройка файлового сервера на LIN-SRV1
Задача: Обеспечить общий анонимный ресурс Share, хранилище перемещаемых профилей Windows Profiles и личные папки UserDocs.
Хост: LIN-SRV1
- Установим Samba (файловый сервер):
apt-get update && apt-get install task-samba
- Создадим каталоги и установим права:
mkdir -p /srv/share /opt/profiles /opt/UserDocs chmod 777 /srv/share chmod 700 /opt/profiles
- Создадим личные каталоги для всех существующих доменных пользователей (полезная информация):
samba-tool user list | while read user; do if [[ "$user" != "Administrator" && "$user" != "krbtgt" && "$user" != "Guest" && ! "$user" =~ \\$ ]]; then mkdir -p "/opt/UserDocs/$user" chown "$user":"semifinal.irpo\\Domain Users" /opt/UserDocs/"$user" chmod 700 "/opt/UserDocs/$user" fi done
- Отредактируем файл /etc/samba/smb.conf, добавив в конец следующие секции:
[Share] path = /srv/share guest ok = yes read only = no browsable = yes [Profiles] path = /opt/profiles read only = no browsable = no create mask = 0700 directory mask = 0700 csc policy = disable profile acls = yes [UserDocs] path = /opt/UserDocs/%U valid users = %U read only = no browsable = no
- Запустим службу Samba:
systemctl enable --now smb
Настройка веб-сервера Apache с прозрачной аутентификацией (SSO)
Задача: Сайт http://web.semifinal.irpo должен авторизовывать доменных пользователей через Kerberos без ввода пароля.
Хост: LIN-SRV1
- Установим Apache и модуль GSSAPI:
apt-get install apache2 apache2-mod_auth_gssapi -y
- Включим необходимые модули Apache:
a2enmod auth_gssapi a2enmod authn_core a2enmod authz_user
- Создадим Service Principal Name (SPN) для веб-сервера в домене:
samba-tool spn add HTTP/web.semifinal.irpo@SEMIFINAL.IRPO LIN-SRV1$ -Uadministrator samba-tool spn add HTTP/lin-srv1.semifinal.irpo@SEMIFINAL.IRPO LIN-SRV1$ -Uadministrator
- Экспортируем keytab-файл с ключами для HTTP-сервиса:
samba-tool domain exportkeytab /etc/apache2/http.keytab —principal=HTTP/web.semifinal.irpo@SEMIFINAL.IRPO samba-tool domain exportkeytab /etc/apache2/http.keytab —principal=HTTP/lin-srv1.semifinal.irpo@SEMIFINAL.IRPO chown www-data:www-data /etc/apache2/http.keytab && chmod 600 /etc/apache2/http.keytab
- Создадим конфигурацию виртуального хоста в файле /etc/apache2/sites-available/web.conf:
<VirtualHost *:80> ServerName web.semifinal.irpo DocumentRoot /var/www/web <Location /> AuthType GSSAPI AuthName «GSSAPI Login» GssapiCredStore keytab:/etc/apache2/http.keytab GssapiBasicAuth On GssapiLocalName On require valid-user </Location> </VirtualHost>
- Создадим каталог для сайта и разместим в нём файл login.html (из /template):
mkdir -p /var/www/web cp /template/login.html /var/www/web/index.html
- Активируем сайт и перезагрузим Apache:
a2ensite web.conf systemctl reload apache2
Ввод Linux-клиента в домен (LIN-CLI1)
Задача: LIN-CLI1 должен стать членом домена, применять GPO и автоматически монтировать ресурс UserDocs.
Хост: LIN-CLI1
- Установим пакеты для аутентификации через AD и применения GPO:
apt-get update && apt-get install task-auth-ad-sssd gpupdate systemd-settings-enable-kill-user-processes -y
- Введите машину в домен:
system-auth write ad semimifinal.irpo LIN-CLI1 SEMIFINAL Administrator P@ssw0rd --gpo
- Перезагрузим компьютер:
systemctl reboot
- После перезагрузки установим компоненты для автомонтирования:
apt-get install pam_mount cifs-utils -y
- Добавим модуль pam_mount в схему аутентификации. В файл /etc/pam.d/system-auth в секцию session добавим строку:
session optional pam_mount.so disable_interactive
- Настроим монтирование. В файле /etc/security/pam_mount.conf.xml перед закрывающим тегом </pam_mount> добавим:
<volume uid="10000-2000200000" fstype="cifs" server="lin-srv1.semifinal.irpo" path="UserDocs" mountpoint="~/DomainDocs" options="sec=krb5,vers=2.1,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775" />
- Переместим учётную запись компьютера LIN-CLI1 в подразделение LinOU (выполнить на контроллере домена Lin-DC1):
samba-tool computer move "CN=LIN-CLI1,CN=Computers,DC=semifinal,DC=irpo" "OU=LinOU,DC=semifinal,DC=irpo"
Ввод Windows-клиентов в домен и настройка RSAT
Задача: WIN-CLI1 уже в домене, WIN-CLI2 ввести сейчас. На WIN-CLI1 установить RSAT.
Хост: WIN-CLI2
- Убедимся, что компьютер получает IP-адрес от DHCP-сервера (LIN-DC2).
- Откроим «Свойства системы» → «Имя компьютера» → «Изменить».
- Выберем «Является членом домена», вводим semifinal.irpo.
- Введем учётные данные администратора домена (Administrator, P@ssw0rd).
- Перезагрузим компьютер.
Хост: WIN-CLI1 (RSAT)
- Откроим «Управление» → «Добавить роли и компоненты».
- В разделе «Компоненты» найдем «Средства удалённого администрирования сервера» (RSAT).
- Установим оснастки: Active Directory – пользователи и компьютеры, Управление групповыми политиками, DNS-сервер.
- После установки оснастки будут доступны в меню «Администрирование».
Настройка мониторинга (Prometheus + Grafana) на LIN-SRV2
Задача: Сбор метрик с LIN-DC1, LIN-DC2, LIN-SRV1 и отображение на дашборде Grafana по адресу http://mon.semifinal.irpo.
Хост: LIN-SRV2
- Установим Prometheus, Grafana и Node Exporter:
apt-get install prometheus grafana prometheus-node_exporter -y
- Запустим Node Exporter:
systemctl enable --now prometheus-node_exporter
- Настроим Prometheus для сбора метрик с трёх целевых хостов. В файле /etc/prometheus/prometheus.yml в секции scrape_configs добавим:
— job_name: ‘node’
static_configs:
— targets: [‘192.168.1.3:9100’, ‘192.168.1.2:9100’, ‘192.168.1.4:9100’]
- Запустим Prometheus и Grafana:
systemctl enable --now prometheus systemctl enable --now grafana-server
- Настроим дашборд Grafana:
- Откроем веб-интерфейс http://192.168.1.5:3000 (логин/пароль по умолчанию admin/admin).
- Добавим источник данных Prometheus (URL: http://localhost:9090).
- Импортируем готовый дашборд для Node Exporter (например, ID 1860 с grafana.com).
- Для доступа по адресу http://mon.semifinal.irpo добавим соответствующую DNS-запись и настроим виртуальный хост в Apache.
samba-tool dns add 192.168.1.5 semimifinal.irpo mon A 192.168.1.4 -Uadministrator
Хосты: LIN-DC1, LIN-DC2, LIN-SRV1 (агенты)
- Установим и запустим Node Exporter:
apt-get install prometheus-node_exporter systemctl enable --now prometheus-node_exporter
Резервное копирование (Кибер Бекап)
Задача: Настроить резервное копирование каталогов /opt/profiles и /opt/UserDocs с LIN-SRV1 на хост ADM.
Хост: LIN-SRV1 (сервер управления)
- Установим сервер управления Кибер Бекап, следуя инструкциям установщика из предоставленного ISO-образа.
- Для доступа по доменному имени создадим на LIN-DC1 DNS-запись:
samba-tool dns add 192.168.1.3 semimifinal.irpo backup A 192.168.1.4 -Uadministrator
После этого веб-интерфейс будет доступен по адресу http://backup.semifinal.irpo:9877.
Хост: ADM (агент и узел хранения)
- Установим агент Кибер Бекап из ISO-образа.
- В процессе установки укажем IP-адрес сервера управления: 192.168.1.4.
- После установки агента подключим его к серверу управления LIN-SRV1 через веб-интерфейс.
- На хосте ADM создадим каталог для хранения резервных копий:
mkdir /backup
- В веб-интерфейсе сервера управления:
- Создадим узел хранения с именем BackUpFolder, указав путь /backup на хосте ADM.
- Создадим план резервного копирования с именем DomDataBackUp.
- В плане укажем источник: папки /opt/profiles и /opt/UserDocs на LIN-SRV1.
- Настроим расписание (например, ежедневно).
- Убедимся, что план выполняется успешно.
Администрирование с хоста ADM (вне домена)
Задача: Обеспечить возможность управления доменом с помощью ADMC и GPUI без ввода хоста ADM в домен.
Хост: ADM
- Установим инструменты управления:
apt-get update && apt-get install admc gpui -y
- Настройте Kerberos для работы вне домена. Файл /etc/krb5.conf должен содержать:
[libdefaults]
default_realm = SEMIFINAL.IRPO
dns_lookup_kdc = true
[realms]
SEMIFINAL.IRPO = {
kdc = 192.168.1.3
admin_server = 192.168.1.3
}
[domain_realm]
.semifinal.irpo = SEMIFINAL.IRPO
semifinal.irpo = SEMIFINAL.IRPO
- Получим билет администратора домена:
kinit administrator@SEMIFINAL.IRPO
- Запустим ADMC или GPUI:
admc
ИЛИ
gpui
Миграция данных и отключение WIN-DC
Задача: Перенести все данные, создать резервную копию, затем удалить старый контроллер Windows и выключить его.
Хост: LIN-DC1 (действия выполняются после полной настройки инфраструктуры)
- Перенесите содержимое SYSVOL со старого контроллера (WIN-DC) на новый, если оно ещё не было перенесено. Для этого можно временно подключить сетевую папку \\WIN-DC\SYSVOL и скопировать данные в /var/lib/samba/sysvol.
- Перенесите профили пользователей Windows со старого файлового сервера (если они там были) в /opt/profiles на LIN-SRV1.
- Убедитесь, что все существовавшие до миграции пользователи, группы и GPO корректно отображаются в новом домене (проверьте через ADMC или RSAT).
- Выполните резервное копирование данных с помощью плана DomDataBackUp (дождитесь успешного завершения).
- На контроллере LIN-DC1 выполните команду удаления WIN-DC из домена:
samba-tool domain demote —remove-other-dead-server=WIN-DC -Uadministrator
- Очистите старые DNS-записи, относящиеся к WIN-DC:
bash
samba-tool dns delete 192.168.1.3 semimifinal.irpo WIN-DC A -Uadministrator
- Выключите виртуальную машину WIN-DC.
Проверка выполнения чек-листа
После завершения всех шагов проверьте каждый пункт требований заказчика:
- Синхронизация времени: chronyc sources -v на любом клиенте показывает источник 192.168.1.3.
- Разрешение имён DNS: nslookup lin-srv1.semifinal.irpo возвращает правильный IP, nslookup 192.168.1.4 возвращает lin-srv1.semifinal.irpo.
- Выдача DHCP: WIN-CLI2 получает IP из диапазона, в DNS появляются его A и PTR записи.
- Отсутствие WIN-DC: в оснастке ADUC контроллеров только LIN-DC1 и LIN-DC2.
- Роли FSMO: samba-tool fsmo show показывает владельца LIN-DC1.
- Уровень домена: samba-tool domain level show выводит 2016 или выше.
- Репликация SYSVOL: создание тестового файла в /var/lib/samba/sysvol/semifinal.irpo/scripts на одном DC приводит к его появлению на другом в течение 5 минут.
- Вход старых пользователей: пользователи, существовавшие до миграции, могут войти на Windows и Linux клиентах.
- GUID групповых политик: проверяется через ADSI Edit (не изменились).
- Применение GPO на Windows: gpresult /r показывает применение политик IrpoStyle и ChromiumSSO.
- Наличие LinUser1/2, LinUsers, LinOU: проверяется через ADUC или ADMC.
- Политика IrpoStyle: на Windows-клиенте тёмная тема, кнопка смены темы заблокирована.
- Политика ChromiumSSO: в браузере Chromium на Windows-клиенте при открытии http://web.semifinal.irpo не запрашивается пароль.
- Доступность Share: \\LIN-SRV1\Share открывается без аутентификации.
- Перемещаемые профили: настройки рабочего стола сохраняются при входе на разных Windows-клиентах.
- Разграничение UserDocs: пользователь видит только свою папку.
- Автомонтирование DomainDocs: после входа на LIN-CLI1 в домашней папке появляется каталог DomainDocs с содержимым UserDocs.
- Мониторинг: дашборд Grafana отображает метрики CPU, RAM, Disk для трёх хостов.
- Резервное копирование: в веб-интерфейсе Кибер Бекап есть успешные задания плана DomDataBackUp.
- Управление с WIN-CLI1 (RSAT): можно создать/изменить пользователя.
- Управление с ADM: запускаются ADMC и GPUI, доступно редактирование объектов и политик.
- Ввод WIN-CLI2: компьютер введён в домен, на него распространяются GPO.
- DNS-записи: для всех включённых хостов существуют A и PTR записи.











































