Windows server 2008 kerberos

Любому администратору Windows, разумеется, не раз приходилось иметь дело с двумя основными протоколами аутентификации в среде Windows: Kerberos и NTLM. Данная статья посвящена тому, как Kerberos и NTLM поддерживаются в системах Windows 7 и Windows Server 2008 R2. Но для начала я хотел бы остановиться на ключевых различиях между этими протоколами.

Разработчики Microsoft впервые реализовали протокол Kerberos в системе Windows 2000. Протокол NTLM вошел в употребление гораздо раньше, во времена Windows NT. Kerberos представляет собой протокол аутентификации, базирующийся на концепции доверенной третьей стороны trusted third party (TTP), тогда как в основу протокола NTLM положен механизм «запрос-ответ» (challenge/response). Более подробно различия между двумя протоколами описаны в таблице.

При обмене данными в ходе аутентификации с использованием протокола NTLM серверный ресурс (например, файл-сервер) генерирует запрос, который направляется клиенту. Клиент формирует NTLM-ответ, включающий хеш пароля пользователя, а сервер проверяет правильность этого ответа. Если клиент использует локальную учетную запись, сервер проверяет ответ пользователя с помощью хеша пароля пользователя, который хранится в локальной базе данных диспетчера учетных записей безопасности Security Account Manager (SAM). Если же клиент применяет доменную учетную запись, сервер передает ответ для проверки контроллеру домена, ибо только контроллеры доменов хранят в своих базах данных Active Directory (AD) копии хешей пользовательских паролей.

В системе Windows Kerberos доверенной третьей стороной является контроллер домена Windows 2000 или более поздней версии, на котором размещается служба центра распространения ключей Kerberos Key Distribution Center (KDC). Центр KDC облегчает процедуру аутентификации между оснащенным средствами Kerberos клиентом и сервером. Служба KDC автоматически устанавливается как компонент системы AD и состоит из двух подсистем: службы аутентификации Authentication Service (AS) и службы предоставления билетов Ticket-Granting Service (TGS).

Когда пользователь регистрируется в домене Windows с использованием протокола Kerberos, клиент Windows первым делом проверяет подлинность пользователя на контроллере домена с помощью пользовательского пароля. В то же время клиент запрашивает билет на выдачу билета Ticket Grant Ticket (TGT) в службу аутентификации. TGT можно рассматривать как временный пароль (по умолчанию время его жизни составляет 8 часов), который будет заменять пароль пользователя в последующих запросах на аутентификацию. Когда пользователю нужно будет обратиться к серверному ресурсу, клиент представит TGT на выдачу TGT для проверки подлинности на серверном ресурсе. Имейте в виду, что, в отличие от NTLM, протокол Kerberos не используется для локальной аутентификации в диспетчере учетных записей безопасности Windows; его сфера применения ограничивается доменной аутентификацией на контроллере домена.

Kerberos — стандартный протокол аутентификации в системе Windows 2000 и в более новых версиях Microsoft. В этих операционных системах протокол аутентификации определяется с использованием механизма согласования. Если предлагаемый по умолчанию протокол Kerberos не подходит или не поддерживается одним из клиентских либо серверных компонентов, принимающих участие в аутентификации, Windows переходит на использование NTLM.

Почему Kerberos?

Kerberos более эффективен, нежели NTLM, и тому есть несколько причин. При использовании протокола Kerberos хеш пользовательского пароля экспонируется намного реже, чем в случае применения NTLM. Хеш пароля экспонируется только в том случае, когда пользователь запрашивает TGT — в сущности, один раз каждые восемь часов. С другой стороны, в случае применения NTLM хеш пароля экспонируется всякий раз, когда клиент использует NTLM для аутентификации на сервере. В этом состоит важное преимущество протокола Kerberos перед протоколом NTLM; дело в том, что существуют специальные инструменты, проверяющие сетевой трафик на наличие хешей паролей. Эти инструменты захватывают обнаруженные хеши и методом подбора восстанавливают на их основе пароли пользователей.

Еще одно достоинство Kerberos состоит в том, что этот протокол предусматривает использование отметок времени для защиты от атак с повторной передачей пакетов. Вот почему так важно наличие службы синхронизации времени, безупречно функционирующей в Kerberos-центрической среде Windows. В Windows 2000 и более новых версиях системы службы времени работают без предварительной настройки. Если компьютерные часы на разных компьютерах не синхронизированы, это может обернуться дополнительным трафиком в процессе аутентификации по стандарту Kerberos или же — в худшем случае — такая ситуация может вызвать ошибку в процессе аутентификации.

В дополнение к сказанному протокол Kerberos реализует такие усовершенствованные функции аутентификации, как взаимная аутентификация и делегирование аутентификации. Взаимная аутентификация означает, что пользователь и служба проверяют подлинность друг друга, тогда как возможности NTLM ограничиваются проверкой подлинности пользователя. Без этой функции могут возникать ситуации, когда пользователи предоставляют свои учетные данные фиктивному серверу.

Служба может обращаться к удаленным ресурсам от имени пользователя с помощью механизма делегирования аутентификации. Иными словами, пользователь может предоставлять системе-посреднику право подтвердить от своего имени свою (пользователя) подлинность на сервере приложений. В результате сервер приложений получает возможность принимать решения по авторизации не на базе идентичности системы-посредника, а основываясь на идентичности пользователя. Функция делегирования проверки подлинности весьма полезна в многоуровневых приложениях, таких как доступ к базам данных с помощью внешнего интерфейса на базе Web.

Наконец, надо сказать, что, хотя специалисты Microsoft проделали большую работу по модернизации протокола NTLM, а именно создали версию NTLMv2, которая поддерживается в среде NT4 SP4 и более новых версиях, в продукте Microsoft Kerberos реализовано большее число современных алгоритмов шифрования. Я расскажу об этом подробнее в разделе, посвященном средствам шифрования протокола Kerberos

Ограничения протокола NTLM

Преимущества аутентификации средствами протокола Kerberos сомнения не вызывают. Но даже в среде AD Server 2008 Windows часто использует протокол NTLM, например, когда вы подключаетесь к системе Windows, выпущенной до появления Windows 2000, или при подключении к общедоступному ресурсу с помощью команды net use и IP-адреса (а не имени NetBIOS). Кроме того, приложения, у которых имена участников службы service principal names (SPN) не настроены должным образом, будут по-прежнему использовать протокол NTLM.

Чтобы узнать, каким протоколом — NTLM или Kerberos — вы пользуетесь в данный момент, можете визуализировать трафик NTLM с помощью утилиты netmon или другого трассировщика сети; альтернативный вариант — проверить содержимое кэша билетов Kerberos с помощью инструмента klist (который входит в комплекты поставки Windows 7 и Server 2008). В системах Windows 7 и Server 2008 специалисты Microsoft реализовали новые групповые политики, с помощью которых можно отслеживать, а также блокировать использование протокола NTLM вашими пользователями и приложениями. Всего таких политик три: одна для входящего трафика NTLM (для отслеживания и блокировки на уровне сервера), другая для исходящего трафика NTLM (для отслеживания и блокировки на уровне клиента) и третья для доменного трафика (для отслеживания и блокировки на уровне контроллера домена). Они размещаются в контейнере Security Options Group Policy Object (CPO), попасть в который можно, последовательно выбирая пункты Computer Configuration, Windows Settings, Security Settings, Local Policies (см. экран 1). Все они начинаются с элемента Network security: Restrict NTLM:.

Экран 1. Новые групповые политики для отслеживания NTLM

Каждая настройка политики имеет параметры audit и block. Когда вы включаете функцию аудита NTLM, программа создает записи журнала событий с исходными данными NTLM и числами 8001, 8002, 8003 и 8004. Журнальные записи хранятся в контейнере Operational с путем доступа Event Viewer (Local), Applications And Services Logs, Microsoft, Windows, NTLM. Я рекомендую для начала провести аудит NTLM в тестовой среде и позаботиться о том, чтобы там были должным образом представлены все ваши приложения. Если начать произвольно блокировать использование протокола, скорее всего, некоторые приложения функционировать не будут. Чтобы не допустить потери событий, следует перед началом тестирования средств аудита NTLM установить решение для сбора событий аудита; можете воспользоваться встроенной службой Windows Event Collector, средствами Event Subscriptions или решением от независимого поставщика. Кроме того, я рекомендую первым делом начать мониторинг NTLM на серверах. Вы можете подключить клиенты для проведения детального анализа, после того как станет очевидно, что сервер использует протокол NTLM. Уяснив, какие приложения используют NTLM, вы можете разработать стратегию блокировки NTLM. Эта стратегия может включать в себя стратегию исключений для устаревших приложений, которые не могут быть переписаны или перенастроены и которые всегда будут требовать применения NTLM.

