Вопрос или проблема
Я настраиваю процесс, который будет автоматически создавать SPN для новых URL-адресов сервиса. Я знаю, как создать SPN с помощью Windows, используя команду setspn -A с соответствующими привилегиями.
Поскольку мой сборочный сервер работает на Linux, мне интересно, есть ли способ – помимо входа на сервер Windows и выполнения setspn – создать SPN с сервера Linux?
Когда вы используете инструмент setspn
, все, что вы делаете, это изменяете атрибут servicePrincipalName указанного компьютера/пользователя в AD.
Чтобы сделать то же самое с машины Linux, вам просто нужно использовать инструмент LDAP для подключения к контроллеру домена и изменить атрибут так же, как и любой другой. Имейте в виду, что это атрибут с несколькими значениями. Поэтому не стирайте случайно существующие записи, которые могут быть на целевом объекте.
Библиотека Python для удаленного управления Windows (WinRM) позволит вам выполнять удаленные команды на машине Windows с машины Linux
pywinrm – это клиент на Python для удаленного управления Windows (WinRM). Это позволяет вам вызывать команды на целевых машинах Windows с любой машины, на которой может работать Python.
https://blogs.technet.microsoft.com/heyscriptingguy/2015/10/27/using-winrm-on-linux/
https://github.com/diyan/pywinrm
Я не думаю, что существует инструмент для Linux, который регистрирует SPN в Active Directory. В зависимости от вашего приложения и того, как оно настроено, вы можете делегировать учетной записи службы возможность регистрировать SPN.
Откройте Active Directory Users and Computers.
Чтобы открыть Active Directory Users and Computers, нажмите Пуск, нажмите Выполнить, введите dsa.msc и нажмите ENTER.
Нажмите Вид и убедитесь, что выбран флажок Расширенные функции.
Нажмите Расширенные функции, если он не выбран.
Если домен, для которого вы хотите разрешить несоответствующее пространство имен, не отображается в консоли, выполните следующие действия:
В древе консоли щелкните правой кнопкой мыши на Active Directory Users and Computers, затем нажмите Подключиться к домену.
В поле Домен введите имя домена Active Directory, для которого вы хотите разрешить несоответствующее пространство имен, а затем нажмите OK.
В качестве альтернативы вы можете использовать кнопку Обзор, чтобы найти домен Active Directory.
В древе консоли щелкните правой кнопкой мыши на узел, представляющий домен, для которого вы хотите разрешить несоответствующее пространство имен, и затем нажмите Свойства.
На вкладке Безопасность нажмите Дополнительно.
На вкладке Разрешения нажмите Добавить.
Введите имя объекта для выбора, введите имя группы или учетной записи пользователя, которому вы хотите делегировать разрешения, и затем нажмите OK.
Настройте поле Применить к объектам компьютера.
В нижней части окна Разрешения отметьте флажок Разрешить, который соответствует разрешениям на проверяемую запись для имени основного сервиса, а затем нажмите OK в трех открытых диалоговых окнах, чтобы подтвердить ваши изменения.
Закройте Active Directory Users and Computers.
Ответ или решение
Создание SPN (Service Principal Name) — важная задача для авторизации служб, особенно в среде Active Directory (AD). Для автоматизации процесса создания SPN для новых URL-адресов служб с помощью сборочного сервера на Linux необходимо учитывать несколько аспектов.
Способы создания SPN из Linux
-
Использование LDAP-инструментов:
Для взаимодействия с Active Directory из Linux можно использовать инструменты, работающие по протоколу LDAP. Одним из популярных решений являетсяldapmodify
, который позволяет вам изменять атрибуты объектов в AD. Для этого вам потребуется:- Установить необходимый пакет (например,
ldap-utils
):sudo apt-get install ldap-utils
- Создать LDIF-файл, в котором будет указано изменение атрибута
servicePrincipalName
. Пример:dn: CN=your_service_account,OU=YourOU,DC=yourdomain,DC=com changetype: modify add: servicePrincipalName servicePrincipalName: HTTP/your-service-url
- Запустить команду для обновления AD:
ldapmodify -x -D "CN=your_service_account,OU=YourOU,DC=yourdomain,DC=com" -W -f modify_spn.ldif
- Установить необходимый пакет (например,
-
Использование Python библиотек для работы с WinRM:
Если у вас есть доступ к машине с Windows, вы можете использовать Python библиотекуpywinrm
для удаленного выполнения командыsetspn
. Убедитесь, что на целевой машине включен WinRM и корректно настроены права для выполнения команд.- Установите библиотеку:
pip install pywinrm
-
Используйте следующий скрипт для выполнения команды
setspn
:import winrm session = winrm.Session('http://<windows-server>:5985/wsman', auth=('username', 'password')) result = session.run_cmd('setspn -A HTTP/your-service-url your_service_account') print(result.std_out)
- Установите библиотеку:
-
Делегирование полномочий:
Если у вас есть возможность настраивать права в Active Directory, вы можете делегировать вашим учетным записям права на регистрацию SPN. Это делается через интерфейс Active Directory Users and Computers:- Откройте консоль и перейдите к нужному объекту.
- Включите
Advanced Features
. - В свойствах нужного контейнера найдите вкладку
Security
. - Добавьте нужную учетную запись в разделе
Permissions
с правомValidated write to service principal name
.
Важные моменты
- Многочисленные значения SPN: Помните, что атрибут
servicePrincipalName
является многозначным. При добавлении нового значения не удаляйте существующие, чтобы избежать проблем с аутентификацией. - Тестирование: После добавления SPN обязательно протестируйте его работоспособность, используя инструменты, такие как
kinit
для проверки Kerberos аутентификации.
Заключение
Создание SPN из Linux не только возможно, но и позволяет автоматизировать процесс, что значительно упрощает управление сервисами в Active Directory. Выбор метода зависит от ваших конкретных потребностей, наличия прав и инфраструктуры. Используйте предоставленные инструменты и подходы для оптимизации своей работы и поддержания высокой доступности ресурса.