Создание SPN и Keytab файла: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 14 промежуточных версий 2 участников)
Строка 1: Строка 1:
== Введение ==
== Введение ==
'''SPN (Service Principal Name)''' - уникальный идентификатор экземпляра сервиса. SPN используется аутентификацией Kerberos для сопоставления экземпляра сервиса с учетной записью сервиса (service logon account). Это позволяет клиентским приложением аутентифицироваться в роли сервиса даже не зная имени пользователя.<br>
Многие сервисы ([[Apache2/AD-auth|apache]], [[Nginx/AD-auth|nginx]] и др.) могут использовать keytab-файлы для Kerberos аутентификации в домене без ввода пароля. SSO-аутентификация избавляет доменного пользователя от повторных запросов на прохождение аутентификации. Пользователь вводит доменный логин/пароль всего один раз — при логоне в операционную систему.
 
'''SPN (Service Principal Name)''' уникальный идентификатор экземпляра сервиса. SPN используется аутентификацией Kerberos для сопоставления экземпляра сервиса с учетной записью сервиса (service logon account). Это позволяет клиентским приложением аутентифицироваться в роли сервиса даже не зная имени пользователя.<br>
До того как аутентификация Kerberos сможет использовать SPN для аутентификации сервиса, SPN должен быть привязан к учетной записи, которая будет использоваться для входа. SPN может быть привязан только к одной учетной записи. Если учетная запись, привязанная к SPN, изменяется, то необходимо заново выполнить привязку.<br>
До того как аутентификация Kerberos сможет использовать SPN для аутентификации сервиса, SPN должен быть привязан к учетной записи, которая будет использоваться для входа. SPN может быть привязан только к одной учетной записи. Если учетная запись, привязанная к SPN, изменяется, то необходимо заново выполнить привязку.<br>
Когда клиент хочет воспользоваться сервисом, он находит экземпляр сервиса и составляет SPN для этого экземпляра, далее использует этот SPN для аутентификации.<br>
Когда клиент хочет воспользоваться сервисом, он находит экземпляр сервиса и составляет SPN для этого экземпляра, далее использует этот SPN для аутентификации.<br>


'''Keytab-файл''' - это файл содержащий пары Kerberos принципалов и их ключей (полученных с использованием Kerberos пароля). Эти файлы используются для аутентификации в системах, использующих Kerberos, без ввода пароля. Если пароль принципала изменится, то keytab-файл необходимо будет сгенерировать заново.<br>
'''Keytab-файл''' это файл содержащий пары Kerberos принципалов и их ключей (полученных с использованием Kerberos пароля). Эти файлы используются для аутентификации в системах, использующих Kerberos, без ввода пароля. Если пароль принципала изменится, то keytab-файл необходимо будет сгенерировать заново.<br>
{{Attention|Каждый кто имеет разрешения на чтения keytab-файла может воспользоваться любыми ключами в нем. Чтобы предотвратить нежелательное использование, ограничивайте права доступа при создании keytab-файла}}
{{Attention|Каждый кто имеет разрешения на чтения keytab-файла может воспользоваться любыми ключами в нем. Чтобы предотвратить нежелательное использование, ограничивайте права доступа при создании keytab-файла}}
== Создание SPN ==
== Создание SPN ==
=== DC Windows ===  
=== DC Windows ===  
Для начала необходимо создать на контроллере домена (DC) пользователя к которому впоследствии мы привяжем SPN.<br>
Для начала необходимо создать на контроллере домена (DC) пользователя к которому впоследствии будет привязан SPN.<br>
Например создадим пользователя squid:<br>
Например, создадим пользователя webauth:
[[Файл:Win user create.jpg]]<br>
 
Далее необходимо запретить пользователю смену пароля и не ограничивать срок действия пароля. Последнее важно, так как иначе при истечении срока действия пароля придется не только менять пароль, но и заново генерировать keytab-файлы привязанные к этому пользователю:<br>
[[Файл:Win_user_create.png|DC Windows. Создание пользователя]]
[[Файл:Win user options.jpg]]<br>
 
В целях безопасности рекомендуется исключить сервисного пользователя из доменных групп.<br>
Далее необходимо запретить пользователю смену пароля и не ограничивать срок действия пароля. Последнее важно, так как иначе при истечении срока действия пароля придется не только менять пароль, но и заново генерировать keytab-файлы привязанные к этому пользователю:
Создадим SPN для прокси-сервера squid HTTP/sqserver.domg.testg и привяжем его к пользователю squid.<br>
 
