Это старая версия документа.


Kerberos

Kerberos это система сетевой аутентифиации, основанная на принципах доверия третьей стороне. Другие две стороны - это пользователь и сервис, на котором он хочет авторизоваться. Не все сервисы и приложения могут использовать Kerberos, но те, которые могут, приближают сетевое окружение на один шаг к технологии единого входа (Single Sign On - SSO).

Этот раздел раскрывает установку и настройку сервера Kerberos, а также некоторые примеры клиентских настроек.

Обзор

Если вы новичок в Kerberos, есть несколько терминов, которые хорошо понять до установки сервера Kerberos. Большинство терминов связаны с вещами, которые могут быть вам знакомы по другим окружениям:

  1. Учетная запись (Principal): любые пользователи, компьютеры или сервисы, предоставляемые серверами, должны быть определены как учетные записи Kerberos .

  2. Требования (Instances): используются для сервисных и специальных административных учетных записей.

  3. Области (Realms): уникальная область управления, обеспечиваемая установкой Kerberos. Представляйте ее себе как домен или группу ваших компьютеров и пользователей, ей принадлежащих. По умолчанию Ubuntu использует имя DNS домена в верхнем регистре (EXAMPLE.COM) в качестве имени области.

  4. Центр распространения ключей (KDC): состоит из трех частей: базы данных всех учетных записей, сервера аутентификации и сервера предоставления билетов. Для каждой области должен быть хотя бы один KDC.

  5. Билет для получения билета (TGT): изданный сервером аутентификации, TGT зашифровывается на пароле пользователя, который известен только пользователю и KDC.

  6. Сервер распространения билетов (TGS): выпускает сервисные билеты для клиентов по запросу.

  7. Билеты (Tickets): подтверждение идентичности двух учетных записей. Одна учетная запись - пользователь, а другая - сервис, запрашиваемый этим пользователем. Билеты устанавливают секретный ключ, используемый для защищенного соединения во время авторизованной сессии.

  8. Файлы ключей (Keytab Files): файлы, извлеченные из базы учетных записей KDC и содержащие ключ шифрования для сервиса или компьютера.

Чтобы сложить все вместе: Область содержит как минимум один KDC, лучше больше для обеспечения безотказности, которые содержат базу данных учетных записей. Когда пользователь под учетной записью заходит на рабочую станцию, которая настроена на Kerberos аутентификацию, KDC выпускает билет для получения билетов (TGT). Если пользователь предоставляет совпадающие параметры, он считается аутентифицированным и может запрашивать билеты для сервисов, поддерживающих Kerberos, на сервере распространения билетов (TGS). Сервисные билеты позволяют пользователю аутентифицироваться на сервисах без ввода имени и пароля.

Сервер Kerberos

Установка

Протокол Kerberos разработан в Масачусетском технологическом университете (MIT), поэтому полное название протокола MIT Kerberos. (прим. переводчика).

Для данного обсуждения мы создадим домен MIT Kerberos со следующими параметрами (изменяйте их для соответствия вашим требованиям):

  1. Область: EXAMPLE.COM

  2. Первичный KDC: kdc01.example.com (192.168.0.1)

  3. Вторичный KDC: kdc02.example.com (192.168.0.2)

  4. Учетная запись пользователя: steve

  5. Учетная запись администратора: steve/admin

Настоятельно рекомендуется, чтобы ваши авторизованные в сети пользователи имели uid в отдельном диапазоне от ваших локальных пользователей (скажем, начиная с 5000).

Перед установкой сервера 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 и административного, которые могут быть одним и тем же или разными серверами для определенной области.

По умолчанию область создается из доменного имени KDC.

Далее создаем новую область с помощью утилиты 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 и она будет иметь только обычные права пользователя.

Замените EXAMPLE.COM и steve на ваши имена области и администратора.
  • Далее, новому пользователю-администратору требуется предоставить соответствующие права доступа 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.
Замените EXAMPLE.COM, kdc01 и kdc02 на ваши имя домена, первичный и вторичный KDC