К сожалению, упомянутые настройки NTLM нельзя применять на старых системах Windows. Однако эти системы допускают возможность управления версиями протокола NTLM. Вы можете, например, отключить фрагмент LM протокола аутентификации NTLM (поскольку этот фрагмент слаб по самой своей природе) или задать принудительное применение протокола NTLMv2. Для этого следует воспользоваться настройкой Network Security: LAN Manager Authentication Level GPO, которая размещается в контейнере Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options GPO (см. экран 2).

Экран 2. Принудительное включение протокола NTLMv2

Средства шифрования Kerberos

Криптографические протоколы, используемые протоколами аутентификации, играют важную роль в обеспечении безопасности последних. Как я уже отмечал, в этой области показатели Kerberos выше, чем у протокола NTLM. Алгоритм шифрования RC4 был впервые реализован в протоколе Windows Kerberos в версии Windows 2000 и по сей день поддерживается в системах Server 2008, а также Windows 7 (точнее говоря, поддерживается его версия RC4_HMAC_MD5). В системах Server 2008, Windows Vista и более новых версиях разработчики Microsoft добавили средства поддержки шифрования по стандарту Advanced Encryption Standard, AES, а системы Windows 7 и Server 2008 R2 поддерживают типы шифрования Kerberos AES (AES128_HMAC_SHA1 и AES256_HMAC_SHA1) без предварительной настройки. AES — более новый и мощный алгоритм шифрования, нежели DES. Логика Kerberos на контроллерах доменов перейдет на стандарт шифрования AES, когда вы модернизируете домен AD до уровня Windows 2008 Domain Functional Level (DFL).

В системах Windows 7 и Server 2008 R2 типы шифрования DES для протокола аутентификации Kerberos по умолчанию отключены. Из-за этого могут возникнуть проблемы совместимости, если одно из устаревших приложений жестко закодировано на шифрование только по стандарту DES или если учетная запись Windows, выполняющая ту или иную службу (учетная запись этой службы), настроена на использование только DES-шифрования. Эти службы или приложения выйдут из строя, если вы не сможете перенастроить соответствующую службу либо приложение на поддержку другого типа шифрования (RC4 или AES) либо не восстановите поддержку стандарта DES.

Чтобы выяснить, имеются ли у вас приложения либо службы, закодированные на шифрование исключительно по стандарту DES, можно запустить сетевой трассировщик при старте соответствующего приложения или службы и проверить содержимое полей Etype в заголовках аутентификации Kerberos. Чтобы определить, настроена ли учетная запись пользователя либо компьютера AD или учетная запись компьютера для применения исключительно типов шифрования DES, нужно проверить, выбран ли на вкладке Account свойств объекта параметр Use Kerberos DES encryption types for this account. К этим свойствам можно обратиться из оснастки AD Users and Computers консоли MMC.

Если вы выполните упомянутые выше проверки и окажется, что у вас возникла эта проблема, можете активировать DES-шифрование для аутентификации с помощью Kerberos на компьютерах, функционирующих под Windows 7 или Server 2008 R2, с помощью GPO настройки Network security: настройте типы шифрования, совместимые со стандартом Kerberos; эти настройки расположены в контейнере Computer Configuration, Windows Settings, Security Settings, Local Policies, Security Options GPO.

Итак, из двух протоколов аутентификации Windows предпочтительным является протокол Kerberos. Администраторам следует всегда настаивать на том, чтобы пользователи и приложения применяли именно Kerberos, а не NTLM. Новые ограничения по использованию NTLM, реализованные в системах Windows 7 и Server 2008 R2, открывают перед нами отличную возможность для достижения этой цели.

Жан де Клерк (jan.declercq@hp.com) — сотрудник Security Office компании HP. Специализируется на управлении идентификационными параметрами и безопасностью в продуктах Microsoft

Доброго времени, уважаемые читатели и гости блога! В продолжении прошлой темы о NFS, хочу опубликовать небольшой мануал как настроить экспортированные каталоги NFSv4 на проверку подлинности через Active Directory на Windows 2008 R2. Данный пост я реализовывал на дистрибутиве Debian. Удачно заставить работать NFSv4 и AD на Windows 2008 мне удалось только на тестовой версии – wheezy с ядром 3.0.0. На версии squeeze до сих пор идут дебаты по поводу ошибки

Nov 17 11:20:49 archiv rpc.svcgssd[13849]: ERROR: GSS-API: error in handle_nullreq: gss_accept_sec_context(): \
GSS_S_FAILURE (Unspecified GSS failure.  Minor code may provide more information) - \
No supported encryption types (config file error?)

Если появится какое-либо решение этой проблемы, то я обновлю пост…

План интеграции Active Directory на Windows 2008 R2 и NFSv4 на Linux (Debian wheezy)

В целом, организацию проверки подлинности ресурсов NFS посредством Kerberos можно представить в виде следующей последовательности шагов:

1. Настроить NFS и проверить работоспособность без Kerberos по протоколу NFSv4

  1. Настройка NFSv4 на сервере
  2. Настройка NFSv4 на клиенте.

2. Настроить Kerberos

  1. Предварительная настройка DNS и контроллера домена.
  2. Настройка синхронизации времени (на основе демона ntpd)
  3. Настроить и проверить Kerberos на идентификацию пользователя без ключевого файла krb5.keytab.
  4. Создать ключевой файл krb5.keytab на KDC (контроллер домена Windows 2008 R2)
  5. Настроить и проверить работу Kerberos для авторизации через krb5.keytab

3. Настроить NFSv4 на проверку подлинности через Kerberos.

  1. Настроить и проверить работу сервера NFSv4 на Debian
  2. Настроить и проверить работу клиента NFSv4 на Debian

4. Траблешуттинг Troubleshooting

Давайте подробней разберем каждый шаг.

Исходные данные для организации NFS

  • доменDOMAIN.LOCAL
  • DNS-имя контроллера доменаDC.DOMAIN.LOCAL
  • IP-адрес контроллера домена 10.0.0.4
  • NFS-server
    • DNS-имя NFS сервера – NFSD.DOMAIN.LOCAL
    • IP-адрес NFS сервера – 10.0.0.50
  • NFS-client
    • DNS-имя NFS сервера – NFSC.DOMAIN.LOCAL
    • IP-адрес NFS сервера – 10.0.0.51

1. Настройка NFSv4 без Kerberos

1.1., 1.2. Настройка NFSv4 сервера и клиента

Я решил объединить эти 2 пункта, т.к. они содержат очень похожие шаги. Поэтому начнем настройку с общих этапов для клиента и сервера. Итак, и на клиенте и на сервере необходимо настроить сеть в Debian. (Так же можно почитать статью основные понятия сетей). На сервере и клиенте необходим установленный пакет nfs-common с необходимыми зависимостями (portmap). Для того чтобы протокол Kerberos работал корректно, необходимо обязательно правильно настроить файлы /etc/hosts, /etc/hostname, /etc/resolv.conf, ну и конечно /etc/network/interfaces. Для того чтобы избавиться от возможных ошибок при работе к Kerberos, необходимо учесть некоторые нюансы (хотя и без этих нюансов скорей всего заработает), которые я отмечу комментариями:

root@nfsc:~# cat /etc/hosts
10.0.0.51       nfsc.DOMAIN.local  nfsc
127.0.0.1       localhost
# для Kerberos советуют указывать именно такой порядок
# то есть первой строкой именно 10.0.0.51 (внешний IP, не loopback)
root@nfsc:~# cat /etc/hostname
nfsc
root@nfsc:~# cat /etc/resolv.conf
domain DOMAIN.local
search DOMAIN.local
nameserver 10.0.0.4
root@nfsc:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 10.0.0.51
        netmask 255.255.0.0
        gateway 10.0.0.254
==================================
root@nfsd:~# cat /etc/hosts
10.0.0.50       nfsd.DOMAIN.local  nfsd
127.0.0.1       localhost

root@nfsd:~# cat /etc/hostname
nfsd
root@nfsd:~# cat /etc/resolv.conf
domain DOMAIN.local
search DOMAIN.local
nameserver 10.0.0.4
root@nfsd:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 10.0.0.50
        netmask 255.255.0.0
        gateway 10.0.0.254

Думаю видно, где тут сервер, где тут клиент? Если все же – нет, то как я уже говорил выше nfsd – это сервер и имеет строку root@nfsd:~#, а nfsс – это клиент и имеет строку root@nfsc:~#. На клиенте и на сервере необходимо иметь установленный пакет nfs-common, как он устанавливается и из чего он состоит я писал в прошлой статье. В конфигурационном файле NFS клиента (/etc/default/nfs-common) необходимо добавить “yes” в параметр NEED_IDMAPD=yes и NEED_GSSD=yes. Это разрешить запуск демонов rpc.idmapd и rpc.gssd, которые необходимы для работы интерфейса GSS-API для взаимодействия с Kerberos. После этого, необходимо перезапустить nfs-common на обеих машинах.

root@nfsс:~# service nfs-common restart
Stopping NFS common utilities: gssd idmapd statd.
Starting NFS common utilities: statd idmapd gssd.