Для этого в командной строке на контроллере домена выполним следующую команду:
[[Файл:Win_user_options.png|DC Windows. Создание пользователя - пароль]]
<pre>C:\>setspn -A HTTP/sqserver.domg.testg squid
 
Регистрация ServicePrincipalNames для CN=squid,CN=Users,DC=domg,DC=testg
В целях безопасности рекомендуется исключить сервисного пользователя из доменных групп.
         HTTP/sqserver.domg.testg
 
Обновленный объект
Создать SPN для веб-сервера HTTP/web.win.alt и привязать его к пользователю webauth (этот шаг делать отдельно не обязательно, т.к. его автоматически выполняет утилита {{cmd|ktpass}} при создании keytab-файла).<br>
</pre>
Для этого в командной строке на контроллере домена выполнить следующую команду:
Проверить привязанные SPN у пользователя можно командой:
<syntaxhighlight lang="bash">C:\>setspn -A HTTP/web.win.alt webauth
<pre>C:\>setspn -L squid
Checking domain DC=win,DC=alt
Зарегистрирован ServicePrincipalNames для CN=squid3,CN=Users,DC=domg,DC=testg:
 
         HTTP/sqserver.domg.testg</pre>
Registered ServicePrincipalNames for CN=webauth,CN=Users,DC=win,DC=alt
         HTTP/web.win.alt
Updated object
</syntaxhighlight>
 
Вывести список SPN записей, привязанных к пользователю:
<syntaxhighlight lang="bash">C:\>setspn -L webauth
Registered ServicePrincipalNames for CN=webauth,CN=Users,DC=win,DC=alt:
         HTTP/web.win.alt</syntaxhighlight>
 
=== Samba DC ===
 
Создать пользователя, с которым будут связаны создаваемые SPN:
<syntaxhighlight lang="bash"># samba-tool user create --random-password webauth
# samba-tool user setexpiry webauth --noexpiry</syntaxhighlight>
 
Команда привязки SPN к пользователю (возможно несколько раз для разных сервисов):
<syntaxhighlight lang="bash"># samba-tool spn add <service-name>/<fdqn@KerberosRealm> <someuser></syntaxhighlight>
 
Привязать к пользователю SPN:
<syntaxhighlight lang="bash"># samba-tool spn add HTTP/web.test.alt webauth</syntaxhighlight>
 
=== DC FreeIPA ===
=== DC FreeIPA ===
Для добавления SPN зайдите в web-интерфейс сервера FreeIPA->Identity->Services->Add:<br>
Для добавления SPN необходимо в веб-интерфейсе сервера FreeIPA выбрать «Идентификация»→«Службы» и нажать кнопку «Добавить» «Identity»→«Services»→«Add»:
[[Файл:Add SPN FreeIPA 01.jpg|600px]]<br>
 
В открывшемся окне необходимо выбрать имя сервиса и имя хоста, к которому будет привязан сервис:<br>
[[Файл:Add SPN FreeIPA 01.png|FreeIPA. Добавление SPN]]
[[Файл:Add SPN FreeIPA 02.jpg|600px]]<br>
 
Чтобы добавить SPN с коротким именем хоста (например это необходимо для samba), выполните команду:
В открывшемся окне необходимо выбрать имя сервиса и имя узла, к которому будет привязан сервис:
<pre># ipa service-add cifs/samba --force</pre>
 
[[Файл:Add SPN FreeIPA 02.png|FreeIPA. Добавление SPN]]
 
Чтобы добавить SPN с коротким именем узла (например, это необходимо для samba), следует выполнить команду:
<syntaxhighlight lang="bash"># ipa service-add cifs/samba --force</syntaxhighlight>


