Apache y Nginx como proxy para Kibana

por | julio 11, 2020

Aunque desde la versión 7 de ELK el módulo X-Pack permite configurar autenticación de usuarios para el stack securizando entre ellos la capa de presentación en Kibana, normalmente no la expondremos directamente al exterior sino que accederemos a través de un frontal web.

Similar a la opción que vimos con Grafana hace tiempo, podemos utilizar Apache o Nginx. Además los servidores web nos permitirán añadir más capas de seguridad si lo deseamos como basic auth, certificado de cliente o filtro de IP de origen entre otros.

Frontal Apache

Si vamos a utilizar Apache, un ejemplo sería la siguiente configuración que añade verificación con certificado de cliente para el contexto /kibana que más tarde redirigimos a nuestra instancia local de Kibana:

    ...
    <Location /kibana>
      SSLVerifyClient require
      SSLVerifyDepth  3
      SSLRequire %{SSL_CLIENT_I_DN_C} eq "ES" and \
                 %{SSL_CLIENT_I_DN_O} eq "MyCorp" and \
                 %{SSL_CLIENT_S_DN_CN} eq "mail@example.com" and \
                 %{SSL_CLIENT_S_DN_Email} eq "mail@example.com"
    </Location>

    ProxyPass        /kibana   http://localhost:5601
    ProxyPassReverse /kibana   http://localhost:5601
    ...

Otro ejemplo con basic auth y restringiendo el acceso sólo a la red 192.168.1.0/24:

    ...
    <Location /kibana>
      Require ip 192.168.1.0/24
      AuthType Basic
      AuthName "Kibana Basic Auth Files"
      AuthBasicProvider file
      AuthUserFile "/etc/apache2/.htpasswd"
    </Location>

    ProxyPass        /kibana   http://localhost:5601
    ProxyPassReverse /kibana   http://localhost:5601
    ...

Frontal Nginx

Si utilizamos Nginx como frontal, una configuración válida también con certificado de cliente podría ser:

    ...
    # SSL Client Cert
    ssl_client_certificate /etc/nginx/ssl/client-jota-ca-chain.pem;
    ssl_verify_client on;

    location /kibana {
      if ($ssl_client_verify != SUCCESS) {
        return 403;
      }
      proxy_pass http://localhost:5601;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
    }
    ...

Otro ejemplo con autenticación básica y restricción por IP de origen permitiendo sólo la red 192.168.1.2/24:

    ...
    location /kibana {
      satisfy all;

      allow 192.168.1.0/24;
      deny  all;

      auth_basic           “Kibana Basic Auth”;
      auth_basic_user_file /etc/nginx/.htpasswd;

      proxy_pass http://localhost:5601;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
    }
    ...

Configuración Kibana

Tanto si elegimos Apache como Nginx como frontales, en /etc/kibana/kibana.yml añadimos el contexto de aplicación del que estemos haciendo proxy desde los frontales, en este caso /kibana:

server.basePath: "/kibana"

Y ya podremos acceder desde nuestro dominio con alguna capa más de seguridad que X-Pack si queremos.