nyarime 发表于 昨天 05:12

借助Casdoor+OAuth2-Proxy实现类Cloudflare Access功能(宝塔面板)

其实可以直接套Cloudflare Access(现在合并到Zero Trust功能了),Cloudflare Access 的作用是在无需传统VPN 的情况下可保护内部应用和资源,然而奶油在奶昔SSO点那个Cloudflare后注册量达到100用户后就爆了。好嘛,那就自己搓一个类似于Cloudflare Access的功能,即在Nginx层面给任意项目站点增加访问限制,也就是推出奶油专属的服务。
这个在nmQu实现过,只不过Any-Proxy是基于PHP的因此引入一个OIDC鉴权就行。不管老牌KeyCloak以及奶昔SSO用的Casdoor,总之都是以OIDC标准实现的。因此我们需要用到OAuth2-Proxy完成鉴权,并告知NGINX这个是符合资格的用户。不过这个方法也有缺点,除非你是ALL IN BOOM否则你得弄一堆OAuth2-Proxy,不知道为啥写公网地址会500错误。
static/image/hrline/5.gif
确认你的NGINX具备auth_request
终端执行nginx -V看到--with-http_auth_request_module就是有,宝塔用户默认都没有。因此需要卸载NGINX(重装会保留配置)再选择编译安装,然后添加自定义选装模块如下图,添加自定义模板参数写--with-http_auth_request_module,模块名随意填写(如auth_request)

重装完后到终端执行nginx -V,就发现已经有了。那就可以在宝塔面板上创建了你的网站

static/image/hrline/5.gif
部署OAuth2-Proxy对接Casdoor
假设你已经有了IdP(奶昔SSO)后,并已经创建了网站。在确保能访问的情况下,我们先搓一下OAuth2-Proxy。
这里我用 o2p.naixi.net 作为域名,确保访问 https://o2p.naixi.net 可以正常打开后再来添加反代。使用宝塔默认的反向代理,以本帖为例我绑定的是4180端口就写127.0.0.1:4180,其他默认就好

要使用OAuth2-Proxy首先需要写下配置文件。这边参考官方文档直接用二进制,我在别人的博客看到了密密麻麻的启动参数,还以为我在docker run。不过以官方OIDC的案例是可以用一个文本写配置的。我把它叫naixi.cfg,先在奶昔SSO(Casdoor)上创建好应用,然后参考如下内容写配置:#OAuth2-Proxy开在4180端口,为了避免暴露公网用127.0.0.1
http_address="127.0.0.1:4180"
# 表示 Oauth2-Proxy 运行在反向代理之后,使用 X-Real-IP 头,并允许X-Forwarded-{Proto,Host,Uri}在重定向选择上使用
reverse_proxy=true
# 使用 openssl rand -base64 16 生成
cookie_secret="NYARIMEYesIArkAreYouOK=="
# Cookies 限定域
cookie_domains=".naixi.net"
# 配置Provider为OIDC类型
provider="oidc"
# 配置Provider名称
provider_display_name="Naixi SSO"
client_id="应用id"
client_secret="应用私钥"
# Casdoor授权完成后的回调地址
# /oauth2/callback 是 oauth2-proxy 提供的接口
redirect_url="https://o2p.naixi.net/oauth2/callback"
# Casdoor地址
oidc_issuer_url="https://auth.naixi.net"
# 域名白名单(可选)
whitelist_domains=".naixi.net"
# 限定邮箱后缀
email_domains=["*"]保存后可以在终端执行oauth2-proxy --config naixi.cfg启动后再次访问 https://o2p.naixi.net 显示OAuth2-Proxy则表示启动成功

接下来先Ctrl+C关掉,然后再用宝塔的进程守护管理器保持就行(screen也行,但这个可以开机自启动)

启动好后保险起见,还可以再访问下 https://o2p.naixi.net,能打开就表示OAuth2-Proxy搞定。然后再点一下,试试可否顺利加载Casdoor的登录框,若有回调错误可按照报错的URI加入Casdoor应用的Redirect URI。以本帖为例,添加的是https://o2p.naixi.net/oauth2/callback

登录后若凭据在有效期内,将显示404。因此建议用无痕浏览器调试!

static/image/hrline/5.gif
为网站启用OAuth2-Proxy验证
以 search.naixi.net (最近在玩的SearXNG)为例,由于自建搜索引擎会有违规内容导致被墙的风险,因此只对奶油开放。首先打开网站详情,然后选择配置文件,启用auth_requestauth_request /oauth2/auth;
error_page 401 = https://o2p.naixi.net/oauth2/sign_in?rd=$scheme://$host$request_uri;
接着创建一个反向代理,这里创建一个占位就行。由于SearXNG是用Docker部署的,因此我已经反代过8180端口,这里不用管它。

创建好后点配置文件,然后删掉那些。输入下面的代码:#PROXY-START/

location ^~ /oauth2/ {

      proxy_pass       http://127.0.0.1:4180; # Change this to the "--http-address" configured in step II.6

      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;
      # or, if you are handling multiple domains:
      # proxy_set_header X-Auth-Request-Redirect $scheme://$host$request_uri;
    }
    location = /oauth2/auth {
      
      proxy_pass       http://127.0.0.1:4180; # Change this to the "--http-address" configured in step II.6

      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 ^~ /
{
    proxy_pass http://127.0.0.1:8180;# Change this to your app's url
    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 REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;
    # proxy_hide_header Upgrade;

    add_header X-Cache $upstream_cache_status;
    #Set Nginx Cache

    set $static_filefp9pXqS2 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
      set $static_filefp9pXqS2 1;
      expires 1m;
    }
    if ( $static_filefp9pXqS2 = 0 )
    {
      add_header Cache-Control no-cache;
    }
}

#PROXY-END/如果网站不是Docker部署的,那就把location ^~ /开始到#PROXY-END/之前的删完即可,删完后如下:#PROXY-START/
location ^~ /oauth2/ {

      proxy_pass       http://127.0.0.1:4180; # Change this to the "--http-address" configured in step II.6

      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;
      # or, if you are handling multiple domains:
      # proxy_set_header X-Auth-Request-Redirect $scheme://$host$request_uri;
    }
    location = /oauth2/auth {
      
      proxy_pass       http://127.0.0.1:4180; # Change this to the "--http-address" configured in step II.6

      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;
    }

#PROXY-END/上面的#PROXY-START/和#PROXY-END/是宝塔面板用于读取反代规则所引用的限定头尾,这个需要保留。
此时访问您的用户在登录您的服务时会经历以下过程:在浏览器中打开 URL -> 仅看到需要登录的页面,包括名为“使用 Naixi SSO 登录”的按钮 -> 单击按钮并被重定向到您的 Casdoor 地址,他们将被要求登录 -> 用户输入他们的用户名和密码,Casdoor 验证他们的凭据 -> 自动重定向回您的 URL -> 成功访问您的服务 -> 用户在以下情况下将被要求再次登录您设置的时间将过期。

Clutter 发表于 昨天 05:54

辛苦

tomcruise 发表于 昨天 13:48

技术帖,学习了。感谢
页: [1]
查看完整版本: 借助Casdoor+OAuth2-Proxy实现类Cloudflare Access功能(宝塔面板)