13 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. Installez KDC et les utilitaires client :
sudo apt update
sudo apt install krb5-kdc krb5-admin-server krb5-user
Pendant la configuration des paquets, répondez 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. 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 :
sudo vi /etc/hosts
Exemple de ligne à ajouter :
192.168.1.100 dc01.example.com dc01
3. Configurez le client Kerberos et le domaine 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 correspondances 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é :
sudo krb5_newrealm
5. Créez le principal HTTP/host.fqdn@REALM en utilisant exactement le nom d'hôte que les clients utiliseront ; privilégiez les minuscules (par exemple HTTP/[email protected]).
Une incohérence de casse ou de nom provoque 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éplacez le keytab vers l'hôte web (ou conservez-le localement si c'est la même machine) et définissez des permissions utilisables par Apache :
chown www-data:www-data /etc/apache2/http.keytab
chmod 600 /etc/apache2/http.keytab
# vérification
sudo -u www-data -k /etc/apache2/http.keytab
6. Installez et activez le module Apache GSSAPI :
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', supprimez la directive non prise en charge ou mettez à niveau le module.
7. Configurez un VirtualHost (adaptez 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émarrez Apache :
sudo systemctl restart apache2
8. Activez/démarrez les services KDC et vérifiez 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. Obtenez un TGT pour les tests (exécutez la commande en tant qu'utilisateur qui utilisera le ticket).
Vous devriez voir krbtgt/[email protected] dans la liste des tickets.
Exécutez kinit en tant que même utilisateur OS 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 émis pour un autre utilisateur OS ne seront pas visibles, sauf si KRB5CCNAME et les permissions sont ajustés.
kinit [email protected]
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 :
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 l'interface Zabbix (ui/conf/zabbix.conf.php) :
$ALLOW_HTTP_AUTH = true;
Dans l'interface web, allez dans Users > Authentication et ouvrez l'onglet HTTP settings. Cochez 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 :
network.negotiate-auth.trusted-uris = dc01.example.com
En visitant maintenant http://dc01.example.com, vous devriez être connecté directement à Zabbix sans 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 une tâche cron/un timer 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érifie que le principal de service est présent dans le keytab.sudo tail -f /var/log/apache2/error.log— surveille les erreurs GSSAPI (gss_acquire_cred[_from]() failed to get server credssignifie un problème de keytab/permissions ou un principal manquant).- Un retour
401/403aveccurl --negotiatesignifie souvent un mauvais principal, l'absence de ticket, une incohérence de l'en-tête Host ou un problème de permissions du système de fichiers ; vérifiez les journaux et les mappages de domaine dans/etc/krb5.conf.
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.