Kerberos

Керберос был создан с мыслью об аутентификации, но не авторизации. Он говорит "Ты мне можешь доверять, этот человек тот, за кого себя выдаёт" и ничего более.

Правильным описанием для Керберос является "безопасный, single sign on, доверенная стороння служба взаимной аутентификации". Он не хранит никакой информации про UID, GID или путь к домашней папке. Чтобы передать эту информацию хостам, тебе в конечном итоге понадобятся справочные службы: NIS, LDAP или Samba.

Реализации

MIT Kerberos - первоначальная реализация. Из-за того, что во время своего появления она попадала под ограничения экспорта технологий криптографии, была придумана альтернатива в виде шведского Heimdal Kerberos.

Heimdal Kerberos - изначально не было экспортных ограничений. Создана в Швеции и нацелена на полную совместимость с MIT Kerberos. Используется сервером Samba.

Active Directory - эти контроллеры доменов используют для Windows свою реализацию Керберос 5.

Shishi - GNU реализация Керберос 5.

Пакеты

  • krb5-kdc - сервер KDC (ставится на основной и подчинённые KDC)
  • krb5-admin-server - сервер администрирования KDC (ставится на основной KDC)
  • krb5-kpropd - сервер репликации KDC (ставится на подчинённые KDC)
  • krb5-user - клиентские утилиты Керберос (kinit, klist и т.д.)
  • krb5-config - содержит шаблон для конфигурационного файла /etc/krb5.conf и доки по нему
  • krb5-k5tls
  • krb5-doc - локальная копия раздела документации с сайта Керберос. После установки пакета, документация доступна по ссылке file:///usr/share/doc/krb5-doc/index.html
  • libgssrpc4
  • libkadm5clnt-mit12
  • libkadm5srv-mit12
  • libkdb5-10

Установка клиента

sudo apt install krb5-user

Получить тикет

kinit

Посмотреть имеющиеся тикеты

klist

Какому пакету принадлежит файл /usr/bin/klist

$ dpkg -S /usr/bin/klist krb5-user: /usr/bin/klist

Посмотреть информацию о пакете

$ apt-cache show krb5-user Package: krb5-user Source: krb5 Version: 1.18.3-6+deb11u1 Installed-Size: 442 Maintainer: Sam Hartman Architecture: amd64 Depends: libc6 (>= 2.25), libcom-err2 (>= 1.43.9), libk5crypto3 (>= 1.18.2), libkadm5clnt-mit12 (>= 1.18.2), libkadm5srv-mit12 (>= 1.18.2), libkdb5-10 (>= 1.18.3), libkrb5-3 (= 1.18.3-6+deb11u1), libkrb5support0 (>= 1.17), libss2 (>= 1.01), krb5-config Suggests: krb5-k5tls Conflicts: heimdal-clients Description-en: basic programs to authenticate using MIT Kerberos Kerberos is a system for authenticating users and services on a network. Kerberos is a trusted third-party service. That means that there is a third party (the Kerberos server) that is trusted by all the entities on the network (users and services, usually called "principals"). . This is the MIT reference implementation of Kerberos V5. . This package contains the basic programs to authenticate to MIT Kerberos, change passwords, and talk to the admin server (to create and delete principals, list principals, etc.). Description-md5: b10599fa748131166d0b1a01617ee6ce Multi-Arch: foreign Homepage: http://web.mit.edu/kerberos/ Tag: admin::login, admin::user-management, implemented-in::c, interface::commandline, network::client, protocol::kerberos, role::program, security::authentication, use::login Section: net Priority: optional Filename: pool/main/k/krb5/krb5-user_1.18.3-6+deb11u1_amd64.deb Size: 151304 MD5sum: fe08f17d28e54d8721533a7a9654bbbc SHA256: 250c3e1592f517a1510d4187c9e68ee58d2b88401359e08629f8265718f7c7c8

Посмотреть состав пакета krb5-user

$ dpkg -L krb5-user /. /usr /usr/bin /usr/bin/k5srvutil /usr/bin/kadmin /usr/bin/kdestroy /usr/bin/kinit /usr/bin/klist /usr/bin/kpasswd /usr/bin/ksu /usr/bin/kswitch /usr/bin/ktutil /usr/bin/kvno /usr/share /usr/share/doc /usr/share/doc/krb5-user /usr/share/doc/krb5-user/NEWS.Debian.gz /usr/share/doc/krb5-user/README.Debian /usr/share/doc/krb5-user/README.gz /usr/share/doc/krb5-user/changelog.Debian.gz /usr/share/doc/krb5-user/copyright /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/krb5-user /usr/share/man /usr/share/man/man1 /usr/share/man/man1/k5srvutil.1.gz /usr/share/man/man1/kadmin.1.gz /usr/share/man/man1/kdestroy.1.gz /usr/share/man/man1/kinit.1.gz /usr/share/man/man1/klist.1.gz /usr/share/man/man1/kpasswd.1.gz /usr/share/man/man1/ksu.1.gz /usr/share/man/man1/kswitch.1.gz /usr/share/man/man1/ktutil.1.gz /usr/share/man/man1/kvno.1.gz

