Apache Ranger 部署文檔

很久沒寫過部署文檔了,不過 Apache Ranger KMS 的手動部署較為繁瑣,網(wǎng)上的相關(guān)資料基本都是散裝的,因此寫了一篇進(jìn)行總結(jié)。

背景

需要一個高可用的 KMS 服務(wù)用于數(shù)據(jù)靜態(tài)加密(HDFS 透明加密 / ORC格式列加密),hadoop 原生基于 java keystore 的 KMS 方案在生產(chǎn)環(huán)境并不可靠,列了幾種可能的方案:

  1. 使用內(nèi)部自建的 KMS ,實現(xiàn) hadoop provider
  2. 使用 CDH 收費(fèi)的 Navigator Key Trustee Server
  3. 使用 Apache Ranger KMS

綜合考慮最后選擇了方案三,Hadoop KMS是Apache社區(qū)開發(fā)的,將密鑰存入文件(Java keystore)中,而Ranger KMS則是把密鑰存入后臺數(shù)據(jù)庫中,通過Ranger Admin webui/Api 可以集中化管理KMS服務(wù)(密鑰管理,訪問策略,審計日志)。

安裝部署

  • hadoop 版本: 2.6.0-cdh5.15.0
  • ranger 版本: 1.2.0

下載 range-1.2.0 源碼進(jìn)行編譯,初次編譯耗時可能較長,可以放在后臺執(zhí)行,相應(yīng)包會生成在 target 目錄下。

wget http://mirrors.tuna.tsinghua.edu.cn/apache/ranger/1.2.0/apache-ranger-1.2.0.tar.gz 
tar -vxf apache-ranger-1.2.0.tar.gz 
cd apache-ranger-1.2.0
nohup mvn clean compile package assembly:assembly install -DskipTests=true -Drat.skip=true -Dmaven.test.skip=true > maven.log &

安裝 ranger-admin

mysql 增加用戶及數(shù)據(jù)庫

create database ranger;
alter database ranger character set latin1; 
create user 'rangeradmin'@'%' identified by '123456';
GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'%' IDENTIFIED BY '123456';
flush privileges;

解壓,修改配置文件

tar -vxf ranger-1.2.0-admin.tar.gz
cd ranger-1.2.0-admin
vim install.properties

install.properties

SQL_CONNECTOR_JAR=/path/to/mysql-connector-java-5.1.34.jar

db_root_user=...
db_root_password=...
db_host=...

# DB UserId used for the Ranger schema
db_name=ranger
db_user=rangeradmin
db_password=123456

# 禁用audit審計,如需開啟,需安裝solr
#audit_store=solr
#audit_solr_urls=
#audit_solr_user=
#audit_solr_password=
#audit_solr_zookeepers=

# Custom log directory path
RANGER_KMS_LOG_DIR=/home/admin/output/ranger/admin/logs

#PID file path
RANGER_KMS_PID_DIR_PATH=/home/admin/var/ranger/admin/run

保存后使用 root 進(jìn)行 setup

./setup.sh

安裝成功后會提示

Installation of Ranger PolicyManager Web Application is completed.

啟動服務(wù)

./ews/ranger-admin-services.sh  start

通過 netstat -lntp|grep 6080 查看進(jìn)程是否正常啟動,啟動后訪問 ip:6080 ,通過 admin/admin 訪問 webui 。

安裝 ranger-kms

mysql 增加用戶及數(shù)據(jù)庫

create database rangerkms;
alter database rangerkms character set latin1; 
create user 'rangerkms'@'%' identified by '123456';
GRANT ALL PRIVILEGES ON rangerkms.* TO 'rangerkms'@'%' IDENTIFIED BY '123456';
flush privileges;

解壓,修改配置文件

tar -vxf ranger-1.2.0-kms.tar.gz
cd ranger-1.2.0-kms
vim install.properties
SQL_CONNECTOR_JAR=/path/to/mysql-connector-java-5.1.34.jar

db_root_user=...
db_root_password=...
db_host=...

# DB UserId used for the Ranger KMS schema
db_name=rangerkms
db_user=rangerkms
db_password=123456

# Location of Policy Manager URL
POLICY_MGR_URL=http://$RANGER_ADMIN_HOST:6080

# This is the repository name created within policy manager
REPOSITORY_NAME=kmsdev

# Custom log directory path
RANGER_KMS_LOG_DIR=/home/admin/output/ranger/kms/logs

#PID file path
RANGER_KMS_PID_DIR_PATH=/home/admin/var/ranger/kms/run

保存后進(jìn)行安裝

./setup.sh
./enable-kms-plugin.sh

一切順利后會顯示

Installation of Ranger KMS is completed

查看 rangerkms 數(shù)據(jù)庫會發(fā)現(xiàn)兩張表