Смотрите Служба доменных имен (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, у вас будет запрашиваться пароль вашей учетной записи username/admin@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.kdc02 иной, замените соответственно.

Также вы можете вывести список учетных записей в файл 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
  • Теперь запускаем сервис kpropd, который слушает соединения от утилиты kprop. kprop используется для передачи файлов выгрузки данных:

sudo kpropd -S
  • Из терминала на первичном KDC создаем файл выгрузки для базы данных учетных записей:

sudo kdb5_util dump /var/lib/krb5kdc/dump
  • Извлекаем keytab файл первичного KDC и копируем его в /etc/krb5.keytab:

    kadmin -q "ktadd -k keytab.kdc01 host/kdc01.example.com"
    sudo mv keytab.kdc01 /etc/krb5.keytab
Убедитесь, что это host для kdc01.example.com, перед извлечением Keytab.
  • Используя утилиту kprop, загрузите базу данных на вторичный KDC:

sudo kprop -r EXAMPLE.COM -f /var/lib/krb5kdc/dump kdc02.example.com
Должно вернуться сообщение SUCCEEDED если распространение сработало. Если вернулось сообщени об ошибке, проверьте /var/log/syslog на вторичном KDC для дополнительной информации.

Вы можете также создать задачу cron для периодического обновления базы данных на вторичных KDC. Например, следующий код будет выгружать базу данных каждый час (обратите внимание, что длинная строка разделена чтобы соответствовать формату документа):

    # 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
  • Вернемся на вторичный KDC, создадим скрытый (stash) файл для хранения Kerberos master key (главного ключа Kerberos):

sudo kdb5_util stash
  • Под конец запустим сервис krb5-kdc на вторичном KDC:

sudo /etc/init.d/krb5-kdc start

Вторичный KDC теперь должен иметь возможность выдавать билеты для своей области. Вы можете это проверить, остановив сервис krb5-kdc на первичном KDC и затем запросив билет с помощью kinit. Если все пойдет хорошо, вы получите билет со вторичного KDC. В противном случае проверяйте /var/log/syslog и /var/log/auth.log на вторичном KDC.

Линукс клиент Kerberos

Эта часть освещает настройку клиента Kerberos на системе Линукс. Это позволит получить доступ к любому керберезированному сервису как только пользователь удачно авторизуется в системе.

Установка

Чтобы аутентифицироваться в области Kerberos, требуются пакеты krb5-user и libpam-krb5, а также некоторые другие, которые не являются необходимыми, но делают жизнь проще. Для установки пакетов наберите следующую команду в терминале:

sudo apt-get install krb5-user libpam-krb5 libpam-ccreds auth-client-config

Пакет auth-client-config позволяет просто настроить PAM для аутентификации множества сервисов, а libpam-ccreds будет кэшировать параметры аутентификации, позволяя вам подключаться когда центр распространения ключей (KDC) недоступен. Этот пакет также полезен для переносных компьютеров, которые могут авторизовываться с использованием Kerberos в корпоративной сети, но также должны быть доступны и вне сети.

Настройка

Для настройки клиента наберите в терминале:

sudo dpkg-reconfigure krb5-config

Вас попросят ввести имя области Kerberos. Также, если у вас нет DNS сервера с настроенными записями Kerberos SRV, меню запросит у вас сетевое имя центра распространения ключей (KDC) и административного сервера области.

dpkg-reconfigure добавит записи в файл /etc/krb5.conf для вашей области. У вас будут записи, похожие на следующие:

[libdefaults]
        default_realm = EXAMPLE.COM
...
[realms]
        EXAMPLE.COM = }                
                kdc = 192.168.0.1               
                admin_server = 192.168.0.1
        }
Если вы установите uid каждого вашего авторизованного в сети пользователя начиная с 5000, как предложено в Установке, вы затем сможете указать pam аутентифицировать с помощью Kerberos только пользователей с 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 

Это поможет избежать запросов (несуществующих) паролей Kerberos для локально аутентифицированных пользователей при смене у них пароля с помощью passwd.

Вы можете проверить настройки запросив билет с помощью утилиты kinit. Например:

kinit steve@EXAMPLE.COM
Password for steve@EXAMPLE.COM:

Когда билет будет предоставлен, детали можно увидеть с помощью 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

Затем используйте auth-client-config для настройки модуля libpam-krb5 для запроса билета в процсе входа:

sudo auth-client-config -a -p kerberos_example

Теперь вы будете получать билет в случае удачной авторизации на входе.

Ссылки

  1. Для дополнительной информации по версии MIT Kerberos, смотрите сайт MIT Kerberos.

  2. Ubuntu Wiki Kerberos для деталей.

  3. Kerberos: The Definitive Guide от O'Reilly - великолепное руководство по установке Kerberos.

  4. Также почувствуйте свободу без остановки на IRC каналах #ubuntu-server и #kerberos на Freenode, если у вас остались вопросы по Kerberos.