Посмотреть состав пакета krb5-kdc

$ dpkg -L krb5-kdc /. /etc /etc/init.d /etc/init.d/krb5-kdc /etc/krb5kdc /lib /lib/systemd /lib/systemd/system /lib/systemd/system/krb5-kdc.service /usr /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/krb5 /usr/lib/x86_64-linux-gnu/krb5/plugins /usr/lib/x86_64-linux-gnu/krb5/plugins/kdb /usr/lib/x86_64-linux-gnu/krb5/plugins/kdb/db2.so /usr/sbin /usr/sbin/kdb5_util /usr/sbin/kproplog /usr/sbin/krb5kdc /usr/share /usr/share/doc /usr/share/doc/krb5-kdc /usr/share/doc/krb5-kdc/NEWS.Debian.gz /usr/share/doc/krb5-kdc/README.Debian /usr/share/doc/krb5-kdc/README.KDC /usr/share/doc/krb5-kdc/changelog.Debian.gz /usr/share/doc/krb5-kdc/copyright /usr/share/doc/krb5-kdc/examples /usr/share/krb5-kdc /usr/share/krb5-kdc/kdc.conf.template /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/krb5-kdc /usr/share/man /usr/share/man/man5 /usr/share/man/man5/kdc.conf.5.gz /usr/share/man/man8 /usr/share/man/man8/kdb5_util.8.gz /usr/share/man/man8/kproplog.8.gz /usr/share/man/man8/krb5kdc.8.gz /var /var/lib /var/lib/krb5kdc /usr/share/doc/krb5-kdc/examples/kdc.conf

Посмотреть состав пакета krb5-admin-server

$ dpkg -L krb5-admin-server /. /etc /etc/init.d /etc/init.d/krb5-admin-server /lib /lib/systemd /lib/systemd/system /lib/systemd/system/krb5-admin-server.service /usr /usr/sbin /usr/sbin/kadmin.local /usr/sbin/kadmind /usr/sbin/kprop /usr/sbin/krb5_newrealm /usr/share /usr/share/doc /usr/share/doc/krb5-admin-server /usr/share/doc/krb5-admin-server/changelog.Debian.gz /usr/share/doc/krb5-admin-server/copyright /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/krb5-admin-server /usr/share/man /usr/share/man/man5 /usr/share/man/man5/kadm5.acl.5.gz /usr/share/man/man8 /usr/share/man/man8/kadmin.local.8.gz /usr/share/man/man8/kadmind.8.gz /usr/share/man/man8/kprop.8.gz /usr/share/man/man8/krb5_newrealm.8.gz

kadmin.local - утилита для локального управления БД для KDC

kadmind - сервер администрирования KDC

kprop - утилита для распространения БД на подчинённые серверы KDC

Репликация KDC

Для репликации используется утилита kprop из пакета krb5-admin-server и сервер kpropd из пакета krb5-kpropd. Сервер ставится на подчинённые KDC. Сервер управления KDC находится только на основном KDC.

Создание базы данных для KDC

$ sudo kdb5_util create -s Loading random data Initializing database '/var/lib/krb5kdc/principal' for realm 'MY.REALM.RU', master key name 'K/M@MY.REALM.RU' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: Re-enter KDC database master key to verify:

Списки контроля доступа ACL

Обычно размещаются в файле /etc/krb5kdc/kadm5.acl

Флаг Описание
a/A Разрешить/запретить добавлять политики принципалов
d/D Разрешить/запретить удалять принципалов
m/M Разрешить/запретить изменять принципалов
c/C Разрешить/запретить изменять пароль принципалов
i/I Разрешить/запретить запросы к БД
l/L Разрешить/запретить принципалам просматривать БД

Список портов

Сервер Локальный порт Удалённый порт Описание
Все KDC TCP 88, UDP 88 Выше 1024 Сервер тиектов Керберос 5
Все KDC TCP 749 Выше 1024 Служба Керберос 5 для смены пароля пользователя
Все KDC UDP 4444 Выше 1024 Служба для преобразования тикетов из Керберос 5 в Керберос 4
Все KDC TCP 749 Выше 1024 Сервер управления Керберос 5
Главный/Управляющий KDC TCP 464 Выше 1024 Служба Керберос 5 для смены пароля пользователя (старая версия и AD)

Создание принципала для службы

# kadmin.local kadmin.local: add_principal -randkey servicename/hostname@REALM

Далее надо экспортировать ключ в файл keytab

kadmin.local: ktadd -k servicename.keytab servicename/hostname

Скопировать полученный ключ на сервер службы.

scp /tmp/ssh-server.keytab root@ssh-server.foobar.com:/etc/krb5.keytab

Файл keytab должен быть доступен для процесса, который его использует.