13 Configurando Kerberos con Zabbix

Descripción general

La autenticación Kerberos se puede utilizar en la monitorización web y en los items HTTP en Zabbix.

Esta página describe un ejemplo de configuración de Kerberos para que el servidor Zabbix realice la monitorización web de www.example.com con un principal Kerberos para el proceso Zabbix en Debian/Ubuntu.

Configuración

1. Instale KDC y las utilidades de cliente:

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

Durante la configuración del paquete, responda a las preguntas, por ejemplo:

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. Asigne un nombre de host amigable (opcional, para pruebas locales).

Edite /etc/hosts y agregue una entrada para su DC y servidor web si no tiene DNS:

sudo vi /etc/hosts

Ejemplo de línea que podría agregar:

192.168.1.100  dc01.example.com dc01

3. Configure el cliente Kerberos y el realm de KDC:

sudo vi /etc/krb5.conf

Ejemplo de configuración:

[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 planea usar .localdomain u otros nombres no públicos, agregue asignaciones explícitas dominio→realm para que funcione la asignación hostname→realm. Las discrepancias aquí provocan errores Server not found in Kerberos database.

4. Inicialice la base de datos de Kerberos (una sola vez, en el host KDC). Establezca una contraseña maestra segura cuando se le solicite:

sudo krb5_newrealm

5. Cree el principal HTTP/host.fqdn@REALM usando exactamente el nombre de host que usarán los clientes; prefiera minúsculas (por ejemplo, HTTP/[email protected]). Una discrepancia de mayúsculas/minúsculas o de nombre provoca Server not found in Kerberos database.

sudo kadmin.local

Dentro de kadmin.local:

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

Mueva el keytab al host web (o déjelo local si es la misma máquina) y establezca permisos utilizables por 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. Instale y habilite el módulo Apache GSSAPI:

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

No todas las versiones de mod_auth_gssapi admiten todas las directivas Gssapi*. Si Apache falla con Invalid command 'GssapiCredStore', elimine la directiva no compatible o actualice el módulo.

7. Configure un VirtualHost (ajuste DocumentRoot / la ruta a su interfaz de Zabbix):

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

Dentro de 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>

Reinicie Apache:

sudo systemctl restart apache2

8. Habilite/inicie los servicios de KDC y verifique los puertos en escucha (host KDC):

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

9. Obtenga un TGT para pruebas (ejecútelo como el usuario que usará el ticket).

Espere ver krbtgt/[email protected] en la lista de tickets. Ejecute kinit como el mismo usuario del sistema que necesita el ticket (por ejemplo, zabbix para comprobaciones web o www-data/Apache para pruebas interactivas de SSO en el navegador). Los tickets emitidos a un usuario distinto del sistema no serán visibles a menos que se ajusten KRB5CCNAME y los permisos.

kinit [email protected]
klist

10. Pruebe el intercambio SPNEGO con curl (desde un cliente con un TGT válido). Un 200 OK (o una redirección a la aplicación) indica que SPNEGO se completó correctamente:

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

11. Opcionalmente, si la interfaz de Zabbix debe aceptar inicios de sesión autenticados por HTTP, habilite la autenticación HTTP en el frontend de Zabbix (ui/conf/zabbix.conf.php):

$ALLOW_HTTP_AUTH = true;

En la interfaz web vaya a Users > Authentication y cambie a la pestaña HTTP settings. Marque la casilla Enable HTTP authentication y haga clic en Ok en la ventana emergente. Seleccione "HTTP login form" en la lista desplegable Default login form. Decida si Case-sensitive login se ajusta a la política de su directorio. Haga clic en el botón Update para finalizar.

12. Configuración del navegador (Firefox se usa como ejemplo): establezca network.negotiate-auth.trusted-uris en el/los host(s) que realizan Negotiate (dc01.example.com) para que el navegador envíe automáticamente los tokens Kerberos.

Dentro de about:config:

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

Ahora, al visitar http://dc01.example.com, debería entrar directamente en Zabbix sin usar el formulario.

13. Mantenga actualizadas las claves/tickets. La duración predeterminada del ticket Kerberos es de aproximadamente 10 horas. Agregue un cron/systemd timer para evitar expiraciones:

#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. Comprobaciones de mantenimiento:

  • klist -k /etc/apache2/http.keytab — verifique que el principal del servicio esté presente en el keytab.
  • sudo tail -f /var/log/apache2/error.log — supervise errores GSSAPI (gss_acquire_cred[_from]() failed to get server creds significa problemas con el keytab/permisos o que falta el principal).
  • Si curl --negotiate devuelve 401/403, normalmente significa principal incorrecto, falta de ticket, discrepancia en el host header o un problema de permisos del sistema de archivos; revise los registros y las asignaciones de dominio en /etc/krb5.conf.

Notas de seguridad y permisos de archivos

Los archivos keytab deben ser legibles solo por la cuenta que los necesita. Permisos de ejemplo: 0400 propiedad de zabbix:zabbix para un keytab de usuario zabbix, o 0440 y root:www-data para un keytab de Apache.

Evite almacenar contraseñas en texto plano de larga duración en el host. Utilice keytabs o principales de máquina unidos al dominio siempre que sea posible.

Al ejecutar pruebas o scripts que establecen KRB5CCNAME o copian keytabs, verifique la propiedad y los permisos después de la operación; un servidor web que rechaza credenciales suele ser un problema de permisos de archivos.