Vouch-proxy 实现 Zabbix 对接 SSO

Vouch-proxy 实现 Zabbix 对接 SSO

Zabbix 自身不支持 SSO 对接,我使用 Nginx 代理 Zabbix,将请求转发至 Vouch-proxy,由 Vouch-proxy 对接 SSO,对接完毕 Vouch-proxy 将返回 Nginx,Nginx 此时将获取到用户信息,使用 HTTP Basic Auth 接入 Zabbix。

环境

Zabbix            192.168.10.227:80
Nginx             192.168.10.227:8080
Vouch-proxy       192.168.10.227:9090
SSO               sso.mydomain.com:80    域名是修改 hosts 实现的,实际 IP 为 xxx.xxx.xxx.xxx

在 SSO(Keycloak) 中创建客户端

具体对接情况取决于实际情况,Vouch-proxy 支持多种协议,该方案应该满足各种协议。

我用的是 OpenID Connect 协议,需要在 SSO 中创建客户端,得到以下信息:

客户端ID:myzabbix

秘钥:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

三个对接需要的 URL:

http://sso.mydomain.com/auth/realms/master/protocol/openid-connect/auth

http://sso.mydomain.com/auth/realms/master/protocol/openid-connect/token

http://sso.mydomain.com/auth/realms/master/protocol/openid-connect/userinfo

同时需要在 SSO 中配置重定向地址:http://192.168.10.227:9090/auth,注意这是 Vouch-proxy 的地址

SSO 中的配置到此结束。

搭建 Vouch-proxy

创建并进入项目目录

mkdir -p /usr/local/zabbixsso && cd /usr/local/zabbixsso

创建映射目录

mkdir -p /usr/local/zabbixsso/config && mkdir -p /usr/local/zabbixsso/data

创建配置文件 /usr/local/zabbixsso/config/config.yml,配置文件的模板来自 config.yml_example_oidc

vouch:
  domains:
  - 192.168.10.227
  - sso.mydomain.com

  allowAllUsers: true

  headers:
    claims:
      - groups
      - given_name
      - preferred_username

oauth:
  provider: oidc
  client_id: myzabbix
  client_secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  auth_url: http://sso.mydomain.com/auth/realms/master/protocol/openid-connect/auth
  token_url: http://sso.mydomain.com/auth/realms/master/protocol/openid-connect/token
  user_info_url: http://sso.mydomain.com/auth/realms/master/protocol/openid-connect/userinfo
  scopes:
    - openid
    - email
    - profile
  callback_url: http://192.168.10.227:9090/auth

启动 Vouch-proxy 容器

注意,我的 SSO 域名 sso.mydomain.com 是自己改 hosts 实现的,我必须添加 host,不然无法访问 SSO

docker run     --add-host=sso.mydomain.com:xxx.xxx.xxx.xxx     -d     -p 9090:9090     --name vouch-proxy     -v ${PWD}/config:/config     -v ${PWD}/data:/data     voucher/vouch-proxy

搭建 Nginx(OpenResty)

Nginx 需要用到 http_auth_basic_module 和 lua,默认的 Nginx 没有安装这些组件,我们使用 OpenResty,这是个加强版的 Nginx,有我们需要的一切东西。

创建目录

mkdir -p /usr/local/zabbixsso/conf.d

创建配置文件 /usr/local/zabbixsso/conf.d/default.conf

server {
    listen       80;
    server_name  localhost;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    auth_request /validate;

    location = /validate {
      # forward the /validate request to Vouch Proxy
      proxy_pass http://192.168.10.227:9090/validate;

      # be sure to pass the original host header
      proxy_set_header Host $http_host;

      # Vouch Proxy only acts on the request headers
      proxy_pass_request_body off;
      proxy_set_header Content-Length "";

      # optionally add X-Vouch-User as returned by Vouch Proxy along with the request
      # auth_request_set $auth_resp_x_vouch_user $upstream_http_x_vouch_user;

      # these return values are used by the @error401 call
      auth_request_set $auth_resp_jwt $upstream_http_x_vouch_jwt;
      auth_request_set $auth_resp_err $upstream_http_x_vouch_err;
      auth_request_set $auth_resp_failcount $upstream_http_x_vouch_failcount;
    }

    # if validate returns `401 not authorized` then forward the request to the error401block
    error_page 401 = @error401;

    location @error401 {
        # redirect to Vouch Proxy for login
        return 302 http://192.168.10.227:9090/login?url=$scheme://$http_host$request_uri&vouch-failcount=$auth_resp_failcount&X-Vouch-Token=$auth_resp_jwt&error=$auth_resp_err;
        # you usually *want* to redirect to Vouch running behind the same Nginx config proteced by https
        # but to get started you can just forward the end user to the port that vouch is running on
    }

    # proxy pass authorized requests to your service
    location / {
      # forward authorized requests to your service protectedapp.yourdomain.com
      # proxy_pass http://192.168.10.227:9091/header/show_headers;
      proxy_pass http://192.168.10.227/;
      # you may need to set these variables in this block as per https://github.com/vouch/vouch-proxy/issues/26#issuecomment-425215810
      # auth_request_set $auth_resp_x_vouch_idp_claims_groups $upstream_http_x_vouch_idp_claims_groups;
      # auth_request_set $auth_resp_x_vouch_idp_claims_given_name $upstream_http_x_vouch_idp_claims_given_name;

      auth_request_set $auth_resp_x_vouch_user $upstream_http_x_vouch_user;
      auth_request_set $auth_resp_x_vouch_preferred_username $upstream_http_x_vouch_idp_claims_preferred_username;

      # set user header (usually an email)
      proxy_set_header X-Vouch-User $auth_resp_x_vouch_user;
      # 这是登陆用户名
      proxy_set_header X-Vouch-Preferred-Username $auth_resp_x_vouch_preferred_username;

      # 设置 Zabbix 需要的 HTTP Basic Auth 请求头
      # 最终的效果是在访问 Zabbix 的请求头中添加 Authorization = ‘Basic QWRtaW46MTIzNDU2Nzg5MDExMQ==‘;

      default_type text/html;
      set $encode_username "";
      access_by_lua_block {
          ngx.var.encode_username = ngx.encode_base64(ngx.var.auth_resp_x_vouch_preferred_username..":1234567890113")
      }
      proxy_set_header Authorization "Basic $encode_username";

    }
}

