13. Настройка Kerberos с Zabbix

Обзор

В Zabbix аутентификацию Kerberos можно использовать в веб-мониторинге и HTTP элементах данных.

На этой странице описывается пример настройки Kerberos для выполнения Zabbix сервером веб-мониторинга страницы www.example.com с использованием принципала Kerberos для процесса Zabbix в Debian/Ubuntu.

Настройка

1. Установите KDC и клиентские утилиты:

sudo apt update
       sudo apt install krb5-kdc krb5-admin-server krb5-user

Во время настройки пакетов ответьте на вопросы, например:

Default Kerberos version 5 realm: EXAMPLE.COM
       Kerberos servers for your realm: localhost (или ваш FQDN)
       Administrative server for your Kerberos realm: localhost (или ваш FQDN)

2. Укажите удобное имя хоста (необязательно, для локального тестирования).

Если у вас нет DNS, отредактируйте /etc/hosts и добавьте записи для вашего контроллера домена и веб-сервера:

sudo vi /etc/hosts

Пример строки, которую вы могли бы добавить:

192.168.1.100  dc01.example.com dc01

3. Настройте клиента Kerberos и KDC realm:

sudo vi /etc/krb5.conf

Пример настроек:

[libdefaults]
           default_realm = EXAMPLE.COM
           dns_lookup_realm = false
           dns_lookup_kdc = false
           rdns = false
           ticket_lifetime = 24h
           renew_lifetime = 7d
           forwardable = true
       
       [realms]
           EXAMPLE.COM = {
               kdc = dc01.example.com
               admin_server = dc01.example.com
           }
       
       [domain_realm]
           .example.com = EXAMPLE.COM
           example.com = EXAMPLE.COM

Если вы планируете использовать .localdomain или другие непубличные имена, добавьте явное отображение домен→realm, чтобы работало отображение имя_хоста→realm. Несоответствия здесь приводят к ошибкам Server not found in Kerberos database («Сервер не найден в базе данных Kerberos»).

4. Инициализируйте базу данных Kerberos (одноразово, хост KDC). При появлении соответствующего запроса задайте надежный главный пароль (master password):

sudo krb5_newrealm

5. Создайте принципал HTTP/host.fqdn@REALM, используя точное имя хоста, которое будет использовать клиент; предпочтительно в нижнем регистре (например, HTTP/[email protected]). Несоответствие в регистре/имени приводит к ошибке Server not found in Kerberos database.

sudo kadmin.local

Внутри kadmin.local:

addprinc [email protected]     # административный принципал
       addprinc -randkey HTTP/[email protected]
       ktadd -k /etc/apache2/http.keytab HTTP/[email protected]
       quit

Поместите keytab-файл на веб-хост (или оставьте локально, если он на той же машине) и задайте права доступа для использования сервером Apache:

chown www-data:www-data /etc/apache2/http.keytab
       chmod 600 /etc/apache2/http.keytab
       # проверка
       sudo -u www-data -k /etc/apache2/http.keytab

6. Установите и подключите модуль Apache GSSAPI:

sudo apt install libapache2-mod-auth-gssapi
       sudo a2enmod auth_gssapi
       sudo a2enmod headers
       sudo systemctl restart apache2

Не все версии mod_auth_gssapi поддерживают каждую директиву Gssapi*. Если Apache выдаёт ошибку Invalid command 'GssapiCredStore', удалите неподдерживаемую директиву или обновите модуль.

7. Настройте VirtualHost (измените DocumentRoot / путь к веб-интерфейсу вашего Zabbix):

sudo vi /etc/apache2/sites-available/zabbix.conf

Внутри zabbix.conf:

<VirtualHost *:80>
           ServerName dc01.example.com
           DocumentRoot /usr/share/zabbix/ui
           <Directory /usr/share/zabbix/ui>
               Options FollowSymLinks
               AllowOverride None
               Require all granted
               AuthType GSSAPI
               AuthName "Kerberos Login"
               GssapiCredStore keytab:/etc/apache2/http.keytab
               GssapiLocalName On
               Require valid-user
           </Directory>
           RequestHeader set X-Remote-User %{REMOTE_USER}s env=REMOTE_USER
           RequestHeader unset Authorization
       </VirtualHost>

