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 (or your FQDN)
Administrative server for your Kerberos realm: localhost (or your FQDN)

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

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

sudo vi /etc/hosts

Пример добавляемой строки:

192.168.1.100  dc01.example.com dc01

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

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 или другие непубличные имена, добавьте явные сопоставления доменов с областями, чтобы сопоставление имени узла с областью работало корректно. Несоответствия в этой конфигурации приводят к ошибкам Server not found in Kerberos database.

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

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 :80    # или: sudo netstat -tnlp | grep :80

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;

В веб-интерфейсе перейдите в раздел Users > Authentication и откройте вкладку HTTP settings. Установите флажок Enable HTTP authentication и нажмите Ok во всплывающем окне. В раскрывающемся списке Default login form выберите 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, после операции еще раз проверьте владельца и разрешения — отказ веб-сервера в принятии учетных данных часто связан с проблемами разрешений файлов.