[comment]: # translation:outdated

[comment]: # ({930fae3b-930fae3b})
# 13. Настройка Kerberos с Zabbix

[comment]: # ({/930fae3b-930fae3b})

[comment]: # ({bfbefd40-5be9f534})
#### Обзор

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

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

[comment]: # ({/bfbefd40-5be9f534})

[comment]: # ({e94370cd-edb96e72})
#### Настройка

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

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

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

```default
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 и добавьте записи для вашего контроллера домена и веб-сервера:

```bash
sudo vi /etc/hosts
```

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

```ini
192.168.1.100  dc01.example.com dc01
```

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

```bash
sudo vi /etc/krb5.conf
```

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

```ini
[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):

```bash
sudo krb5_newrealm
```

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

```bash
sudo kadmin.local
```

Внутри `kadmin.local`:

```bash
addprinc kerb-admin@EXAMPLE.COM     # административный принципал
addprinc -randkey HTTP/dc01.example.com@EXAMPLE.COM
ktadd -k /etc/apache2/http.keytab HTTP/dc01.example.com@EXAMPLE.COM
quit
```

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

```bash
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:

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

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

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

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

Внутри `zabbix.conf`:

```apache
<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:

```bash
sudo systemctl restart apache2
```

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

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

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

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

```bash
kinit kerb-admin@EXAMPLE.COM
klist
```

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

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

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

```php
$ALLOW_HTTP_AUTH = true;
```

В веб-интерфейсе перейдите к *Пользователи* → *Аутентификация (Users* → *Authentication)* и перейдите к вкладке [*Настройки HTTP (HTTP settings)*](/manual/web_interface/frontend_sections/users/authentication/http).
Отметьте флажок *Активация 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`:

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

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

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

```bash
#для веб-службы
kinit -kt /etc/apache2/http.keytab HTTP/dc01.example.com@EXAMPLE.COM
#для пользователя мониторинга
kinit -kt /var/lib/zabbix/kerb.keytab kerb-admin@EXAMPLE.COM
```

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`.

[comment]: # ({/e94370cd-edb96e72})

[comment]: # ({32287407-notes})
#### Замечания о безопасности и правах доступа к файлам

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

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

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

[comment]: # ({/32287407-notes})