Перезапустите Apache:

sudo systemctl restart apache2

8. Активируйте/запустите службы KDC и проверьте прослушиваемые порты (хост KDC):

sudo systemctl enable --now krb5-kdc krb5-admin-server
       ss -tnlp | grep :88    # или: sudo netstat -tnlp | grep :88

9. Получите TGT для тестирования (запустите от имени пользователя, который будет использовать этот мандат).

Ожидаем увидеть krbtgt/[email protected] в списке мандатов. Выполните kinit от имени того пользователя операционной системы, которому нужен мандат (например, zabbix для веб-проверок или www-data/Apache для проверок SSO интерактивного браузера). Мандаты, выданные другому пользователю операционной системы, не будут видны без модификации KRB5CCNAME и прав доступа.

kinit [email protected]
       klist

10. Протестируем обмен SPNEGO с помощью curl (от клиента с корректным TGT). Ответ 200 OK (либо перенаправление на приложение) означает успешное SPNEGO:

curl -v --negotiate -u : http://dc01.example.com/

11. При желании, если веб-интерфейс Zabbix должен принимать входы с HTTP-аутентификацией, активируйте HTTP аутентификацию в веб-интерфейсе Zabbix (ui/conf/zabbix.conf.php):

$ALLOW_HTTP_AUTH = true;

В веб-интерфейсе перейдите к ПользователиАутентификация (UsersAuthentication) и перейдите к вкладке Настройки HTTP (HTTP settings). Отметьте флажок Активация HTTP аутентификации (Enable HTTP authentication) и нажмите Ok во всплывающем окне. В выпадающем окне Диалог входа в систему по умолчанию (Default login form) выберите «HTTP диалог входа в систему (HTTP login form)». Решите, соответствует ли Регистрозависимый вход (Case-sensitive login) вашей политике каталога. Нажмите кнопку Обновить (Update) для завершения.

12. Настройки браузера (в качестве примера используется Firefox): установите network.negotiate-auth.trusted-uris в хост(ы), выполняющие Negotiate (dc01.example.com), так что браузер будет автоматически посылать токены Kerberos.

Внутри about:config:

network.negotiate-auth.trusted-uris = dc01.example.com

Теперь при посещении http://dc01.example.com вы должны попасть прямо в Zabbix без формы логина.

13. Сохраняйте ключи/мандаты свежими. По умолчанию время жизни мандата Kerberos составляет около 10 часов. Добавьте таймер cron/systemd, чтобы избежать истечения срока действия:

#для веб-службы
       kinit -kt /etc/apache2/http.keytab HTTP/[email protected]
       #для пользователя мониторинга
       kinit -kt /var/lib/zabbix/kerb.keytab [email protected]

14. Санитарные проверки:

  • klist -k /etc/apache2/http.keytab — убедиться, что служебный принципал присутствует в keytab-файле.
  • sudo tail -f /var/log/apache2/error.log — посмотреть на ошибки GSSAPI (gss_acquire_cred[_from]() failed to get server creds означает проблемы с keytab-файлом/доступами либо отсутствующий принципал).
  • curl --negotiate, часто возвращающий 401/403, означает неверный принципал, отсутствие мандата, несовпадение заголовка хоста либо проблемы с правами доступа в файловой системе; проверьте файлы журналов и отображение доменов /etc/krb5.conf.

Замечания о безопасности и правах доступа к файлам

Keytab-файлы должны быть доступны на чтение только той учётной записи, которой они нужны. Пример доступов: 0400 с владельцем zabbix:zabbix для keytab-файла пользователя zabbix, либо 0440 и root:www-data для keytab-файла для Apache.

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

При запуске тестов или скриптов, устанавливающих KRB5CCNAME или копирующих keytab-файлы, дважды проверьте владельцев и права доступа после операции — веб-сервер, отклоняющий учётные данные, обычно является проблемой с правами доступа к файлу.