需求背景簡介
系統安全通常包括兩個核心主題:身份驗證和授權。一個解決“用戶是誰”的問題,另一個解決“用戶允許執行什么操作”的問題。在大數據領域,Apache Ranger 是最受歡迎的授權選擇之一,它支持所有主流大數據組件,包括 HDFS、 Hive、HBase、 Trino 等組件。
雖然 Hive 在設計中通過 Linux 的用戶和用戶組來控制用戶權限,但集成在 Amazon EMR 中的 Hive 組件默認權限管理是 None,即不設置權限控制,任何用戶名都可以通過 Hive 用戶對 Hive 組件中的數據進行操作,在多用戶和多任務的情況下,就會造成數據管理的安全隱患。因此,在基于 Amazon EMR 構建的大數據環境中,客戶往往需要集成權限控制工具,實現細化到數據表級別甚至字段級別的權限管理。
本文介紹了在 Amazon EMR 中,通過部署 Apache Ranger 和 Simple AD 服務,對 Amazon EMR 中的數據進行 Hive 表級別的權限管理。
系統方案架構圖
主要服務和組件簡介
Amazon EMR
Amazon EMR(以前稱為 Amazon Elastic MapReduce)是一個托管集群平臺,可簡化在上運行大數據框架(如 Apache Hadoop 和 Apache Spark)的過程,亞馬遜云科技以處理和分析海量數據。使用這些框架和相關的開源項目,您可以處理用于分析目的的數據和業務情報工作負載。
集群是 Amazon EMR 的核心組件。集群是 Amazon Elastic Compute Cloud(Amazon EC2)實例的集合。集群中的每個實例稱作節點。Amazon EMR 中的節點類型有:
主節點:該節點管理集群,它通過運行軟件組件來協調在其它節點之間分配數據和任務的過程以便進行處理。主節點跟蹤任務的狀態并監控集群的運行狀況。每個集群都有一個主節點,并且可以僅使用主節點創建單節點集群。
核心節點:該節點具有運行任務并在集群上的 Hadoop Distributed File System(HDFS)中存儲數據的軟件組件。多節點集群至少具有一個核心節點。
任務節點:該節點具有僅運行任務但不在 HDFS 中存儲數據的軟件組件。
Simple Active Directory
Simple AD 目錄是由 Samba 4 Active directory 兼容服務器提供支持的托管目錄。它提供了 Microsoft AD 提供的功能的子集,并支持常用功能,如用戶帳戶、組成員身份、加入到運行 Linux 和 Windows 的域的 Amazon EC2 實例,以及基于 Kerberos 的單點登錄(SSO)和組策略。這使得管理運行 Linux 和 Windows 的 EC2 實例以及在亞馬遜云平臺中部署應用程序變得更加容易。
同時 Simple AD 的成本也非常低廉,在大多數情況下,Simple AD 是成本最低的選擇,如果用戶數不超過 5000,并且不需要更高級的 Microsoft Active Directory 域功能,Simple AD 是這種場景下的最佳選擇。
Apache Ranger
Apache Ranger 是一個框架,可跨 Hadoop 平臺啟用、監控和管理全面的數據安全。Apache Ranger 具有以下功能:
集中安全管理以在中央 UI 或使用 REST API 管理所有與安全相關的任務;
使用 Hadoop 組件或工具執行特定操作或操作的精細授權,通過集中管理工具進行管理;
跨所有 Hadoop 組件的標準化授權方法;
增強了對各種授權方法的支持;
在 Hadoop 的所有組件中對用戶訪問和管理操作(安全相關)進行集中審計。
Apache Ranger 使用兩個關鍵組件進行授權:
Apache Ranger 策略管理服務器 – 此服務器允許您定義 Hadoop 應用程序的授權策略。與 Amazon EMR 集成時,您可以為 Apache Spark 和 Hive 定義和實施策略以訪問 Hive Metastore,并訪問 Amazon S3 數據 EMR 文件系統。您可以設置新的或使用現有的 Apache Ranger 策略管理服務器與 Amazon EMR 集成。
Apache Ranger 插件 – 此插件根據 ApacheRanger 策略管理服務器中定義的授權策略驗證用戶的訪問權限。Amazon EMR 會為在 Apache Ranger 配置中選擇的每個 Hadoop 應用程序自動安裝和配置 Apache Ranger 插件。
部署步驟
01
部署?Simple AD 服務
創建 Simple AD 服務比較簡單,可以在亞馬遜云科技控制臺中,選擇 Directory Service 服務,點擊“設置目錄”。
在“目錄類型”中選擇創建“Simple AD”
目錄大小選擇“小型”即可,為目錄設置一個 DNS 域名,例如 awsbuilder.cn。需要注意這個域名在后續 Apache Ranger 的集成配置中需要作為 Search Base 使用,LDAP 的 Search Base 格式是“dc=awsbuilder,dc=cn”;User Search Base 的格式是“cn=users,dc=awsbuilder,dc=cn”。
繼續設置 AD 域管理員密碼
最后選擇 Simple AD 所在的 VPC 和子網,就可以完成 Simple AD 的創建。
創建完成后,可以看到 Simple AD 的 VPC 網絡和 IP 地址,通過 AD 域控制器或者 LDAP 客戶端工具對用戶和組進行管理。如何管理 Simple AD 中的用戶目錄可以參考官方文檔,本文中不再贅述。
官方文檔:
https://docs.aws.amazon.com/zh_cn/directoryservice/latest/admin-guide/simple_ad_how_to.html
02
部署?Apache Ranger
Apache Ranger 的官方網站是?https://ranger.apache.org/,最新的版本是 2.4.0,可以從?https://ranger.apache.org/download.html?獲取最新版本的下載。詳細的安裝手冊可以參考?https://cwiki.apache.org/confluence/display/RANGER/Running+Apache+Ranger+-++%5BFrom+source%5D+in+minutes。
Apache Ranger 是一個開源軟件,我們需要啟動一臺 EC2 進行安裝部署。同時 Apache Ranger 沒有直接的安裝包,官網下載源碼后需要進行編譯。具體安裝部署的步驟如下:
1)準備工作,在 EC2 中,用 root 帳號安裝 Java JDK、Maven、git、gcc 等工具軟件
sudo su - root
yum -y install java-11* git gcc expectwget https://archive.apache.org/dist/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
tar -zxf apache-maven-3.8.6-bin.tar.gz -C /usr/local
export JAVA_HOME=/usr/lib/jvm/java
export PATH=$JAVA_HOME/bin:$PATH
export MAVEN_OPTS="-Xmx2048M"
export M2_HOME=/usr/local/apache-maven-3.8.6
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
左滑查看更多
運行 mvn -version,可以看到正常顯示 Maven 的版本。
安裝完成后,需要修改 Maven 的配置文件,否則部署 Apache Ranger 會報錯。修改$M2_HOME/conf/setting.xml 文件,屏蔽掉 159 行到 165 行:
sed 159c\ "<!-- <mirror>" -i $M2_HOME/conf/settings.xml
sed 165c\ "</mirror> -->" -i $M2_HOME/conf/settings.xml
sed -i "s/\r//g" $M2_HOME/conf/settings.xml
左滑查看更多
Apache Ranger 使用 MySQL 作為儲存權限策略的數據庫,需要下載 MySQL 的 JDBC Driver 文件:
wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.25.tar.gz
tar -zxf mysql-connector-java-8.0.25.tar.gz mysql-connector-java-8.0.25/mysql-connector-java-8.0.25.jar --strip-components 1
mv mysql-connector-java-8.0.25.jar /usr/share/java -f
左滑查看更多
MySQL 數據庫可以在 EC2 中自建 MySQL 數據庫,也可以采用亞馬遜云科技托管的 RDS MySQL 8.0 版本,如果采用 RDS MySQL 8.0 版本,需要修改 RDS MySQL 實例的參數: log_bin_trust_function_creators = 1 。
2)編譯 Apache Ranger,下載 Apache Ranger 的源碼包,用 Maven 進行編譯
wget https://dlcdn.apache.org/ranger/2.4.0/apache-ranger-2.4.0.tar.gz
tar -zxf apache-ranger-2.4.0.tar.gz
cd apache-ranger-2.4.0
mvn clean compile package -DskipTests -Drat.skip=true -Dmaven.wagon.http.ssl.insecure=true
左滑查看更多
編譯的時間比較長,根據機型配置不同所需要的編譯時間會有所不同,本文采用 t3a.small 的機型大約需要等待 30 分鐘左右,看到 BUILD SUCCESS 的信息表示編譯成功。編譯后的安裝包保存在 target 目錄中。
3)安裝 Apache Ranger 的 ranger-admin 組件,解壓縮編譯后的安裝包
tar -zxf ~/ranger/apache-ranger-2.4.0/target/ranger-2.4.0-admin.tar.gz -C /usr/local
左滑查看更多
修改/usr/local/ranger-2.4.0-admin/install.properties 配置文件的下列參數:
SQL_CONNECTOR_JAR = /usr/share/java/mysql-connector-java-8.0.25.jar
db_root_user = $dbadmin
db_root_password = $dbpassword
db_host = $dbhostname
db_name = $rangerdbname
db_user = $rangeradmin
db_password = $rangerpassword
rangerAdmin_password = $rangerpassword
rangerTagsync_password = $rangerpassword
rangerUsersync_password = $rangerpassword
keyadmin_password = $rangerpassword
#audit_store=solr
左滑查看更多
修改完成后,執行 ./setup.sh?進行 ranger-admin 組件的安裝。直到出現“Installation of Ranger PolicyManager Web Application is completed.”的信息,表示?ranger-admin 安裝成功。接著執行 ranger-admin start 啟動 ranger-admin 服務,啟動后,在瀏覽器訪問 ranger-admin 的管理地址,URL 是?http://ec2-hostname:6080,用 admin 用戶登錄,密碼是 install.properties 中 rangerAdmin_password 參數的值。如下圖所示,ranger-admin 已經成功部署并運行。
4)安裝 Apache Ranger 的 ranger-usersync 組件,解壓縮編譯后的安裝包
tar -zxf ~/ranger/apache-ranger-2.4.0/target/ranger-2.4.0-usersync.tar.gz -C /usr/local
左滑查看更多
修改/usr/local/ranger-2.4.0-usersync/install.properties 配置文件的下列參數:
修改/usr/local/ranger-2.4.0-usersync/install.properties配置文件的下列參數:
POLICY_MGR_URL = http://localhost:6080
SYNC_SOURCE = ldap
SYNC_INTERVAL = 60
rangerUsersync_password = $rangerpassword
SYNC_LDAP_URL = ldap://simple-ad-ipaddress:389
SYNC_LDAP_BIND_DN = $ADadmin_DN
SYNC_LDAP_BIND_PASSWORD = $ADadmin_password
SYNC_LDAP_DELTASYNC = true
SYNC_LDAP_SEARCH_BASE = $Search_base
SYNC_LDAP_USER_SEARCH_BASE = $User_search_base
左滑查看更多
修改完成后,執行 ./setup.sh?進行 ranger-usersync 的安裝。安裝完成后,修改/usr/local/ranger-2.4.0-usersync/conf/ranger-ugsync.site.xml,把第 8 行 ranger.usersync.enabled 的屬性由 false 改為 true,否則不會執行用戶同步;然后修改/usr/local/ranger-2.4.0-usersync/conf/ranger-ugsync.default.xml,把第 70 行的 ranger.usersync.cookie.enabled 屬性由 true 改為 false,否則 usersync 執行定時同步時會報 session 錯誤。
接著執行?ranger-usersync start?啟動 ranger-usersync 服務。在 ranger-admin 的管理控制臺中,點擊 settings à Users/Groups/Roles,可以看到 Simple AD 中的用戶已經被同步到 Ranger 服務,用戶類型是 External,用戶源是 LDAP/AD。
Apache Ranger 的手工部署步驟比較繁瑣,筆者基于 Apache Ranger 2.3.0 的安裝寫了一個自動化部署腳本,https://github.com/eq9684/emr_autolaunch/blob/main/ranger_mysql8.sh,讀者可以參考腳本自行編寫 Apache Ranger 2.4.0 的自動化部署腳本。
03
部署?Amazon EMR
Amazon EMR 可以通過亞馬遜云科技管理控制臺頁面進行部署,也可以通過 Amazon CLI 進行一鍵部署。本文中采用 Amazon CLI 進行快速部署。如何安裝和使用 Amazon CLI 可以參考官方文檔:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-getting-started.html,本文假設讀者已經安裝并熟悉 Amazon CLI 的使用。
安裝 Amazon EMR,執行下面的 CLI 命令,命令中的文件參數可以參考:https://github.com/eq9684/emr_autolaunch。Amazon EMR 的組件較多,每個組件與 Simple AD 集成需要分別配置,手動配置會比較繁瑣。本文的參數自動填充了 Hive 和 HUE 的參數,啟動 Amazon EMR 后,HUE 即可通過設置 Simple AD 的用戶作為 HUE 管理員帳號訪問。注意需要將命令行和文件中的 keypair、子網、安全組、數據庫鏈接等參數替換為自己的環境,更詳細的部署參數可以查看官方文檔:https://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-ha-launch.html。
aws emr create-cluster \--release-label emr-6.12.0 \--instance-groups=''file://instance-group.json \--use-default-roles \--auto-scaling-role EMR_AutoScaling_DefaultRole \--applications Name=Hadoop Name=Hive Name=Hue Name=Pig Name=Tez \--ec2-attributes KeyName=keypairFile,SubnetId=subnet-12345678,EmrManagedMasterSecurityGroup=sg-12345678,EmrManagedSlaveSecurityGroup=sg-12345678 \--termination-protected \--configurations=file://hiveldap.json \--name EMR-auto \--managed-scaling-policy ComputeLimits='{MinimumCapacityUnits=1,MaximumCapacityUnits=4,MaximumOnDemandCapacityUnits=2,UnitType=Instances,MaximumCoreCapacityUnits=2}' \--log-uri s3://aws-logs-bucket\--ebs-root-volume-size 30
左滑查看更多
執行后返回帶有 ClusterId 的 json 結果,可以在亞馬遜云科技管理控制臺頁面中查看啟動狀態,Amazon EMR 啟動的時間比較長,大約在 10 分鐘左右。等集群狀態變為綠色字體的“正在等待”,表示 EMR 集群已經成功啟動。
訪問 Amazon EMR 主節點的 HUE 服務,URL 是?http://emr-master-hostname:8.8.8.8,用 Simple AD 的設置的管理員帳號登錄,就可以進入 HUE 主界面。
HUE 不會自動同步 Simple AD 的其他帳號,需要管理員在用戶管理中手動同步。訪問?http://emr-master-hostname:8.8.8.8/hue/useradmin/users?進入用戶管理界面。
點擊“Add/Sync LDAP user”,接下來輸入 LDAP 的用戶名就可以同步 Simple AD 的用戶到 HUE 中。
用新同步的用戶登錄 HUE,可以用 Simple AD 的用戶名和密碼登錄。
04
在?Amazon EMR 的主節點中
部署 Apache Ranger Plugin
登錄到 Ranger 管理控制臺的界面,點擊 HADOOP SQL 右面的+號,創建 Hive 的策略條目。
在 Service Detail 段落中,填寫 Service Name 和 Display Name,例如“hive”,記下填入的名稱,Amazon EMR plugin 配置文件的屬性必須和這個名稱一致。
在 Config Properties 段落中,填寫 Simple AD 的用戶名和密碼,jdbc.driverClassName 保留默認的 org.apache.hive.jdbc.HiveDriver,jdbc url 填寫 jdbc:hive2://emr-master-ip:10000/default;auth=noSasl。
點擊頁面下方的“Test Connection”按鈕,可以看到連接成功的信息。成功后,點擊最下面的“Add”按鈕就可以保存策略配置。
在 Apache Ranger 的編譯目錄中,復制 ranger-2.4.0-hive-plugin.tar.gz 文件到 Amazon EMR 的主節點。
用 root 用戶登錄到 Amazon EMR 的 ssh 終端,執行下列命令:
tar -zxf ranger-2.4.0-hive-plugin.tar.gz
cd $HOME/ranger-2.4.0-hive-plugin/
cp lib/ranger-hive-plugin-impl/*.jar /usr/lib/hive/lib
左滑查看更多
修改 ranger-2.4.0-hive-plugin 目錄中的 install.properties 文件,其中 REPOSITORY_NAME 參數必須填寫上一步創建的 Ranger 權限策略的 Service Name,本文上一步填寫的 Service Name 是 hive,這里的 REPOSITORY_NAME 也要填寫 hive:
POLICY_MGR_URL = http://$ranger-hostname:6080
REPOSITORY_NAME = hive
COMPONENT_INSTALL_DIR_NAME = /usr/lib/hive
左滑查看更多
執行 ./enable-hive-plugin.sh ,安裝 hive plugin,然后執行?systemctl restart hive-server2?重新啟動 hive 服務。
05
配置?Apache Ranger 權限策略
登錄到 Ranger 管理控制臺,點擊“hive”的權限策略,可以看到當前的權限配置,點擊列表中的“all-database”。
用 HUE 管理員用戶登錄 HUE,在 default 庫中創建一個 hive 表,表名為 private_table。
登錄 Ranger 管理控制臺,點擊 hive 策略,可以編輯 hive 表的權限,例如我們想把剛才創建的 hive 表設置為私有,就可以在 Range 的權限列表中,增加一條權限如下圖所示,我們設置策略的資源是 private_table 表,給用戶 huawangz 授予所有權限,同時拒絕任何其他的用戶訪問。
回到 HUE 的界面中,通過 huawangz 用戶增加一條記錄
用 select * from default.private_table,可以查詢到剛剛加入的記錄
退出當前的 HUE 用戶,用其他用戶登錄 HUE,同樣運行 select * from default.private_table;,可以看到查詢被 Hive 拒絕,此用戶沒有訪問 default/private_table/*的權限,無法查詢私有表中的數據,說明在 Ranger 中配置的權限策略已經生效。
小結
本文介紹了如何在 Amazon EMR 集群中,通過開源組件 Apache Ranger 對 EMR 中的數據進行權限管理。通過 Apache Ranger 不同的 plug-in,除了對 Hive 表進行權限管理,還可以對 S3、Trino、Spark 等組件進行權限的管理,有興趣的讀者可以查閱亞馬遜云科技官方文檔:
https://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-ranger-plugins.html?和 Apache Ranger 的文檔?https://cwiki.apache.org/confluence/display/RANGER/Ranger+Installation+Guide
本文中自動化部署和配置的代碼可以在?https://github.com/eq9684/emr_autolaunch?進行下載并修改。
本篇作者
王華
亞馬遜云科技解決方案架構師。有 20 年從事軟件架構、應用開發、系統集成等工作經驗。擅長 Web 領域應用系統架構設計和開發運維,即時通訊軟件、UC、企業 IT 服務臺和云呼叫中心系統的開發部署工作,從事過多個大型企業呼叫中心項目的設計、開發與部署。目前專注于制造業和呼叫中心領域的研究和方案推廣。
星標不迷路,開發更極速!
關注后記得星標「亞馬遜云開發者」
聽說,點完下面4個按鈕
就不會碰到bug了!