Это старая версия документа.
Kerberos
Kerberos это система сетевой аутентифиации, основанная на принципах доверия третьей стороне. Другие две стороны - это пользователь и сервис, на котором он хочет авторизоваться. Не все сервисы и приложения могут использовать Kerberos, но те, которые могут, приближают сетевое окружение на один шаг к технологии единого входа (Single Sign On - SSO).
Этот раздел раскрывает установку и настройку сервера Kerberos, а также некоторые примеры клиентских настроек.
Обзор
Если вы новичок в Kerberos, есть несколько терминов, которые хорошо понять до установки сервера Kerberos. Большинство терминов связаны с вещами, которые могут быть вам знакомы по другим окружениям:
Учетная запись (Principal): любые пользователи, компьютеры или сервисы, предоставляемые серверами, должны быть определены как учетные записи Kerberos .
Требования (Instances): используются для сервисных и специальных административных учетных записей.
Области (Realms): уникальная область управления, обеспечиваемая установкой Kerberos. Представляйте ее себе как домен или группу ваших компьютеров и пользователей, ей принадлежащих. По умолчанию Ubuntu использует имя DNS домена в верхнем регистре (EXAMPLE.COM) в качестве имени области.
Центр распространения ключей (KDC): состоит из трех частей: базы данных всех учетных записей, сервера аутентификации и сервера предоставления билетов. Для каждой области должен быть хотя бы один KDC.
Билет для получения билета (TGT): изданный сервером аутентификации, TGT зашифровывается на пароле пользователя, который известен только пользователю и KDC.
Сервер распространения билетов (TGS): выпускает сервисные билеты для клиентов по запросу.
Билеты (Tickets): подтверждение идентичности двух учетных записей. Одна учетная запись - пользователь, а другая - сервис, запрашиваемый этим пользователем. Билеты устанавливают секретный ключ, используемый для защищенного соединения во время авторизованной сессии.
Файлы ключей (Keytab Files): файлы, извлеченные из базы учетных записей KDC и содержащие ключ шифрования для сервиса или компьютера.
Чтобы сложить все вместе: Область содержит как минимум один KDC, лучше больше для обеспечения безотказности, которые содержат базу данных учетных записей. Когда пользователь под учетной записью заходит на рабочую станцию, которая настроена на Kerberos аутентификацию, KDC выпускает билет для получения билетов (TGT). Если пользователь предоставляет совпадающие параметры, он считается аутентифицированным и может запрашивать билеты для сервисов, поддерживающих Kerberos, на сервере распространения билетов (TGS). Сервисные билеты позволяют пользователю аутентифицироваться на сервисах без ввода имени и пароля.
Сервер Kerberos
Установка
Для данного обсуждения мы создадим домен MIT Kerberos со следующими параметрами (изменяйте их для соответствия вашим требованиям):
Область: EXAMPLE.COM
Первичный KDC: kdc01.example.com (192.168.0.1)
Вторичный KDC: kdc02.example.com (192.168.0.2)
Учетная запись пользователя: steve
Учетная запись администратора: steve/admin
Перед установкой сервера Kerberos требуется правильно настроить DNS сервер для вашего домена. Поскольку область Kerberos по соглашению совпадает с именем домена, этот раздел использует домен EXAMPLE.COM, настроенный как Primary Master по документации DNS.
Кроме того, Kerberos - протокол, зависимый от времени. Поэтому если локальное время системы на клиентской машине и на сервере отличается более чем на 5 минут (по умолчанию), рабочая станция не будет аутентифицирована. Для решения проблемы все узлы сети должны синхронизировать свое время по одному серверу NTP. Детали настройки NTP смотрите в разделе Синхронизация времени по NTP.
Первый шаг по созданию области Kerberos - это установка пакетов krb5-kdc и krb5-admin-server. Введите в терминале:
sudo apt-get install krb5-kdc krb5-admin-server
В конце установки у вас запросят сетевые имена серверов Kerberos и административного, которые могут быть одним и тем же или разными серверами для определенной области.
Далее создаем новую область с помощью утилиты kdb5_newrealm:
sudo krb5_newrealm
Настройка
Вопросы, задаваемые в процессе установки, используются для настройки файла /etc/krb5.conf. Если вам требуется скорректировать настройки KDC, просто измените файл и перезапустите сервис krb5-kdc. Если вам требуется перенастроить Kerberos сначала, возможно для изменения имени области, вы можете это сделать набрав следующее:
sudo dpkg-reconfigure krb5-kdc
Как только KDC запущен правильно, требуется административный пользователь (учетная запись администратора). Рекомендуется использовать имя пользователя, отличное от вашего повседневного пользователя. Для использования утилиты kadmin.local, наберите терминале:
sudo kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin.local: addprinc steve/admin WARNING: no policy specified for steve/admin@EXAMPLE.COM; defaulting to no policy Enter password for principal "steve/admin@EXAMPLE.COM": Re-enter password for principal "steve/admin@EXAMPLE.COM": Principal "steve/admin@EXAMPLE.COM" created. kadmin.local: quit
В примере выше steve - учетная запись, /admin - требование, а @EXAMPLE.COM - определяет область. "Ежедневная" учетная запись, она же пользовательская - steve@EXAMPLE.COM и она будет иметь только обычные права пользователя.
Далее, новому пользователю-администратору требуется предоставить соответствующие права доступа ACL. Права настраиваются в файле /etc/krb5kdc/kadm5.acl:
steve/admin@EXAMPLE.COM *
Эта запись предоставляет для steve/admin возможность выполнять любые операции над любыми учетными записями в этой области. Вы можете настроить учетные записи более ограниченными правами, которые удобны если вам требуется учетная запись младшего администратора, которую можно использовать на клиентах Kerberos. Пожалуйста, посмотрите страницу руководства (man) по kadm5.acl.
Теперь перезапустите krb5-admin-server чтобы применились новые ACL:
sudo /etc/init.d/krb5-admin-server restart
Новая пользовательская учетная запись может быть протестирована утилитой kinit:
kinit steve/admin steve/admin@EXAMPLE.COM's Password:
После ввода пароля используйте утилиту klist чтобы увидеть информацию о билете для получения билетов (TGT):
klist Credentials cache: FILE:/tmp/krb5cc_1000 Principal: steve/admin@EXAMPLE.COM Issued Expires Principal Jul 13 17:53:34 Jul 14 03:53:34 krbtgt/EXAMPLE.COM@EXAMPLE.COM
где имя файла кэша krb5cc_1000 составлено из префикса krb5cc_ и id пользователя (uid), который в нашем случае 1000. У вас может возникнуть необходимость добавить запись в /etc/hosts для KDC чтобы клиент мог его найти. Например:
192.168.0.1 kdc01.example.com kdc01
Замените 192.168.0.1 на IP адрес вашего KDC. Обычно такое требуется, когда ваша Kerberos область охватывает различные сети, разделенные роутерами.
Лучший способ позволить клиентам автоматически определить KDC для области это использование SRV записей DNS. Добавьте следующие записи в /etc/named/db.example.com:
_kerberos._udp.EXAMPLE.COM. IN SRV 1 0 88 kdc01.example.com. _kerberos._tcp.EXAMPLE.COM. IN SRV 1 0 88 kdc01.example.com. _kerberos._udp.EXAMPLE.COM. IN SRV 10 0 88 kdc02.example.com. _kerberos._tcp.EXAMPLE.COM. IN SRV 10 0 88 kdc02.example.com. _kerberos-adm._tcp.EXAMPLE.COM. IN SRV 1 0 749 kdc01.example.com. _kpasswd._udp.EXAMPLE.COM. IN SRV 1 0 464 kdc01.example.com.
Смотрите Служба доменных имен (DNS) для детальных инструкций по настройке DNS.
Ваша новая область Kerberos теперь готова аутентифицировать клиентов.
Вторичный KDC
Когда у вас есть один центр распространения ключей (KDC) в сети, хорошей практикой является создание вторичного KDC на случай, если первичный будет недоступен. Также, если у вас Kerberos клиенты расположены в различных сетях (возможно разделенные роутерами, использующими NAT), разумно будет поместить вторичные KDC в каждую такую сеть.
Сначала установим пакеты и на вопросы о Kerberos и административном серверах введем имя первичного KDC:
sudo apt-get install krb5-kdc krb5-admin-server
Как только пакеты установлены, создавайте учетную запись вторичного KDC. Из терминала набираем:
kadmin -q "addprinc -randkey host/kdc02.example.com"
Извлекаем файл ключей:
kadmin -q "ktadd -norandkey -k keytab.kdc02 host/kdc02.example.com"
Теперь в текущем каталоге появился keytab.kdc02, переместите его в /etc/krb5.keytab:
sudo mv keytab.kdc02 /etc/krb5.keytab
Также вы можете вывести список учетных записей в файл keytab, который может быть полезен при решении проблем, используя утилиту klist:
sudo klist -k /etc/krb5.keytab
Опция -k показывает, что это keytab файл.
Затем на каждом KDC должен быть файл kpropd.acl, который содержит список всех KDC в области. В нашем примере на первичном и вторичном KDC создайте /etc/krb5kdc/kpropd.acl:
host/kdc01.example.com@EXAMPLE.COM host/kdc02.example.com@EXAMPLE.COM
Создаем пустую базу данных на вторичном KDC:
sudo kdb5_util -s create
Now start the kpropd daemon, which listens for connections from the kprop utility. kprop is used to transfer dump files:
sudo kpropd -S
From a terminal on the Primary KDC, create a dump file of the principal database:
sudo kdb5_util dump /var/lib/krb5kdc/dump
Extract the Primary KDC's keytab file and copy it to /etc/krb5.keytab:
kadmin -q "ktadd -k keytab.kdc01 host/kdc01.example.com" sudo mv keytab.kdc01 /etc/krb5.keytab
Make sure there is a host for kdc01.example.com before extracting the Keytab.
Using the kprop utility push the database to the Secondary KDC:
sudo kprop -r EXAMPLE.COM -f /var/lib/krb5kdc/dump kdc02.example.com
There should be a SUCCEEDED message if the propagation worked. If there is an error message check /var/log/syslog on the secondary KDC for more information.
You may also want to create a cron job to periodically update the database on the Secondary KDC. For example, the following will push the database every hour (note the long line has been split to fit the format of this document):
# m h dom mon dow command 0 * * * * /usr/sbin/kdb5_util dump /var/lib/krb5kdc/dump && /usr/sbin/kprop -r EXAMPLE.COM -f /var/lib/krb5kdc/dump kdc02.example.com
Back on the Secondary KDC, create a stash file to hold the Kerberos master key:
sudo kdb5_util stash
Finally, start the krb5-kdc daemon on the Secondary KDC:
sudo /etc/init.d/krb5-kdc start
The Secondary KDC should now be able to issue tickets for the Realm. You can test this by stopping the krb5-kdc daemon on the Primary KDC, then by using kinit to request a ticket. If all goes well you should receive a ticket from the Secondary KDC. Otherwise, check /var/log/syslog and /var/log/auth.log in the Secondary KDC.
Линукс клиент Kerberos
This section covers configuring a Linux system as a Kerberos client. This will allow access to any kerberized services once a user has successfully logged into the system.
Установка
In order to authenticate to a Kerberos Realm, the krb5-user and libpam-krb5 packages are needed, along with a few others that are not strictly necessary but make life easier. To install the packages enter the following in a terminal prompt:
sudo apt-get install krb5-user libpam-krb5 libpam-ccreds auth-client-config
The auth-client-config package allows simple configuration of PAM for authentication from multiple sources, and the libpam-ccreds will cache authentication credentials allowing you to login in case the Key Distribution Center (KDC) is unavailable. This package is also useful for laptops that may authenticate using Kerberos while on the corporate network, but will need to be accessed off the network as well.
Настройка
To configure the client in a terminal enter:
sudo dpkg-reconfigure krb5-config
You will then be prompted to enter the name of the Kerberos Realm. Also, if you don't have DNS configured with Kerberos SRV records, the menu will prompt you for the hostname of the Key Distribution Center (KDC) and Realm Administration server.
The dpkg-reconfigure adds entries to the /etc/krb5.conf file for your Realm. You should have entries similar to the following:
[libdefaults]
default_realm = EXAMPLE.COM
… [realms]
EXAMPLE.COM = } kdc = 192.168.0.1 admin_server = 192.168.0.1 }
If you set the uid of each of your network-authenticated users to start at 5000, as suggested in Installation, you can then tell pam to only try to authenticate using Kerberos users with uid > 5000:
# Kerberos should only be applied to ldap/kerberos users, not local ones. for i in common-auth common-session common-account common-password; do sudo sed -i -r \ -e 's/pam_krb5.so minimum_uid=1000/pam_krb5.so minimum_uid=5000/' \ /etc/pam.d/$i done
This will avoid being asked for the (non-existent) Kerberos password of a locally authenticated user when changing its password using passwd.
You can test the configuration by requesting a ticket using the kinit utility. For example:
kinit steve@EXAMPLE.COM Password for steve@EXAMPLE.COM:
When a ticket has been granted, the details can be viewed using klist:
klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: steve@EXAMPLE.COM
Valid starting Expires Service principal 07/24/08 05:18:56 07/24/08 15:18:56 krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until 07/25/08 05:18:57
Kerberos 4 ticket cache: /tmp/tkt1000 klist: You have no tickets cached
Next, use the auth-client-config to configure the libpam-krb5 module to request a ticket during login:
sudo auth-client-config -a -p kerberos_example
You will should now receive a ticket upon successful login authentication.
Ссылки
For more information on MIT's version of Kerberos, see the MIT Kerberos site.
The Ubuntu Wiki Kerberos page has more details.
O'Reilly's Kerberos: The Definitive Guide is a great reference when setting up Kerberos.
Also, feel free to stop by the #ubuntu-server and #kerberos IRC channels on Freenode if you have Kerberos questions.