Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add authentication to metrics endpoint #39

Open
jkroepke opened this issue Jul 4, 2019 · 11 comments
Open

Add authentication to metrics endpoint #39

jkroepke opened this issue Jul 4, 2019 · 11 comments

Comments

@jkroepke
Copy link

jkroepke commented Jul 4, 2019

Description

Add authentication to the metrics endpoint. It should be only accessible with an specific user role oder admin account.

Expected Behavior

http://127.0.0.1:8080/auth/realms/master/metrics should be return 503 unless a valid session with specific role logged in.

Actual Behavior

http://127.0.0.1:8080/auth/realms/master/metrics is would accessible.

@pb82
Copy link
Contributor

pb82 commented Jul 12, 2019

@jkroepke having a way to restrict access to the metrics endpoint sounds reasonable. Usually this endpoint is scraped by Prometheus which won't have a valid keycloak session. Wondering what's the best way here, i'll try to give it some thought.

@jkroepke
Copy link
Author

Some inspiration from here https://github.com/AndreyVMarkelov/jira-prometheus-exporter/

https://github.com/AndreyVMarkelov/jira-prometheus-exporter/blob/master/src/main/java/ru/andreymarkelov/atlas/plugins/promjiraexporter/servlet/PrometheusExporter.java#L35

This exporter generates a static key. If you want to scrape the endpoint you must attach the key as get parameter. Otherwise you get an unauthorized messages.

2 possible ways to store the static key inside keycloak.

@danifr
Copy link
Contributor

danifr commented Jul 10, 2020

I am interested in this. Having those keycloak metrics open to everyone does not seem like good idea.

@jkroepke did you managed to configure it? Thanks

@danifr
Copy link
Contributor

danifr commented Jul 14, 2020

As a workaround and since I have an HAproxy in front of my Keycloak servers, I added a http-request deny to my HAproxy frontend configuration:

frontend https-keycloak
  ...
  balance  roundrobin
  http-request  deny if { path -i -m reg /auth/realms/.+\/metrics } !{ src <IP_PROMETHEUS_SERVER> }
  mode  http

This config seems to do the trick.

@giner
Copy link

giner commented Sep 2, 2020

One way to restrict metrics endpoint is mentioned under Keycloak admin docs https://www.keycloak.org/docs/11.0/server_admin/#admin-endpoints-and-console where you replace path-prefix('/auth/admin') by
either path-template('/auth/realms/{realm}/metrics')
or (path-prefix('/auth/admin') or path-template('/auth/realms/{realm}/metrics'))

@jelly
Copy link

jelly commented Sep 9, 2020

I've fixed this problem with an nginx location rule and basic auth (ofcourse servering on https)

    location ~ /auth/realms/[a-z]+/metrics  {
        auth_basic "Prometheus exporter";
        auth_basic_user_file /etc/nginx/auth/prometheus;
        proxy_set_header    Host               $host;
        proxy_set_header    X-Real-IP          $remote_addr;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto  $scheme;
        proxy_ssl_verify    off;
        proxy_pass https://localhost:8443;
    }

    location / {
        proxy_set_header    Host               $host;
        proxy_set_header    X-Real-IP          $remote_addr;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto  $scheme;
        proxy_ssl_verify    off;
        proxy_pass https://localhost:8443;
    }

Prometheus itself supports base64 authentication.

@jkroepke
Copy link
Author

jkroepke commented Sep 9, 2020

I still would like to see an in-tree solution without the need to configure an reverse proxy.

@Tim-Schwalbe
Copy link

Tim-Schwalbe commented Oct 2, 2020

Here is my NGINX Ingress Config to block requests to /auth/realms/master/metrics

   annotations: 
    kubernetes.io/ingress.class: "nginx"
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/server-snippet: |
      location /auth/realms/master/metrics {
          return 403;
      }

@ghost
Copy link

ghost commented Dec 8, 2020

The location should probably be location ~ /auth/realms/[^/]*/metrics to get all realms.

@Cyben
Copy link

Cyben commented Aug 19, 2021

I think it is really important to restrict this endpoint from regular users as well.

Seems like the best and easiest way is configuring it in the keycloak configuration.

As @giner mentioned:

One way to restrict metrics endpoint is mentioned under Keycloak admin docs https://www.keycloak.org/docs/11.0/server_admin/#admin-endpoints-and-console where you replace path-prefix('/auth/admin') by
either path-template('/auth/realms/{realm}/metrics')
or (path-prefix('/auth/admin') or path-template('/auth/realms/{realm}/metrics'))

Maybe just add the jboss cli command in the documentation, at least for now.

There is also a way to implement everything as and "admin rest api" but it requires some work, so I'm not sure if this is the approach you want to go with.

@TDog42
Copy link

TDog42 commented Oct 18, 2022

It seems that with KeyCloak 17 there is no way to rextrict endpoints anymore within the server configuration (keycloak/keycloak#12394)

Maybe just add an option for some basic authentication. This way not the whole internet will be able to sniff out the metrics

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants