背景:我司為解決hive資料分析慢問題,部署了presto 347版本集群,同時即席分析平臺采用開源產品superset 1.0版本,
為滿足公司業務場景,需開發以下功能解決認證及審計等問題,
- jdbc等連接方式(開發同學專用)需驗證ranger賬號密碼并通過ranger進行庫表權限驗證,
- superset登錄(資料分析同學使用)需驗證公司sso賬號,且superset端所有同學共用一個presto資料源連接,需單獨設計權限認證方式,
- 開發事件監聽器,用于用戶SQL查詢情況審計等,
一、賬號密碼認證
經調研presto支持Password Authenticator介面的開發,可以在createAuthenticatedPrincipal()方法中實作自己的認證邏輯,最侄訓傳
Principal物件用于之后的 System Access Control權限驗證,經調研presto 347版本已支持 ranger的權限驗證,ranger最低版本為2.0.0,
還有一個問題就是通過 presto jdbc傳輸密碼必須開啟https認證,我們為規避繁瑣的服務端證書認證環節采用nginx做轉發的方案完成,
即客戶端開啟ssl認證,nginx安裝證書接收https請求并轉發http請求到服務端,
具體方案如下:
- System Access Control權限認證采用ranger方案,
- 基于Password Authenticator介面開發ranger賬號密碼認證邏輯,
- 部署nginx做請求轉發,
下面分別介紹下各步驟的具體實作:
1.配置權限認證
第一步配置屬性檔案:
第二步在Presto中安裝Presto Plugin,這個網上有很多教程這里就不詳細介紹了,很多同學公司原來只有hive集群,現在搭建了presto集群想和原有的hive庫表權限共用,
我們發現阿里是自己實作了邏輯讓presto和hive一起去讀取presto中的hive權限,這個方案也不錯,我們的方案是同步一份ranger中歷史的hive權限到presto空間中,
然后在權限系統中開發統一申請介面,為新用戶同時開通兩份相同的權限到ranger的兩個空間中,好處是特殊情況下我們可以給同一個用戶對hive和presto開通不同的訪問權限,
2.賬號密碼認證
這里需要自己開發插件并注冊到presto中,
首先需要在pom檔案中引入presto-spi依賴
每個插件標識一個入口點:Plugin介面的一個實作 ,這個類名通過標準 Java ServiceLoader介面提供給 Presto :類路徑包含在 META-INF/services目錄下的以io.prestosql.spi.Plugin命名的資源檔案,該檔案的內容是一行列出插件類的名稱:com.example.authenticator.RangerPasswordAuthenticatorPlugin,
需要實作一個plugin介面:

工廠類實作PasswordAuthenticatorFactory介面:

核心認證類實作PasswordAuthenticator介面:

最侄訓傳一個帶用戶名的Principal:new BasicPrincipal(username),該用戶名用于第一步中的權限認證,
插件開發完需要注冊到presto中:
<1>添加組態檔:

<2>在plugin目錄下創建名為ranger-password-authenticator的目錄,并把相關依賴包放入,這里有個注意點就是presto打包時需要使用assembly把相關依賴都打到包里,

3.nginx請求轉發
nginx conf檔案內容如下:

我們是把證書安裝到了nginx服務器,通過nginx決議https請求并轉發http請求到presto coordinator 上,
二、superset連接認證
為讓公司同學更方便使用superset平臺,我們需開發公司sso賬號登錄功能,這一步已完成了用戶的身份認證,同樣為方便同學們使用superset平臺查詢presto
離線資料,我們默認為用戶建好了統一的資料源連接,但是該連接的賬號及密碼經過Password Authenticator認證后無法控制住用戶庫表權限,因為server端
無法識別具體的連接用戶,經過我們調研,superset本身支持模擬presto用戶,這樣我們就可以在Password Authenticator中為superset用戶預留一個口子,
通過連接中的唯一復雜密碼作為token來識別superset的連接,
具體方案如下:
1.superset模擬用戶連接并開啟https連接,
2.Password Authenticator介面單獨處理superset連接,
3.System Access Control權限認證還是走ranger方案就好了,
下面分別介紹下各步驟的具體實作:
1.superset資料源配置


開啟模擬用戶,并配置連接協議為https,
2.單獨處理superset請求
這塊還是在上面的presto-password-authenticator插件中的createAuthenticatedPrincipal方法里實作就好了,

3.System Access Control
因為上面經過模擬用戶presto server已經能拿到登錄superset的用戶了,而且經過自己的邏輯已成功的把登錄用戶資訊轉發給了System Access Control模塊,所以權限驗證模塊邏輯不需要做任何改動,
三、SQL審計
經調研,presto支持自定義的事件監聽器的開發,基于該介面我們可以開發自定義日志記錄、除錯以及性能分析插件,我們借助該功能可以實作多事件下查詢作業的指標收集、格式化、持久化作業,持久化的目的地為MySQL,

事件監聽器的開發和上面的密碼驗證器的插件開發相似,這里有些環節就簡單說一下吧,
同樣需要在services里注冊插件實作類,事件監聽器工廠類中的getName方法回傳的名字和組態檔中要一致,
事件監聽器類需要實作事件監聽器介面,并根據需求重寫queryCreated,queryCompleted,splitCompleted等方法,

Presto 支持為以下事件呼叫的自定義事件偵聽器:
- queryCreated 查詢創建
- queryCompleted 查詢完成(成功或失敗)
- splitCompleted 拆分完成(成功或失敗)
此功能支持開發自定義日志記錄、除錯和性能分析插件,
我們這里是做sql的一個審計所以只實作了queryCompleted方法,核心邏輯如下,

插件寫完注冊方法和上面的密碼驗證器也是一樣的,

經過上面兩個presto插件的開發我們就完成了密碼登錄驗證及SQL審計等功能,presto是插件化架構所以開發部署還是相對簡單的,
有些復雜的是完整一套的權限賬號及審計方案的制定,希望本文能給當前正在基于presto搭建公司離線加速分析系統的同學提供一定幫助,
禁止轉載,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293312.html
標籤:其他
上一篇:31.分隔符例外分析
下一篇:最近七天內連續三天活躍用戶數