ranger_keystore
ranger_masterkey

使用 keyadmin/keyadmin 登陸 webui,添加 kms 服務(wù),服務(wù)名為 kms-site.xml 中REPOSITORY_NAME 設(shè)置的值,此處為 kmsdev

Service Name :kmsdev
KMS URL :kms://http@hostnip:9292/kms
Username :keyadmin
Password :keyadmin

啟動 ranger-kms

./ranger-kms start

通過 netstat -lntp|grep 9292 查看進(jìn)程是否正常啟動

HDFS 配置

hdfs-site.xml

dfs.encryption.key.provider.uri kms://http@kms_host:9292/kms

core-site.xml

hadoop.security.key.provider.path kms://http@kms_host:9292/kms

Kerberos 配置

如果 range-admin 開啟了 kerberos 認(rèn)證,kms 也需要修改相關(guān)配置:

/home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml

<property>
    <name>hadoop.kms.authentication.type</name>
    <value>kerberos</value>
</property>

<property>
    <name>hadoop.kms.authentication.kerberos.keytab</name>
    <value>/etc/kerberos/dcadmin.keytab</value>
</property>

<property>
    <name>hadoop.kms.authentication.kerberos.principal</name>
    <value>HTTP/spark-d-011016.hz.td@HZNEW.TONGDUN.COM</value>
</property>

配置 kerberos SPNEGO 后可以通過 curl --negotiate -u: "..." 訪問相應(yīng)的 rest api ,會自動將本地的 tgt 票據(jù)加到 http 請求中

//list kms keys
curl --negotiate -u: "http://spark-d-011015.hz.td:9292/kms/v1/keys/names"

HA 配置

  1. 可以啟動多個 ranger kms 實例,當(dāng)hadoop.security.key.provider.path中指定了多個URL時,將隱式使用LoadBalancingKMSClientProvider,對多個 kms 實例以輪詢的方式發(fā)送請求。
  2. 對于 Kerberos SPNEGO 身份驗證,URL的主機(jī)名用于構(gòu)造服務(wù)器的 Kerberos 服務(wù)名HTTP /#HOSTNAME# ,這意味著所有KMS實例必須具有帶有負(fù)載均衡器的Kerberos服務(wù)名稱。為了能夠直接訪問特定的KMS實例,KMS實例還必須具有其自己的主機(jī)名的 Keberos 服務(wù)名,所以需要將 hadoop.kms.authentication.kerberos.principal 中的 Kerberos 服務(wù)名改為 *
  3. Ranger admin 不可用不會影響到 Ranger KMS 提供服務(wù),Ranger KMS 默認(rèn)每30秒會從Ranger Admin 中下載最新的策略(policies),當(dāng) Ranger Admin 不可用時,Ranger KMS 則會使用上一次從 ranger admin 中下載的策略。

修改相關(guān)配置,參數(shù)比較多,為了縮短篇幅,不再以 xml 格式表達(dá):

/home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml

hadoop.kms.key.provider.uri = dbks://http@spark-d-011016.hz.td:9292/kms
hadoop.kms.cache.enable = false
hadoop.kms.cache.timeout.ms = 0
hadoop.kms.current.key.cache.timeout.ms = 0
hadoop.kms.authentication.kerberos.principal = *
hadoop.kms.authentication.signer.secret.provider = zookeeper
hadoop.kms.authentication.signer.secret.provider.zookeeper.connection.string = spark-d-011017.hz.td:2181,spark-d-011018.hz.td:2181,spark-d-011019.hz.td:2181
hadoop.kms.authentication.signer.secret.provider.zookeeper.auth.type = none

配置 provider url ,下述第一種寫法必須保證所有的 kms 端口一致

之前的 KMS URL = kms://http@<internal host name>:9292/kms
新的 KMS URL
寫法1 kms://http@<RangerKMS-node1>;<RangerKMS-node2>;...:9292/kms
寫法2 kms://http@<RangerKMS-node1>:9292/kms,kms://http@<RangerKMS-node2>:9292/kms

可以直接使用 hadoop 命令行進(jìn)行測試

hadoop key list -metadata -provider "kms://http@spark-d-011015.hz.td;spark-d-011016.hz.td:9292/kms"

Tip

不要直接從 github 上 clone 1.2.1-snapshot 版本,否則開啟 HA 會提示下方錯誤,因為有個 commit 升級了 guava 版本,會導(dǎo)致方法沖突。

2020-01-08 23:26:55,583 ERROR [/kms] - Exception starting filter authFilter
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;

KMS LUNA HSM