Далее, настройка производится на cервере. На сервере NFS необходимо установить пакет nfs-kernel-server. И задать экспортируемые каталоги в файле /etc/exports, перезапустить сервер и проверить сделанное командой showmount:

root@nfsd:~# mkdir /nfs
root@nfsd:~# vim /etc/exports
root@nfsd:~# cat /etc/exports
/nfs    10.0.0.51(rw,sync,no_subtree_check) 10.0.0.50(rw,sync,no_subtree_check)
root@nfsd:~# service nfs-kernel-server restart
Stopping NFS kernel daemon: mountd nfsd.
Unexporting directories for NFS kernel daemon....
Exporting directories for NFS kernel daemon....
Starting NFS kernel daemon: nfsd mountd.
root@nfsd:~# showmount -e
Export list for nfsd:
/nfs 10.0.0.50,10.0.0.51

На этом настройка сервера и клиента завершена. Давайте проверим наши настройки. Сначал необходимо попробовать смонтировать экспортированный каталог локально на сервере по протоколу NFSv4:

root@nfsd:~# mount -v -t nfs4 10.0.0.50:/nfs /mnt
mount.nfs4: timeout set for Fri Nov 18 12:20:52 2011
mount.nfs4: trying text-based options 'addr=10.0.0.50,clientaddr=10.0.0.50'
10.0.0.50:/nfs on /mnt type nfs4 (rw)
root@nfsd:~# mount | grep nfs4
10.0.0.50:/nfs on /mnt type nfs4 (rw,addr=10.0.0.50,clientaddr=10.0.0.50)

Как видно, монтирование произошло удачно. Более подробно о команде mount тут, а еще подробней – в man mount. Теперь проверим возможность удаленного монтирования с клиентской машины:

root@nfsc:~# mount -v -t nfs4 10.0.0.50:/nfs /mnt
mount.nfs4: timeout set for Fri Nov 18 11:01:16 2011
mount.nfs4: trying text-based options 'addr=10.0.0.50,clientaddr=10.0.0.51'
10.0.0.50:/nfs on /mnt type nfs4 (rw)
root@nfsc:~# mount | grep nfs4
10.0.0.50:/nfs on /mnt type nfs4 (rw,addr=10.0.0.50,clientaddr=10.0.0.51)

Как видно, опять все удачно. На этом можно считать, что NFS корректно работает по протоколу NFSv4. Теперь можно приступить к настройке протокола Kerberos на Debian.

2. Настройка протокола Kerberos на Debian

2.1. Предварительная настройка DNS и Active Directory

Для корректной работы Kerberos в Linux необходима правильная настройка DNS. “Настройка DNS” тут громко сказано, просто нужно иметь корректные записи в прямой и обратной зоне для клиента NFS и сервера NFS. Создаем эти записи в оснастке DNS (изображение) и проверим работу на Debian:

root@nfsc:~# nslookup -type=A nfsc
Server:         10.0.0.4
Address:        10.0.0.4#53

Name:   nfsc.DOMAIN.local
Address: 10.0.0.51

root@nfsc:~# nslookup -type=A nfsd
Server:         10.0.0.4
Address:        10.0.0.4#53

Name:   nfsd.DOMAIN.local
Address: 10.0.0.50

root@nfsc:~# nslookup 10.0.0.50
Server:         10.0.0.4
Address:        10.0.0.4#53

50.0.0.10.in-addr.arpa  name = nfsd.domain.local.

root@nfsc:~# nslookup 10.0.0.51
Server:         10.0.0.4
Address:        10.0.0.4#53

51.0.0.10.in-addr.arpa  name = nfsc.domain.local.

DNS корректно отдает наши IP по именам и имена DNS по IP. Это меговажный момент, ибо Kerberos активно взаимодействует с DNS и без данных записей просто не будет работать!

2.2. Настройка синхронизации времени для протокола Kerberos

Для работы среды Kerberos v5 необходимо, чтобы расхождение времени KDC и хостов, запрашивающих доступ к каким-либо ресурсам и времени на хостах, предоставляющих сами ресурсы не составляло более 5 минут. Для синхронизации будем использовать возможности пакета ntp. О том, как настроить сервер и клиента NTP я уже рассказывал в прошлых статьях, поэтому отправлю вас читать NTP server на Linux. Здесь же ограничусь основными параметрами. Итак, на клиенте и сервере NFS необходимо установить пакет ntp, отредактировать файл конфигурации /etc/ntp.conf до следующего вида (после этого перезапустить службу ntp):

root@nfsd:~# cat /etc/ntp.conf
server dc.domain.local
restrict default ignore
restrict dc.domain.local
restrict 127.0.0.1 nomodify notrap
root@nfsd:~# service ntp restart
Stopping NTP server: ntpd.
Starting NTP server: ntpd.

2.3. Настройка клиента Kerberos на Debian Wheezy для доменной аутентификации

Данный этап необходимо сделать как на клиенте, так и на сервере – он одинаков как для сервера, так и для клиента NFS. Поэтому покажу, как настроить на примере сервера. Для Kerberos необходимо установить пакет krb5-user с зависимостями (он должен подтянуть krb5-config), далее его необходимо настроить. Настройка заключается в редактировании файла /etc/krb5.conf. Данный файл содержит настройки, необходимые библиотекам, взаимодействующим со средой Kerberos V, такие как область (ее еще называют realm) по умолчанию, расположение серверов KDC (key distribution centers) для известных областей и др. По синтаксису файл очень похож на файл конфигурации SAMBA (smb.conf) и так же состоит из разделов, выделенных квадратными скобками и параметров в формате параметр=значение (более подробно о настройках этого файла в man krb5.conf). Для работы в сети с одной областью вполне достаточно следующего конфигурационного файла:

root@nfsd:~# cat /etc/krb5.conf
[libdefaults]
        default_realm = DOMAIN.LOCAL
[realms]
        DOMAIN.LOCAL = {
                kdc = dc.domain.local
        }

Раздел [libdefaults] содержит значения по-умолчанию для Kerberos V библиотек, а параметр default_realm задает область по умолчанию, которая будет задействована при взаимодействии с Kerberos. Раздел  [realms] содержит подразделы с параметрами, отписывающими область Kerberos, например расположение KDC контроллера. Остальные параметры, которые часто советуют указывать в этом файле вполне работоспособны и по-умолчанию.  После данной настройки давайте проверим работоспособность Kerberos, для этого используется утилита kinit. Kinit запрашивает, получает и кэширует TGT (ticket-granting ticket)-билеты от KDC.

root@nfsc:~# # получаем билет для любого доменного пользователя
root@nfsc:~# kinit domainuser
Password for [email protected]:
root@nfsc:~# # после ввода пароля ошибок не было
root@nfsc:~# # значит билет получен корректно
root@nfsc:~# # просмотрим содержимое кэша:
root@nfsc:~# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting     Expires            Service principal
11/18/11 16:12:00  11/19/11 02:12:08  krbtgt/[email protected]
        renew until 11/19/11 16:12:00
root@nfsc:~# ls -la /tmp/krb5*
-rw------- 1 root root 1101 Ноя 18 16:12 /tmp/krb5cc_0
root@nfsc:~# # очистим содержимое кэша:
root@nfsc:~# kdestroy
root@nfsc:~# ls -la /tmp/krb5*
ls: невозможно получить доступ к /tmp/krb5*: Нет такого файла или каталог

Как видно, билет корректно получен. Не забудьте те же действия проделать на сервере.

Тут я сделаю небольшое отступление в виде абзаца, взятого не помню откуда и не с первого прочтения подающегося пониманию, но тем не менее, хорошо описывающего работу Kerberos ):

Сервер Kerberos свободно распространяет TGT (Ticket Granting Ticket) на каждый неавторизованный запрос; однако, каждый TGT зашифрован ключом, полученным из пароля пользователя. Следовательно, когда пользователь вводит свой пароль, он не отправляется на KDC, а используется для расшифровки TGT, который уже получен kinit. Если в процессе расшифровки получается правильный билет с правильным значением времени, у пользователя есть действующее удостоверение. Это удостоверение содержит ключ сессии для установления безопасного соединения с сервером Kerberos, как и действующий TGT, зашифрованный ключом сервера Kerberos. Второй уровень шифрования недоступен пользователю, но позволяет серверу Kerberos проверять правильность каждого TGT.

Идем дальше…

2.4. Создание keytab-файла на контроллере домена Windows 2008 R2

Перед созданием ключевого файла необходимо создать учетные записи для хостов (сервера и клиента) NFS, соответствующие именами хостов:

Наступает самый интересный этап. Не углубляясь в Kerberos, keytab-файл это “связка ключей”, файл содержащий в себе одну или несколько запсей – ключей, которые используются вместо логина/пароля при запросе доступа у сервера KDC к какому-либо ресурсу. Другими словами, машина предоставляет данный файл серверу KDC как подтверждение своей достоверности, когда запрашивает у контроллера домена (KDC) доступ к какому-либо ресурсу (например доступ к службе или сетевому каталогу). В большинстве случаев, при настройке какой-либо службы в связке с Kerberos проблемы возникают именно на данном этапе, т.к. именно этот файл является связующим звеном между Windows 2008 и Linux (в нашем случае – Debian). Проблемы обычно связаны с различными типами шифрования, которые поддерживает Windows, но не поддерживает Linux и наоборот…

