Настройка 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.
В файле конфигурации веб-интерфейса (zabbix.conf.php) задайте:
$ZBX_FEATURE_FLAGS['http_auth_enabled'] = true;
Затем настройте HTTP-аутентификацию в веб-интерфейсе.
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 или разрешениями либо отсутствие принципала).- Возврат
401/403командойcurl --negotiateчасто означает неправильный принципал, отсутствие билета, несоответствие заголовка узла сети или проблему с разрешениями файловой системы; проверьте журналы и сопоставления доменов в/etc/krb5.conf.
Замечания о безопасности и правах доступа к файлам
Keytab-файлы должны быть доступны на чтение только той учётной записи, которой они нужны.
Пример доступов: 0400 с владельцем zabbix:zabbix для keytab-файла пользователя zabbix, либо 0440 и root:www-data для keytab-файла для Apache.
Избегайте хранения долговременных паролей в открытом виде на хосте. По возможности используйте keytab-файлы или принципалы машин, подключённых к домену.
При запуске тестов или скриптов, устанавливающих KRB5CCNAME или копирующих keytab-файлы, дважды проверьте владельцев и права доступа после операции — веб-сервер, отклоняющий учётные данные, обычно является проблемой с правами доступа к файлу.