Grafana在nginx后面运行,并通过oauth2_proxy进行身份验证



问题

我正在尝试在本地设置以下配置[nginx] <-> [oauth2_proxy] <-> [grafana]

  • nginx80上侦听
  • oauth2_proxy4180上侦听
  • grafana监听3000

尽管通过代理(从代理和身份提供商的角度-这里是谷歌(成功地进行了身份验证,但已验证的用户不会转移到grafana,而是重定向到登录屏幕。

虽然我们可以使用auth.generic_oauth通过第三方OAuth2提供商对用户进行身份验证(请参阅此处(,但我选择这种方法的原因是为了使多个应用程序能够配置通用的身份验证后端。

您预计会发生什么

如何复制(尽可能少且精确(

# docker-compose.yml
version: '3'
services:
  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    restart: always
    user: '104'
    volumes:
      - $PWD/data/grafana:/var/lib/grafana
    ports:
      - 3000:3000
    environment:
      # [users]
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_USERS_AUTO_ASSIGN_ORG=true
      - GF_USERS_AUTO_ASSIGN_ORG_ROLE=Admin
      
      # [auth.basic]
      - GF_AUTH_BASIC_ENABLED=false
      
      # [auth]
      - GF_AUTH_DISABLE_LOGIN_FORM=true
      # [auth.proxy]
      - GF_AUTH_PROXY_ENABLED=true
      - GF_AUTH_PROXY_HEADER_NAME=X-Email
      - GF_AUTH_PROXY_HEADER_PROPERTY=email
      - GF_AUTH_PROXY_AUTO_SIGN_UP=true
      - GF_AUTH_PROXY_ENABLE_LOGIN_TOKEN=false
  oauth2-proxy:
    container_name: oauth2-proxy
    image: quay.io/oauth2-proxy/oauth2-proxy:latest
    restart: always
    ports:
      - 4180:4180
    volumes:
      - $PWD/data/oauth2:/var/lib/oauth2_proxy
    environment:
      - OAUTH2_PROXY_PROVIDER=oidc
      - OAUTH2_PROXY_CLIENT_ID=<google_client_id>
      - OAUTH2_PROXY_CLIENT_SECRET=<google_client_secret>
      - OAUTH2_PROXY_OIDC_ISSUER_URL=https://accounts.google.com
      - OAUTH2_PROXY_COOKIE_SECRET=abcdefgh
      - OAUTH2_PROXY_COOKIE_DOMAIN=http://localhost:3000
      - OAUTH2_PROXY_EMAIL_DOMAINS=*
      - OAUTH2_PROXY_COOKIE_SECURE=false
      - OAUTH2_PROXY_UPSTREAMS=http://grafana:3000
      - OAUTH2_PROXY_HTTP_ADDRESS=http://:4180
      - OAUTH2_PROXY_REDIRECT_URL=http://localhost:3000/oauth2/callback
      - OAUTH2_PROXY_SET_XAUTHREQUEST=true
      
      - OAUTH2_PROXY_ERRORS_TO_INFO_LOG=true
      - OAUTH2_PROXY_AUTH_LOGGING=true
      - OAUTH2_PROXY_SHOW_DEBUG_ON_ERROR=true
      - OAUTH2_PROXY_SET_AUTHORIZATION_HEADER=true
      - OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER=true    
      - OAUTH2_PROXY_PASS_USER_HEADERS=true
      - OAUTH2_PROXY_PASS_HOST_HEADER=true
      - OAUTH2_PROXY_REVERSE_PROXY=true
      - OAUTH2_PROXY_SSL_UPSTREAM_INSECURE_SKIP_VERIFY=true
      - OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY=true
  
  nginx:
    container_name: nginx
    image: nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - $PWD/data/nginx/:/etc/nginx/conf.d/
# nginx.conf
server {
  listen 80;
  server_name localhost;
  location /oauth2/ {
    proxy_pass       http://oauth2-proxy:4180;
    proxy_set_header Host                    $host;
    proxy_set_header X-Real-IP               $remote_addr;
    proxy_set_header X-Scheme                $scheme;
    proxy_set_header X-Auth-Request-Redirect $request_uri;
  }
  location = /oauth2/auth {
    proxy_pass       http://oauth2-proxy:4180;
    proxy_set_header Host             $host;
    proxy_set_header X-Real-IP        $remote_addr;
    proxy_set_header X-Scheme         $scheme;
    proxy_set_header Content-Length   "";
    proxy_pass_request_body           off;
  }
  location /grafana/ {
    auth_request /oauth2/auth;
    error_page 401 = /oauth2/sign_in;
    auth_request_set $user   $upstream_http_x_auth_request_user;
    auth_request_set $email  $upstream_http_x_auth_request_email;
    proxy_set_header X-User  $user;
    proxy_set_header X-Email $email;
    auth_request_set $auth_cookie $upstream_http_set_cookie;
    add_header Set-Cookie $auth_cookie;
    proxy_pass http://grafana:3000;
  }
}

Rundocker-compose up -d --build

然后在浏览器中导航到localhost/grafana/=>用户重定向到oauth2_proxy=>谷歌登录成功=>返回grafana登录屏幕。

我似乎缺少了一些用于传递auth头之类的设置。有人能给我指正确的方向吗?

不久前这里也出现了类似的问题,但它对我不起作用。我已经有了GF_AUTH_BASIC_ENABLED=false

还有什么我们需要知道的吗:所有3个参与者:grafana、nginx、oauth2_proxy都有干净的日志,没有警告或错误。

环境local

  • Grafana版本:grafana:latest
  • 数据源类型&版本:
  • 操作系统Grafana安装在:MacOS
  • 用户操作系统&浏览器:Chrome
  • Grafana插件:
  • 其他:nginxoauth2_proxy

您需要正确配置标头:

      - GF_AUTH_PROXY_HEADER_NAME=X-Email

因此,此配置表示用户名/电子邮件将在X-Email标头中。

但用户名/电子邮件似乎在不同的标题中,请参阅https://github.com/grafana/grafana/issues/27251#issuecomment-682477379:

X-Forwarded-User:<我的电子邮件>

所以应该是:

GF_AUTH_PROXY_HEADERS='Name:X-Forwarded-User Email:X-Forwarded-Email'

最新更新