Итак, согласно документации жадных, Windows 7 и Windows Server 2008 R2 более не поддерживают типы шифрования, основанные на DES (DES-CBC-MD5 & DES-CBC-CRC), но в них включены следующие типы шифрования (по убиванию стойкости):

  • AES256-CTS-HMAC-SHA1-96
  • AES128-CTS-HMAC-SHA1-96
  • RC4-HMAC

При этом, необходимо учитывать, что если при использовании Kerberos будут использоваться клиенты на основе WinXP и младше, то они из всего приведенного поддерживают только RC4-HMAC.

keytab создается с помощью утилиты ktpass (документация по ней), которая с Windows 2003 SP1 входит в состав дистрибутива, а в дистрибутивах младше – необходимо установить отдельно Microsoft Server SupportTools, имеющегося на диске с дистрибутива Windows Server . Формат создания keytab утилитой ktpass следующий:

ktpass.exe /princ имя_службы/fqdn.имя.хоста@ИСПОЛЬЗУЕМАЯ.ОБЛАСТЬ
/mapuser учетная_запись_хоста$@ИСПОЛЬЗУЕМАЯ.ОБЛАСТЬ
/crypto тип_шифрования
/ptype ТИП_ПРИНЦИПАЛА
/pass пароль_или_+rndpass
/out C:\каталог\создаваемый_файл

В примере параметры команды для удобства выстроены в столбик, реально же они пишутся все в одну строку. Давайте поймем,  что делает команда ktpass и ее параметры и все их рассмотрим. Вообще, говоря о функциях и назначении данной программы, то создание keytab файла – это одна из двух ее функций, другая функция – это создание принципала (/princ), “привязанного” (примапленного – /mapuser) к учетной записи компьютера или пользователя.  Принципал представляет собой SPN-запись (server principal name, дословно – имя основного сервера), думаю, что из дословного перевода SPN, понятно что назначение этой записи – указать на компьютер, предоставляющий тот или иной сервис (службу, в нашем случае – служба NFS). О том, что есть принципал (SPN) – более подробно – можно почитать тут. Давайте пойдем по прядку по параметрам…

Параметр /princ

Задает имя службы и хост, на котором она (служба) расположена и в какой области домене. В нашем случае указывается nfs/[email protected] (для сервера NFS) и nfs/nfsс[email protected] (для клиента NFS). Для примера, для службы Apache указывается принципал HTTP/fqdn.имя.хоста@ИСПОЛЬЗУЕМАЯ.ОБЛАСТЬ, причем HTTP обязательно В ВЕРХНЕМ РЕГИСТРЕ, многие службы требуют указания имени службы в SPN именно в верхнем регистре. Узнать, в каком регистре и какое значение имя_службы указывать можно из документации к службе, например в man rpc.gssd есть такая информация. Очень часто указывается общее имя принципала host/fqdn@REALM. Стоит отметить такой нюанс…почему-то во всех источниках указывают, что должно стоять имя FQDN. Но на сколько я знаю, FQDN-имя предполагает наличие точки в конце имени, но тем не менее – точку не ставят в данном случае.

Параметр /mapuser

Задает имя доменной учетной записи, к которой “цепляется” указанный выше SPN. Для нас это будет созданные в предыдущем разделе учетные записи компьютеров [email protected] – для клиента и [email protected] – для сервера.

Параметр /crypto

Задает тип шифрования Kerberos, который будет использоваться при шифрации/дешифрации билетов, передаваемых между контроллером домена KDC и хостами. На Windows 2008 R2 мне удалось запустить корректную аутентификацию при указании параметра /crypto ALL (то есть keytab создавался с несколькими принципалами со всеми поддерживаемыми типами шифрования). Тем не менее, желательно придерживаться следующих правил, чтобы избежать проблем с шифрованием: для win 2k и 2k3 желательно указывать /crypto DES-CBC-MD5, для Win 2k3 SP1/crypto rc4-hmac-nt, для Windows 2008 R2/crypto AES256-SHA1 или /crypto rc4-hmac-nt.

Параметр /ptype

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

Параметр /pass

Задает пароль, который может быть указан вручную, или устанавливает произвольный пароль, если задано значение +rndpass.

Параметр /out

Задает имя выходного файла keytab.

Итак, рассмотрев параметры, можно составить команды, которые создадут нам необходимые keytab файлы на контроллере домена:

C:\Windows\system32>ktpass.exe /princ nfs/[email protected] /mapuser \
[email protected] /crypto ALL /ptype KRB5_NT_PRINCIPAL /pass +rndpass \
/out C:\tmp\nfsckeytab
Targeting domain controller: DC.domain.local
Using legacy password setting method
Successfully mapped nfs/nfsc.domain.local to NFSC$.
WARNING: Account NFSC$ is not a user account (uacflags=0x1021).
WARNING: Resetting NFSC$'s password may cause authentication problems if NFSC$
is being used as a server.

Reset NFSC$'s password [y/n]?  y
WARNING: pType and account type do not match. This might cause problems.
Key created.
Key created.
Key created.
Key created.
Key created.
Output keytab to C:\tmp\nfsckeytab:
Keytab version: 0x502
keysize 55 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x1 (DES-CBC-CRC) keylength 8 (0x206e7fbaa738ec1c)
keysize 55 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x3 (DES-CBC-MD5) keylength 8 (0x206e7fbaa738ec1c)
keysize 63 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x17 (RC4-HMAC) keylength 16 (0x85a6dea042798a45a547f8450e1115fc)
keysize 79 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x12 (AES256-SHA1) keylength 32 (0x624fe15973fb5bda6c88a289260789cd16b135451f296
a83679424c27c04507a)
keysize 63 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x11 (AES128-SHA1) keylength 16 (0x5ea804c4527c2467f7c710d845c09821)

Это был клиент. Как видно, вывалилось несколько “варнингов”. Первый нам говорит, о том, что это аккуант не пользователя, а компьютера, второй – что могут возникнуть проблемы, если мы сбросим пароль (но мы то знаем, что делаем, поэтому подтверждаем и жмахаем Ентер), третий говорит нам, что ptype не соответствует аккуанту. Это произошло потому что мы указали “общий” тип, а привязали принципал к учетной записи хоста. Теоретически, это не должно привести к проблемам при настройке, но если сообщение мозолит глаза, то можно указать тип KRB5_NT_SRV_HST. Давайте теперь создадим кейтаб для сервера NFSv4:

C:\Windows\system32>ktpass.exe /princ nfs/[email protected] /mapuser \
[email protected] /crypto ALL /ptype KRB5_NT_PRINCIPAL /pass +rndpass \
/out C:\tmp\nfsdkeytab
Targeting domain controller: DC.domain.local
Using legacy password setting method
Successfully mapped nfs/nfsd.domain.local to NFSD$.
WARNING: Account NFSD$ is not a user account (uacflags=0x1021).
WARNING: Resetting NFSD$'s password may cause authentication problems if NFSD$
is being used as a server.

Reset NFSD$'s password [y/n]?  y
WARNING: pType and account type do not match. This might cause problems.
Key created.
Key created.
Key created.
Key created.
Key created.
Output keytab to C:\tmp\nfsdkeytab:
Keytab version: 0x502
keysize 55 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x1 (DES-CBC-CRC) keylength 8 (0xb36dd6ef3b518f73)
keysize 55 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x3 (DES-CBC-MD5) keylength 8 (0xb36dd6ef3b518f73)
keysize 63 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x17 (RC4-HMAC) keylength 16 (0x85a6dea042798a45a547f8450e1115fc)
keysize 79 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x12 (AES256-SHA1) keylength 32 (0x760287626e74dea671b3c90cfae8d2b2f5b69f596ff9e
f73c8c3da476ee64925)
keysize 63 nfs/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype
0x11 (AES128-SHA1) keylength 16 (0x8fa396ecd3d4a69c329437b08da883e9)

Итого, мы получили 2 keytab в каталоге C:\tmp\ для клиента – nfsсkeytab и для сервера – nfsdkeytab

Примечание. Подразделение (Organization Unit) в котором размещены учетные записи сервера (nfsd) и клиента (nfsc) не должны иметь в своем имени кириллических символов. Иначе при создании keytab будет ошибка Password set failed! 0×00000020. Aborted. (Спасибо за замечание комментатору Михаилу)

Теперь эти ключи Kerberos необходимо БЕЗОПАСНО скопировать на соответствующие машины, например чрез WinSCP и приступить к следующему шагу.

2.5. Настройка клиента Kerberos для аутентификации через keytab

Допустим, мы скопировали наши keytab файлы в папку пользователя root. Теперь рассмотрим настройку keytab на сервере NFS:

