Introducción
Kerberos SSO (Single Sign-On) permite una autenticación sin problemas de sus agentes a través de Active Directory, sin que se transmitan contraseñas en texto plano. En una instalación de OTOBO basada en Docker, se utiliza NGINX como proxy web con el módulo SPNEGO, que se compila en un contenedor "builder" separado. Luego, el módulo generado dinámicamente (ngx_http_auth_spnego_module.so
) se transfiere al contenedor NGINX real y se reemplaza la configuración estándar con una configuración compatible con Kerberos :contentReference[oaicite:0]{index=0}.
De esta manera, seguimos el procedimiento establecido en el proyecto de Docker de OTOBO oficial, que realiza una clara separación entre las etapas de compilación y ejecución.
En este artículo, obtendrá:
- Una visión general completa de las diferencias entre OTOBO y Znuny en el contexto de Kerberos SSO.
- Una guía paso a paso desde la preparación de AD hasta la creación de Keytab y la configuración de Docker.
- Consejos para depuración, configuración del navegador y mejores prácticas para diferentes versiones de OTOBO.
Diferencias entre OTOBO y Znuny
Aunque OTOBO y Znuny son funcionalmente muy similares (ambos provienen del proyecto OTRS original), existen ajustes finos en el contexto de Kerberos:
- Rutas de configuración: OTOBO utiliza de forma predeterminada
/opt/otobo-docker/nginx-conf/krb5.conf
, mientras que Znuny utiliza generalmente/opt/znuny/nginx-conf/krb5.conf
. - Archivos de plantilla: Las plantillas de NGINX difieren ligeramente en nombre y sintaxis de marcadores; OTOBO proporciona un archivo
otobo_nginx-kerberos.conf.template
, mientras que Znuny ofrece uno similar llamadoznuny_nginx-kerberos.conf.template
. - Versionado: OTOBO 11.x introduce parámetros SSO extendidos ("KerberosAdminServer", "KerberosDefaultDomain") que faltan en Znuny 6.x.
Requisitos previos
- Active Directory con Kerberos (Realm y KDC ya configurados).
- Una instalación de OTOBO con Docker según la documentación oficial de instalación con Docker :contentReference[oaicite:2]{index=2}.
- Registros DNS:
- Un registro A para su FQDN de OTOBO (no un CNAME), por ejemplo,
otobo.example.com → 192.0.2.10
. - Búsqueda inversa para el nombre del host, para que funcionen las resoluciones de SPN de Kerberos.
- Un registro A para su FQDN de OTOBO (no un CNAME), por ejemplo,
1. Usuario y SPN de Active Directory
1.1 Crear usuario
Cree en su AD una cuenta de servicio dedicada, por ejemplo, HTTP/otobo.example.com
(UserPrincipalName). Tenga en cuenta:
- Mayúsculas en
HTTP/
; Kerberos espera exactamente este prefijo :contentReference[oaicite:3]{index=3}. - No utilice caracteres especiales en la contraseña (por ejemplo,
&
).
1.2 Generar SPN y Keytab
Inicie sesión en un DC con derechos de administrador y utilice ktpass.exe
:
ktpass.exe \
-princ HTTP/otobo.example.com@EXAMPLE.COM \
-mapUser EXAMPLE\\otobo-svc \
-crypto All \
-pass SvcUserPassword \
-ptype KRB5_NT_PRINCIPAL \
-out C:\krb5.keytab
-princ
: SPN con Realm en mayúsculas.-mapUser
: Nombre de cuenta SAM (pre-W2K), por ejemplo,otobo-svc
([doc.otobo.de][1]).-out
: Ruta a la Keytab en el DC.
Luego, mueva la Keytab al host de Docker:
docker_admin> mkdir -p /opt/otobo-docker/nginx-conf
docker_admin> mv /path/to/krb5.keytab /opt/otobo-docker/nginx-conf/krb5.keytab
2. NGINX con módulo SPNEGO
2.1 Etapa de compilación en Dockerfile
El Dockerfile oficial utiliza un constructor separado con los paquetes de desarrollo necesarios:
FROM nginx:mainline AS builder-for-kerberos
...
RUN apt-get update && apt-get install -y gcc libc-dev make libpcre3-dev zlib1g-dev libkrb5-dev wget
WORKDIR /usr/src
RUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \
&& wget https://github.com/stnoonan/spnego-http-auth-nginx-module/archive/${SPNEGO_AUTH_COMMIT_ID}.tar.gz
RUN tar -xzf nginx.tar.gz \
&& tar -xzf spnego-http-auth.tar.gz \
&& cd nginx-${NGINX_VERSION} \
&&./configure --with-compat ${NGINX_CONFIG} --add-dynamic-module=../spnego-http-auth-nginx-module-${SPNEGO_AUTH_COMMIT_ID_FILE} \
&& make modules \
&& cp objs/ngx_http_auth_spnego_module.so /usr/lib/nginx/modules/
De esta manera, se compila el módulo SPNEGO compatible con su versión de NGINX ([extras.getpagespeed.com][2]).
2.2 Configuración en el contenedor de tiempo de ejecución
FROM nginx:mainline AS otobo-nginx-kerberos-webproxy
COPY --from=builder-for-kerberos /usr/lib/nginx/modules/ngx_http_auth_spnego_module.so /usr/lib/nginx/modules
RUN apt-get update && apt-get install -y krb5-user libpam-krb5 libpam-ccreds krb5-multidev libkrb5-dev
COPY templates/ kerberos/templates
COPY docker-entrypoint.d/21-envsubst-on-krb5-conf.sh /docker-entrypoint.d/
RUN sed -i '4i load_module modules/ngx_http_auth_spnego_module.so;' /etc/nginx/nginx.conf
- Carga del módulo:
load_module
en la línea 4. - Scripts de envsubst: generan
/etc/krb5.conf
a partir de datos de plantilla.
3. Volúmenes de Docker y plantillas de NGINX
3.1 Crear un volumen personalizado
docker volume create otobo_nginx_custom_config
mp=$(docker volume inspect --format '{{.Mountpoint }}' otobo_nginx_custom_config)
docker create --name tmp-nginx rotheross/otobo-nginx-webproxy:latest-11_0
docker cp tmp-nginx:/etc/nginx/templates/otobo_nginx-kerberos.conf.template.hidden $mp/otobo_nginx.conf.template
docker rm tmp-nginx
3.2 Anulación de docker-compose
Cree docker-compose/otobo-nginx-custom-config.yml
:
version: '3.7'
services:
nginx:
volumes:
- otobo_nginx_custom_config:/etc/nginx/config/template-custom
Active en el archivo .env
principal:
COMPOSE_FILE=docker-compose.yml:docker-compose/otobo-nginx-custom-config.yml
NGINX_ENVSUBST_TEMPLATE_DIR=/etc/nginx/config/template-custom
4. Ajustes de .env
Guarde su antiguo
/opt/otobo-docker/.env
:bashmv.env.env.bak cp.docker_compose_env_https_kerberos.env
Agregue las variables de Kerberos:
dotenvOTOBO_NGINX_KERBEROS_KEYTAB=/opt/otobo-docker/nginx-conf/krb5.keytab OTOBO_NGINX_KERBEROS_CONFIG=/opt/otobo-docker/nginx-conf/krb5.conf OTOBO_NGINX_KERBEROS_SERVICE_NAME=HTTP/otobo.example.com OTOBO_NGINX_KERBEROS_REALM=EXAMPLE.COM OTOBO_NGINX_KERBEROS_KDC=dc1.example.com OTOBO_NGINX_KERBEROS_ADMIN_SERVER=dc1.example.com OTOBO_NGINX_KERBEROS_DEFAULT_DOMAIN=example.com
Certificados SSL y contraseñas de base de datos desde su antiguo
.env.bak
.
Luego, inicie con:
docker-compose down && docker-compose up -d
``` :contentReference[oaicite:6]{index=6}.
## 5. Configuración de OTOBO
### 5.1 Módulo de autenticación en `Kernel/Config.pm`
Comente la autenticación LDAP/DB y agregue en su `Kernel/Config.pm`:
```perl
$Self->{AuthModule} = 'Kernel::System::Auth::HTTPBasicAuth';
$Self->{'AuthModule::HTTPBasicAuth::ReplaceRegExp'} = '^(.+?)@.+?$';
```
De esta manera, `REMOTE_USER` se interpreta correctamente como inicio de sesión ([doc.otobo.de][1]).
### 5.2 Activación en la interfaz de administración
* **Configuración del sistema**:
* Establezca `Customer::AuthModule` en `HTTPBasicAuth`.
* Establezca `AuthModule::HTTPBasicAuth::ReplaceRegExp`.
* **Kernel/Config** -> **Implementar**.
## 6. Configuración del navegador
Para que funcione SPNEGO, su navegador debe aceptar el host como **de confianza**:
### Chrome / Edge / IE
* „Opciones de Internet“ → **Seguridad** → **Sitios de intranet local** → **Sitios**
* Agregue el dominio `https://otobo.example.com` y active la „Autenticación integrada de Windows“ ([doc.otobo.de][1]).
### Firefox
* `about:config` en la barra de direcciones.
* `network.negotiate-auth.trusted-uris = https://otobo.example.com`
* `network.negotiate-auth.delegation-uris = https://otobo.example.com`
## 7. Depuración y solución de problemas
1. **Revisar registros de NGINX**
```bash
docker logs otobo_nginx_1 -f
```
2. **Ingresar al contenedor**
```bash
docker exec -it otobo_nginx_1 bash
cat /etc/krb5.conf
klist -e
```
3. **Obtener token SPN**
```bash
env KRB5_TRACE=/dev/stdout kvno HTTP/otobo.example.com@EXAMPLE.COM
```
4. **Probar Keytab**
```bash
kinit -VV -k -t /etc/krb5.keytab HTTP/otobo.example.com@EXAMPLE.COM
```
Error `KDC cannot fulfill request` → DNS/SPN incorrecto ([plugins.miniorange.com][3]).
## 8. Mejores prácticas y seguridad
* **Keytab propio**: Nunca reutilice la cuenta de servicio de sincronización de LDAP; evite colisiones de contraseñas.
* **Privilegios mínimos**: Otorgue solo los derechos de AD mínimamente necesarios para la cuenta de SSO.
* **Rotación de Keytab**: Renueve el Keytab cada 90 días.
* **TLS para KDC**: Active `ldaps://` o GSSAPI sobre TLS si es posible.
* **Monitoreo**: Monitoree con herramientas como `klist` y `kvno` los tickets de Kerberos de forma automática.
---
Con esta guía completa, su instalación de OTOBO Docker está óptimamente preparada para Kerberos SSO – autenticación segura, mantenible y escalable incluida!
---
**Fuentes:**
* rotheross/otobo-nginx-kerberos-webproxy en Docker Hub ([hub.docker.com][4])
* Módulo SPNEGO HTTP Auth NGINX (stnoonan) ([extras.getpagespeed.com][2])
* Documentación oficial de instalación de OTOBO (11.0 SSO Kerberos) ([doc.otobo.de][1])
* Problema #81 de GitHub: NGINX Kerberos roto ([github.com][5])
* Guía de configuración de Kerberos SSO de miniOrange ([plugins.miniorange.com][3])
* Anulación de OTOBO Docker para HTTPS-Kerberos ([github.com][6])
* Manuales de desarrollo y administración de OTOBO
* Microsoft Docs: ktpass.exe ([community.znuny.org][7])
* MDN de Mozilla: SPNEGO en Firefox ([doc.otobo.de][1])
* Documentos de NGINX: módulos dinámicos ([extras.getpagespeed.com][2])
[1]: https://doc.otobo.de/manual/installation/11.0/es/content/sso-kerberos.html?utm_source=chatgpt.com "Kerberos Single Sign On en la instalación de OTOBO Docker"
[2]: https://extras.getpagespeed.com/redhat/9/x86_64/repoview/nginx-module-spnego-http-auth.html?utm_source=chatgpt.com "nginx-module-spnego-http-auth en CentOS/RHEL 9 (x86_64)"
[3]: https://plugins.miniorange.com/guide-to-setup-kerberos-single-sign-sso?utm_source=chatgpt.com "Configuración de Kerberos SSO: una guía de configuración completa"
[4]: https://hub.docker.com/r/rotheross/otobo-nginx-kerberos-webproxy?utm_source=chatgpt.com "rotheross/otobo-nginx-kerberos-webproxy - Docker Hub"
[5]: https://github.com/RotherOSS/otobo-docker/issues/81?utm_source=chatgpt.com "NGINX Kerberos parece estar roto · Issue #81 · RotherOSS/otobo-docker"
[6]: https://github.com/RotherOSS/otobo-docker/blob/rel-10_1/.docker_compose_env_https_kerberos?utm_source=chatgpt.com "otobo-docker/.docker_compose_env_https_kerberos at rel-10_1"
[7]: https://community.znuny.org/viewtopic.php?t=28160&utm_source=chatgpt.com "Autenticación SSO del cliente no funciona, Kerberos funciona"