启动容器

docker run     --name openresty-test     -p 8080:80     -v ${PWD}/conf.d:/etc/nginx/conf.d     openresty/openresty:1.15.8.2-7-centos

Zabbix 开启 HTTP auth

访问

直接访问 Nginx 地址

http://192.168.10.227:8080/

如果配置正常,将跳转到 sso 页面,登陆成功将会用 Admin 身份进入 Zabbix 系统。

注意,通过 SSO 登陆的用户,必须在 Zabbix 创建好对应用户。

PS:理想的话,应该将 Zabbix 的退出功能,重定向到 Vouch-proxy 的退出,暂时没有这个需求,先不做了。

原文地址:https://www.cnblogs.com/eoalfj/p/12554117.html

时间: 2024-11-09 05:52:59

Vouch-proxy 实现 Zabbix 对接 SSO的相关文章

elasticsearch搭建与zabbix对接

一. 搭建elasticsearch 上传jdk-8u181-linux-x64.tar.gz和elasticsearch-6.1.4.tar.gz文件到系统任意目录, 安装java解压jdk-8u181-linux-x64.tar.gz文件tar -zxvf jdk-8u181-linux-x64.tar.gz 编辑profile文件,添加jdk环境变量vim /etc/profile 在最后添加#JDK环境变量 JAVA_HOME=/usr/local/jdk1.8.0_181 CLASSP

【Zabbix】Zabbix对接AD域

zabbix对接AD域 需要的信息:一个域账号密码,使用的端口:域名 1. 先查看php是否安装了ldap模块php –m (查看已安装的php模块)若没有安装请参照我之前写的文章"在已编译安装的PHP环境下安装LDAP模块".2. LDAP用户:方法A.域通过zabbix管理员配置,需要知道域控的同名Admin账号的账号密码:方法B.已知某域控账号,有权限访问域控,可在zabbix上创建同名的账号,添加为"超级管理员".在zabbix页面上,选择"管理&

zabbix - 对接钉钉应用接口

因为当时正配置的时候,钉钉推出了钉钉机器人接口,更方便的配置和报警: 所以就没有再弄这个,有需要的朋友再看看吧. https://github.com/Shanwn-git/zabbix/tree/master/dingding_api

ZABBIX对接飞书实现报警通知

飞书提供了丰富的api来实现消息的通知,包括文本消息.图片消息.富文本消息,本次介绍使用飞书api发送文本消息,以下是实现思路飞书API地址:https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM 实现思路 1.需要获取三个授权凭证 app_access_token :访问App资源相关接口. tenant_access_token :访问企业资源相关接口. user_access_token :访问用户资源相关接口. 2.根据

ZABBIX对接飞书实现带图片的报警通知

飞书提供了丰富的api来实现消息的通知,包括文本消息.图片消息.富文本消息,本次介绍使用飞书api发送富文本消息,以下是实现思路飞书API地址:https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM 实现思路 1.根据正则获取监控项id,需要在动作中定义报警信息2.根据获取的监控项id构造请求获取图片地址,并下载到本地3.需要获取三个授权凭证 app_access_token :访问App资源相关接口. tenant_acces

zabbix的proxy代理

zabbix proxy代理 当我们监控的服务器数量较少的时候,用单独有的server来获取数据能够承受,但是当需要监控的服务器数量过多,如3000台服务器,一千台在北京,一千在上海,一千在杭州,我们就可以用分布式的方式进行监控 zabbix_server---->proxy---->agent 我们创建三个proxy,分别对接北京,上海,杭州,的三千台机器,安装完proxy之后,server只需要于三天proxy交互信息就行了,会减少服务器的压力. 我们在安装prixy的是时候,也需要安装数

RHEL 7.2 搭建配置Zabbix proxy

1.安装zabbix proxy 2.将proxy服务器加入到zabbix监控 3.配置mariadb 4.添加proxy到zabbix server 5.使用zabbix proxy监控不同VPC的主机 1.安装zabbix proxy a.配置zabbix yum源: #rpm -ivh  http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm b.安装相关软件  #yum ins

Zabbix基于Proxy分布式部署实现Web监控

前言 在日常运维工作中,难免会遇到这样或那样的故障,如何能在第一时间发现故障,并及时定位故障原因,保证业务不受影响,我想这应该是做好一个运维必须要掌握的技能.但人力不可能实时掌控系统的变化,于是监控系统应运而生,监控便是运维的眼睛,把监控和性能管理做好后,运维就是一件很轻松的事情.目前比较流行的开源监控工具有Cacti.Nagios(Icinga).Zabbix等.本文带来的是Zabbix基于Proxy分布式部署实现Web监控. Zabbix 简介 Zabbix是一个基于Web界面提供分布式系统

升级Zabbix proxy到3.0.2后无法启动报错

一 问题描述 将一台zabbix proxy由2.4.5升级到3.0.2后启动了就直接崩溃了. 错误信息如下: 2367:20160508:153246.830 One child process died (PID:42385,exitcode/signal:11). Exiting ... 42367:20160508:153248.904 Zabbix Proxy stopped. Zabbix 3.0.2 (revision 59540). 将日志级别调高点,设置DebugLevel=4