root@nfsd:~# ktutil
ktutil:  rkt /root/nfsdkeytab
ktutil:  list
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
   1    3             nfs/[email protected]
   2    3             nfs/[email protected]
   3    3             nfs/[email protected]
   4    3             nfs/[email protected]
   5    3             nfs/[email protected]
ktutil:  wkt /etc/krb5.keytab
ktutil:  q
root@nfsd:~# kinit -k  nfs/nfsd.domain.local
root@nfsd:~# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: nfs/[email protected]

Valid starting     Expires            Service principal
11/19/11 01:17:30  11/19/11 11:17:31  krbtgt/[email protected]
        renew until 11/20/11 01:17:30
root@nfsd:~# kdestroy
root@nfsd:~# chmod -v u=rw,go-rwx /etc/krb5.keytab
права доступа «/etc/krb5.keytab» изменены с 0644 (rw-r--r--) на 0600 (rw-------)

Давайте разберем сделанное: сначала, с помощью утилиты ktutil прочитали исходный скопированный файл, просмотрели его содержимое, чтобы убедится, что это нужный нам файл и записали прочитанное содержимое в файл /etc/krb5.keytab, который читается библиотеками Kerberos, затем вышли из утилиты командой q. Командой kinit с параметром -k и указанным именем службы мы попробовали проверить подлинность без пароля с помощью keytab. Данное действие корректно завершилось, т.к. ошибок выдано не было и klist нам отобразил полученный билет из кэша. Далее мы удалили полученный билет и задали права на доступ к krb5.keytab только пользователю root. Дополнительно могу отметить, что иногда приходится к kinit добавить ключ -t с путем к кейтаб-файлу. Это может понадобиться, если по какой-то причине, kinit не смог найти и обратиться к keytab файлу по умолчательному пути… (спасибо комментатору angel2s2АХТУНГ!!! Если на данном этапе kinit выдал ошибки, то далее настраивать смысла нет, ибо Kerberos клиент работает не корректно. Необходимо избавиться от ошибок.

Далее, давайте то же самое проделаем с клиентом:

root@nfsc:~# ktutil
ktutil:  rkt /root/nfsckeytab
ktutil:  list
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
   1    3             nfs/[email protected]
   2    3             nfs/[email protected]
   3    3             nfs/[email protected]
   4    3             nfs/[email protected]
   5    3             nfs/[email protected]
ktutil:  wkt /etc/krb5.keytab
ktutil:  q
root@nfsc:~# kinit -k nfs/nfsc.domain.local
root@nfsc:~# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: nfs/[email protected]

Valid starting     Expires            Service principal
11/19/11 01:31:28  11/19/11 11:31:29  krbtgt/[email protected]
        renew until 11/20/11 01:31:28
root@nfsc:~# kdestroy
root@nfsc:~# chmod -v -u=rw,go- /etc/krb5.keytab
права доступа «/etc/krb5.keytab» изменены с 0600 (rw-------) на 0644 (rw-r--r--)

Все у нас хорошо. Можно пробовать настроить NFS через Kerberos.

3. Настройка NFSv4 на проверку подлинности через Kerberos V (Win 2k8 R2 как KDC)

Настройку начнем с сервера NFS. В конфигурационном файле сервера (/etc/default/nfs-kernel-server)  необходимо разрешить запуск демона, отвечающего за взаимодействие с Kerberos (демон rpc.svcgssd), для этого необходимо вставить yes в параметре NEED_SVCGSSD=yes, задать экспортируемому ресурсу соответствующую настройку для авторизации через KDC и перезапустить службу:

root@nfsd:~# cat /etc/exports
/nfs    gss/krb5(rw,sync,no_subtree_check)
root@nfsd:~# service nfs-kernel-server restart
Stopping NFS kernel daemon: mountd svcgssd nfsd.
Unexporting directories for NFS kernel daemon....
Exporting directories for NFS kernel daemon....
Starting NFS kernel daemon: nfsd svcgssd mountd.
root@nfsd:~# showmount -e
Export list for nfsd:
/nfs gss/krb5

На этом настройка закончена. Давайте для начала размонтируем ранее смонтированную NFS и попробуем смонтировать каталог на той же машине, где установлен сервер:

root@nfsd:~# umount -v /mnt
NFSv4 mount point detected
10.0.0.50:/nfs umounted
root@nfsd:~# mount -v -t nfs4 -o sec=krb5 nfsd:/nfs /mnt
mount.nfs4: timeout set for Sat Nov 19 01:50:11 2011
mount.nfs4: trying text-based options 'sec=krb5,addr=10.0.0.50,clientaddr=10.0.0.50'
nfsd:/nfs on /mnt type nfs4 (rw,sec=krb5)
root@nfsd:~# mount | grep nfs4
nfsd:/nfs on /mnt type nfs4 (rw,sec=krb5,addr=10.0.0.50,clientaddr=10.0.0.50)

Как видно, все получилось отлично. Давайте то же самое попробуем проделать на клиенте:

root@nfsc:~# mount -v -t nfs4 -o sec=krb5 nfsd:/nfs /mnt
mount.nfs4: timeout set for Sat Nov 19 02:24:21 2011
mount.nfs4: trying text-based options 'sec=krb5,addr=10.0.0.50,clientaddr=10.0.0.51'
nfsd:/nfs on /mnt type nfs4 (rw,sec=krb5)
root@nfsc:~# mount | grep nfs4
nfsd:/nfs on /mnt type nfs4 (rw,sec=krb5,addr=10.0.0.50,clientaddr=10.0.0.51)

Так же – все удачно.

4. Траблешуттинг Kerberos и NFS

Диагностику стоит начать с проверки – запущены ли необходимые процессы:

root@nfsd:~# ps aux | grep rpc
root       667  0.0  0.2   2236   940 ?        Ss   Nov17   0:01 /sbin/rpcbind -w
root       690  0.0  0.0      0     0 ?        S<   Nov17   0:00 [rpciod]
statd     1666  0.0  0.3   2548  1248 ?        Ss   Nov18   0:00 /sbin/rpc.statd
root      1679  0.0  0.1   2552   736 ?        Ss   Nov18   0:00 /usr/sbin/rpc.idmapd
root      1684  0.0  0.5   3948  2240 ?        Ss   Nov18   0:28 /usr/sbin/rpc.gssd
root      3859  0.0  0.4   3880  1808 ?        Ss   01:44   0:00 /usr/sbin/rpc.svcgssd
root      3862  0.0  0.3   3076  1504 ?        Ss   01:44   0:00 /usr/sbin/rpc.mountd --manage-gids
root      4017  0.0  0.1   3424   768 pts/0    S+   02:29   0:00 grep rpc

Это вывод с сервера. На клиенте, соответственно, не будет процесса rpc.svcgssd. Далее стоит просмотреть лог /var/log/daemons.log и /var/log/syslog на наличие ошибок.

Для диагностики клиента, необходимо добавить в /etc/defaults/nfs-common строку RPCGSSDOPTS=-vvv и перезапустить nfs-common. Это запустит демон rpc.gssd в очень verbose-режиме )). Для диагностики сервера можно добавить такую же опцию в RPCSVCGSSDOPTS=-vvv и перезапустить nfs-kernel-server. После этого – наблюдать за логом /var/log/daemons.log и /var/log/syslog.

БОлше понимания о шифровании в Kerberos дает команда klist с параметром -e, что заставляет отображать типы шифрования в файле keytab и кэше.

Можно так же “поиграться” с заданием разрешенного типа шифрования Kerberos. Это делается добавлением строк в файл krb5.conf:

[libdefaults]
 …
      # явно задает тип шифрования RC4, можно
      # задать des-cbc-cbr, des-cbc-md5, aes256-cts или aes128-cts
      default_tkt_enctypes = rc4-hmac
      default_tgs_enctypes = rc4-hmac
      permitted_enctypes = rc4-hmac

Если используется Kerberos клиент старше 1.6, то скорее всего DES там как и в Windows 2008 – не поддерживается и для его включения необходимо добавить в раздел [libdefaults] строку allow_weak_crypto = true.

Хочется отметить еще вот такой нюанс: на контроллере домена возможно привязать несколько SPN к однойучетной записи, но это может привести к некоторым проблемам, поэтому я бы не советовал этого делать. Пример такой проблемы хорошо раборали товарсчи с форума ixbt. Кроме того, в сети идет много дебатов о том, привязывать SPN к учетной записи компьютера или к учетной записи пользователя, некоторую полезную информацию об этом можно найти тут.

Многие ресурсы советуют добавить в krb5.conf вот такой раздел:

[logging]
FILE=/var/krb5/kdc.log

Что теоретически должно заставить библиотеки клиента kerberos писать о своей работе в лог, но заставить работать этот механизм мне не удалось, поэтому я пропустил данную настройку в статье.

Резюме.