== Генерирование keytab-файла ==
== Генерирование keytab-файла ==
Создать keytab-файл можно разными способами.<br>
Создать keytab-файл можно разными способами.<br>
Рассмотрим некоторые из них.<br>
Рассмотрим некоторые из них.<br>
=== На контроллере домена Windows 2008 R2 ===
=== На контроллере домена Windows ===
Необходимо выполнить следующую команду:
Чтобы создать keytab-файл необходимо выполнить следующую команду:
<pre>C:\>ktpass -princ HTTP/sqserver.domg.testg@DOMG.TESTG -mapuser squid -pass Pa$$word -ptype KRB5_NT_PRINCIPAL -out C:\squid.keytab
<syntaxhighlight lang="bash">C:\>ktpass -princ HTTP/web.wim.alt@WIN.ALT -mapuser webauth -pass Pa$$word -ptype KRB5_NT_PRINCIPAL -out C:\web.keytab
Targeting domain controller: dcd.domg.testg
Targeting domain controller: dc1.win.alt
Using legacy password setting method
Using legacy password setting method
Successfully mapped HTTP/sqserver.domg.testg to squid.
Successfully mapped HTTP/web.wim.alt to webauth.
Key created.
Key created.
Output keytab to C:\squid.keytab:
Output keytab to C:\web.keytab:
Keytab version: 0x502
Keytab version: 0x502
keysize 70 HTTP/sqserver.domg.testg@DOMG.TESTG ptype 1 (KRB5_NT_PRINCIPAL) vno 6
keysize 59 HTTP/web.wim.alt@WIN.ALT ptype 1 (KRB5_NT_PRINCIPAL) vno 6
  etype 0x17 (RC4-HMAC) keylength 16 (0x1a4b1757588cab6298e29e91c06df58d)</pre>
  etype 0x17 (RC4-HMAC) keylength 16 (0x1a4b1757588cab6298e29e91c06df58d)</syntaxhighlight>
Рассмотрим параметры команды подробнее:<br>
Где:
*'''-princ''' - имя принципала содержащее SPN и Kerberos-область (realm)
*'''-princ''' имя принципала содержащее SPN и Kerberos-область (realm);
*'''-mapuser''' - пользователь к которому привязывается SPN
*'''-mapuser''' пользователь к которому привязывается SPN;
*'''-pass''' - пароль пользователя
*'''-pass''' пароль пользователя;
*'''-ptype''' - указывает тип принципала (рекомендуется KRB5_NT_PRINCIPAL)
*'''-ptype''' указывает тип принципала (рекомендуется KRB5_NT_PRINCIPAL);
*'''-out''' - путь и имя генерируемого файла
*'''-out''' путь и имя генерируемого файла.
 
В результате выполнения данной команды будет создан keytab файл {{path|C:\web.keytab}} для SPN записи сервиса HTTP/web.win.alt. При этом SPN запись привязывается к учетной записи webauth с указанным паролем.
 
После привязки SPN к учетной записи, «Имя входа пользователя» («User logon name») в свойствах пользователя  станет равен SPN:
 
[[Файл:Win_user_logon.png|DC Windows. Свойства пользователя]]
 
В одном keytab-файле могут хранится ключи нескольких SPN. Дополнительные имена SPN и ключи добавляются в файл keytab с помощью отдельных параметров утилиты {{cmd|ktpass}} (-in, -setupn, -setpass).


