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.
1. Instale KDC y las utilidades de cliente:
Durante la configuración del paquete, responda a las indicaciones, por ejemplo:
Default Kerberos version 5 realm: EXAMPLE.COM
Kerberos servers for your realm: localhost (o su FQDN)
Administrative server for your Kerberos realm: localhost (o su 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:
Ejemplo de línea que podría agregar:
3. Configure el cliente Kerberos y el realm KDC:
Configuraciones de ejemplo:
[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.COMSi planea usar .localdomain u otros nombres no públicos, agregue asignaciones explícitas de dominio→realm para que la asignación de nombre de host→realm funcione. Las discrepancias aquí causan errores de Server not found in Kerberos database.
4. Inicialice la base de datos Kerberos (una vez, host KDC). Establezca una contraseña maestra segura cuando se le solicite:
5. Cree el principal HTTP/host.fqdn@REALM usando el nombre de host exacto que usarán los clientes; prefiera minúsculas (por ejemplo, HTTP/[email protected]). Una discrepancia de mayúsculas/nombre causa Server not found in Kerberos database.
Dentro de kadmin.local:
addprinc [email protected] # principal administrativo
addprinc -randkey HTTP/[email protected]
ktadd -k /etc/apache2/http.keytab HTTP/[email protected]
quitMueva el keytab al host web (o manténgalo 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
# verificar
sudo -u www-data -k /etc/apache2/http.keytab6. 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 apache2No 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 / ruta a su interfaz de Zabbix):
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:
8. Habilite/inicie los servicios KDC y verifique los puertos en escucha (host KDC):
sudo systemctl enable --now krb5-kdc krb5-admin-server
ss -tnlp | grep :80 # o: sudo netstat -tnlp | grep :809. Obtenga un TGT para pruebas (ejecute como el usuario que usará el ticket).
Espere ver krbtgt/[email protected] en la lista de tickets. Ejecute kinit como el mismo usuario del SO que necesita el ticket (por ejemplo, zabbix para comprobaciones web o www-data/Apache para pruebas SSO interactivas en el navegador). Los tickets emitidos a un usuario diferente del SO no serán visibles a menos que se ajusten KRB5CCNAME y los permisos.
kinit [email protected]
klist10. Pruebe el intercambio SPNEGO con curl (desde un cliente con un TGT válido). Un 200 OK (o redirección a la aplicación) indica que SPNEGO tuvo éxito:
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):
En la interfaz web vaya a Usuarios > Autenticación y cambie a la pestaña Configuración HTTP. Marque la casilla Habilitar autenticación HTTP y haga clic en Ok en la ventana emergente. Seleccione "Formulario de inicio de sesión HTTP" en el desplegable Formulario de inicio de sesión predeterminado. Decida si Inicio de sesión sensible a mayúsculas se ajusta a la política de su directorio. Haga clic en el botón Actualizar para finalizar.
12. Configuración del navegador (se utiliza Firefox 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 los tokens Kerberos automáticamente.
Dentro de about:config:
Ahora, al visitar http://dc01.example.com debería iniciar sesión directamente en Zabbix sin el formulario.
13. Mantenga las claves/tickets actualizados. La vida útil predeterminada del ticket Kerberos es de aproximadamente 10 horas. Agregue un cron/timer de systemd para evitar expiraciones:
#para el servicio web
kinit -kt /etc/apache2/http.keytab HTTP/[email protected]
#para el usuario de monitorización
kinit -kt /var/lib/zabbix/kerb.keytab [email protected]14. Comprobaciones de mantenimiento:
klist -k /etc/apache2/http.keytab — verifique que el principal de servicio esté presente en el keytab.sudo tail -f /var/log/apache2/error.log — observe los errores de GSSAPI (gss_acquire_cred[_from]() failed to get server creds significa keytab/permisos o principal faltante).curl --negotiate devolviendo 401/403 a menudo significa principal incorrecto, sin ticket, discrepancia en el encabezado de host o problema de permisos de sistema de archivos; revise los registros y las asignaciones de dominio en /etc/krb5.conf.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.