Esta guía es una propuesta para Apache 2.4. No se ha aplicado ni validado contra el VirtualHost de producción: hay que inspeccionar su configuración actual antes de integrarla. El módulo PHP ya admite las credenciales; el cierre del acceso público se hace en Apache.
Crear una cuenta HTTP Basic exclusiva para el servidor WHMCS, por ejemplo whmcs-graphite.
No es una cuenta de cliente ni un usuario del panel ISPConfig. No compartirla con clientes:
puede acceder a todas las métricas disponibles en Graphite. WHMCS sigue autorizando qué
servicio puede visualizar cada cliente antes de solicitar sus datos.
En una instalación tipo Debian/Ubuntu, usar un fichero de contraseñas fuera del DocumentRoot,
por ejemplo /etc/apache2/graphite.htpasswd. Estos comandos solicitan la clave de forma
interactiva y evitan sobrescribir un fichero ya existente:
if [ -e /etc/apache2/graphite.htpasswd ]; then
sudo htpasswd -B /etc/apache2/graphite.htpasswd whmcs-graphite
else
sudo htpasswd -cB /etc/apache2/graphite.htpasswd whmcs-graphite
fi
No usar htpasswd -b ni poner la contraseña en argumentos. -B genera un hash bcrypt;
-c se usa solamente al crear el fichero. Darle permisos 0640, propietario administrador
y grupo legible por el usuario real de Apache. Adaptar ruta, usuario y grupo al sistema;
no usar chmod 777 ni guardar este fichero en Git.
Integrar este bloque en el VirtualHost HTTPS existente de Graphite, conservando su certificado y sus directivas WSGI/proxy/estáticos actuales:
<Location "/">
AuthType Basic
AuthName "Graphite privado"
AuthBasicProvider file
AuthUserFile /etc/apache2/graphite.htpasswd
Require user whmcs-graphite
</Location>
Se requieren los módulos auth_basic, authn_file y authz_user. Revisar que ninguna
sección más específica (Location, Directory, alias u otro VirtualHost) elimine o sustituya
esta protección. Deben quedar protegidas tanto la interfaz como /render/, las APIs de
búsqueda de métricas y todas las demás rutas. Proteger únicamente la página de login no basta.
El VirtualHost HTTP debe redirigir a HTTPS sin servir Graphite. El backend WSGI/proxy debe escuchar solo en loopback/red privada protegida; cerrar cualquier puerto/origen/hostname alternativo que permita eludir Apache. Revisar todos los virtual hosts que sirvan el mismo backend. No activar logs que incluyan Authorization ni modo verbose de cURL.
Antes de recargar, comprobar la configuración:
sudo apachectl configtest
Solo después de obtener Syntax OK, recargar Apache con el mecanismo propio del sistema.
No se incluye un VirtualHost completo para evitar sustituir o romper el despliegue existente.
En /etc/open6hosting/whmcs-vpsmanager.php, conservar las otras claves y añadir:
'graphite_auth' => 'basic',
'graphite_username' => 'whmcs-graphite',
'graphite_password' => '', // Introducir aquí la clave real, solo en este fichero privado.
Mantener graphite_url como la base HTTPS que ya se utiliza, sin /render/ y sin
credenciales o query string. Las claves vacías del ejemplo NO son una configuración válida
para Basic: hasta completarlas el módulo muestra el aviso de métricas no disponibles.
La contraseña real debe ser la misma creada en Apache. No copiar el hash bcrypt del fichero htpasswd: cURL necesita el secreto original y Apache verifica su hash. El fichero privado de WHMCS debe ser legible por PHP-FPM, no estar dentro del repositorio/DocumentRoot y no ser escribible por PHP. Restringir igualmente copias de seguridad y acceso administrativo.
Para una comprobación manual autenticada, curl --user whmcs-graphite solicita la
contraseña sin incluirla en los argumentos. Usar la URL HTTPS propia y no activar -v.
No probar con credenciales incluidas en la URL ni copiar respuestas de producción a Git.
La cuenta Basic autentica al servidor WHMCS frente a Graphite. La autorización individual por cliente sigue siendo responsabilidad de WHMCS; Apache no filtra targets por UUID. Esta autenticación tampoco protege automáticamente la aplicación independiente Graphs: si esa aplicación consulta Graphite desde su servidor, puede seguir publicando los datos. Mantener su botón desactivado y restringir o corregir esa aplicación por separado.