[comment]: # translation:outdated

[comment]: # ({930fae3b-930fae3b})
# 13 Configuration de Kerberos avec Zabbix

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

[comment]: # ({bfbefd40-5be9f534})
#### Aperçu

L'authentification Kerberos peut être utilisée dans la surveillance web et les éléments HTTP dans Zabbix.

Cette page décrit un exemple de configuration de Kerberos pour que le serveur Zabbix effectue la surveillance web de `www.example.com` avec un principal Kerberos pour le processus Zabbix sur Debian/Ubuntu.

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

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

1\. Installez le KDC et les utilitaires client :

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

Pendant l’installation des paquets, répondez aux invites, par exemple :

```default
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\. Associez un nom d’hôte convivial (facultatif, pour les tests locaux).

Modifiez /etc/hosts et ajoutez une entrée pour votre DC et votre serveur web si vous n’avez pas de DNS :

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

Exemple de ligne que vous pouvez ajouter :

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

3\. Configurez le client Kerberos et le realm KDC :

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

Exemple de paramètres :

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

Si vous prévoyez d’utiliser `.localdomain` ou d’autres noms non publics, ajoutez des mappages explicites domaine→realm afin que le mappage nom d’hôte→realm fonctionne.
Des incohérences ici provoquent des erreurs `Server not found in Kerberos database`.

4\. Initialisez la base de données Kerberos (une seule fois, sur l’hôte KDC).
Définissez un mot de passe maître sécurisé lorsque vous y êtes invité :

```bash
sudo krb5_newrealm
```

5\. Créez le principal `HTTP/host.fqdn@REALM` en utilisant le nom d’hôte exact que les clients utiliseront ; privilégiez les minuscules (par exemple `HTTP/web.example.com@EXAMPLE.COM`).
Une différence de casse/nom provoque `Server not found in Kerberos database`.

```bash
sudo kadmin.local
```

Dans `kadmin.local` :

```bash
addprinc kerb-admin@EXAMPLE.COM     # principal administratif
addprinc -randkey HTTP/dc01.example.com@EXAMPLE.COM
ktadd -k /etc/apache2/http.keytab HTTP/dc01.example.com@EXAMPLE.COM
quit
```

Déplacez le keytab vers l’hôte web (ou conservez-le localement s’il s’agit de la même machine) et définissez des permissions utilisables par Apache :

```bash
chown www-data:www-data /etc/apache2/http.keytab
chmod 600 /etc/apache2/http.keytab
# verify
sudo -u www-data -k /etc/apache2/http.keytab
```

6\. Installez et activez le module Apache GSSAPI :

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

:::noteimportant
Toutes les versions de mod_auth_gssapi ne prennent pas en charge chaque directive `Gssapi*`.
Si Apache échoue avec `Invalid command 'GssapiCredStore'`, supprimez la directive non prise en charge ou mettez à niveau le module.
:::

7\. Configurez un VirtualHost (ajustez `DocumentRoot` / le chemin vers votre interface Zabbix) :

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

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

Redémarrez Apache :

```bash
sudo systemctl restart apache2
```

8\. Activez/démarrez les services KDC et vérifiez les ports d’écoute (hôte KDC) :

```bash
sudo systemctl enable --now krb5-kdc krb5-admin-server
ss -tnlp | grep :80    # or: sudo netstat -tnlp | grep :80
```

9\. Obtenez un TGT pour les tests (exécutez la commande en tant qu’utilisateur qui utilisera le ticket).

Vous devez voir `krbtgt/EXAMPLE.COM@EXAMPLE.COM` dans la liste des tickets.
Exécutez `kinit` avec le même utilisateur du système d’exploitation qui a besoin du ticket (par exemple `zabbix` pour les contrôles web ou `www-data`/Apache pour les tests SSO interactifs dans le navigateur).
Les tickets émis pour un autre utilisateur du système d’exploitation ne seront pas visibles, sauf si `KRB5CCNAME` et les permissions sont ajustés.

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

10\. Testez l’échange SPNEGO avec curl (depuis un client disposant d’un TGT valide).
Un `200 OK` (ou une redirection vers l’application) indique que SPNEGO a réussi :

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

11\. Facultativement, si l’interface Zabbix doit accepter les connexions authentifiées par HTTP, activez l’authentification HTTP dans le front-end Zabbix (ui/conf/zabbix.conf.php) :

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

Dans l’interface web, allez dans *Users* > *Authentication* puis ouvrez l’onglet [*HTTP settings*](/manual/web_interface/frontend_sections/users/authentication/http).
Cochez la case *Enable HTTP authentication* et cliquez sur *Ok* dans la fenêtre contextuelle.
Sélectionnez "HTTP login form" dans la liste déroulante *Default login form*.
Déterminez si *Case-sensitive login* correspond à la politique de votre annuaire.
Cliquez sur le bouton *Update* pour terminer.

12\. Configuration du navigateur (Firefox est utilisé comme exemple) : définissez `network.negotiate-auth.trusted-uris` sur le ou les hôtes effectuant Negotiate (`dc01.example.com`) afin que le navigateur envoie automatiquement les jetons Kerberos.

Dans `about:config` :

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

Désormais, en visitant `http://dc01.example.com`, vous devriez être connecté directement à Zabbix sans le formulaire.

13\. Gardez les clés/tickets à jour.
La durée de vie par défaut d’un ticket Kerberos est d’environ 10 heures.
Ajoutez un cron/minuteur systemd pour éviter les expirations :

```bash
#for the web service
kinit -kt /etc/apache2/http.keytab HTTP/dc01.example.com@EXAMPLE.COM
#for the monitoring user
kinit -kt /var/lib/zabbix/kerb.keytab kerb-admin@EXAMPLE.COM
```

14\. Vérifications de maintenance :

-   `klist -k /etc/apache2/http.keytab` — vérifiez que le principal de service est présent dans le keytab.
-   `sudo tail -f /var/log/apache2/error.log` — surveillez les erreurs GSSAPI (`gss_acquire_cred[_from]() failed to get server creds` signifie keytab/permissions incorrects ou principal manquant).
-   `curl --negotiate` renvoyant 401/403 signifie souvent un principal incorrect, l’absence de ticket, une non-correspondance de l’en-tête d’hôte ou un problème de permissions du système de fichiers ; vérifiez les journaux et les mappages de domaine dans `/etc/krb5.conf`.

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

[comment]: # ({32287407-notes})
#### Remarques sur la sécurité et les permissions de fichiers

Les fichiers keytab doivent être lisibles uniquement par le compte qui en a besoin.
Exemples de permissions : `0400` avec `zabbix:zabbix` comme propriétaire pour un keytab d’utilisateur zabbix, ou `0440` et `root:www-data` pour un keytab Apache.

Évitez de stocker des mots de passe en clair à longue durée de vie sur l’hôte.
Utilisez des keytabs ou des principaux de machine joints au domaine lorsque cela est possible.

Lors de l’exécution de tests ou de scripts qui définissent `KRB5CCNAME` ou copient des keytabs, vérifiez de nouveau le propriétaire et les permissions après l’opération — le rejet des informations d’identification par un serveur web est souvent dû à un problème de permissions de fichier.

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