Hadoop生態圈-Knox網關的應用案例
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.Knox網關簡介
據Knox官網所述(http://knox.apache.org/):Apache Knox Gateway是用於與Apache Hadoop部署的RESTAPI和UI交互的應用程序網關。Knox Gateway為與Apache Hadoop集群的所有REST和HTTP交互提供一個單一的訪問點。KNOX提供三組面向用戶的服務:
代理服務:Apache Knox項目的主要目標是通過代理HTTP資源提供對Apache Hadoop的訪問。
認證服務:對USTAPI訪問以及UIS的WebSSO流進行身份驗證。LDAP/AD,基於頭的PROAUTH,Kerberos,SAML,OAUTH都是可用的選項。
客戶服務:可以通過DSL編寫腳本或直接將Knox Shell類作為SDK來完成客戶端開發。
簡單的說,Apache Knox Gateway是一款用於保護Hadoop生態體系安全的代理網關系統,為Hadoop集群提供唯一的代理入口。Knox以類似反向代理的形式擋在汲取你的前面,隱匿部署細節(例如端口號和機器名等),接管所有用戶的HTTP請求(例如WEB UI 控制台訪問和RESTful 服務調用),以此來保護集群安全。不僅如此,Knox還能擔任認證網關的角色。如下圖所示:
Knox網關本質上是一款基於Jetty實現的高性能反向代理服務器,通過內置的過濾器鏈來處理URL請求,支持使用LADP進行用戶身份認證。Knox網關在架構設計上具有良好的可擴展性,這種擴展性主要通過Service和Provider這兩個擴展性框架來實現。Server擴展性框架還提供了一種網關新增的HTTP或RESTful服務端點的途徑,例如WebHDFS就是以新建的Service的形式加入Knox網關的。而Provider擴展性框架則是用來定義並實現相應Service所提供的功能,例如端點的用戶認證或是WebHDFS中的文件上傳等功能。當我們使用Knox作為代理網關之后,大數據平台中Hadoop系統的邏輯拓撲就會變成如下圖所示:
更多關於Knox的知識請參考官網鏈接:http://knox.apache.org/。
二.通過Ambari安裝Knox服務
1>.點擊添加服務
2>.選中Knox服務並點擊下一步
3>.將Knox Gateway服務和Ambar-server安裝在同一台服務器上
4>.輸入認證密碼
5>.預覽配置信息,確認無誤后,點擊“Deploy”
6>.安裝成功后,點擊下一步
7>.安裝成功后,點擊完成
8>.安裝成功后,查看Knox的主界面信息
三.LDAP介紹
Knox網關的認證服務是支持LDAP進行用戶身份認證的,那么什么是LDAP呢?LDAP(全稱:“Weight Diretory Access Protocol”)是輕量級目錄訪問協議的簡稱。它是一種樹形目錄結構的輕量級數據庫,能夠提供快速檢索能力。常用與存儲企業內部組織機構與用戶數據。

1.什么是目錄服務 目錄是一類為了瀏覽和搜索數據二十幾的特殊的數據庫,例如:最知名的的微軟公司的活動目錄(active directory)就是目錄數據庫的一種。目錄服務時按照梳妝形式存儲信息的,目錄包含基於屬性的描述性信息,並且支持高級的過濾功能。 一般來說,目錄不支持大多數事務性數據庫所支持的高吞吐兩盒復雜的更新操作。目錄進行更新操作,可以說是要么全部,要么都不的原子操作,目錄服務適合的業務應用在於提供大量的查詢和搜索操作。 為了保證目錄數據的可用性和卡可靠性,她們在確保提供快速的查詢和搜索操作的同事,還提供了主從服務器同步目錄數據信息的能力,這相當於傳統的Mysql數據庫的主從同步一樣,可以最大限度的確保基於目錄業務的持續可用性。 廣義的目錄服務概念,可以有多重不同的方式來提供目錄服務,不同的目錄所允許存儲的信息是不同的,在信息如何被引用,查詢,更新以及防止未經守群的訪問等問題上,不同的目錄所允許存儲的信息是不同的,在信息如何被引用,查詢,更新以及防止未經授權的訪問等問題上,不同的目錄的處理方式也有諸多的不同。一些目錄服務時為本地的,只提供受限的服務,(比如,單機上的finger服務)。另一些服務時大范圍的(global),提供廣闊得多的服務(比如面向整個因特網)。大范圍的服務通常是分布式的,這也就意味着數據是分布在多台機器上的,這些計數器一起來提供目錄服務。典型的大范圍服務定義一個統一的名稱空間(namespace)來給出一個相同的數據試圖(data view),而不管你相對於數據所在的位置。DNS是一個典型的大范圍分布式目錄服務的例子。 2.什么是ldap LDAP是Lightweight Directory Access Protocol (輕量級目錄訪問協議)的縮寫。正如它的名字所表明的那樣,它是一個輕量級的目錄訪問協議,特質基於X.500的目錄訪問協議的簡化版本。LADP運行在TCP/IP或者其他的面向連接的傳輸服務至上。LADP完整的技術規范由RFC2251 “The Lightweight Directory Access Protocol(V3)”和其他幾個在RFC3377中定義的文檔組成。我們不需要研究的那么深,因為我們又不會對它進行二次開發,我們運維只要能了解到它的目錄結構,以及它的用法就OK了,因此我們可以用兩句話總結以上內容: a>.LADP是輕量目錄訪問協議(Lightweight Directory Access Protocal)的縮寫; b>.LADP標准實際上是在X.500標准基礎 上產生的一個簡化版本; 3.什么是X.500 X.500由ITU-T和ISO定義,它實際上不是一個協議,而是有一個協議族組成,包括了從X.501到X.525等一系列非常完整的目錄服務協議。X。500主要具備以下特征: a>.分散維護 運行X.500的每一個站點只負責人本地目錄部分,可以立即更新和維護操作; b>.搜索性能 X.500具有強大的搜素功能,支持用戶建立的任意復雜查詢。 c>.單一全局命名空間 類似於DNS,X.500為用戶提供單一同性命名空間(Single Homogeneous Namespace)。與DNS相比,X。500目錄中定義了信息結構,運行本地擴展。 d>.結構化信息結構 X.500目錄中定義了信息結構,運行本地擴展。 e>.基於標准的目錄服務 由於X.500可以被用於建立一個基於標准的目錄,因此在某種意義上,請求應用目錄信息(電子郵件,資源自動分配器,特定目錄工具)的應用程序就能訪問重要且有簡直的信息。 從技術上來說,LADP是一個到X.500目錄服務的目錄訪問協議,X.500是一個OSI目錄協議。最初,LADP客戶單通過網關(gateway)訪問X.500目錄服務。在客戶和網關之間運行LADP和X.500目錄訪問協議(Directory Access Protocol,DAP),而X.500目錄訪問協議時位於網關和X.500之間的。DAP是一個重量級的協議,在整個OSI協議棧上進行操作,而且需要占用大量的計算資源。LADP被設計的在TCP/IP層上操作,以小得多的代價實現了大多數DAP的功能。 雖然LADP仍舊可以通過網關訪問X.500目錄服務器,但是現在通常都是在X.500服務器上直接實現LADP。 單獨的LADP守護程序sladp,可以被看做是一個輕量級的X.500目錄服務器。也就是說,他沒有實現X.500完整的DAP協議。作為一個輕量級的目錄服務器,sladp實現的僅僅是X.500模型的一個子集。我們可以理解是LADP是X.500的一個簡單的實現。 4.LADP與X.500的相同點 LADP是X.500標准中的目錄訪問協議DAP的一個子集,可用於建立X.500目錄。因此這兩個目錄技術標准有着許多的共同之處: a>.在平台上,都實現了一個通用的平台結構,提供了一個操作系統和應用程序需要的信息服務類型,可以被許多平台和應用程序接收和實現; b>.在信息模型上,都是用了項,對象類,屬性等概念的模式來描述信息; c>.在命名空間上方面,都是用了目錄信息結構和層次命名模型; d>.在功能模型上,都使用了相似的操作命令來管理目錄信息; e>.在認證框架方面,都可以實現用戶名稱和密碼,或者基於安全加密方式的認真機制; f>.早靈活性上,他們的目錄規模都可大可小,達到全球目錄樹,小到只有一台目錄服務器; g>.在分布性方面,目錄信息都可以分布在多個目錄服務器中,這些服務器可以由各個組織管理,既保證了目錄信息總體結構的一致性,又滿足了分級管理的需要。 5.LADP與X.500的差別 a>.LADP基於Internet協議,X.500基於OSI(開放式系統互聯)協議,建立在應用層上的X.500目錄訪問協議DAP,需要在OSI會話層和表示層上進行許多的建立連接和包處理的任務,需要特殊的網絡軟件實現對網絡的訪問;LADP則直接運行在更簡單和更通用的TCP/IP或其他可靠的傳輸層協議上,避免了在OSI會話和表示層的開銷,是鏈接的建立和包的處理更簡單,更快,對於互聯網和企業網應用更理性。 b>.LADP協議更為簡單,LADP繼承了X.500最好的特性,同時去掉了它的復雜性,LADP通過使用查找操作實現列表方式和讀操作,另一方面省去了X.500中神貓的和很少使用的服務控制和安全特性,只保留常用的特性,簡化了LADP的實現。 c>.LADP通過引用機制實現分布式訪問,X.500 DSA通過服務器之間的鏈操作實現分布式的訪問,這樣查詢的壓力九中與服務器端;而LADP通過客戶端API實現分布式操作(對於應用透明)平衡了負載; d>.LADP實現具有低費用,已配置和一管理的特點,經過性能測試,LADP比X.500㕛更少的響應時間;LADP提供了滿足應用程序對目錄服務所需求的特性。
1>.LDAP基本概念中常用名詞縮寫及含義
LDAP通過定義schema模型來描述一個對象,模型中有一些重要的概念,也就是一系列常用名詞縮寫,如下圖所示:
2>.安裝LDAP(安裝測試的LDAP服務需要你的集群安裝knox網關服務)
Knox網關自帶了一個用於測試LDAP服務,並定義好了一些用戶,同時它所有的認證配置都默認指向這個測試的LADP。所以為了方便演示這里就直接使用這個測試的LDAP服務了。
2.1>.啟動LDAP:
登陸Knox網關所在的服務器,進入安裝目錄並執行啟動腳本。
[root@node101 ~]# hostname node101.yinzhengjie.org.cn [root@node101 ~]# [root@node101 ~]# cd /usr/hdp/current/knox-server/bin/ [root@node101 bin]# [root@node101 bin]# ll total 144 -rwxr-xr-x 1 root root 45 Oct 30 2017 gateway -rw-r--r-- 1 root root 1472 Oct 30 2017 gateway.cmd -rw-r--r-- 1 root root 23626 Oct 30 2017 gateway.jar -rwxr-xr-x 1 root root 6840 Oct 30 2017 gateway.sh -rw-r--r-- 1 root root 1024 Oct 30 2017 gateway.xml -rw-r--r-- 1 root root 1206 Oct 30 2017 knoxcli.cmd -rw-r--r-- 1 root root 23594 Oct 30 2017 knoxcli.jar -rwxr-xr-x 1 root root 1769 Oct 30 2017 knoxcli.sh -rwxr-xr-x 1 root root 1907 Oct 30 2017 knox-env.sh -rw-r--r-- 1 root root 1649 Oct 30 2017 ldap.cmd -rw-r--r-- 1 root root 23658 Oct 30 2017 ldap.jar -rwxr-xr-x 1 root root 6354 Oct 30 2017 ldap.sh -rw-r--r-- 1 root root 1059 Oct 30 2017 ldap.xml -rw-r--r-- 1 root root 23623 Oct 30 2017 shell.jar [root@node101 bin]# [root@node101 bin]# ./ldap.sh start Starting LDAP succeeded with PID 5642. [root@node101 bin]# [root@node101 bin]# jps | grep ldap 5642 ldap.jar [root@node101 bin]#
2.2>.登陸驗證
LDAP測試服務預置的用戶信息有兩種途徑查看,一種是登陸Knox網關所在的服務器查看配置文件,配置文件地址是“/etc/knox/conf/users.ldif”,另一種是通過Ambari的配置管理查看,如下圖所示:
現在我們使用客戶端工具鏈接到LDAP測試一下服務是否正確啟動。市面上有很多免費到LADP客戶端工具可以選擇,這里推薦使用jxplorer。jxplorer是一款開源的LADP客戶端工具,大家根據自己操作系統下載對應 的版本即可,下載地址為:http://jxplorer.org/downloads/users.html。注意,安裝jxplorer時,需要安裝jdk環境喲:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html。
安裝jxplorer的過程很簡單,我這里就不截圖如何安裝了。安裝成功后打開jxplorer輸入登陸信息,如下圖所示,幾個比較重要的信息如下:
主機:node101.yinzhengjie.org.cn(這里也可以直接輸入IP地址,根據的你環境輸入相應的主機名稱即可)
端口:33389(這個端口可以在ldap服務端使用netstat名稱查看)
協定:LDAP v3
基底DN:dc=hadoop,dc=apache,dc=org
層次:用戶 + 密碼
使用者DN:uid=admin,ou=people,dc=hadoop,dc=apache,dc=org
密碼:admin-password
使用模板:點擊存儲自定義一個名稱即可,下次可以直接選中這個模板鏈接對應的目錄結構。
登陸之后我們會看到LDAP里面已經預置了一些組和用戶的數據了,如下圖所示:
四.驗證Knox網關
由於使用了Knox網關自帶的LDAP服務 ,所以我們無須更改它的配置便可以直接使用。作為代理網關,Knox將所有支持代理的RESTful服務和頁面進行了一層地址映射。現在我們來測試一下YARN的RESTful服務,打開瀏覽器輸入:“https://node101.yinzhengjie.org.cn:8443/gateway/default/resourcemanager/v1/cluster/apps”。這是YARN查看任務集群的RESTful服務接口。如下圖所示,Knox網關需要進行登陸認證。
輸入用戶名和密碼進行認證登陸,認證通過之后我們如願訪問到數據了,如下圖所示:
接下來我們嘗試訪問YARN的Web UI控制台,Knox網關的默認配置中只代理了RESful接口,所以我們需要修改它的配置文件,添加想要代理的Web UI控制台。打開Ambari找到Knox網關的配置頁面,選擇Advanced topology配置項,在末尾添加YARN UI的配置,保存后需要重啟Knox網關服務。

<topology> <gateway> <provider> <role>authentication</role> <name>ShiroProvider</name> <enabled>true</enabled> <param> <name>sessionTimeout</name> <value>30</value> </param> <param> <name>main.ldapRealm</name> <value>org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm</value> </param> <param> <name>main.ldapRealm.userDnTemplate</name> <value>uid={0},ou=people,dc=hadoop,dc=apache,dc=org</value> </param> <param> <name>main.ldapRealm.contextFactory.url</name> <value>ldap://{{knox_host_name}}:33389</value> </param> <param> <name>main.ldapRealm.contextFactory.authenticationMechanism</name> <value>simple</value> </param> <param> <name>urls./**</name> <value>authcBasic</value> </param> </provider> <provider> <role>identity-assertion</role> <name>Default</name> <enabled>true</enabled> </provider> <provider> <role>authorization</role> <name>AclsAuthz</name> <enabled>true</enabled> </provider> </gateway> <service> <role>NAMENODE</role> <url>hdfs://{{namenode_host}}:{{namenode_rpc_port}}</url> </service> <service> <role>JOBTRACKER</role> <url>rpc://{{rm_host}}:{{jt_rpc_port}}</url> </service> <service> <role>WEBHDFS</role> {{webhdfs_service_urls}} </service> <service> <role>WEBHCAT</role> <url>http://{{webhcat_server_host}}:{{templeton_port}}/templeton</url> </service> <service> <role>OOZIE</role> <url>http://{{oozie_server_host}}:{{oozie_server_port}}/oozie</url> </service> <service> <role>WEBHBASE</role> <url>http://{{hbase_master_host}}:{{hbase_master_port}}</url> </service> <service> <role>HIVE</role> <url>http://{{hive_server_host}}:{{hive_http_port}}/{{hive_http_path}}</url> </service> <service> <role>RESOURCEMANAGER</role> <url>http://{{rm_host}}:{{rm_port}}/ws</url> </service> <service> <role>YARNUI</role> <url>http://{{rm_host}}:{{rm_port}}</url> </service> <service> <role>DRUID-COORDINATOR-UI</role> {{druid_coordinator_urls}} </service> <service> <role>DRUID-COORDINATOR</role> {{druid_coordinator_urls}} </service> <service> <role>DRUID-OVERLORD-UI</role> {{druid_overlord_urls}} </service> <service> <role>DRUID-OVERLORD</role> {{druid_overlord_urls}} </service> <service> <role>DRUID-ROUTER</role> {{druid_router_urls}} </service> <service> <role>DRUID-BROKER</role> {{druid_broker_urls}} </service> <service> <role>ZEPPELINUI</role> {{zeppelin_ui_urls}} </service> <service> <role>ZEPPELINWS</role> {{zeppelin_ws_urls}} </service> </topology>
通過以上配置的修改並重啟了Knox服務之后,現在我們再次打開瀏覽器輸入:“https://node101.yinzhengjie.org.cn:8443/gateway/default/yarn”,就能看到YARN的Web UI管理控制台了,如下圖所示:
我們還可以繼續修改Knox網關的配置加入更多的Web UI映射配置,例如,HDFS Namenode UI,Hbase UI,Spark UI。

<service> <role>HDFSUI</role> <url>http://node101.yinzhengjie.org.cn:50070/webhdfs</url> </service>

<service> <role>HBASEUI</role> <url>http://node101.yinzhengjie.org.cn:16010/</url> </service>

<service> <role>SPARKHISTORYUI</role> <url>http://node101.yinzhengjie.org.cn:8080/</url> </service>