Configuration de Kerberos avec Zabbix

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.

Configuration

1. Installer le KDC et les utilitaires client :

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

Lors de la configuration des paquets, répondre aux invites, par exemple :

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

Modifier /etc/hosts et ajouter une entrée pour votre DC et votre serveur web si vous ne disposez pas de DNS :

sudo vi /etc/hosts

Exemple de ligne à ajouter :

192.168.1.100  dc01.example.com dc01

3. Configurer le client Kerberos et le realm KDC :

sudo vi /etc/krb5.conf

Exemple de paramètres :

[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. Les incohérences à ce niveau provoquent des erreurs Server not found in Kerberos database.

4. Initialiser la base de données Kerberos (une seule fois, sur l’hôte KDC). Définir un mot de passe principal sécurisé lorsque vous y êtes invité :

sudo krb5_newrealm

5. Créer le principal HTTP/host.fqdn@REALM en utilisant le nom d’hôte exact que les clients utiliseront ; privilégier les minuscules (par exemple, HTTP/[email protected]). Une différence de casse ou de nom provoque l’erreur Server not found in Kerberos database.

sudo kadmin.local

Dans kadmin.local :

addprinc [email protected]     # principal administratif
addprinc -randkey HTTP/[email protected]
ktadd -k /etc/apache2/http.keytab HTTP/[email protected]
quit

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

chown www-data:www-data /etc/apache2/http.keytab
chmod 600 /etc/apache2/http.keytab
# vérifier
sudo -u www-data -k /etc/apache2/http.keytab

6. Installer et activer le module GSSAPI d’Apache :

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

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

7. Configurer un VirtualHost (adapter DocumentRoot / le chemin vers votre interface Zabbix) :

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

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

Redémarrer Apache :

sudo systemctl restart apache2

8. Activer et démarrer les services KDC, puis vérifier les ports en écoute (hôte KDC) :

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

9. Obtenir un TGT pour les tests (exécuter la commande avec l’utilisateur qui utilisera le ticket).

Vous devez voir krbtgt/[email protected] dans la liste des tickets. Exécuter kinit avec le même utilisateur du système d’exploitation que celui qui a besoin du ticket (par exemple, zabbix pour les vérifications web ou www-data/Apache pour les tests SSO interactifs dans le navigateur). Les tickets attribués à un autre utilisateur du système d’exploitation ne seront pas visibles, sauf si KRB5CCNAME et les permissions sont ajustés.

kinit [email protected]
klist

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

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

11. Facultatif : si l’interface Zabbix doit accepter les connexions authentifiées par HTTP, activer l’authentification HTTP dans l’interface Zabbix.

Dans le fichier de configuration de l’interface (zabbix.conf.php), définir :

$ZBX_FEATURE_FLAGS['http_auth_enabled'] = true;

Puis configurer l’authentification HTTP dans l’interface web.

12. Configuration du navigateur (Firefox est utilisé comme exemple) : définir network.negotiate-auth.trusted-uris sur le ou les hôtes qui effectuent la négociation (dc01.example.com) afin que le navigateur envoie automatiquement les jetons Kerberos.

Dans about:config :

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

En accédant maintenant à http://dc01.example.com, vous devriez être directement connecté à Zabbix sans afficher le formulaire.

13. Maintenir les clés et les tickets à jour. La durée de vie par défaut d’un ticket Kerberos est d’environ 10 heures. Ajouter une tâche cron ou un minuteur systemd pour éviter les expirations :

#pour le service web
kinit -kt /etc/apache2/http.keytab HTTP/[email protected]
#pour l’utilisateur de supervision
kinit -kt /var/lib/zabbix/kerb.keytab [email protected]

14. Vérifications de maintenance :

  • klist -k /etc/apache2/http.keytab - vérifier que le principal de service est présent dans le keytab.
  • sudo tail -f /var/log/apache2/error.log - surveiller les erreurs GSSAPI (gss_acquire_cred[_from]() failed to get server creds signifie un problème de keytab ou de permissions, ou l’absence du principal).
  • Si curl --negotiate renvoie 401/403, cela signifie souvent que le principal est incorrect, qu’aucun ticket n’est disponible, que l’en-tête d’hôte ne correspond pas ou qu’il existe un problème de permissions du système de fichiers ; vérifier les journaux et les mappages de domaines dans /etc/krb5.conf.

Remarques sur la sécurité et les permissions des 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 utilisateur zabbix, ou 0440, avec root:www-data comme propriétaire pour un keytab Apache.

Évitez de stocker des mots de passe en clair à longue durée de validité 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 à nouveau le propriétaire et les permissions après l’opération : lorsqu’un serveur web rejette des identifiants, le problème provient souvent des permissions d’un fichier.