Итак, статью можно считать завершенной. Чтобы до конца разобраться в этом вопросе мне пришлось убить более 2х недель и перечитать кучу материалов. Очень надеюсь, что  материал, который я постарался как можно понятней донести до Вас будет Вам полезен. Буду рад комментариям и замечаниям. До новых встреч!

Что почитать еще

http://blog.scottlowe.org/2007/01/15/active-directory-integration-index/ – очень много информации по интеграции UNIX и AD
http://technet.microsoft.com/en-us/library/cc734104(WS.10).aspx – Kerberos Key Distribution Center на Windows 2008
http://social.technet.microsoft.com/wiki/contents/articles/717.aspx – SPN от мелкософт
http://technet.microsoft.com/en-us/library/cc753771(WS.10).aspx – ktpass от Microsoft
http://msdn.microsoft.com/en-us/library/ms995329.aspx – очень интересная статья с теоретической точки зрения о настройке Linux, Kerberos и HTTP
http://technet.microsoft.com/ru-ru/library/dd546914.aspx – управление доступом в гетерогенных сетях
http://www.grolmsnet.de/kerbtut/ – тоже о Linux, Kerberos и HTTP
http://osdude.wordpress.com/2011/08/12/authenticating-unixlinux-to-windows-2008r2-part-3-rhel-5-6/ – неплохая теоретическая информация о шифровании в KDC на Windows 2008
http://osdude.wordpress.com/2011/08/12/authenticating-unixlinux-to-windows-2008r2-part-5-kerberos-encryption-types/ – вторая неплохая теоретическая информация о шифровании в KDC на Windows 2008
http://www.securitylab.ru/analytics/265153.php – работа Kerberos в Linux
http://nfsworld.blogspot.com/2005/06/using-active-directory-as-your-kdc-for.html – NFS и Windows 2003
http://sammoffatt.com.au/jauthtools/Kerberos – хорошая wiki по Kerberos
http://techpubs.spinlocksolutions.com/info/kerberos.html – MIT Kerberos в Debian

C Уважением, Mc.Sim!


Теги: Active Directory, HOWTO, kerberos, Linux, Microsoft Windows, NFS

Recently, I wanted to add single sign on (SSO) functionality to our intranet server, which runs a Debian Linux. Users should be automatically logged in to the website using their Windows user accounts, which are stored in an Active Directory on a Windows Server 2008 R2, without entering their credentials again. To make this work in the described Linux/Windows environment, Kerberos is the method of choice.

Now, after looking at the small bit of configuration that is actually needed to get SSO working, the complete day I spent figuring it out seems like a waste of time 🙂 But while searching the web for answers to all the problems I faced during the initial configuration, I got a feeling that many others had to struggle with Kerberos, too.

Anyway, here is how to make SSO run on Debian Linux against Windows Server 2008 R2, started from scratch:

Make sure to use only the latest packages available, especially the ones regarding Samba and Kerberos. Otherwise Kerberos may not work due to changes in Windows Server 2008. I used the following configuration in /etc/apt/sources.list:

deb http://ftp.de.debian.org/debian/ squeeze main
deb-src http://ftp.de.debian.org/debian/ squeeze main

These are the packages’ versions on my Debian machine:

ii  samba                             2:3.5.6~dfsg-3squeeze2       SMB/CIFS file, print, and login server for Unix
ii  samba-common                      2:3.5.6~dfsg-3squeeze2       common files used by both the Samba server and client
ii  samba-common-bin                  2:3.5.6~dfsg-3squeeze2       common files used by both the Samba server and client
ii  krb5-config                       2.2                          Configuration files for Kerberos Version 5
ii  krb5-multidev                     1.8.3+dfsg-4                 Development files for MIT Kerberos without Heimdal conflict
ii  krb5-user                         1.8.3+dfsg-4                 Basic programs to authenticate using MIT Kerberos
ii  libgssapi-krb5-2                  1.8.3+dfsg-4                 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
ii  libkrb5-3                         1.8.3+dfsg-4                 MIT Kerberos runtime libraries
ii  libkrb5-dev                       1.8.3+dfsg-4                 Headers and development libraries for MIT Kerberos
ii  libkrb53                          1.8.3+dfsg-4                 transitional package for MIT Kerberos libraries
ii  libkrb5support0                   1.8.3+dfsg-4                 MIT Kerberos runtime libraries - Support library

Install the needed packages and go through the basic configuration as described here:

  • Achim Grolms: Using mod_auth_kerb and Windows 2000/2003/2008R2 as KDC
  • Michele Baldessari: Active Directory and Apache Kerberos authentication
  • Ulf Kosack: Debian in ein Active Directory integrieren
  • Pröhl, Mark, und Michael Weiser. “Im Bann der Domänen – Single Sign-On für alle mit Active Directory.” iX, Nr. 12 (November 2008): 150-154.

In my case the basic needed configuration looks like this:

  • /etc/krb5.conf
    [libdefaults]
        default_realm = YOURDOMAIN.COM
    [realms]
        YOURDOMAIN.COM = {
            kdc = DOMAINCONTROLLER.YOURDOMAIN.COM
            master_kdc = DOMAINCONTROLLER.YOURDOMAIN.COM
            admin_server = DOMAINCONTROLLER.YOURDOMAIN.COM
            default_domain = YOURDOMAIN.COM
        }
    [login]
        krb4_convert = true
        krb4_get_tickets = false
  • /etc/samba/smb.conf
    workgroup = YOURDOMAIN
    realm = YOURDOMAIN.COM
    netbios name = WEBSERVER
    security = ADS
    idmap uid = 10000-20000
    idmap gid = 10000-20000
    winbind enum users = yes
    winbind enum groups = yes
    winbind use default domain = yes
    machine password timeout = 0 # needed when using only the machine account as described below
  • /var/www/kerberos/.htaccess
    AuthType Kerberos
    KrbAuthRealms YOURDOMAIN.COM
    KrbMethodNegotiate On
    KrbMethodK5Passwd On
    KrbServiceName HTTP/webserver.yourdomain.com
    Krb5KeyTab /etc/krb5.keytab
    require valid-user

Now you basically have two choices for Kerberos authentication against the Active Directory: Using a seperate technical user account (which should be the preferred method) or using only the Linux server’s machine account.

Using a seperate technical user account

  • (re)join the Linux server to the domain
    webserver:~# net ads join -U administrator
    Enter administrator's password:
    Using short domain name -- YOURDOMAIN
    Joined 'WEBSERVER' to realm 'yourdomain.com'
  • restart the services
    webserver:~# /etc/init.d/samba restart
    Stopping Samba daemons: nmbd smbd.
    Starting Samba daemons: nmbd smbd.
    webserver:~# /etc/init.d/winbind restart
    Stopping the Winbind daemon: winbind.
    Starting the Winbind daemon: winbind.
  • check whether everything works
    webserver:~# wbinfo -t
    checking the trust secret for domain YOURDOMAIN via RPC calls succeeded
  • add a technical user to your Active Directory, e.g. tukerberos with password Kerber0s
  • create and attach the needed service principals for the website to the technical user on the domain controller
    ktpass -princ HOST/webserver.yourdomain.com@YOURDOMAIN.COM -mapuser tukerberos@YOURDOMAIN.COM -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass Kerber0s -out c:\krb5.keytab
    ktpass -princ HTTP/webserver.yourdomain.com@YOURDOMAIN.COM -mapuser tukerberos@YOURDOMAIN.COM -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -pass Kerber0s -out c:\krb5.keytab -in c:\krb5.keytab
  • copy \\domaincontroller\c$\krb5.keytab to webserver:/etc/krb5.keytab
  • set the needed file system permissions on the keytab file
    webserver:~# chown root.www-data /etc/krb5.keytab
    webserver:~# chmod 0640 /etc/krb5.keytab
  • open http://webserver/ in Internet Explorer → the user should be logged in automatically

Using only the Linux server’s machine account

  • (re)join the Linux server to the domain (the error message may be ignored for now)
    webserver:~# net ads join -U administrator
    Enter administrator's password:
    Using short domain name -- YOURDOMAIN
    Joined 'WEBSERVER' to realm 'yourdomain.com'
    [2011/04/19 10:54:35.026049,  0] libads/kerberos.c:333(ads_kinit_password)
      kerberos_kinit_password WEBSERVER$@YOURDOMAIN.COM failed: Preauthentication failed
  • reset the (newly created) machine account in your Active Directory so the machine’s password is reset to the initial value (i.e. the machine’s hostname, webserver)
  • change the machine’s password to a new value (e.g. Kerber0s)
    webserver:~# kpasswd webserver
    Password for webserver@YOURDOMAIN.COM: webserver
    Enter new password: Kerber0s
    Enter it again: Kerber0s
    Password changed.
  • add the needed service principals (e.g. HTTP/webserver, HTTP/webserver.yourdomain.com) to the machine account using adsiedit.msc on your domain controller
  • request an initial Kerberos ticket
    webserver:~# kinit webserver
    Password for webserver@YOURDOMAIN.COM: Kerber0s
  • find out the current kvno of the service principal
    webserver:~# kvno HTTP/webserver
    HTTP/webserver@YOURDOMAIN.COM: kvno = 18
  • create a Kerberos keytab file
    webserver:~# ktutil
    ktutil:  addent -password -p HOST/webserver.yourdomain.com@YOURDOMAIN.COM -k 18 -e rc4-hmac
    Password for HTTP/webserver.yourdomain.com@YOURDOMAIN.COM: Kerber0s
    ktutil:  addent -password -p HTTP/webserver.yourdomain.com@YOURDOMAIN.COM -k 18 -e rc4-hmac
    Password for HTTP/webserver.yourdomain.com@YOURDOMAIN.COM: Kerber0s
    ktutil:  wkt /etc/krb5.keytab
    ktutil:  q
  • set the needed file system permissions on the keytab file
    webserver:~# chown root.www-data /etc/krb5.keytab
    webserver:~# chmod 0640 /etc/krb5.keytab
  • open http://webserver/ in Internet Explorer → the user should be logged in automatically

