13 Configuring Kerberos with Zabbix

Overview

Kerberos authentication can be used in web monitoring and HTTP items in Zabbix.

This page describes an example of configuring Kerberos for Zabbix server to perform web monitoring of www.example.com with a Kerberos principal for Zabbix process on Debian/Ubuntu.

Configuration

1. Install KDC and client utilities:

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

During package setup answer the prompts, e.g.:

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. Map a friendly hostname (optional, for local testing).

Edit /etc/hosts and add an entry for your DC and webserver if you don't have DNS:

sudo vi /etc/hosts

Example line you might add:

192.168.1.100  dc01.example.com dc01

3. Configure the Kerberos client and KDC realm:

sudo vi /etc/krb5.conf

Example settings:

[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

If you plan to use .localdomain or other non-public names, add explicit domain→realm mappings so hostname→realm mapping works. Mismatches here cause Server not found in Kerberos database errors.

4. Initialize the Kerberos database (one-time, KDC host). Set a secure master password when prompted:

sudo krb5_newrealm

5. Create the HTTP/host.fqdn@REALM principal using the exact hostname clients will use; prefer lowercase (e.g. HTTP/[email protected]). A case/name mismatch causes Server not found in Kerberos database.

sudo kadmin.local

Inside kadmin.local:

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

Move the keytab to the web host (or keep local if same machine) and set permissions usable by Apache:

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. Install and enable Apache GSSAPI module:

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

Not all mod_auth_gssapi versions support every Gssapi* directive. If Apache fails with Invalid command 'GssapiCredStore' remove the unsupported directive or upgrade the module.

7. Configure a VirtualHost (adjust DocumentRoot / path to your Zabbix UI):

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

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

Restart Apache:

sudo systemctl restart apache2

8. Enable/start KDC services and verify listening ports (KDC host):

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

9. Obtain a TGT for testing (run as the user that will use the ticket).

Expect to see krbtgt/[email protected] in the ticket list. Run kinit as the same OS user that needs the ticket (e.g., zabbix for web checks or www-data/Apache for interactive browser SSO tests). Tickets issued to a different OS user won't be visible unless KRB5CCNAME and permissions are adjusted.

kinit [email protected]
klist

10. Test SPNEGO exchange with curl (from a client with a valid TGT). A 200 OK (or redirect to app) indicates SPNEGO succeeded:

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

11. Optionally, if Zabbix UI should accept HTTP-authenticated logins, enable HTTP auth in Zabbix front end (ui/conf/zabbix.conf.php):

$ALLOW_HTTP_AUTH = true;

In the web UI go to Users > Authentication and move to HTTP settings tab. Mark Enable HTTP authentication checkbox and click Ok in the pop-up. Select "HTTP login form" in the Default login form drop-down. Decide whether Case-sensitive login fits your directory policy. Click on Update button to finish.

12. Browser configuration (Firefox is used as an example): set network.negotiate-auth.trusted-uris to the host(s) performing Negotiate (dc01.example.com) so the browser will send Kerberos tokens automatically.

Inside about:config:

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

Now visiting http://dc01.example.com should log you straight into Zabbix without the form.

13. Keep keys/tickets fresh. Default Kerberos ticket lifetime is approximately 10 hours. Add a cron/systemd timer to avoid expirations:

#for the web service
kinit -kt /etc/apache2/http.keytab HTTP/[email protected]
#for the monitoring user
kinit -kt /var/lib/zabbix/kerb.keytab [email protected]

14. Housekeeping checks:

  • klist -k /etc/apache2/http.keytab — verify service principal present in keytab.
  • sudo tail -f /var/log/apache2/error.log — watch for GSSAPI errors (gss_acquire_cred[_from]() failed to get server creds means keytab/permissions or missing principal).
  • curl --negotiate returning 401/403 often means wrong principal, no ticket, host header mismatch, or filesystem permission issue; check logs and /etc/krb5.conf domain mappings.

Security and file-permission notes

Keytab files must be readable only by the account that needs them. Example permissions: 0400 owned by zabbix:zabbix for a zabbix user keytab, or 0440 and root:www-data for an Apache keytab.

Avoid storing long-lived plaintext passwords on the host. Use keytabs or domain-joined machine principals where possible.

When running tests or scripts that set KRB5CCNAME or copy keytabs, double-check ownership and permissions after the operation — a webserver rejecting credentials is commonly a file-permission problem.