Конечная цель проектов импортозамещения в ИТ — полный отказ от операционной системы Windows. Но, как говорится, гладко было на бумаге, да забыли про овраги. Может так оказаться, что быстро заменить какие-то клиентские корпоративные приложения, написанные под эту операционную систему, не получится. В этом случае вам может пригодиться возможность присоединения Windows-компьютеров к домену ALD Pro.
В этой статье я расскажу, как добиться максимальной функциональности от такого сценария развертывания, и презентую утилиту нашей собственной разработки aldpro-join. С ее помощью можно решить проблему настройки рабочих станций всего за пару кликов. Если это именно то, о чем вы хотели узнать, но не знали, кого спросить, — вы на правильном пути. Поехали!
Материал будет полезен даже в том случае, если в вашей инфраструктуре пока еще используется «ванильная» система FreeIPA.
Присоединение Windows клиентов к домену FreeIPA не находится в фокусе внимания команды разработчиков этой службы каталога, так как проект ставит своей целью не заменить Active Directory для Windows-компьютеров, а создать аналогичное решение для компьютеров под управлением операционной системы Linux. Однако компания Microsoft еще с версии Windows 2000 поддерживает возможность интеграции своих ОС с областями Kerberos, которые совместимы с RFC 2136, а центр распределения ключей FreeIPA работает как раз на базе эталонной реализации MIT KDC. То есть ничто не препятствует тому, чтобы вводить Windows-компьютеры напрямую в домен FreeIPA.
Более того, разработчики FreeIPA реализовали возможность интеграции своего домена с Active Directory на уровне доверительных отношений за счет компонента Samba AD, поэтому контроллеры домена, помимо Kerberos, поддерживают такие протоколы, как NetBIOS, SMB, Netlogon (MS-NRPC) и NTLM. В базе данных DNS есть SRV записи по стандартам Microsoft, а Kerberos-билеты содержат не только аутентификационные данные, но и сертификат PAC, включающий SID’ы пользователя и всех его групп.
Все эти особенности открывают дополнительные возможности по работе Windows-компьютеров в составе домена FreeIPA. Ниже я расскажу, как правильно задействовать эти отличительные черты, чтобы получить доступ к следующим функциям:
-
вход в ОС Windows с помощью учетных записей из домена ALD Pro;
-
прозрачная аутентификация при обращении пользователя к керберизированным ресурсам, например файловым серверам;
-
получение уведомлений об истечении срока действия пароля и возможность сменить пароль штатными функциями ОС Windows;
-
предоставление доменным пользователям прав доступа к локальным ресурсам Windows-компьютера с учетом их участия в доменных группах;
-
синхронизация времени рабочей станции с временем на контроллерах домена;
-
динамическое изменение DNS-записей в домене при изменении IP-адреса на сетевом интерфейсе Windows-компьютера.
1. Настройка Kerberos-аутентификации
Компьютеру для работы в составе домена требуется учетная запись, с помощью которой он будет выполнять авторизованные LDAP-запросы к каталогу и проверять аутентичность пользователей по протоколу Kerberos V5.
Создать эту учетную запись можно на контроллере с помощью команды host-add утилиты ipa, в параметрах которой нужно указать полное доменное имя компьютера и его IP-адрес. Перед выполнением команды нужно произвести Kerberos-аутентификацию привилегированной учетной записью администратора.
Обратите внимание, что служба каталога FreeIPA автоматически приведет доменное имя компьютера к нижнему регистру.
admin@dc-1:~$ kinit admin
admin@dc-1:~$ ipa host-add DESKTOP-7VKREUO.ald.company.lan --ip-address=10.0.1.151
-----------------------------------------------
Добавлен узел "desktop-7vkreuo.ald.company.lan"
-----------------------------------------------
Имя узла: desktop-7vkreuo.ald.company.lan
Имя учётной записи: host/desktop-7vkreuo.ald.company.lan@ALD.COMPANY.LAN
Псевдоним учётной записи: host/desktop-7vkreuo.ald.company.lan@ALD.COMPANY.LAN
Link to department: ou=ald.company.lan,cn=orgunits,cn=accounts,dc=ald,dc=company,dc=lan
Link to head department: ald.company.lan
Пароль: False
Таблица ключей: False
Managed by: desktop-7vkreuo.ald.company.lan
Чтобы использовать новую учетную запись, ей нужно назначить пароль. Сделать это можно с помощью утилиты ipa-getkeytab, которая создаст необходимые Kerberos-ключи, запишет их в атрибут krbPrincipalKey учетной записи и сохранит в указанный keytab-файл.
admin@dc-1:~$ sudo ipa-getkeytab -p host/desktop-7vkreuo.ald.company.lan@ALD.COMPANY.LAN \
-P -k /tmp/client.keytab << EOF
Windows10ComputerPassword
Windows10ComputerPassword
EOF
Новый пароль учётной записи:
Проверка пароля учётной записи:
Таблица ключей успешно получена и сохранена в: /tmp/client.keytab
где:
-
p — указывает имя Kerberos-принципала, для которого будет сгенерирована связка ключей. Его можно взять из предыдущего шага в текстовом выводе команды host-add.
-
P — указывает, что пароль учетной записи должен быть задан вручную с помощью интерактивного ввода. Если этот параметр не будет задан, то система сгенерирует пароль автоматически, но не отобразит его на экране. Поэтому такой способ подходит только в случае, если мы планируем использовать keytab-файл.
-
k — указывает путь к keytab-файлу, в который нужно сохранить Kerberos-ключи. Параметр является обязательным — невозможно назначить пароль без создания keytab-файла.
-
<< EOF … EOF — позволяет перенаправить следующие две строки в качестве пароля и подтверждения. Не забудьте отключить занесение команды в history, например добавив символ пробела перед командой sudo.
Дополнительно можно воспользоваться следующими параметрами:
-
s — задает fqdn имя контроллера домена, через который следует выполнить установку пароля. По умолчанию используются настройки из /etc/ipa/default.conf.
-
e — задает через запятую способы хеширования паролей. В крайних версиях FreeIPA утилита ipa-getkeytab использует ключи AES256-CTS-HMAC-SHA1-96 и AES128-CTS-HMAC-SHA1-96, совместимые с современными дистрибутивами ОС Microsoft, включая Windows 10. Поэтому задавать параметр не требуется. Полный перечень хешей, поддерживаемых FreeIPA, можно посмотреть командой «ipa-getkeytab —permitted-enctypes». Для Windows это можно узнать в справке к утилите ksetup командой «ksetup.exe /?».
При желании вы можете проверить содержимое keytab-файла с помощью утилиты klist:
admin@dc-1:~$ sudo klist -ket /tmp/client.keytab
Keytab name: FILE:/tmp/client.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
1 19.11.2023 16:05:15 host/desktop-7vkreuo.ald.company.lan@ALD.COMPANY.LAN (aes256-cts-hmac-sha1-96)
1 19.11.2023 16:05:15 host/desktop-7vkreuo.ald.company.lan@ALD.COMPANY.LAN (aes128-cts-hmac-sha1-96)
Но сам keytab-файл нам не потребуется, потому что утилите ksetup.exe пароль нужно будет передать открытым текстом. Используя это значение, утилита сгенерирует несколько хешей, не совместимых с Kerberos, таких как NTLM и SHA1, и сохранит пароль «как есть» в менеджере учетных записей безопасности (Security Accounts Manager, SAM). С помощью утилиты Mimikatz можно убедиться, что Windows хранит пароль компьютера в том числе и открытым текстом.
mimikatz # sekurlsa::logonpasswords
...
Authentication Id : 0 ; 2053055 (00000000:001f53bf)
Session : Interactive from 2
User Name : DWM-2
Domain : Window Manager
Logon Server : (null)
Logon Time : 1/11/2024 10:39:38 AM
SID : S-1-5-90-0-2
msv :
[00000003] Primary
* Username : DESKTOP-7VKREUO$
* Domain : ALD
* NTLM : cb4cacacf93394406beb092f12ac797c
* SHA1 : 4fe309666be5630192c09851b20be577a914fee8
tspkg :
wdigest :
* Username : DESKTOP-7VKREUO$
* Domain : ALD
* Password : (null)
kerberos :
* Username : DESKTOP-7VKREUO$
* Domain : ALD.COMPANY.LAN
* Password : Windows10ComputerPassword
ssp : KO
credman :
...
Чтобы Windows-компьютер работал в составе домена, в качестве DNS-сервера у него должен быть указан IP-адрес контроллера домена ALD Pro. Дополнительно рекомендуется отключить протокол NetBIOS, иначе вход в систему будет выполняться с большой задержкой. А вот задавать DNS-суффикс необязательно, так как утилита ksetup установит глобальный DNS-суффикс для компьютера и короткие имена будут автоматически дополняться до FQDN-имен.
Продемонстрирую внесение указанных настроек
1. Откройте оснастку «Network Connections» (ncpa.cpl), затем свойства сетевого интерфейса, далее выберите протокол «Internet Protocol Version 4 (TCP/IPv4)» и нажмите кнопку «Properties», см. рисунок 1.
Внесите требуемые значения, см. рисунок 2.
IP address: 10.0.1.151
Subnet mask: 255.255.255.0
Default gateway: 10.0.1.1
Preferred DNS server: 10.0.1.11
Windows-компьютер может совершать ненужные запросы SAM LOGON к контроллеру домена — это сильно замедляет процедуру входа. Чтобы этого не происходило, нажмите кнопку «Advanced» — так вы перейдете к расширенным настройкам. На вкладке «WINS» отключите NetBIOS для сетевого подключения, см. рисунок 3.
Чтобы Windows-компьютер работал в составе домена, ему нужно предоставить логин и пароль от доменной учетной записи, которую мы создали ранее. Логин учетной записи соответствует имени компьютера. Посмотреть текущее значение и изменить его можно с помощью стандартной оснастки sysdm.cpl (System Device Manager), см. рисунок 4.
Пароль учетной записи компьютера можно задать с помощью команды SetComputerPassword утилиты ksetup на Windows-компьютере.
> ksetup.exe /SetComputerPassword Windows10ComputerPassword
где:
-
/SetComputerPassword — команда утилиты ksetup, с помощью которой можно установить пароль для доменной учетной записи компьютера. Она сохраняет исходный текст пароля и несколько хешей в диспетчере учётных записей безопасности (Security Account Manager, SAM), то есть в защищенной части реестра.
-
Windows10ComputerPassword — пароль, который мы использовали ранее при создании учетной записи компьютера в домене. Напоминаю, что нужно использовать длинные пароли, сгенерированные случайным образом.
Теперь все готово для того, чтобы переключить компьютер на работу в Kerberos-области, совместимой с RFC1510. Для этого нужно выполнить команду SetRealm утилиты ksetup.
> ksetup.exe /SetRealm ALD.COMPANY.LAN
где:
-
/SetRealm — команда задает Kerberos-область, создавая ключ в разделе реестра «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Domains».
-
ALD.COMPANY.LAN — область Kerberos нашего домена ALD Pro.
После изменения имени компьютера, пароля или принадлежности компьютера к домену нужно выполнить перезагрузку компьютера, чтобы указанные изменения вступили в силу.
Текущие настройки можно посмотреть с помощью команды DumpState:
> ksetup.exe /DumpState
default realm = ALD.COMPANY.LAN (external)
ALD.COMPANY.LAN:
(no kdc entries for this realm)
Realm Flags = 0x0No Realm Flags
No user mappings defined.
Отмечу еще несколько моментов, которые можно встретить в Интернете. Ниже объясню, почему они не требуются или могут быть даже вредны:
-
Команда SetRealm первоначально называлась SetDomain, и этот алиас продолжает работать до сих пор. Поэтому во многих инструкциях остается такой вариант написания, но команда «установить область» лучше отражает тот факт, что Kerberos-аутентификация Windows-компьютеров возможна не только в домене Active Directory, но и других реализациях, совместимых с RFC1510. Например, в MIT Kerberos.
-
Довольно часто предлагают с помощью команд /addkdc и /addkpasswd задать адреса серверов, через которые можно выполнять аутентификацию и менять пароль. Указанные рекомендации актуальны при интеграции Windows-машины с простой Kerberos-областью, но в домене ALD Pro (FreeIPA) есть все необходимые SRV-записи, и отказываться от функции автоматического обнаружения этих сервисов не имеет смысла.
-
Иногда можно встретить рекомендации по настройке разрешенных типов шифрования Kerberos через локальную групповую политику «Security Options > Network Security: Configure encryption types allowed for Kerberos». Это может потребоваться только для учетных записей хостов, которые находятся под управлением устаревших Windows 2000, Windows Server 2003 и Windows XP. Современные релизы поддерживают необходимые типы шифрования по умолчанию (AES128_HMAC_SHA1 и AES256_HMAC_SHA1).
-
В большинстве инструкций предлагают настроить сопоставление доменных пользователей на локальные учетные записи с помощью команды «ksetup.exe /mapuser * *», что правильно при интеграции Windows с базовой реализацией MIT Kerberos, в которой нет никаких идентификаторов безопасности Windows. При таком способе настройки вход Kerberos-пользователя аналогичен входу локального пользователя. Разница только в том, что первичная проверка аутентичности выполняется через KDC, а все остальные механизмы работают так же, как если бы вход в систему был выполнен локальной учетной записью.
Однако в службе каталога FreeIPA центр распределения ключей MIT KDC интегрирован с Samba AD, поэтому Kerberos-билеты содержат сертификат PAC со всей необходимой авторизационной информацией, включая идентификатор безопасности пользователя и всех его групп. В силу указанного обстоятельства маппинг учетных записей для FreeIPA делать не нужно. При таком способе настройки будет обеспечиваться полноценная работа под доменной учетной записью: при входе пользователя будет сохраняться его доменный SID, у него будет TGT-билет с полным перечнем групп из PAC-сертификата, он сможет выполнять прозрачную Kerberos-аутентификацию при обращении к файловым серверам и другим керберизированным ресурсам в домене.
Для входа в компьютер с помощью доменной учетной записи в качестве имени пользователя нужно вводить полное имя Kerberos-принципала в формате login@REALM.FQDN. Причем логин может быть задан в любом регистре, а реалм — обязательно прописными буквами.
Операционная система Windows позволяет задать домен для входа по умолчанию, для этого нужно изменить в реестре значение DefaultLogonDomain. Из командной строки это можно сделать с помощью командлета Set-ItemProperty:
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System' -Name 'DefaultLogonDomain' -Value 'ALD.COMPANY.LAN'
Однако при использовании домена по умолчанию ОС будет дополнять имена пользователей до формата DefaultLogonDomain\login, который будет усечен до NETBIOS\login — например, ALD\admin. Из-за этого перестанут работать такие важные функции, как вход с экрана блокировки, вход последним пользователем и смена пароля через <ctrl> + <alt> + <del>.
Для устранения указанных проблем, после входа необходимо исправить значения LoggedOnUser и LastLoggedOnUser в реестре, что можно сделать PowerShell-скриптом:
> cat FixPreWindowsNames.ps1
function Fix-PreWindowsName ([string]$Domain, [string]$NetBIOS, [string]$Path, [string]$Parameter){
$Path = 'Registry::' + $Path;
$UsernameComponents = (Get-ItemPropertyValue -Path $Path -Name $Parameter) -split '\\';
if ($UsernameComponents.length -eq 2 -AND $UsernameComponents[0].ToUpper() -eq $NetBIOS){
$UPN = $UsernameComponents[1] + '@' + $Domain;
Set-ItemProperty -Path $Path -Name $Parameter -Value $UPN;
}
}
$Domain = (Get-ItemPropertyValue -Path 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters' -Name 'Domain').ToUpper();
$NetBIOS = ($Domain -split '\.')[0];
Fix-PreWindowsName $Domain $NetBIOS 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\' 'LastLoggedOnUser';
foreach($SessionData in Get-ChildItem -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData'){
Fix-PreWindowsName $Domain $NetBIOS $SessionData.Name 'LoggedOnUser';
}
Для автоматического выполнения скрипта после входа в систему можно зарегистрировать следующее задание в планировщике. Скрипт небольшой, поэтому его текст можно передать напрямую в параметре EncodedCommand в формате base64, чтобы не хранить файл где-то на диске:
Register-ScheduledTask
-TaskName 'FixPreWindowsNames'
-Description 'Задача исправляет значения LoggedOnUser и LastLoggedOnUser'
-Trigger (New-ScheduledTaskTrigger -AtLogOn)
-Principal (New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount)
-Settings (New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries)
-Action (New-ScheduledTaskAction -Execute 'cmd' -Argument $('/c start /min powershell -WindowStyle hidden -EncodedCommand ' + [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes((Get-Content FixPreWindowsNames.ps1))) ) )
В качестве промежуточного итога добавлю, что для вывода машины из домена FreeIPA достаточно выполнить команду RemoveRealm и ввести компьютер в рабочую группу:
> ksetup.exe /RemoveRealm 'ALD.COMPANY.LAN'
NOTE: /RemoveRealm requires a reboot to take effect on pre-SP1 Win2000 computers
> Add-Computer -WorkGroupName 'WORKGROUP'
WARNING: The changes will take effect after you restart the computer DESKTOP-7VKREUO.
2. Балансировка Kerberos аутентификации с использованием сайтов
Функция «локаций» в домене FreeIPA решает ту же задачу, что и «сайты» Active Directory, но несколько иным образом. Если в AD к сайтам привязываются компьютерные сети, и принадлежность компьютера к сайту определяется его текущим IP-адресом, то в FreeIPA привязка выполняется косвенно через DNS-сервер, который обслуживает запросы компьютера.
Например, если запросить SRV-записи «_kerberos._udp.ald.company.lan» у контроллеров из разных локаций, то dc-1 сделает перенаправление на адрес «hq», а dc-4 на адрес «spb» соответственно. В обоих случаях будет выдан полный перечень всех контроллеров домена с приоритизацией по принадлежности серверов к локациям. Проверку доступности серверов клиент SSSD выполняет в порядке заданных приоритетов.
$ nslookup -type=SRV _kerberos._udp.ald.company.lan dc-1.ald.company.lan
Server: dc-1.ald.company.lan
Address: 10.0.1.11#53
_kerberos._udp.ald.company.lan canonical name = _kerberos._udp.hq._locations.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 0 100 88 dc-2.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 0 100 88 dc-3.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 0 100 88 dc-1.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 50 100 88 dc-4.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 50 100 88 dc-5.ald.company.lan.
$ nslookup -type=SRV _kerberos._udp.ald.company.lan dc-4.ald.company.lan
Server: dc-4.ald.company.lan
Address: 10.0.1.14#53
_kerberos._udp.ald.company.lan canonical name = _kerberos._udp.spb._locations.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 50 100 88 dc-1.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 0 100 88 dc-5.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 50 100 88 dc-3.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 0 100 88 dc-4.ald.company.lan.
_kerberos._udp.hq._locations.ald.company.lan service = 50 100 88 dc-2.ald.company.lan.
Windows-клиент тоже учитывает приоритеты SRV-записей, но запрашивает их по адресам вида «_kerberos._udp.dc._msdcs.ald.company.lan» в соответствии со спецификацией Active Directory (Active Directory Technical Specification, MS-ADTS). Такие записи в домене FreeIPA тоже есть, они добавляются автоматически для поддержки интеграции с Active Directory. Таким образом, для использования географической балансировки достаточно в качестве DNS-сервера указать один из контроллеров FreeIPA.
3. Настройка синхронизации времени
Для корректной работы протокола аутентификации Kerberos V5 необходимо, чтобы разница во времени между клиентом и сервером была не более 5 минут. За синхронизацию времени в операционной системе Windows отвечает служба W32Time (Windows Time Service), которая работает по протоколу NTP (Network Time Protocol). Прочитать и изменить параметры службы можно из командной строки с помощью утилиты w32tm. Параметры хранятся в реестре «Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters»:
> w32tm.exe /query /configuration
...
Type: NTP (Local)
NtpServer: time.windows.com,0x9 (Local)
...
В домене Active Directory источниками точного времени для рабочих станций выступают контроллеры домена, выбор которых осуществляется с учетом иерархии домена. Имитировать режим DOMHIER не имеет смысла, т. к. в этом случае служба W32Time будет следовать протоколу MS-SNTP и проверять цифровые подписи пакетов, которых нет в Chrony.
Учитывая сказанное, правильно будет использовать режим manual и указать DNS-имена или IP-адреса конкретных контроллеров домена. Например, если у вас в домене только два контроллера, настроить службу W32Time можно с помощью следующей команды:
> w32tm.exe /config /syncfromflags:manual /manualpeerlist:"dc-1.ald.company.lan,0x9 dc-2.ald.company.lan,0x9" /update
где:
-
/config — основная команда, используемая для конфигурирования службы W32Time. С ее помощью можно изменить текущие настройки, задать список используемых серверов времени, тип синхронизации и многое другое.
-
/syncfromflags — устанавливает тип источника для синхронизации времени. Допустимы значения:
-
MANUAL — синхронизация времени с серверами из списка, заданного вручную (Type: NTP).
-
DOMHIER — синхронизация времени с контроллерами в соответствии с иерархией домена (Type: NT5DS).
-
ALL — разрешает использовать любой источник, как внешний сервер, так и контроллеры домена в соответствии с установленной иерархией (Type: AllSync).
-
NO — отключает синхронизацию времени (Type: NoSync).
-
-
/manualpeerlist — задает список DNS-имен и/или IP-адресов серверов, которые могут выступать источниками времени для синхронизации.
Адреса разделяются символом пробела, а в конце каждого адреса через запятую может быть задан дополнительный параметр, значение которого складывается из следующих флагов:
-
0x1 (SpecialInterval) — указывает, что между отправкой запросов к этому серверу нужно использовать специальный интервал, заданный параметром SpecialPollInterval, который по умолчанию имеет значение 32768 секунд (9 часов). Если флаг не задан, то используется стандартное значения в 604800 секунд (7 дней).
-
0x2 (UseAsFallbackOnly) — указывает, что данный сервер необходимо использовать в последнюю очередь как резервный.
-
0x4 (SymmetricActive) — указывает, что сервер является одноранговым узлом, с которым возможна симметричная синхронизация времени.
-
0x8 (Client) — означает, что текущий хост должен выступать клиентом по отношению к указанному серверу.
Значение по умолчанию «time.windows.com,0x9» соответствует комбинации первого и последнего флагов SpecialInterval+Client. Если вам нужно будет указать резервный источник времени, то используйте значение 0xB, чтобы к предыдущему значению добавить флаг UseAsFallbackOnly.
-
-
/update — уведомляет службу об изменении параметров для их принудительного применения. Если параметр не использовать, то изменения вступят в силу при следующем перезапуске службы.
Принудительно запустить синхронизацию времени можно с помощью команды resync:
> w32tm.exe /resync
Sending resync command to local computer
The command completed successfully.
Посмотреть результаты синхронизации можно с помощью команды status:
> w32tm.exe /query /status /verbose
Leap Indicator: 0(no warning)
Stratum: 4 (secondary reference - syncd by (S)NTP)
Precision: -23 (119.209ns per tick)
Root Delay: 0.0081377s
Root Dispersion: 7.8973731s
ReferenceId: 0x0A00010B (source IP: 10.0.1.11)
Last Successful Sync Time: 1/14/2024 11:32:33 AM
Source: dc-1.ald.company.lan,0x9
Poll Interval: 10 (1024s)
Phase Offset: 0.1344197s
ClockRate: 0.0156250s
State Machine: 1 (Hold)
Time Source Flags: 0 (None)
Server Role: 0 (None)
Last Sync Error: 0 (The command completed successfully.)
Time since Last Good Sync Time: 2.2626619s
Учитывая, что со временем топология домена может претерпевать существенные изменения, использовать имена конкретных серверов крайне нежелательно. Лучше будет указать DNS-имя домена:
> w32tm.exe /config /syncfromflags:manual /manualpeerlist:"ald.company.lan,0x9" /update
В этом случае A-записи нужно будет добавить вручную, автоматически они в домене не создаются. Сделать это можно на контроллере, используя утилиту командной строки ipa.
# for server in $(ipa-replica-manage list | sed 's/: master//'); do ipa dnsrecord-add ald.company.lan @ --a-rec=$(dig +short $server); done
Однако чтобы учесть географическое распределение инфраструктуры, правильным будет создать запись вида «_ntp._udp.имя_домена» и добавить A-записи в соответствующие локации.
Для упрощения предлагаю воспользоваться уже существующей записью «_kerberos._udp». Создадим необходимые A-записи сначала в головном офисе:
$ ipa dnsrecord-add ald.company.lan _kerberos._udp.hq._locations --a-rec=10.0.1.11
Имя записи: _kerberos._udp.hq._locations
A record: 10.0.1.11
SRV record: 0 100 88 dc-1.ald.company.lan., 0 100 88 dc-2.ald.company.lan., 0 100 88 dc-3.ald.company.lan., 50 100 88 dc-4.ald.company.lan., 50 100 88 dc-5.ald.company.lan.
$ ipa dnsrecord-add ald.company.lan _kerberos._udp.hq._locations --a-rec=10.0.1.12
Имя записи: _kerberos._udp.hq._locations
A record: 10.0.1.11, 10.0.1.12
SRV record: 0 100 88 dc-1.ald.company.lan., 0 100 88 dc-2.ald.company.lan., 0 100 88 dc-3.ald.company.lan., 50 100 88 dc-4.ald.company.lan., 50 100 88 dc-5.ald.company.lan
$ ipa dnsrecord-add ald.company.lan _kerberos._udp.hq._locations --a-rec=10.0.1.13
Имя записи: _kerberos._udp.hq._locations
A record: 10.0.1.11, 10.0.1.12, 10.0.1.13
SRV record: 0 100 88 dc-1.ald.company.lan., 0 100 88 dc-2.ald.company.lan., 0 100 88 dc-3.ald.company.lan., 50 100 88 dc-4.ald.company.lan., 50 100 88 dc-5.ald.company.lan
Затем в офисе Санкт-Петербурга:
$ ipa dnsrecord-add ald.company.lan _kerberos._udp.spb._locations --a-rec=10.0.1.14
Имя записи: _kerberos._udp.spb._locations
A record: 10.0.1.14
SRV record: 50 100 88 dc-1.ald.company.lan., 50 100 88 dc-2.ald.company.lan., 50 100 88 dc-3.ald.company.lan., 0 100 88 dc-4.ald.company.lan., 0 100 88 dc-5.ald.company.lan
$ ipa dnsrecord-add ald.company.lan _kerberos._udp.spb._locations --a-rec=10.0.1.15
Имя записи: _kerberos._udp.spb._locations
A record: 10.0.1.14, 10.0.1.15
SRV record: 50 100 88 dc-1.ald.company.lan., 50 100 88 dc-2.ald.company.lan., 50 100 88 dc-3.ald.company.lan., 0 100 88 dc-4.ald.company.lan., 0 100 88 dc-5.ald.company.lan
Проверим работу новых записей:
# nslookup -type=A _kerberos._udp.ald.company.lan dc-1.ald.company.lan
Server: dc-1.ald.company.lan
Address: 10.0.1.11#53
_kerberos._udp.ald.company.lan canonical name = _kerberos._udp.hq._locations.ald.company.lan.
Name: _kerberos._udp.hq._locations.ald.company.lan
Address: 10.0.1.12
Name: _kerberos._udp.hq._locations.ald.company.lan
Address: 10.0.1.11
Name: _kerberos._udp.hq._locations.ald.company.lan
Address: 10.0.1.13
Теперь запись «_kerberos._udp.ald.company.lan» можно использовать в настройках службы W32Time на компьютерах Windows. Для синхронизации времени они будут выбирать ближайший к ним контроллер домена.
4. Настройка динамического обновления DNS-записей
Служба каталога FreeIPA и клиентская часть SSSD поддерживают функцию динамического обновления DNS-записей в соответствии с RFC 2136. Чтобы использовать эту функцию, в конфигурационный файл /etc/sssd/sssd.conf достаточно внести несколько строк:
[domain/ald.company.lan]
...
dyndns_update = true
dyndns_refresh_interval = 43200
dyndns_update_ptr = true
dyndns_ttl = 3600
...
Операционная система Windows тоже поддерживает указанный протокол. Только есть одно маленькое недоразумение, из-за которого ничего не работает: компьютер использует имя принципала в другом формате, поэтому без добавления псевдонима «desktop-7vkreuo$» к учетной записи компьютера хост сможет выполнять только проверку аутентичности пользователей. У него не получится самому пройти аутентификацию в домене, и в журналах будут появляться сообщения об ошибке «CLIENT_NOT_FOUND». Добавить псевдоним можно с помощью команды host-add-principal утилиты ipa:
admin@dc-1:~$ ipa host-add-principal desktop-7vkreuo.ald.company.lan 'desktop-7vkreuo$'
--------------------------------------------------------------------------
Добавлены новые псевдонимы в запись узла "desktop-7vkreuo.ald.company.lan"
--------------------------------------------------------------------------
Имя узла: desktop-7vkreuo.ald.company.lan
Псевдоним учётной записи: host/desktop-7vkreuo.ald.company.lan@ALD.COMPANY.LAN, desktop-7vkreuo$@ALD.COMPANY.LAN
И останется только расширить политику обновления DNS на сервере:
-
Для прямой зоны:
-
DN: idnsname=ald.company.lan.,cn=dns,dc=ald,dc=company,dc=lan.
-
Атрибут: idnsUpdatePolicy
-
Старое значение: grant ALD.COMPANY.LAN krb5-self * A; grant ALD.COMPANY.LAN krb5-self * AAAA; grant ALD.COMPANY.LAN krb5-self * SSHFP;
-
Новое значение: grant ALD.COMPANY.LAN krb5-self * A AAAA SSHFP; grant ALD.COMPANY.LAN ms-self . A AAAA;
-
-
Для обратной зоны:
-
DN: idnsname=10.0.1.in-addr.arpa.,cn=dns,dc=ald,dc=company,dc=lan.
-
Атрибут: idnsUpdatePolicy
-
Старое значение: grant ALD.COMPANY.LAN krb5-subdomain 1.0.10.in-addr.arpa. PTR;
-
Новое значение: grant ALD.COMPANY.LAN krb5-subdomain 1.0.10.in-addr.arpa. PTR; grant ALD.COMPANY.LAN ms-subdomain 1.0.10.in-addr.arpa. PTR;
-
Внести указанные изменения можно через интерфейс IPA https://dc-1.ald.company.lan/ipa/ui, см. рисунок 5.
В завершение не помешает настроить на рабочей станции политику обновления DNS, так как по умолчанию Windows-клиенты сначала предпринимают попытку неавторизованных запросов, а уже после переключаются на GSS-TSIG. Это приводит к тому, что в журналах сервера скапливается много лишних предупреждений.
Для устранения проблемы нужно разрешить «только безопасные» (only secure) обновления для DNS-клиента на стороне рабочей станции Windows. Это делается с помощью редактора локальной групповой политики (gpedit.msc), см. рисунок 6.
Для проверки настроек вы можете выполнить принудительное обновление DNS-записей на Windows-компьютере командой registerdns утилиты ipconfig:
> ipconfig.exe /registerdns
Автоматически запросы на обновление DNS-записей отправляются в следующих случаях:
-
Включение компьютера.
-
Изменение IP-адреса в конфигурации сетевого подключения.
-
Продление срока аренды IP-адреса, выданного DHCP-сервером. Такое событие можно вызвать принудительно командой «ipconfig /renew».
На стороне сервера FreeIPA запросы на обновление DNS можно будет найти в журнале daemon.log. Если хосту установить IP-адрес 10.0.1.155, то вы увидите в журнале следующие строки:
# tail -f /var/log/daemon.log | grep -i 'desktop-7vkreuo'
dc-1 named-pkcs11[4920]: client @0x70a05410f640 10.0.1.155#64080/key
desktop-7vkreuo\$\@ALD.COMPANY.LAN: updating zone 'ald.company.lan/IN':
deleting rrset at 'DESKTOP-7VKREUO.ALD.COMPANY.LAN' AAAA
dc-1 named-pkcs11[4920]: client @0x70a05410f640 10.0.1.155#64080/key
desktop-7vkreuo\$\@ALD.COMPANY.LAN: updating zone 'ald.company.lan/IN':
deleting rrset at 'DESKTOP-7VKREUO.ALD.COMPANY.LAN' A
dc-1 named-pkcs11[4920]: client @0x70a05410f640 10.0.1.155#64080/key
desktop-7vkreuo\$\@ALD.COMPANY.LAN: updating zone 'ald.company.lan/IN':
adding an RR at 'DESKTOP-7VKREUO.ALD.COMPANY.LAN' A 10.0.1.155
dc-1 named-pkcs11[4920]: client @0x70a04411a9d0 10.0.1.155#56472/key
desktop-7vkreuo\$\@ALD.COMPANY.LAN: updating zone '1.0.10.in-addr.arpa/IN':
deleting rrset at '155.1.0.10.in-addr.arpa' PTR
dc-1 named-pkcs11[4920]: client @0x70a04411a9d0 10.0.1.155#56472/key
desktop-7vkreuo\$\@ALD.COMPANY.LAN: updating zone '1.0.10.in-addr.arpa/IN':
adding an RR at '155.1.0.10.in-addr.arpa' PTR DESKTOP-7VKREUO.ALD.COMPANY.LAN.
На стороне клиента возможные ошибки обновления DNS будут появляться в журнале System, см. рисунок 7.
5. Проверка функциональных возможностей
5.1 Вход в систему
Для входа в систему доменным пользователем «admin» нужно выбрать «Other user» и ввести имя в формате «admin@ALD.COMPANY.LAN», см. рис. 8. Если вы настроили домен по умолчанию, то можно использовать короткое имя «admin» без указания домена.
После входа в операционную систему Windows вы можете проверить состояние из командной строки с помощью утилит whoami и klist.
> whoami.exe
ald\admin
> whoami.exe /groups
GROUP INFORMATION
-----------------
Group Name Type SID
========================================== ================ =============================================
Unknown SID type S-1-5-21-1491017894-2377586105-2170988794-512
Everyone Well-known group S-1-1-0
BUILTIN\Users Alias S-1-5-32-545
NT AUTHORITY\INTERACTIVE Well-known group S-1-5-4
CONSOLE LOGON Well-known group S-1-2-1
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11
NT AUTHORITY\This Organization Well-known group S-1-5-15
LOCAL Well-known group S-1-2-0
Authentication authority asserted identity Well-known group S-1-18-1
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
> klist.exe
Current LogonId is 0:0x396cf
Cached Tickets: (1)
#0> Client: admin @ ALD.COMPANY.LAN
Server: krbtgt/ALD.COMPANY.LAN @ ALD.COMPANY.LAN
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 11/19/2023 6:26:37 (local)
End Time: 11/20/2023 6:26:37 (local)
Renew Time: 11/26/2023 6:26:37 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: dc-1.ald.company.lan
Чтобы определить, какой именно контроллер обслуживает Windows-компьютер, можно воспользоваться утилитами systeminfo или nltest:
> systeminfo.exe | find /i "logon server"
Logon Server: \\DC-1
> nltest.exe /dsgetdc:ALD.COMPANY.LAN
DC: \\dc-1.ald.company.lan
Address: \\10.0.1.11
Dom Guid: 808d0975-5d36-47ed-8825-4b4227a348b9
Dom Name: ald.company.lan
Forest Name: ald.company.lan
Dc Site Name: Default-First-Site-Name
Our Site Name: Default-First-Site-Name
Flags: PDC GC DS LDAP KDC TIMESERV GTIMESERV WRITABLE DNS_DC DNS_DOMAIN DNS_FOREST CLOSE_SITE
The command completed successfully
Первый вход в систему может выполняться около минуты, так как создается профиль пользователя. Второй и последующие входы выполняются значительно быстрее, примерно за 5-10 секунд. При недоступности отдельных контроллеров время входа значительно возрастает.
Совет: не забудьте отключить NetBIOS для сетевого подключения, это значительно ускоряет время входа.
5.2 Автономный вход в систему
Операционная система Windows сохраняет хеш пользовательского пароля, что позволяет ей выполнять автономную аутентификацию пользователей без доступа к контроллерам домена.
Продолжительность автономного входа зависит от настроек сетевого интерфейса: если доступа к сети нет или сетевой интерфейс настроен на работу с публичным DNS-сервером, который отклоняет запросы на разрешение локальных имен, то автономный вход будет выполняться без задержек. Если интерфейс включен, но DNS-сервер недоступен, то компьютер будет отправлять до 15 запросов на поиск SRV-записей Kerberos и LDAP-сервисов — общая задержка может составить больше минуты.
Очевидно, что при автономном входе TGT-билет в системе будет отсутствовать:
> whoami
ald\admin
> whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID
========================================== ================ =============================================
Unknown SID type S-1-5-21-1491017894-2377586105-2170988794-512
Everyone Well-known group S-1-1-0
BUILTIN\Users Alias S-1-5-32-545
NT AUTHORITY\INTERACTIVE Well-known group S-1-5-4
CONSOLE LOGON Well-known group S-1-2-1
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11
NT AUTHORITY\This Organization Well-known group S-1-5-15
LOCAL Well-known group S-1-2-0
Authentication authority asserted identity Well-known group S-1-18-1
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
> klist
Current LogonId is 0:0x95e78b
Cached Tickets: (0)
> systeminfo | find /i "logon server"
Logon Server: \\DC-1
> nltest /dsgetdc:ALD.COMPANY.LAN
Getting DC name failed: Status = 1355 0x54b ERROR_NO_SUCH_DOMAIN
После восстановления доступа к локальной сети билеты Kerberos появляются при первом же успешном обращении к керберизированному сервису. Например, при обращении к общим папкам автоматически появятся билеты krbtgt и cifs:
> whoami
ald\admin
> whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID
========================================== ================ =============================================
Unknown SID type S-1-5-21-1491017894-2377586105-2170988794-512
Everyone Well-known group S-1-1-0
BUILTIN\Users Alias S-1-5-32-545
NT AUTHORITY\INTERACTIVE Well-known group S-1-5-4
CONSOLE LOGON Well-known group S-1-2-1
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11
NT AUTHORITY\This Organization Well-known group S-1-5-15
LOCAL Well-known group S-1-2-0
Authentication authority asserted identity Well-known group S-1-18-1
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
> klist
Current LogonId is 0:0x95e78b
Cached Tickets: (2)
#0> Client: admin @ ALD.COMPANY.LAN
Server: krbtgt/ALD.COMPANY.LAN @ ALD.COMPANY.LAN
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 2/4/2024 11:52:59 (local)
End Time: 2/5/2024 11:52:59 (local)
Renew Time: 2/11/2024 11:52:59 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: dc-1.ald.company.lan
#1> Client: admin @ ALD.COMPANY.LAN
Server: cifs/dc-1.ald.company.lan @ ALD.COMPANY.LAN
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a90000 -> forwardable renewable pre_authent name_canonicalize 0x80000
Start Time: 2/4/2024 11:52:59 (local)
End Time: 2/5/2024 11:52:59 (local)
Renew Time: 2/11/2024 11:52:59 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called: dc-1.ald.company.lan
> systeminfo | find /i "logon server"
Logon Server: \\DC-1
> nltest /dsgetdc:ALD.COMPANY.LAN
DC: \\dc-1.ald.company.lan
Address: \\10.0.1.11
Dom Guid: 808d0975-5d36-47ed-8825-4b4227a348b9
Dom Name: ald.company.lan
Forest Name: ald.company.lan
Dc Site Name: Default-First-Site-Name
Our Site Name: Default-First-Site-Name
Flags: PDC GC DS LDAP KDC TIMESERV GTIMESERV WRITABLE DNS_DC DNS_DOMAIN DNS_FOREST CLOSE_SITE
The command completed successfully
5.3 Смена пароля
Функция смены пароля работает штатным образом, если при входе в систему пользователь ввел имя в формате login@REALM.FQDN или это значение было скорректировано автоматически после входа с помощью скриптов, см. рис. 9.
5.4 Прозрачная аутентификация при обращении к сетевой папке
Прозрачная Kerberos-аутентификация при обращении к керберизированным сервисам будет работать, так как у пользователя в системе есть TGT-билет.
Для проверки вы можете создать сетевую папку с именем «testshare» прямо на контроллере домена и предоставить к ней доступ пользователю с именем «admin». Для этого в конец файла /etc/samba/smb.conf допишите следующие строки:
# nano /etc/samba/smb.conf
...
[testshare]
path = /srv/testshare
writable = yes
valid users = admin
write list = admin
После чего создайте указанную папку и перезапустите службу smbd:
# mkdir /srv/testshare
# systemctl restart smbd.service
Откройте сетевую папку в проводнике Windows по адресу «\\dc-1.ald.company.lan\testshare» и проверьте, что у вас есть доступ без ввода пароля и возможность создавать и редактировать файлы, см. рис. 10.
Выполните команду klist в терминале и убедитесь, что там появился дополнительный билет на доступ к службе cifs/dc-1.ald.company.lan:
5.5 Назначение доменным пользователям прав доступа в локальной системе
Как мы убедились ранее, внутри операционной системы пользователь работает под своей доменной учетной записью, но назначать ему какие-то дополнительные права, используя стандартное окно поиска пользователей, не получится — доменных пользователей в нем не будет. Обойти указанную проблему можно путем создания локальных групп, в список участников которых можно включить идентификаторы безопасности из домена.
Текущие идентификаторы пользователей и групп можно посмотреть на контроллере домена FreeIPA с помощью утилиты ipa:
$ ipa user-show admin --all | grep ipantsecurityidentifier
ipantsecurityidentifier: S-1-5-21-1491017894-2377586105-2170988794-500
$ ipa group-show admins --all | grep ipantsecurityidentifier
ipantsecurityidentifier: S-1-5-21-1491017894-2377586105-2170988794-512
Создать локальные группы на Windows-компьютере и добавить в них участников по идентификаторам можно из PowerShell с помощью командлетов New-LocalGroup и Add-LocalGroupMember, см. рис. 11:
> New-LocalGroup -Name "ALD-User-Admin" -Description "Domain user"
Name Description
---- -----------
ALD-User-Admin Domain user
> Add-LocalGroupMember -Group "ALD-User-Admin" -Member "S-1-5-21-1491017894-2377586105-2170988794-500"
> New-LocalGroup -Name "ALD-Group-Admins" -Description "Domain group"
Name Description
---- -----------
ALD-Group-Admins Domain group
> Add-LocalGroupMember -Group "ALD-Group-Admins" -Member "S-1-5-21-1491017894-2377586105-2170988794-512"
Целесообразно добавить администраторов домена также в группу локальных администраторов, чтобы у пользователей были все необходимые привилегии для настройки системы без переключения на учетную запись локального администратора:
Add-LocalGroupMember -Group "Administrators" -Member "S-1-5-21-1491017894-2377586105-2170988794-512"
Вместо заключения
Приведенный способ значительно расширяет возможности построения гибридной инфраструктуры, но требует много времени для настройки рабочих станций. Это не проблема, если у вас почасовая оплата, но в большинстве случаев создает значительные затруднения. Поэтому команда ALD Pro разработала графическую утилиту aldpro-join, которая позволяет выполнить все настройки в пару кликов, см. рисунок 12.
Приложение написано на языке Python и доступно в публичном репозитории продуктовой команды на GitFlic как в виде исходных кодов, так и в виде скомпилированного с помощью Pyinstaller исполняемого exe-файла.
Чтобы утилита смогла внести необходимые изменения и на локальном компьютере, и в домене, запускать ее нужно от имени локального администратора, а при появлении окна аутентификации требуется предоставить учетные данные привилегированного пользователя домена.
Еще раз акцентирую внимание на том, что утилита работает как для домена ALD Pro, так и для «ванильных» инсталляций FreeIPA. Команда ALD Pro прикладывает значительные усилия для выработки лучших практик использования продуктов технологического стека, и мы будем рады, если наши наработки помогут вам в реализации программы импортозамещения в вашей компании.
Перед началом работ по внедрению метода аутентификации пользователей по протоколу Kerberos, рекомендуем ознакомится с разделом Аутентификация Kerberos Руководства Администратора.
Содержание:
1. Краткое описание алгоритма работы Kerberos
2. Поддержка Kerberos клиентами CommuniGate Pro
3. Общие требования
4. Настройка интеграции с Microsoft Active Directory
5. Загрузка keytab.data на сервер CommuniGate Pro
6. Настройка MS Internet Explorer/MS Edge/Google Chrome
7. Проверка работоспособности
8. Устранение проблем
9. Подготовка информации для предоставления в техническую поддержку
10. Полезные ссылки
Сервер Kerberos и сервер CommuniGate Pro (далее – CGPro) не общаются между собой напрямую. То есть для аутентификации через Kerberos серверу CGPro не нужно связываться с Microsoft Active Directory (далее – Microsoft AD). Ключ для расшифровки билетов загружается на сервер CGPro в виде файла таблицы ключей (далее – keytab файл).
Алгоритм аутентификации через Kerberos:
1. Клиент подключается к серверу CGPro;
2. Сервер CGPro предлагает клиенту аутентифицироваться через Kerberos;
3. Клиент обращается к Microsoft AD за билетом для сервера CGPro;
4. Клиент отправляет серверу CGPro полученный билет;
5. Если сервер CGPro может расшифровать билет, то получает из него имя пользователя;
6. Если пользователь найден, то сервер CGPro предоставляет ему доступ к услугам.
Поддержка Kerberos клиентами CommuniGate Pro
Протокол аутентификации Kerberos поддерживается в веб-версии Samoware, настольном клиенте Samoware Desktop для операционной системы Windows, CommuniGate Pro MAPI-коннектор.
Общие требования
Для возможности аутентификации пользователей домена CGPro по протоколу Kerberos, необходимо выполнение общих требований:
1. В установках домена CGPro должен быть включен Способ Аутентификации GSSAPI (Пользователи → Домены → Имя_домена → Установки домена, секция «Способы Аутентификации»);
Примечание. Также рекомендуется включить Способ Аутентификации SESSIONID. Это понадобится, если будет необходимо входить в веб-интерфейс Samoware через Kerberos по ссылке вида: /login (подробнее в разделе Вход при помощи Аутентификации через Браузер);
2. В установках пользователя CGPro должна быть включена Аутентификация Через Kerberos (Пользователи → Домены → Имя_домена → Объекты → Имя_пользователя → Установки, секция «Аутентификация»);
3. Для использования аутентификации Kerberos при подключении по HTTP, в настройках HTTPU должна быть включена опция «Объявлять ‘Negotiate’-Аутентификацию» (Установки → Услуги → HTTPU, секция «Опции HTTP»);
4. Клиенты для обращения к домену сервера CGPro должны использовать имя хоста (далее FQDN), совпадающее с именем домена. Если будет использоваться FQDN, отличное от имени домена, то необходимо добавить его в Псевдонимы домена;
5. Клиенты должны разрешать используемый FQDN в IP-адрес, назначенный главному или дополнительному домену сервера CGPro.
6. В Microsoft AD должен быть создан сервисный пользователь для сервиса (протокола) CGPro, доступ к которому требуется аутентифицировать по Kerberos;
7. Пароль сервисного пользователя должен удовлетворять парольным политикам;
8. Для сервисного пользователя должен быть назначен SPN (Service Principal Names), ключ шифрования, и выгружен keytab файл:
· SPN, назначаемый сервисному пользователю, должен быть уникальным;
· В экземпляре SPN должен использоваться FQDN, выбранный в пункте 4;
9. На ПК пользователя должен быть выполнен вход в домен Microsoft AD под пользователем, имя для входа которого (sAMAccountName), совпадает с именем пользователя CGPro или его Псевдонимом (имена доменов Microsoft AD и CGPro могут не совпадать).
Настройка интеграции с Microsoft Active Directory
1. В DNS (локальном или публичном) создать А-запись, указывающую на IP-адрес главного или дополнительного домена CGPro (для тестов можно использовать записи в hosts);
2. Добавить полное имя хоста (FQDN) А-записи в псевдонимы домена CGPro;
3. В Microsoft AD создать сервисного пользователя cgatepro;
Примечание. Имя cgatepro дано для примера и используется далее, как имя сервисного пользователя. Вы можете выбрать любое другое имя.
На сервисного пользователя будут зарегистрированы принципалы для сервисов CGPro (HTTP, IMAP и т.п.).
Обратите внимание. Для каждого сервиса (HTTP, IMAP, SMTP) рекомендуется создавать отдельного сервисного пользователя в Microsoft AD, чтобы SPN корректно считывался.
4. На контроллере домена Microsoft AD использовать команду ktpass для создания принципала службы и экспорта ключей.
Для создания keytab файла с привязкой к пользователю (ключ «-mapuser») на контроллере домена нужно открыть cmd или PowerShell с правами администратора и использовать команду ktpass.
Пример команды в cmd:
ktpass -princ service/hostname@REALM -mapuser cgatepro -pass <key> -out C:\keytab.data -crypto All -ptype KRB5_NT_PRINCIPAL
Пример команды в PowerShell:
ktpass /princ service/hostname@REALM /mapuser cgatepro /pass <key> /out C:\keytab.data /crypto All /ptype KRB5_NT_PRINCIPAL /
· service – имя сервиса (протокола) CGPro (IMAP/SMTP/HTTP);
· hostname – FQDN, который был выбран в пункте 4 раздела «Общие требования»;
· REALM — полное имя домена Microsoft AD, через который осуществляется вход, в верхнем регистре;
· <key> — ключ шифрования (придумайте произвольный набор символов, который будет использоваться для шифрования билетов);
· С:\keytab.data — путь к файлу, в который запишется таблица ключей;
· crypto — тип шифрования. В примере дано значение параметра «All». Вы можете указать требуемый тип шифрования из перечисленных: DES-CBC-CRC, DES-CBC-MD5, RC4-HMAC-NT, AES256-SHA1*, AES128-SHA1*.
* AES128-SHA1 и AES256-SHA1 поддерживаются, начиная с версии CGPro 6.3.4.
При включении типа шифрования AES256-SHA1 или AES128-SHA1, необходимо у сервисного пользователя в Microsoft AD в параметрах учетной записи включить «Данная учетная запись поддерживает 256-разрядное шифрование» или 128-разрядное в зависимости от выбранного типа.
Также нужно удостовериться, что у сервисного пользователя Microsoft AD в опциях не включено «Use only Kerberos Des encryption».
Обратите внимание. ktpass не перезаписывает выходной файл (-out), а дополняет. Из-за этого в CGPro не загружается корректный ключ. При пересоздании ключа нужно указывать новое имя файла или предварительно стирать имеющийся.
Загрузка keytab.data на сервер CommuniGate Pro
Нужно загрузить keytab файл на сервер CGPro в веб-интерфейсе администратора: Пользователи → Домены → Имя_домена → Безопасность → Kerberos.
Настройка MS Internet Explorer/MS Edge/Google Chrome
Для настройки нужно:
1. Зайти в свойства браузера: Панель Управления → Свойства браузера → Безопасность → Местная интрасеть → Сайты → Дополнительно;
2. В список сайтов добавить URL входа на сервер CGPro и перезагрузить браузер.
Примечание. В URL для подключения нужно указать FQDN, выбранный в пункте 4 раздела «Общие требования».
Примечание. Для поддержки аутентификации Kerberos в других браузерах их необходимо настраивать отдельно (подробнее см. в документации на нужный тип браузера).
Проверка работоспособности
В браузере для аутентификации по Kerberos можно:
· Использовать URL вида: http(s)://fqdn:port/login/
Например: http://cgatepro.msk:8100/login/
· На странице входа в веб-интерфейс пользователя кнопку «Автоматический вход».
Если все настроено правильно, то вход в веб-интерфейс почты должен быть осуществлен автоматически, минуя запрос логина и пароля.
Пример записи успешной аутентификации Kerberos в журнале сервера CGPro:
14:29:50.336 2 HTTPU-000253([10.2.7.51]:64522) ‘ivanov’ connected(KERBEROS) [10.2.7.51]:64522->[10.2.7.45]:8100
Устранение проблем
Большинство проблем аутентификации Kerberos связано с некорректным созданием/установкой keytab файла (например, были указаны неверные параметры при создании).
Если аутентификация Kerberos не проходит (в браузере запрашивается логин/пароль), то в первую очередь необходимо проверить получил ли ПК пользователя билет для сервиса CGPro и имени хоста, указанного в клиенте для подключения к домену сервера CGPro (FQDN, выбранный в пункте 4 раздела «Общие требования»). Для этого можно использовать команду klist.
Пример:
В примере ПК пользователя получил билет для сервиса HTTP и имени хоста dc-1.ipa.msk, с типом шифрования RC4-HMAC.
Проблема 1. ПК пользователя не получил билет.
Возможные причины:
1. Keytab файл не был сгенерирован для сервиса/имени хоста CGPro;
2. Для подключения к домену CGPro использовалось имя хоста (FQDN), отличное от того, на которое сгенерирован keytab.
Решение: Вернитесь к шагу 4 в разделе «Настройка интеграции с Microsoft Active Directory».
Проблема 2. ПК пользователя получил билет, но аутентификация Kerberos не прошла.
Возможные причины:
1. Keytab файл не был загружен на сервер CGPro;
Пример ошибки в журнале сервера CGPro:
15:15:58.593 1 DOMAIN(example.msk) Kerberos key HTTP/example.msk@EXAMPLE.MSK encType=18 v=13 not found
Решение: Загрузите keytab файл на сервер CGPro (см. раздел «Загрузка keytab.data на сервер CommuniGate Pro»).
2. Тип шифрования в билете на ПК пользователя не совпадает с типом шифрования keytab файла. Тип шифрования keytab можно посмотреть в интерфейсе администратора (см. раздел «Загрузка keytab.data на сервер CommuniGate Pro»);
Пример ошибки в журнале сервера CGPro:
15:15:58.593 1 DOMAIN(example.msk) Kerberos key HTTP/example.msk@EXAMPLE.MSK encType=18 v=13 not found
Решение: Вернитесь к шагу 4 в разделе «Настройка интеграции с Microsoft Active Directory» и создайте keytab файл с типом шифрования, совпадающим с типом шифрования билета.
3. Ключи шифрования в билете и на ПК пользователя не совпадают
Пример ошибки в журнале:
15:18:15.276 4 HTTPU-000226([10.3.9.179]:62117) rsp(1005): 401 Kerberos: failed to verify data integrity
Решение: Вернитесь к шагу 4 в разделе «Настройка интеграции с Microsoft Active Directory», создайте новый keytab файл и загрузите его на сервер CGPro.
Обратите внимание: ПК пользователя кэширует полученные билеты. После пересоздания keytab файла (пункты 2 и 3) нужно очистить кэш билетов, чтобы ПК пользователя запросил новый билет. Можно использовать команду klist purge, либо перезагрузить ПК.
Подготовка информации для предоставления в техническую поддержку
Для решения проблем с аутентификацией Kerberos, необходимо собрать и предоставить в техническую поддержку следующие данные:
1. С ПК пользователя: вывод команды klist ;
2. Из веб-интерфейса администратора CGPro: скриншот страницы с keytab:
Пользователи → Домены → Имя_домена → Безопасность → Kerberos;
3. Для сервиса (протокола) CGPro, к которому происходит подключение, установить уровень журнала «Всё»:
HTTPU: Установки → Услуги → HTTPU → Обработка → Уровень журнала: Всё
IMAP/MAPI: Установки → Доступ → IMAP → Уровень журнала: Всё
SMTP: Установки → Почта → SMTP → Прием → Уровень журнала: Всё;
4. Для модуля ROUTER установить уровень журнала «Всё»:
Установки → Маршрутизатор → Уровень журнала: Всё;
5. Повторить попытку входа;
6. Скопировать журнал сервера CGPro за промежуток -/+2 минуты от времени попытки входа в обычный текстовый файл.
Полезные ссылки
Руководство Администратора раздел Аутентификация Kerberos.
Руководство Администратора раздел Псевдонимы домена.
Руководство Администратора раздел Псевдонимы Пользователя.
Руководство Администратора раздел Вход при помощи Аутентификации через Браузер.
Документация Microsoft раздел ktpass.
17 янв. 2024 г.
Сегодня мы с вами рассмотрим протокол аутентификации Kerberos. Пройдемся по самому протоколу и рассмотрим его работу в рамках Microsoft Active Directory.
Kerberos – протокол взаимной аутентификации сервера и клиента, основан на использовании симметричных ключей и может использоваться в незащищенной среде. По сути, протокол выполняет роль третьей стороны, благодаря которой клиент и сервер могут однозначно идентифицировать друг друга.
История
Самая первая версия протокола была разработана в далеком 1988 году в MIT для проекта «Афина». Версии с 1 по 3 использовались исключительно внутри MIT.
4 версия была разработана Стивеном Миллером и Клиффордом Нейманном, она хоть и была публичной, но для очень ограниченного количества компаний, включая проект «Афина». И только 5 версия протокола Kerberos, которая вышла в 1993 году уже стала по настоящему публичной и была описана в RFC 1510.
Microsoft Windows Server и Active Directory используют расширенный протокол Kerberos 5 версии, описанный в RFC 4120.
Kerberos в Active Directory
Kerberos сейчас считается основным протоколом при работе в домене Microsoft Windows и состоит из набора компонентов:
Компонент |
Описание |
Область Kerberos |
Сеть, в которой расположен наш KDC. Если мы говорим про Active Directory – то в качестве области может восприниматься домен. |
KDC (Key Distribution Centre) |
Центр выдачи ключей. Роль состоит из AS и TGS и занимается выдачей билетов. KDC располагается на контроллере домена. |
AS (Authentication Server) |
Выполняет авторизацию пользователя и затем передает данные в KDC для выдачи билета. |
TGS (Ticket Granting Service) |
Билет сервиса. Данный билет клиент предоставляет сервису для проверки. Он зашифрован сервисным ключом. |
TGT (Ticket Granting Ticket) |
Билет клиента, предоставленный KDC после успешной аутентификации. |
Описание работы протокола Kerberos
Для общего понимания для начала нарисуем схему и потом пройдем по всем пунктам. Схема работы протокола представлена ниже:
Рассмотрим каждый шаг более подробно:
1. AS_REQ (Preauthentication Request). Данный этап мы проходим, когда авторизуемся на нашей рабочей станции в домене (вводим наш логин и пароль). Формат отправляемого запроса выглядит следующим образом:
Client Name – имя пользователя;
Service Name – обращение к сервису krbtgt на стороне контроллера домена;
Client Time – метка времени с рабочей станции, откуда мы пытаемся авторизоваться. Метка шифруется хэшем пароля пользователя для предотвращения атак с повторной передачей.
По умолчанию, разница во времени между клиентом и KDC должна быть не более 5 минут, иначе запрос будет отклонен;
2. AS_REP. После того, как контроллер домена получит наш пакет – он сразу же попытается расшифровать присланную метку времени используя локальную копию хэша пароля пользователя из базы Active Directory. Если провести операцию не получается, то такой запрос будет отклонен, а клиенту возвращена ошибка. Если же все проходит успешно, то формируется сообщение AS_REP. Формат данного сообщения приведен ниже:
Client Name – имя пользователя;
Session Key – случайно сгенерированный криптографический ключ, который в дальнейшем будет использоваться для взаимодействия между пользователем и AD;
Token Information – токен пользователя, содержащий все данные по пользователю – состав групп, права и т.д.;
Lifetime/Expiry – время жизни TGT;
По умолчанию время жизни TGT составляет 10 часов.
В сообщении AS_REP у нас 2 блока – один шифруется хэшем пароля пользователя, второй – шифруется секретом KDC. Секрет KDC хранится в AD на контроллере. Клиент расшифровывает свою часть сообщения, а TGT просто сохраняется в памяти. Именно внутри блока TGT у нас хранится Token Information.
После успешно принятого сообщения AS_REP нам уже не требуется пароль, поскольку дальнейшее взаимодействие между клиентом и контроллером AD будет происходит посредством защищенного Session Key;
3. TGS_REQ. Вот и настал момент, когда нам необходимо обратиться к какому – либо сервису по Kerberos. В случае с AD это практически любой сервис (Exchange, SharePoint, файловые серверы и т.д.). Для того, чтобы мы смогли запросить доступ к сервису, данный сервис должен иметь свой SPN.
Итак, мы хотим обратиться к сервису через Kerberos – для этого мы посылаем на KDC сообщение TGS_REQ следующего содержания:
Service Principal – SPN запрашиваемого сервиса;
Client Name – имя пользователя;
Time Stamp – метка времени;
Как видно по изображению выше – имя пользователя и метка времени у нас зашифрованы сессионным ключом, который мы получили еще на этапе аутентификации. Блок TGT, который мы получили ранее, также передается на сервер KDC для обработки;
4. TGS_REP. Если на предыдущем этапе у нас все прошло хорошо, то в ответ KDC формирует нам TGS_REP пакет со следующим содержимым:
Service Principal – SPN сервиса;
Time Stamp – метка времени;
Service Session Key – это сессионный ключ, который будет использоваться уже при общении со службой;
Client Name – имя пользователя.
Здесь у нас также ответ представлен из двух блоков: первый блок – шифруется сессионным ключом клиента, который был получен на этапе AS_REP, второй блок – шифруется хэшем пароля службы;
5. AP_REQ. После того, как клиент получит ответ TGS_REP, он «идет» с ним к целевому сервису уже с запросом AP_REQ следующего содержания:
Client Name – имя пользователя;
Time Stamp – метка времени;
Service Principal – SPN запрашиваемого сервиса;
Service Session Key – это сессионный ключ, который будет использоваться уже при общении со службой;
Token Information – токен пользователя, содержащий все данные по пользователю – состав групп, права и т.д.;
Здесь у нас также представлены 2 блока – один блок шифруется сессионным ключом службы, второй – секретом службы;
6. После поступления запроса AP_REQ служба дешифрует свой блок, получая Service Session Key, которым затем дешифрует первый блок, обеспечивая проверку подлинности;
7. AP_REP. Данный пакет у нас на рисунке выше помечен пунктирной стрелкой. По сути, после получения AP_REQ и его расшифровки у службы нет обязательного требования отправки данного пакета. Он может быть отправлен в случае, например, возникшей ошибки или если была запрошена взаимная проверка подлинности.
Итог
В этой статье мы с вами расмотрели, как происходит взаимодействие по протоколу Kerberos в среде Active Directory. Естественно, сам протокол не ограничивается только этими пакетами. Гораздо больше технической информации можно найти в RFC 1510 и RFC 4120.
Пошаговая инструкция по настройке на веб-сайте IIS на Windows Server 2012 R2 прозрачной авторизации доменных пользователей в режиме SSO (Single Sign-On) по протоколу Kerberos.
На веб сервере запустите консоль IIS Manager, выберите нужный сайт и откройте раздел Authentication. Как вы видите, по умолчанию разрешена только анонимная аутентификация (Anonymous Authentication). Отключаем ее и включаем Windows Authentication (IIS всегда сначала пытается выполнить анонимную аутентификацию).
Открываем список провайдеров, доступных для Windows аутентификации (Providers). По умолчанию доступны два провайдера: Negotiate и NTLM. Negotiate – это контейнер, который в качестве первого метода проверки подлинности использует Kerberos, если эта аутентификация не удается, используется NTLM. Необходимо, чтобы в списке провайдеров метод Negotiate стоял первым.
Следующий этап – регистрация Service Principal Name (SPN) записей для имени сайта, к которому будут обращаться пользователи. В том случае, если сайт IIS должен быть доступен только по имени сервера, на котором он расположен (http://server-name или http://server-name.contoso.com), создавать дополнительные SPN записи не нужно (SPN записи уже имеются в учетной записи сервера в AD). При использовании адреса сайта, отличного от имени хоста, или при построении веб-фермы с балансировкой, придется привязывать дополнительные записи SPN к учётной записи сервера или пользователя.
Предположим, у нас имеется ферма IIS серверов. В этом случае оптимально создать отдельную учетную запись в AD и привязать SPN записи к ней. Из-под этой же учетной записи будут запускать целевой Application Pool нашего сайта.
Создадим доменную учетную запись iis_service. Убедимся, что SPN записи для этого объекта не назначены (атрибут servicePrincipalName пустой).
Предположим, что сайт должен отвечать по адресам _http://webportal and _http://webportal.contoso.loc. Мы должны прописать эти адреса в SPN атрибут служебной учетной записи
Setspn /s HTTP/webportal contoso\iis_service
Setspn /s HTTP/webportal.contoso.loc contoso\iis_service
Таким образом, мы разрешим этой учетной записи расшифровывать тикеты Kerberos при обращении пользователей к данным адресам и аутентифицировать сессии.
Проверить настройки SPN у учетной записи можно так:
setspn /l iis_service
Совет. Kerberos не будет работать корректно при наличии дублирующих SPN у разных записей домена. С помощью следующей команды, убедитесь, что дубликатов SPN в домене нет:
setspn –x
Следующий этап – настройка в IIS Application Pool для запуска из-под созданной сервисной учетной записи.
Выберите Application Pool сайта (в нашем примере это DefaultAppPool).
Откройте раздел настроек Advanced Settings и перейдите к параметру Identity.
Измените его с ApplicationPoolIdentity на contoso\iis_service.
Затем в консоли IIS Manager перейдите на свой сайт и выберите секцию Configuration Editor.
В выпадающем меню перейдите в раздел system.webServer > security > authentication > windowsAuthentication
Измените useAppPoolCredentials на True.
Тем самым мы разрешим IIS использовать доменную учетку для расшифровки билетов Kerberos от клиентов.
Перезапустим IIS командой:
iisreset
Аналогичную настройку нужно выполнить на всех серверах веб-фермы.
Протестируем работу Kerberos авторизации, открыв в браузере клиента (браузер нужно предварительно настроить для использования Kerberos) адрес _http://webportal.contoso.loc
Примечание. В моем примере, на IE11 сразу авторизоваться не получилось. Пришлось добавить адрес в доверенные и в настройках Trusted Zones Sites выставить значение параметра User Authentication -> Logon на Automatic logon with current user name and password
Убедится, что для авторизации на сайте используется Kerberos можно с помощью инспектирования HTTP трафика утилитой Fiddler.
Запускаем Fiddler, в браузере открываем целевой сайт. В левом окне находим строку обращения к сайте. Справа переходим на вкладку Inspectors. Строка Authorization Header (Negotiate) appears to contain a Kerberos ticket, говорит о том, что для авторизации на IIS сайте использовался протокол Kerberos.