=== На машине с ALT ===
=== На машине с ALT ===
==== С помощью ktutil ====
==== С помощью ktutil ====
Этот способ работает если SPN предварительно были созданы и привязаны.<br>
Этот способ работает если SPN предварительно были созданы и привязаны (например, см.[[Создание_SPN_и_Keytab_файла#Samba_DC]]).
Установим необходимый пакет:
 
<pre># apt-get install krb5-kadmin</pre>
Установить пакет {{pkg|krb5-kadmin}}:
Запустим ktutil и создадим keytab-файл:
<syntaxhighlight lang="bash"># apt-get install krb5-kadmin</syntaxhighlight>
<pre># ktutil
Запустить {{cmd|ktutil}} и создать keytab-файл:
ktutil:  addent -password -p HTTP/sqserver.domg.testg@DOMG.TESTG -k 6 -e RC4-HMAC
<syntaxhighlight lang="bash"># ktutil
Password for HTTP/sqserver.domg.testg@DOMG.TESTG:  
ktutil:  addent -password -p HTTP/web.test.alt@TEST.ALT -k 6 -e RC4-HMAC
ktutil:  wkt squid.keytab
Password for HTTP/web.test.alt@TEST.ALT:  
ktutil:  q</pre>
ktutil:  wkt web.keytab
ktutil:  q</syntaxhighlight>
 
==== С помощью Samba ====
==== С помощью Samba ====
Для создания keytab-файла с помощью samba, необходима работающая kerberos-аутентификация.<br>
Для создания keytab-файла с помощью samba, необходима работающая kerberos-аутентификация.
При использовании этого метода нет необходимости генерировать и привязывать SPN  на контроллере домена.<br>
 
Приведите файл настроек {{path|/etc/samba/smb.conf}} к следующему виду:
При использовании этого метода нет необходимости генерировать и привязывать SPN  на контроллере домена.
<pre>realm = DOMG.TESTG
 
workgroup = DOMG
Привести файл настроек {{path|/etc/samba/smb.conf}} к следующему виду:
server string = Samba server on %h (v. %v)
<syntaxhighlight lang="ini">realm = TEST.ALT
workgroup = TEST
security = ads
security = ads
dedicated keytab file = /etc/krb5.keytab
dedicated keytab file = /etc/krb5.keytab
kerberos method = dedicated keytab</pre>
kerberos method = dedicated keytab</syntaxhighlight>
Введите машину в домен:
 
<pre># net -v ads join DOMG.TESTG -UAdministrator
После ввода машины в домен в домене будет создан аккаунт компьютера к которому можно привязать SPN.
Using short domain name -- DOMG
 
Joined 'DOSERVER' to dns domain 'domg.testg'</pre>
Создать keytab-файл для компьютера:
Проверить ввод в домен можно командой:
<syntaxhighlight lang="bash"># net ads keytab create -UAdministrator
<pre># net ads testjoin
Password for [TEST\Administrator]:</syntaxhighlight>
Join is OK</pre>
Добавить в keytab-файл принципал сервиса "HTTP":
После этого в домене будет создан аккаунт компьютера к которому можно будет привязать SPN.<br>
<syntaxhighlight lang="bash"># net ads keytab add HTTP -U Administrator
Создадим keytab-файл для компьютера:
Processing principals to add...
<pre># net ads keytab create -UAdministrator</pre>
Password for [TEST\Administrator]:</syntaxhighlight>
Добавим в keytab-файл принципала сервиса "HTTP":
 
<pre># net ads keytab add HTTP -U Administrator
Processing principals to add...</pre>
Далее можно поменять права на keytab и отредактировать его утилитой kutil.
Далее можно поменять права на keytab и отредактировать его утилитой kutil.


==== С помощью Samba DC ====
==== С помощью Samba DC ====


При использовании этого метода kerberos ни при чём, а все действия выполняются на машине с домен-контроллером.
Этот способ работает если SPN предварительно были созданы и привязаны (например, см.[[Создание_SPN_и_Keytab_файла#Samba_DC]]).
 
Все действия выполняются на машине с домен-контроллером.


Создадим пользователя, с которым будем связывать создаваемые SPN:
Команда создания keytab:
samba-tool user create <someuser>
<syntaxhighlight lang="bash"># samba-tool domain exportkeytab /tmp/keytab --principal=<service-name>/<fdqn></syntaxhighlight>
samba-tool user setexpiry <someuser> --noexpiry


Привяжем к нему SPN:
Эту команду можно выполнить несколько раз для всех SPN, которые нужно поместить в keytab.
samba-tool spn add <service-name>/test.example.com <someuser>
(возможно несколько раз для разных сервисов)


создадим keytab:
Например, создать keytab:
samba-tool domain exportkeytab /tmp/keytab --principal=<service-name>/test.example.com
<syntaxhighlight lang="bash"># samba-tool domain exportkeytab /tmp/http.keytab --principal=HTTP/web.test.alt
(выполняем несколько раз для всех spn, которые хотим поместить в keytab)
Export one principal to /tmp/http.keytab</syntaxhighlight>


проверка:
Проверка:
klist -ke /tmp/keytab
<syntaxhighlight lang="bash"># klist -ke /tmp/http.keytab
  Keytab name: FILE:/etc/http.keytab
Keytab name: FILE:/tmp/http.keytab
  KVNO Principal
KVNO Principal
  ---- --------------------------------------------------------------------------
---- --------------------------------------------------------------------------
      1 host/test.address.com@INTRANET.COM (des-cbc-crc)
  2 HTTP/web.test.alt@TEST.ALT (DEPRECATED:arcfour-hmac)
      1 host/test.address.com@INTRANET.COM (des-cbc-md5)
</syntaxhighlight>
      1 host/test.address.com@INTRANET.COM (arcfour-hmac)  
      1 HTTP/test.address.com@INTRANET.COM (des-cbc-crc)
      1 HTTP/test.address.com@INTRANET.COM (des-cbc-md5)
      1 HTTP/test.address.com@INTRANET.COM (arcfour-hmac)


https://wiki.samba.org/index.php/Generating_Keytabs
https://wiki.samba.org/index.php/Generating_Keytabs


==== С помощью FreeIPA Client ====
==== С помощью FreeIPA Client ====
Для этого способа необходимо ввести машину в домен FreeIPA [[https://www.altlinux.org/FreeIPA#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0_FreeIPA_.D0.BA.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.D0.B8_.D0.BF.D0.BE.D0.B4.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BA_.D1.81.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83]]<br>
Для этого способа необходимо ввести машину в домен FreeIPA [[https://www.altlinux.org/FreeIPA/Клиент ]]
 
 
Для генерации keytab-файла используется команда:
Для генерации keytab-файла используется команда:
<pre># ipa-getkeytab -s dc.ipa.server.ru -p HTTP/httpserver.ipa.server.ru -k /etc/http.keytab</pre>
<syntaxhighlight lang="bash"># ipa-getkeytab -s <FreeIPA_сервер> -p <SPN> -k <keytab-файл>
Где:<br>
</syntaxhighlight>
*dc.ipa.server.ru - FreeIPA сервер
 
*HTTP/httpserver.ipa.server.ru - SPN
Пример генерации keytab-файла (предварительно необходимо выполнить аутентификацию в качестве учетной записи администратора домена)
*/etc/http.keytab - куда запишется keytab
<syntaxhighlight lang="bash"># kinit admin
Password for admin@EXAMPLE.TEST:
# ipa-getkeytab -s ipa.example.test -p HTTP/web.example.test -k /tmp/http.keytab
Таблица ключей успешно получена и сохранена в: /tmp/http.keytab</syntaxhighlight>
 
Содержимое файла keytab  можно просмотреть с помощью команды {{cmd|klist}}:
<syntaxhighlight lang="bash"># klist -ekt /tmp/http.keytab
Keytab name: FILE:/tmp/http.keytab
KVNO Timestamp          Principal
---- ------------------- ------------------------------------------------------
  1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes256-cts-hmac-sha384-192)
  1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes128-cts-hmac-sha256-128)
  1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes256-cts-hmac-sha1-96)
  1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes128-cts-hmac-sha1-96)
</syntaxhighlight>


== Проверка keytab-файла ==
== Проверка keytab-файла ==
Для проверки keytab-файла необходима настроенная Kerberos-аутентификация.<br>
Для проверки keytab-файла необходима настроенная Kerberos-аутентификация.<br>
Это можно проверить командой:
Это можно проверить командой:
<pre># kinit Administrator@DOMG.TESTG</pre>
<syntaxhighlight lang="bash"># kinit administrator@TEST.ALT</syntaxhighlight>
Она должна запрашивать пароль и получать билет:
Она должна запрашивать пароль и получать билет:
<pre># klist
<syntaxhighlight lang="bash"># klist
Ticket cache: KEYRING:persistent:0:0
Ticket cache: KEYRING:persistent:0:0
Default principal: Administrator@DOMG.TESTG
Default principal: administrator@TEST.ALT
 
Valid starting      Expires              Service principal
Valid starting      Expires              Service principal
14.03.2017 16:45:58 15.03.2017 02:45:58 krbtgt/DOMG.TESTG@DOMG.TESTG
03.05.2023 10:11:20 03.05.2023 20:11:20 krbtgt/TEST.ALT@TEST.ALT
renew until 21.03.2017 16:44:36</pre>
renew until 10.05.2023 10:11:15</syntaxhighlight>
Попробуем зарегистрироваться с помощью keytab-файла:
Попробуем зарегистрироваться с помощью keytab-файла:
<pre># kinit -V -k HTTP/sqserver.domg.testg -t /home/test/squid.keytab
<syntaxhighlight lang="bash"># kinit -5 -V -k -t /tmp/web.keytab HTTP/test.alt
Using existing cache: persistent:0:krb_ccache_95Lkl2t
Using default cache: /tmp/krb5cc_0
Using principal: HTTP/sqserver.domg.testg@DOMG.TESTG
Using principal: HTTP/test.alt@TEST.ALT
Using keytab: /home/test/squid.keytab
Using keytab: /tmp/web.keytab
Authenticated to Kerberos v5</pre>
Authenticated to Kerberos v5</syntaxhighlight>
{{note|Если при проверке авторизации возникает ошибка:
kinit: Client not found in Kerberos database while getting initial credentials
Необходимо, например в [[ADMC]], изменить для пользователя значение параметра userPrincipalName на значение servicePrincipalName + REALM (в данном примере нужно поменять webauth на HTTP/test.alt@TEST.ALT).
 
Это происходит потому что {{cmd|samba-tool}}, в отличии от привязки SPN к учетной записи в Windows, не меняет userPrincipalName (Имя входа пользователя) в свойствах пользователя на SPN.
 
https://serverfault.com/questions/606189/keytab-auth-against-samba-4-dc-client-not-found-in-kerberos-database-while-gett
}}
 
Проверить версию ключей на сервере можно, предварительно получив билет, с помощью команды:
Проверить версию ключей на сервере можно, предварительно получив билет, с помощью команды:
<pre># kvno HTTP/sqserver.domg.testg
<syntaxhighlight lang="bash"># kvno HTTP/test.alt@TEST.ALT
HTTP/sqserver.domg.testg@DOMG.TESTG: kvno = 6</pre>
HTTP/test.alt@TEST.ALT: kvno = 2</syntaxhighlight>
Проверить версию kvno и список ключей в keytab-файле можно с помощью команды:
Проверить версию kvno и список ключей в keytab-файле можно с помощью команды (по умолчанию для файла {{path|/etc/krb5.keytab}}):
<pre># klist -ket /home/test/squid.keytab
<syntaxhighlight lang="bash"># klist -ket</syntaxhighlight>
Keytab name: FILE:/home/test/squid.keytab
или
<syntaxhighlight lang="bash"># klist -ket /etc/nginx/web.keytab
Keytab name: FILE:/etc/nginx/web.keytab
KVNO Timestamp          Principal
KVNO Timestamp          Principal
---- ------------------- ------------------------------------------------------
---- ------------------- ------------------------------------------------------
   6 01.01.1970 03:00:00 HTTP/sqserver.domg.testg@DOMG.TESTG (arcfour-hmac)</pre>
   2 30.04.2023 12:41:07 HTTP/dc.test.alt@TEST.ALT (DEPRECATED:arcfour-hmac)
  2 30.04.2023 13:34:31 HTTP/test.alt@TEST.ALT (DEPRECATED:arcfour-hmac)</syntaxhighlight>
После всех проверок желательно удалить полученные билеты командой:
После всех проверок желательно удалить полученные билеты командой:
<pre># kdestroy</pre>
<syntaxhighlight lang="bash"># kdestroy</syntaxhighlight>
[[Категория:Active Directory]]
[[Категория:Active Directory]]
[[Категория:FreeIPA]]

Текущая версия от 15:30, 12 ноября 2023

Введение

Многие сервисы (apache, nginx и др.) могут использовать keytab-файлы для Kerberos аутентификации в домене без ввода пароля. SSO-аутентификация избавляет доменного пользователя от повторных запросов на прохождение аутентификации. Пользователь вводит доменный логин/пароль всего один раз — при логоне в операционную систему.

SPN (Service Principal Name) — уникальный идентификатор экземпляра сервиса. SPN используется аутентификацией Kerberos для сопоставления экземпляра сервиса с учетной записью сервиса (service logon account). Это позволяет клиентским приложением аутентифицироваться в роли сервиса даже не зная имени пользователя.
До того как аутентификация Kerberos сможет использовать SPN для аутентификации сервиса, SPN должен быть привязан к учетной записи, которая будет использоваться для входа. SPN может быть привязан только к одной учетной записи. Если учетная запись, привязанная к SPN, изменяется, то необходимо заново выполнить привязку.
Когда клиент хочет воспользоваться сервисом, он находит экземпляр сервиса и составляет SPN для этого экземпляра, далее использует этот SPN для аутентификации.

Keytab-файл — это файл содержащий пары Kerberos принципалов и их ключей (полученных с использованием Kerberos пароля). Эти файлы используются для аутентификации в системах, использующих Kerberos, без ввода пароля. Если пароль принципала изменится, то keytab-файл необходимо будет сгенерировать заново.

Внимание! Каждый кто имеет разрешения на чтения keytab-файла может воспользоваться любыми ключами в нем. Чтобы предотвратить нежелательное использование, ограничивайте права доступа при создании keytab-файла


Создание SPN

DC Windows

Для начала необходимо создать на контроллере домена (DC) пользователя к которому впоследствии будет привязан SPN.
Например, создадим пользователя webauth:

DC Windows. Создание пользователя

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

DC Windows. Создание пользователя - пароль

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

Создать SPN для веб-сервера HTTP/web.win.alt и привязать его к пользователю webauth (этот шаг делать отдельно не обязательно, т.к. его автоматически выполняет утилита ktpass при создании keytab-файла).
Для этого в командной строке на контроллере домена выполнить следующую команду:

C:\>setspn -A HTTP/web.win.alt webauth
Checking domain DC=win,DC=alt

Registered ServicePrincipalNames for CN=webauth,CN=Users,DC=win,DC=alt
        HTTP/web.win.alt
Updated object

Вывести список SPN записей, привязанных к пользователю:

C:\>setspn -L webauth
Registered ServicePrincipalNames for CN=webauth,CN=Users,DC=win,DC=alt:
        HTTP/web.win.alt

Samba DC

Создать пользователя, с которым будут связаны создаваемые SPN:

# samba-tool user create --random-password webauth
# samba-tool user setexpiry webauth --noexpiry

Команда привязки SPN к пользователю (возможно несколько раз для разных сервисов):

# samba-tool spn add <service-name>/<fdqn@KerberosRealm> <someuser>

Привязать к пользователю SPN:

# samba-tool spn add HTTP/web.test.alt webauth

DC FreeIPA

Для добавления SPN необходимо в веб-интерфейсе сервера FreeIPA выбрать «Идентификация»→«Службы» и нажать кнопку «Добавить» «Identity»→«Services»→«Add»:

FreeIPA. Добавление SPN

В открывшемся окне необходимо выбрать имя сервиса и имя узла, к которому будет привязан сервис:

FreeIPA. Добавление SPN

Чтобы добавить SPN с коротким именем узла (например, это необходимо для samba), следует выполнить команду:

# ipa service-add cifs/samba --force

Генерирование keytab-файла

Создать keytab-файл можно разными способами.
Рассмотрим некоторые из них.

На контроллере домена Windows

Чтобы создать keytab-файл необходимо выполнить следующую команду:

C:\>ktpass -princ HTTP/web.wim.alt@WIN.ALT -mapuser webauth -pass Pa$$word -ptype KRB5_NT_PRINCIPAL -out C:\web.keytab
Targeting domain controller: dc1.win.alt
Using legacy password setting method
Successfully mapped HTTP/web.wim.alt to webauth.
Key created.
Output keytab to C:\web.keytab:
Keytab version: 0x502
keysize 59 HTTP/web.wim.alt@WIN.ALT ptype 1 (KRB5_NT_PRINCIPAL) vno 6
 etype 0x17 (RC4-HMAC) keylength 16 (0x1a4b1757588cab6298e29e91c06df58d)

Где:

  • -princ — имя принципала содержащее SPN и Kerberos-область (realm);
  • -mapuser — пользователь к которому привязывается SPN;
  • -pass — пароль пользователя;
  • -ptype — указывает тип принципала (рекомендуется KRB5_NT_PRINCIPAL);
  • -out — путь и имя генерируемого файла.

В результате выполнения данной команды будет создан keytab файл C:\web.keytab для SPN записи сервиса HTTP/web.win.alt. При этом SPN запись привязывается к учетной записи webauth с указанным паролем.

После привязки SPN к учетной записи, «Имя входа пользователя» («User logon name») в свойствах пользователя станет равен SPN:

DC Windows. Свойства пользователя

В одном keytab-файле могут хранится ключи нескольких SPN. Дополнительные имена SPN и ключи добавляются в файл keytab с помощью отдельных параметров утилиты ktpass (-in, -setupn, -setpass).

На машине с ALT

С помощью ktutil

Этот способ работает если SPN предварительно были созданы и привязаны (например, см.Создание_SPN_и_Keytab_файла#Samba_DC).

Установить пакет krb5-kadmin:

# apt-get install krb5-kadmin

Запустить ktutil и создать keytab-файл:

# ktutil
ktutil:  addent -password -p HTTP/web.test.alt@TEST.ALT -k 6 -e RC4-HMAC
Password for HTTP/web.test.alt@TEST.ALT: 
ktutil:  wkt web.keytab
ktutil:  q

С помощью Samba

Для создания keytab-файла с помощью samba, необходима работающая kerberos-аутентификация.

При использовании этого метода нет необходимости генерировать и привязывать SPN на контроллере домена.

Привести файл настроек /etc/samba/smb.conf к следующему виду:

realm = TEST.ALT
workgroup = TEST
security = ads
dedicated keytab file = /etc/krb5.keytab
kerberos method = dedicated keytab

После ввода машины в домен в домене будет создан аккаунт компьютера к которому можно привязать SPN.

Создать keytab-файл для компьютера:

# net ads keytab create -UAdministrator
Password for [TEST\Administrator]:

Добавить в keytab-файл принципал сервиса "HTTP":

# net ads keytab add HTTP -U Administrator
Processing principals to add...
Password for [TEST\Administrator]:

Далее можно поменять права на keytab и отредактировать его утилитой kutil.

С помощью Samba DC

Этот способ работает если SPN предварительно были созданы и привязаны (например, см.Создание_SPN_и_Keytab_файла#Samba_DC).

Все действия выполняются на машине с домен-контроллером.

Команда создания keytab:

# samba-tool domain exportkeytab /tmp/keytab --principal=<service-name>/<fdqn>

Эту команду можно выполнить несколько раз для всех SPN, которые нужно поместить в keytab.

Например, создать keytab:

# samba-tool domain exportkeytab /tmp/http.keytab --principal=HTTP/web.test.alt
Export one principal to /tmp/http.keytab

Проверка:

# klist -ke /tmp/http.keytab
Keytab name: FILE:/tmp/http.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 HTTP/web.test.alt@TEST.ALT (DEPRECATED:arcfour-hmac)

https://wiki.samba.org/index.php/Generating_Keytabs

С помощью FreeIPA Client

Для этого способа необходимо ввести машину в домен FreeIPA [[1]]


Для генерации keytab-файла используется команда:

# ipa-getkeytab -s <FreeIPA_сервер> -p <SPN> -k <keytab-файл>

Пример генерации keytab-файла (предварительно необходимо выполнить аутентификацию в качестве учетной записи администратора домена)

# kinit admin
Password for admin@EXAMPLE.TEST:
# ipa-getkeytab -s ipa.example.test -p HTTP/web.example.test -k /tmp/http.keytab
Таблица ключей успешно получена и сохранена в: /tmp/http.keytab

Содержимое файла keytab можно просмотреть с помощью команды klist:

# klist -ekt /tmp/http.keytab
Keytab name: FILE:/tmp/http.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes256-cts-hmac-sha384-192) 
   1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes128-cts-hmac-sha256-128) 
   1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes256-cts-hmac-sha1-96) 
   1 02.05.2023 14:38:18 HTTP/web.example.test@EXAMPLE.TEST (aes128-cts-hmac-sha1-96)

Проверка keytab-файла

Для проверки keytab-файла необходима настроенная Kerberos-аутентификация.
Это можно проверить командой:

# kinit administrator@TEST.ALT

Она должна запрашивать пароль и получать билет:

# klist
Ticket cache: KEYRING:persistent:0:0
Default principal: administrator@TEST.ALT

Valid starting       Expires              Service principal
03.05.2023 10:11:20  03.05.2023 20:11:20  krbtgt/TEST.ALT@TEST.ALT
	renew until 10.05.2023 10:11:15

Попробуем зарегистрироваться с помощью keytab-файла:

# kinit -5 -V -k -t /tmp/web.keytab HTTP/test.alt
Using default cache: /tmp/krb5cc_0
Using principal: HTTP/test.alt@TEST.ALT
Using keytab: /tmp/web.keytab
Authenticated to Kerberos v5
Примечание: Если при проверке авторизации возникает ошибка:
kinit: Client not found in Kerberos database while getting initial credentials

Необходимо, например в ADMC, изменить для пользователя значение параметра userPrincipalName на значение servicePrincipalName + REALM (в данном примере нужно поменять webauth на HTTP/test.alt@TEST.ALT).

Это происходит потому что samba-tool, в отличии от привязки SPN к учетной записи в Windows, не меняет userPrincipalName (Имя входа пользователя) в свойствах пользователя на SPN.

https://serverfault.com/questions/606189/keytab-auth-against-samba-4-dc-client-not-found-in-kerberos-database-while-gett


Проверить версию ключей на сервере можно, предварительно получив билет, с помощью команды:

# kvno HTTP/test.alt@TEST.ALT
HTTP/test.alt@TEST.ALT: kvno = 2

Проверить версию kvno и список ключей в keytab-файле можно с помощью команды (по умолчанию для файла /etc/krb5.keytab):

# klist -ket

или

# klist -ket /etc/nginx/web.keytab
Keytab name: FILE:/etc/nginx/web.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   2 30.04.2023 12:41:07 HTTP/dc.test.alt@TEST.ALT (DEPRECATED:arcfour-hmac) 
   2 30.04.2023 13:34:31 HTTP/test.alt@TEST.ALT (DEPRECATED:arcfour-hmac)

После всех проверок желательно удалить полученные билеты командой:

# kdestroy