1. 程式人生 > 其它 >網頁嵌入zabbix頁面(不同域名)

網頁嵌入zabbix頁面(不同域名)

先來結論:

方案一:繞過身份驗證:https://www.cnblogs.com/JaSonS-toy/p/4939805.html(我不是這樣實現,可以自行嘗試)

方案二:

1、保證請求的ip與請求zabbix的ip一致

  1.在nginx中增加一個路由跳轉到zabbix

  2.新增白名單(不然其他域名也能內嵌這個頁面)

    2-1.nginx新增headers_more模組(解除安裝後重新編譯)
    2-2.nginx修改響應頭X-Frame-Options(因為chrome和firefox不支援 ALLOW-FROM,所以要做步驟三)
    2-3.nginx新增響應頭Content-Security-Policy(新增白名單)

2、嵌入頁面後,可以選擇讓使用者自行登入,或者後端調取zabbixAPI獲取token,返回前端,前端document.cookie='zbx_sessionid={{token}}'

本質上,我把zabbix嵌到我的頁面,然後請求我的伺服器tp.abc.cn/zabbix,nginx轉發到zabbix.abc.cn,zabbix.abc.cn返回給nginx,nginx修改響應頭,再返回給客戶端。過程中你不需要修改zabbix伺服器的任何東西。

過程分析:

1、網上很多人說到Zabbix下的 include/defines.inc.php 檔案,把define('X_FRAME_OPTIONS', 'SAMEORIGIN');改為define('X_FRAME_OPTIONS', null);
但實測是不行的,即使改了請求頭依然是“X_FRAME_OPTIONS=SAMEORIGIN”。官網也明確表示不能跨域請求了:https://www.zabbix.com/forum/zabbix-help/361685-change-x_frame_options-do-not-work 

2、也有人說可以繞過身份驗證,但因為zabbix是運維負責的,我懶得去做繞過身份校驗(其實是不會php)

3、所以只能想辦法,實現如官網所說的把zabbix的域名和框架中的域名一致(例如zabbix的域名是zabbix.abc.cn,框架的域名是tp.abc.cn)。我的實現方式是在nginx中增加一個路由跳轉到zabbix,這樣就可以通過訪問tp.abc.cn/zabbix請求zabbix.abc.cn。

4、不能讓別人也能通過訪問tp.abc.cn/zabbix嵌入zabbix頁面吧,所以能不能改成使用白名單呢?理論上響應頭裡的東西都是可以自定義設定的,但是nginx預設只能增加請求頭。即哪怕你加了“X_FRAME_OPTIONS=ALLOW-FROM tp.abc.cn”,請求頭中原帶的“X_FRAME_OPTIONS=SAMEORIGIN”依然存在。如果想修改則要新增headers_more模組(自行百度新增,有人說可以動態新增,我只嘗試了解除安裝後重新新增)。實踐發現即使把X_FRAME_OPTIONS改成ALLOW-FROM,也沒有起到白名單作用(因為chrome和firefox不支援 ALLOW-FROM),所以要使用響應頭Content-Security-Policy設定白名單

注意:測試環境中,雖然嵌入的頁面能訪問到zabbix,但是登入成功也不會跳到監控頁面。因為此時域名依然是不同的,zabbix返回的Set-Cookie沒有設定SameSite=None,在跨域時chrome不會進行Set-Cookie操作