Possible errors and how to fix them

This is how a successful Kerberos login looks in the Apache logfile:

[Tue Apr 19 11:09:04 2011] [debug] src/mod_auth_kerb.c(1628): [client 10.120.22.74] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Tue Apr 19 11:09:04 2011] [debug] src/mod_auth_kerb.c(1240): [client 10.120.22.74] Acquiring creds for HTTP/webserver.yourdomain.com
[Tue Apr 19 11:09:04 2011] [debug] src/mod_auth_kerb.c(1385): [client 10.120.22.74] Verifying client data using KRB5 GSS-API
[Tue Apr 19 11:09:04 2011] [debug] src/mod_auth_kerb.c(1401): [client 10.120.22.74] Client didn't delegate us their credential
[Tue Apr 19 11:09:04 2011] [debug] src/mod_auth_kerb.c(1420): [client 10.120.22.74] GSS-API token of length 163 bytes will be sent back

However, these are all the different error messages I got throughout my initial attempt:

[Mon Apr 18 16:57:30 2011] [debug] src/mod_auth_kerb.c(1101): [client 10.120.22.74] GSS-API major_status:000d0000, minor_status:0000000d
[Mon Apr 18 16:57:30 2011] [error] [client 10.120.22.74] gss_acquire_cred() failed: Unspecified GSS failure.  Minor code may provide more information (, Permission denied)

→ wrong file system permissions for /etc/krb5.keytab, i.e. not readable for the webserver’s Linux user

[Mon Apr 18 17:51:54 2011] [debug] src/mod_auth_kerb.c(1101): [client 10.120.22.74] GSS-API major_status:000d0000, minor_status:025ea101
[Mon Apr 18 17:51:54 2011] [error] [client 10.120.22.74] gss_acquire_cred() failed: Unspecified GSS failure.  Minor code may provide more information (, Key table entry not found)

→ missing service principal (possibly HTTP/webserver.yourdomain.com@YOURDOMAIN.COM) in /etc/krb5.keytab

[Tue Apr 19 08:40:38 2011] [debug] src/mod_auth_kerb.c(1429): [client 10.120.22.74] Warning: received token seems to be NTLM, which isn't supported by the Kerberos module. Check your IE configuration.
[Tue Apr 19 08:40:38 2011] [debug] src/mod_auth_kerb.c(1101): [client 10.120.22.74] GSS-API major_status:00010000, minor_status:00000000
[Tue Apr 19 08:40:38 2011] [error] [client 10.120.22.74] gss_accept_sec_context() failed: An unsupported mechanism was requested (, Unknown error)

→ the website is not in zone “Local Intranet” in IE or IE is configured incorrectly, see Authentication Uses NTLM instead of Kerberos

[Tue Apr 19 09:31:43 2011] [debug] src/mod_auth_kerb.c(1101): [client 10.120.20.81] GSS-API major_status:000d0000, minor_status:000186a3
[Tue Apr 19 09:31:43 2011] [error] [client 10.120.20.81] gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, )

→ wrong kvno or machine password in /etc/krb5.keytab → recreate the keytab using the correct information
→ OR problem with local Kerberos ticket cache on your workstation, use Kerbtray.exe to purge the ticket cache and open the website in IE again

   This article is about the configuration of Windows Server 2008 with Kerberos authentication. Kerberos is an integral part of Windows 2008 Active Directory implementations, and anyone planning to deploy and maintain the enterprise NoSQL database e.g. DataStax Enterprise must should have a basic knowledge of the principals and administrative issues involved in this front-line security technology.

   If we want to configure Windows Server 2008 with Kerberos authentication we need to install: Web Server(IIS), DHCP Server, Active Directory Domain Server. Also, we should set static ip address, computer name, and configure all installed services. The following section will explain how to properly configure system for Kerebros authentication and install the necessary software.

1.        Change computer name (server)

The computer name for Windows Server is the name of our server.

1.1. Click Start, right-click Computer, and then click Properties.

1.2. Under Computer name, domain, and workgroup settings, click Change settings.

1.3. Click the Computer Name tab, and then click Change.

1.4. Write down the computer name. For example we are using «cogserver02» , and then click “OK”.

1.1        Set static ip



For certain types of servers, you must assign a static IP address and subnet mask during or after Setup.
These servers include DHCP servers, DNS servers and any server providing access to users on the Internet. It is also recommended that you assign a static IP address and subnet mask for each domain controller. 

To configure IPv4 for static addressing please do the following:

  1. Click Start, click Control Panel, click Network and Internet, click Network and Sharing Center and then click Change Adapter Settings.
  2. Right-click the connection to which you want to add a static IP address and then click Properties.
  3. Acknowledge the UAC dialog and then double-click Internet Protocol Version 4 (TCP/IP/IPv4).
  4. Click Use the following IP address, and do one of the following:
    • For a local area connection, in IP address, Subnet mask, and Default gateway, type the IP address, subnet mask, and default gateway addresses.
    • For all other connections, in IP address, type the IP address.
  5. Click Use the following DNS server addresses.
  6. In Preferred DNS server and Alternate DNS server, type the primary and secondary DNS server addresses.

To configure advanced static IPv4 address settings for a local area connection, click Advanced.

2.        Web Server(IIS) installation 

Internet Information Services (IIS) is an extensible web server created by Microsoft for use with Windows NT family. 

2.1      Click Start, click Administrative Tools and then click Server Manager.

2.2      In the Server Manager window, scroll down to Roles Summary, and then click Add Roles.

2.3      Select Web Server (IIS) on the Select Server Roles page. 

2.4     Select the IIS services to be installed on the Select Role Services page. Add only the necessary modules. In this case, ASP.NET is selected, and a description of ASP.NET appears in the right pane.Once desired modules are added, click Next.

2.5      Add any required role services.

2.6      IIS is now installed with a default configuration for hosting ASP.NET on Windows Server. Click Close to complete the process.

3.        DHCP Server installation   

Dynamic Host Configuration Protocol (DHCP) is a client/server protocol that automatically provides an Internet Protocol (IP) host with its IP address and other related configuration information such as the subnet mask and default gateway

3.1          From the Start menu, select Administrative Tools, then select Server Manager.

3.2          Expand and click Roles from the left window. Choose Add Roles.

3.3          Next, select that you want to add the DHCP Server Role, and click Next.

3.4          On the Network connection binding screen click Next.

3.5          On the IPv4 DNS Settings screen set Parent Domain (cognet.local), Primary DNS Server (192.168.1.200) and click Next.

3.6          We strongly suggest not to use WINS on the network. Please disable this option. Then click Next.

3.7      On the next screen, click Add  to add a new scope. In our example the scope is named “cognet-local”,  the starting and ending IP addresses is set to 192.168.1.1-192.168.1.100, the subnet mask is set to 255.255.255.0, After writing down these parameters, please click OK, then Next.

3.8          Please set Disable DHCPv6 stateless mode to disable for this server, then click Next.

3.9          Confirm Installation Selections.

AD DS provides a distributed database that stores and manages information about network resources and application-specific data from directory-enabled applications. Administrators can use AD DS to organize elements of a network, such as users, computers, and other devices, into a hierarchical containment structure. The hierarchical containment structure includes the Active Directory forest, domains in the forest, and organizational units (OUs) in each domain. A server that is running AD DS is called a domain controller.

4.1        Installation Active Directory

4.1.1        From the Start menu, select Administrative Tools, then select Server Manager.

4.1.2        Expand and click Roles from the left window. Choose Add Roles.

4.1.3        Next, select that you want to add the Active Directory Domain Server role, and click Next.

4.1.4        Click next to skip  the part and then click install to start installing the binaries for Active Directory.

4.1.5        When the installation is finished you will be shown a success message, then click Close.

4.2        Configuration Active Directory

4.2.1         Open Server Manager, expand Roles and click Active Directory Domain Services. On the right hand side click the Run the Active Directory Domain Services Installation Wizard (dcpromo.exe) link.

4.2.2        This will launch another wizard, this time to configure the settings for you domain. Please  click Next to continue.