有一種比將密鑰存在數(shù)據(jù)庫中更加可靠的密鑰保護(hù)方案,需要額外的硬件支持,HSM(硬件安全模塊)是專為保護(hù)加密密鑰生命周期而設(shè)計的專用加密處理器,在可靠且防篡改的設(shè)備中安全地管理、處理和保存加密密鑰。有此需求的同學(xué)可以在 ranger wiki 中找到配置相應(yīng)文檔。

FAQ

  1. 提示沒有 policies 下載權(quán)限

    在 ranger admin 中配置 kms server 時在 Add New Configurations 中添加參數(shù)。

    policy.download.auth.users = username

  2. 啟動 kms 時提示 java.lang.Exception: Serivce:kmsdev not found

    需要在 ranger admin 中用 keyadmin 用戶預(yù)先建一個 ranger kms 配置中 REPOSITORY_NAME 對應(yīng)的 kms 服務(wù)。

  3. "User:keyadmin not allowed to do 'GET_KEYS'"
    修改 kms 服務(wù) Policies ,對提示用戶添加相應(yīng)的權(quán)限。


    在這里插入圖片描述
  4. WARN RangerAdminRESTClient - Error getting policies. secureMode=true, user=admin/dc@HZNEW.TONGDUN.COM (auth:KERBEROS), response={"httpStatusCode":401,"statusCode":0}, serviceName=kmsdev

    401 的提示基本是 Kerberos SPNEGO 沒有配置正確引起的,排查 /home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml 中的相關(guān)配置。

  5. User: admin is not allowed to impersonate xxx

    用戶沒有代理權(quán)限,修改 /home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml

    <property>
        <name>hadoop.kms.proxyuser.admin.groups</name>
        <value>*</value>
    </property>
    
    <property>
        <name>hadoop.kms.proxyuser.admin.hosts</name>
        <value>*</value>
    </property>
    
    <property>
        <name>hadoop.kms.proxyuser.admin.users</name>
        <value>*</value>
    </property>
    
  6. setup.sh 腳本初始化時 sql 提示: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)
    set global log_bin_trust_function_creators = 1;

  7. ranger kms 日志提示 Illegal key size
    說明 aes 支持的位數(shù)不夠,有兩個解決辦法:

    1. 升級 jdk ,例如 jdk8_162
    2. 替換 jce police,可參考 https://blog.csdn.net/hfhwfw/article/details/68557238
  8. 運(yùn)行一段時間后,NameNode 連接 kms 提示 401
    DelegationToken 過期導(dǎo)致,可以在 crontab 中定期讓 NN 訪問 KMS

  9. KMS 多實例運(yùn)行一段時間后,提示 zk 超時,導(dǎo)致 kms 服務(wù)不可用
    配置 zk-dt-secret-manager 保存 DelegationToken 時,在集群規(guī)模較大的情況下,zk /hadoop-kms-dt/ZKDTSMRoot/ZKDTSMTokensRoot 下的數(shù)據(jù)會迅速增長,在達(dá)到默認(rèn)的 4M 后 zk 客戶端會提示無法連接 zk ,錯誤提示如下:


    packet out of range

    解決辦法:在 ranger-kms 腳本 JAVA_OPTS 中增加參數(shù) -Djute.maxbuffer=50111000,如果請求量較大可以提高 ranger_kms_max_heap_size=4g ,默認(rèn)為1g。


    -Djute.maxbuffer=50111000
  10. ranger 1.2 不支持 hadoop-2.8 及以上版本,默認(rèn)依賴的 2.7.1 在zk代理令牌管理上有不少 BUG

    比如 HADOOP-13487,重啟 kms 不會刪除zk中歷史過期的令牌,導(dǎo)致 ZNODE 節(jié)點不斷增加,在我們的集群中,正常存在的代理令牌數(shù)量保持在 120萬左右,如果不刪除過期令牌,很快就會遇到問題。

    解決方式:

    在 hadoop-2.7.7 版本上 cherry-pick 加入 HADOOP-12652/HADOOP-13422/HADOOP-13487 后,重新編譯 hadoop-common/hadoop-hdfs 模塊,將編譯出的包 hadoop-annotations-2.7.7.jar / hadoop-auth-2.7.7.jar / hadoop-common-2.7.7.jar / hadoop-hdfs-2.7.7.jar 替換到 $RANGER_HOME/ews/webapp/lib 下。

后記

在沒有硬件加密的情況下為了提高密鑰的安全性,密鑰需要不定期 rollover ,同時密鑰數(shù)據(jù)庫要做數(shù)據(jù)備份,密鑰數(shù)據(jù)庫密碼管理需要在行政上做一定約束。

參考

Ranger集成KMS服務(wù)
Install Multiple Ranger KMS
kerberos_and_hadoop Error Messages to Fear
Apache Ranger 0.5.0 Installation
Hadoop Key Management Server (KMS) - Documentation Sets

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容