Apache Ranger 部署文档

很久没写过部署文档了,不过 Apache Ranger KMS 的手动部署较为繁琐,网上的相关资料基本都是散装的,因此写了一篇进行总结。

背景

需要一个高可用的 KMS 服务用于数据静态加密(HDFS 透明加密 / ORC格式列加密),hadoop 原生基于 java keystore 的 KMS 方案在生产环境并不可靠,列了几种可能的方案:

  1. 使用内部自建的 KMS ,实现 hadoop provider
  2. 使用 CDH 收费的 Navigator Key Trustee Server
  3. 使用 Apache Ranger KMS

综合考虑最后选择了方案三,Hadoop KMS是Apache社区开发的,将密钥存入文件(Java keystore)中,而Ranger KMS则是把密钥存入后台数据库中,通过Ranger Admin webui/Api 可以集中化管理KMS服务(密钥管理,访问策略,审计日志)。

安装部署

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

下载 range-1.2.0 源码进行编译,初次编译耗时可能较长,可以放在后台执行,相应包会生成在 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 增加用户及数据库

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 进行 setup

./setup.sh

安装成功后会提示

Installation of Ranger PolicyManager Web Application is completed.

启动服务

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

通过 netstat -lntp|grep 6080 查看进程是否正常启动,启动后访问 ip:6080 ,通过 admin/admin 访问 webui 。

安装 ranger-kms

mysql 增加用户及数据库

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

保存后进行安装

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

一切顺利后会显示

Installation of Ranger KMS is completed

查看 rangerkms 数据库会发现两张表

ranger_keystore
ranger_masterkey

使用 keyadmin/keyadmin 登陆 webui,添加 kms 服务,服务名为 kms-site.xml 中REPOSITORY_NAME 设置的值,此处为 kmsdev

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

启动 ranger-kms

./ranger-kms start

通过 netstat -lntp|grep 9292 查看进程是否正常启动

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 认证,kms 也需要修改相关配置:

/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: "..." 访问相应的 rest api ,会自动将本地的 tgt 票据加到 http 请求中

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

HA 配置

  1. 可以启动多个 ranger kms 实例,当hadoop.security.key.provider.path中指定了多个URL时,将隐式使用LoadBalancingKMSClientProvider,对多个 kms 实例以轮询的方式发送请求。
  2. 对于 Kerberos SPNEGO 身份验证,URL的主机名用于构造服务器的 Kerberos 服务名HTTP /#HOSTNAME# ,这意味着所有KMS实例必须具有带有负载均衡器的Kerberos服务名称。为了能够直接访问特定的KMS实例,KMS实例还必须具有其自己的主机名的 Keberos 服务名,所以需要将 hadoop.kms.authentication.kerberos.principal 中的 Kerberos 服务名改为 *
  3. Ranger admin 不可用不会影响到 Ranger KMS 提供服务,Ranger KMS 默认每30秒会从Ranger Admin 中下载最新的策略(policies),当 Ranger Admin 不可用时,Ranger KMS 则会使用上一次从 ranger admin 中下载的策略。

修改相关配置,参数比较多,为了缩短篇幅,不再以 xml 格式表达:

/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 命令行进行测试

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 版本,会导致方法冲突。

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

有一种比将密钥存在数据库中更加可靠的密钥保护方案,需要额外的硬件支持,HSM(硬件安全模块)是专为保护加密密钥生命周期而设计的专用加密处理器,在可靠且防篡改的设备中安全地管理、处理和保存加密密钥。有此需求的同学可以在 ranger wiki 中找到配置相应文档。

FAQ

  1. 提示没有 policies 下载权限

    在 ranger admin 中配置 kms server 时在 Add New Configurations 中添加参数。

    policy.download.auth.users = username

  2. 启动 kms 时提示 java.lang.Exception: Serivce:kmsdev not found

    需要在 ranger admin 中用 keyadmin 用户预先建一个 ranger kms 配置中 REPOSITORY_NAME 对应的 kms 服务。

  3. "User:keyadmin not allowed to do 'GET_KEYS'"
    修改 kms 服务 Policies ,对提示用户添加相应的权限。


    在这里插入图片描述
  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 中的相关配置。

  5. User: admin is not allowed to impersonate xxx

    用户没有代理权限,修改 /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 支持的位数不够,有两个解决办法:

    1. 升级 jdk ,例如 jdk8_162
    2. 替换 jce police,可参考 https://blog.csdn.net/hfhwfw/article/details/68557238
  8. 运行一段时间后,NameNode 连接 kms 提示 401
    DelegationToken 过期导致,可以在 crontab 中定期让 NN 访问 KMS

  9. KMS 多实例运行一段时间后,提示 zk 超时,导致 kms 服务不可用
    配置 zk-dt-secret-manager 保存 DelegationToken 时,在集群规模较大的情况下,zk /hadoop-kms-dt/ZKDTSMRoot/ZKDTSMTokensRoot 下的数据会迅速增长,在达到默认的 4M 后 zk 客户端会提示无法连接 zk ,错误提示如下:


    packet out of range

    解决办法:在 ranger-kms 脚本 JAVA_OPTS 中增加参数 -Djute.maxbuffer=50111000,如果请求量较大可以提高 ranger_kms_max_heap_size=4g ,默认为1g。


    -Djute.maxbuffer=50111000
  10. ranger 1.2 不支持 hadoop-2.8 及以上版本,默认依赖的 2.7.1 在zk代理令牌管理上有不少 BUG

    比如 HADOOP-13487,重启 kms 不会删除zk中历史过期的令牌,导致 ZNODE 节点不断增加,在我们的集群中,正常存在的代理令牌数量保持在 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 ,同时密钥数据库要做数据备份,密钥数据库密码管理需要在行政上做一定约束。

参考

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269