4.2.3          Click Nextchoose to create a new domain in a new forest.

4.2.4          Type FQDN ( we are using “cognet.local” as an example ), then click  Next.

4.2.5       Since this is the first DC in our domain we can change our forest functional level to Windows Server 2008 R2.

4.2.6         We want to include DNS in our installation because this will allow us to have an AD Integrated DNS Zone. When you click Next you will be prompted with a message to confirm. Please confirm this by clicking Yes to continue.

4.2.7          Confirm all installation sections. (Active directory should install DNS Server)

4.3        Configure DNS Server

4.3.1          From the Start menu, select Administrative Tools and then select DNS to open the DNS console.

4.3.2          Double-click on your computer name (COGSERVER02), then right-click on Reverse Lookup Zones and choose New zone to launch the New Zone Wizard.

4.3.3          Select Primary zone  and  Store the zone in Active Directory, then click  Next.

4.3.4       On the screen Active Directory Replication Scope select To all DNS servers running on domain controllers in this domain: cognet.local, then click  Next.

4.3.5          On the next screen select IPv4 Reverse Lookup Zone, then click Next.

4.3.6          Type Network ID: 192.168.1, then click  Next.

4.3.7          On the screen Dynamic Update select: Allow only secure dynamic updates.

4.3.8          Confirm all configurations sections.



4.4        Managing DNS Records

4.4.1         In DNS Manager, expand your server name (cogserver02), then expand the Forward Lookup Zones , right-click on your domain name (cognet.local) and select Properties.

4.4.2          Click the Start of Authority (SOA) tabulation.

4.4.3          Set the Primary Server to your primary nameserver ( for example we are using “cogserver02.cognet.local”)

4.4.4          Next, click the Name Servers tabulation.

4.4.5          Remove all items in the list, then click Add and type your name servers ( for example we are using “cogserver02.cognet.local”).

4.4.6          When done, click OK to close the window. You are now ready to set up your zone records.

4.4.7          Right-click your domain name under Forward Lookup Zones and Reverse Lookup Zones, and select New Host (A or AAAA) or Pointer(PTR). See image below:

Reverse Lookup Zones settings

Forward
Lookup Zones settings


More information: DNS and DNS2

4.5        Add users to Active directory

4.5.1          Open Active Directory Users and Computers

4.5.2          Right-click the Users then New. Next please select User (in your example “test_user”, “dse/linuxccm.cognet.local”).

4.6        Connect computer to a domain

4.6.1          Open System by clicking the Start button, right-click Computer, and then click Properties

4.6.2          Under Computer name, domain, and workgroup settings, click Change settings.  If you’re prompted for an administrator password or confirmation, type the password or provide confirmation.

4.6.3          Click the Computer Name tab, and then click Change. Alternatively, click Network ID to use the Join a Domain or Workgroup wizard to automate the process of connecting to a domain and creating a domain user account on your computer.

4.6.4          Under Member of, click Domain.

4.6.5          Type the name of the domain (for example: “COGNET.LOCAL”) that you want to join, and then click OK.

4.6.6          Restart the computer.

If Your computer is already in the domain, you must remove computer from the domain:

                    I.            Click Start button, then point to Computer.

                  II.            Right-Click Computer, then click Properties.

                III.            Under the Computer name, domain, and workgroup settings, click Change Settings.

               IV.            Please click Change, change the Member of Option to Workgroup, then click OK.

                 V.            When you are asked for the administrator’s account and/or password, please type it.

               VI.            Restart the computer.

             VII.            Then the computer can be added to the domain.

And  disable cached domain logon:

How to disable the cached domain logon, please set the cachedlogonscount registry key under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon to 0. Then restart the computer.

4.7        Check the correctness settings

4.7.1          Run command line (on the windows: windows button + R, then type cmd ; on the linux: ctrl + alt + T)

4.7.2          Type nslookup name server (for example: “nslookup cogserver02”)

Result nslookup


Cognitum cooperates with Microsoft under prestigious Azure Circle program, where technology partners are invited with experience in Windows Azure. It provides IT solutions in the area of Cloud and BigData for customers both in Poland and abroad.
Cognitum is also a partner of DataStax, a major Cassandra vendor that provides worldwide training for Cassandra and Enterprise level appliances: DataStax Enterprise combining Cassandra, Hadoop, Hive, Solr into single solution. 



SharePoint 2010 by default allows Kerberos authentication when you select NTLM/Negotiate in the authentication scheme. However, there are some additional steps that you can use to force Kerberos authentication to be used. This has advantages in performance as well as increasing security, and is particularly useful in Intranet scenarios.

The requirements for enabling this are:

– Kerberos is enabled in your domain (Windows Server 2003 and up general support this automatically)

– You have application pools that use Domain accounts, insted of Local accounts

In this configuration, Kerberos uses the application pool identity to decrypt Kerberos tickets.

Viewing Logon Sessions in Event Viewer

You can check what authentication is being used by viewing the logon sessions in the Security event log. You should see entries logged with Event ID 4624 and a Task category of Logon. If NTML is being used, in the details you will see an entry like:

Detailed Authentication Information:
	Logon Process:		NtLmSsp 
	Authentication Package:	NTLM
	Transited Services:	-
	Package Name (NTLM only):	NTLM V1
	Key Length:		0

Whereas if Kerberos is being used, the entry will be similar to:

Detailed Authentication Information:
	Logon Process:		Kerberos
	Authentication Package:	Kerberos
	Transited Services:	-
	Package Name (NTLM only):	-
	Key Length:		0

Viewing Kerberos Tickets

When a session is created to a Kerberos-enabled application, the client receives a Kerberos ticket that is used to authenticate the user’s account. In Windows 7 and Windows Server 2008, you can use the KLIST application to view Kerberos tickets from the command line. A typical output would be something like:

Current LogonId is 0:0x2510zzz

Cached Tickets: (2)

#0>     Client: gavin.mckay @ YOUR.DOMAIN.LOCAL
        Server: krbtgt/YOUR.DOMAIN.LOCAL @ YOUR.DOMAIN.LOCAL
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
        Start Time: 11/4/2011 8:02:36 (local)
        End Time:   11/4/2011 18:02:36 (local)
        Renew Time: 11/11/2011 8:02:36 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96


#1>     Client: gavin.mckay @ YOUR.DOMAIN.LOCAL
        Server: ldap/SERVER1.YOUR.DOMAIN.LOCAL/YOUR.DOMAIN.LOCAL @ YOUR.DOMAIN.LOCAL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40a40000 -> forwardable renewable pre_authent ok_as_deleg
ate
        Start Time: 11/4/2011 8:02:36 (local)
        End Time:   11/4/2011 18:02:36 (local)
        Renew Time: 11/11/2011 8:02:36 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96

As Kerberos tickets are cached, you may need to use the command:

KLIST purge

to remove any current tickets and force new ones to be generated.

Create Service Principal Names (SPNs)

NOTE: In the commands below, the HTTP refers to the service type, NOT the protocol type. So if you have https://your.intranet.local, the entry below would be HTTP/your.intranet.local:443. The HTTPS is not included in the service name, but the port number is.

1. Use the command:

(Windows Server 2008)
setspn -S HTTP/your.intranet.local DOMAINNAME/AccountName

(Windows Server 2003)

setspn -A HTTP/your.intranet.local DOMAINNAME/AccountName

Enable Kernel Mode Authentication in IIS 7

From the IIS Manager description:

By default, IIS enables kernel-mode authentication, which may improve authentication performance and prevent authentication problems with application pools configured to use a custom identity. As a best practice, do not disable this setting if Kerberos authentication is used in your environment and the application pool is configured to use a custom identity.

1. Open IIS Manager
2. Select the website you want to enable Kernel Mode authentication for
3. In the IIS group, select Authentication
4. Select Windows Authentication
5. In the Actions area, select Advanced Settings
6. Ensure “Enable Kernel-mode authentication” is ticked
7. Click OK

Update the Authentication in applicationHost.config

1. Using Notepad, open the applicationHost.config (by default this is in C:\Windows\System32\inetsrv\config)

2. Find your website entry, generally this should be similar to:

<location path="your.sharepoint.url">

i.e. if you access your site via http://your.sharepoint.url, look for the location path as above

3. Update the tag <windowsAuthentication…> to:

<windowsAuthentication enabled="true" useKernelMode="true" useAppPoolCredentials="true">

4. Save the file

Additional Troubleshooting

Configuring Kerberos authentication: Core configuration (SharePoint Server 2010)
Kerberos Delegation Configuration Reporting Tool (ASP.NET web app)


This entry was posted on November 2, 2011 at 2:51 pm and is filed under SharePoint, Uncategorized. You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, or trackback from your own site.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Не запускается установка удаление программ windows 10
  • Как поменять имя процессора в windows 10
  • Не устанавливается windows 11 8007000d
  • Как сделать чтобы программа работала в фоновом режиме windows 10
  • Windows 10 домашняя профессиональная или корпоративная